Changed
- Align files according to platform standards in #894 by @giantswarm-align-files[bot]
Full Changelog: https://github.com/giantswarm/muster/compare/v0.16.0...v0.16.1
Full Changelog: https://github.com/giantswarm/muster/compare/v0.16.0...v0.16.1
muster version now derives its version from the Go build info (runtime/debug) stamped from the VCS tag, instead of a hand-maintained literal in pkg/project. Release builds run on the tagged commit, so the binaries report the clean tag version; off-tag builds report a pseudo-version and tag-less builds report dev. gitSHA/buildTimestamp are still injected by architect’s go-build ldflags. Removes the need to bump the version literal on every release. The scratch files architect’s go-build writes into the worktree (the per-arch muster-<os>-<arch> binaries, .ldflags, and .platforms) are now gitignored so an untracked artifact doesn’t mark the build +dirty in the embedded version. Validated end-to-end in CI: all six architectures embed the clean tag version with vcs.modified=false.Full Changelog: https://github.com/giantswarm/muster/compare/v0.14.2...v0.15.0
Full Changelog: https://github.com/giantswarm/klaus/compare/v0.0.228...v0.0.229
Full Changelog: https://github.com/giantswarm/muster/compare/v0.14.1...v0.14.2
Full Changelog: https://github.com/giantswarm/klaus/compare/v0.0.227...v0.0.228
Full Changelog: https://github.com/giantswarm/agentic-platform/compare/v1.12.0...v1.12.1
Full Changelog: https://github.com/giantswarm/agentic-platform/compare/v1.11.0...v1.12.0
agents.sreAgent.m2m: opt-in impersonation RBAC for the agent’s M2M identity. m2m.impersonators (list of {name, namespace} SAs, default mcp-kubernetes) get a Role/ClusterRole allowing them to impersonate m2m.granted. A system:serviceaccount:… granted.user renders a namespaced serviceaccounts Role + groups ClusterRole; a plain username renders a single users+groups ClusterRole. m2m.granted.clusterRoles (default []) binds the granted groups to the listed ClusterRoles (the agent’s K8s authz, e.g. read-all), one ClusterRoleBinding each. The matching muster workloadGroupGrant and mcp-kubernetes impersonateUser/impersonateGroups are configured per cluster and must agree with m2m.granted. Disabled by default.muster events --follow now honors --output: json streams newline-delimited JSON (one object per line, ready for jq), yaml streams one YAML document per event, and the default table/wide formats stream an aligned one-line-per-event view. Previously the output format was silently ignored in follow mode. The human follow line now orders fields to match the static muster events table (timestamp, type, resource, reason, message) and highlights Warning events when stdout is a terminal.--enable-events flag and events: config field) and its “disabled by default” framing were removed; events are a core observability feature that works in both Kubernetes (native Events) and filesystem (on-disk log) modes. The muster serve --enable-events flag is retained as a hidden, deprecated no-op so existing scripts and unit files keep working after upgrade (it prints a deprecation notice and has no effect); the removed events: config key is silently ignored.MCPServerTokenForwarded/MCPServerTokenExchanged Normal events now log at debug level instead of writing a Kubernetes Event on every session’s connection to every SSO server. Token failures are still surfaced as Warning events. The Kubernetes backend now emits events through a client-go EventRecorder/EventBroadcaster so duplicate events aggregate into a single object with a Count and get per-key rate limiting, and the per-poll MCPServerHealthCheckFailed emission is gated on the healthy→unhealthy transition rather than firing every 30s for every unhealthy server. These were the dominant event-volume sources that previously made the feature noisy.--enable-events flag on muster serve and the events: config/Helm value. Event emission is no longer gated; the flag and field are gone (existing configs that still set events: are harmlessly ignored).MCPServerReconnected, WorkflowAvailable, WorkflowToolsDiscovered, WorkflowToolsMissing, WorkflowToolUnregistered, and the legacy WorkflowExecuted. Their constants, message templates, and reference-doc entries were removed so the documented event set matches what muster actually emits.CreateEvent/CreateEventForCRD methods from the api.EventManagerHandler interface (replaced by CreateEventWithData); the documented doc.go examples that called them with the invalid reason "Created" were corrected.api.EventManagerHandler boundary previously dropped everything but the object name/namespace, so every rendered event message lost its contextual fields — failure events showed no error, “created with N steps” showed no count, and step events had empty step IDs/tools. A new CreateEventWithData carries structured EventData (error, step count, duration, step ID/tool, execution ID, condition result, tool names) end-to-end so the message template renders the real detail; all emitters (MCPServer service/aggregator, workflow, token exchange/forwarding) were updated. The event type (Normal/Warning) is now consistently derived from the reason.default. On a real cluster the events previously landed in default with an empty object UID, orphaned from the CRD and invisible to kubectl describe mcpserver.muster events --follow now works via real server-side streaming. It previously blocked forever waiting on an MCP notification the server never sent (the streaming path was an unimplemented stub). Follow is now implemented end-to-end: core_events with follow=true returns the events seen so far and registers a per-session watch on the aggregator; subsequent events are pushed to the client as notifications/muster/event MCP notifications, sourced from a native Kubernetes watch (Kubernetes mode) or an fsnotify watch on the on-disk event log (filesystem mode) — no client-side polling. The stream is torn down when the client disconnects, starts a new follow, or the server shuts down.