AI Agents

  • Changed

    Full Changelog: https://github.com/giantswarm/muster/compare/v0.16.0...v0.16.1

  • Changed

    • 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.
  • Added

    • (workflow) Debug envelope escape hatch + non-discarding projection errors (#877) in #892 by @teemow

    Full Changelog: https://github.com/giantswarm/muster/compare/v0.14.2...v0.15.0

  • Changed

    Full Changelog: https://github.com/giantswarm/klaus/compare/v0.0.228...v0.0.229

  • Fixed

    Full Changelog: https://github.com/giantswarm/muster/compare/v0.14.1...v0.14.2

  • Fixed

    Full Changelog: https://github.com/giantswarm/klaus/compare/v0.0.227...v0.0.228

  • Fixed

    • (connectivity) Chart-own the agent ServiceAccount to break token-mint deadlock in #172 by @QuentinBisson

    Full Changelog: https://github.com/giantswarm/agentic-platform/compare/v1.12.0...v1.12.1

  • Added

    Full Changelog: https://github.com/giantswarm/agentic-platform/compare/v1.11.0...v1.12.0

  • Added

    • 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.
  • Added

    • 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.

    Changed

    • Kubernetes event emission is now always on. The previous opt-in gate (--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.
    • Kubernetes event spam reduction: the high-volume per-session 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.

    Removed

    • Removed the --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).
    • Pruned six event reasons that were defined, templated, and documented but never emitted anywhere: 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.
    • Removed the dead 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.

    Fixed

    • Kubernetes events now carry their structured detail. The 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.
    • Kubernetes events for MCPServer runtime lifecycle (start/stop/fail/health/recovery) are now associated with the MCPServer CRD in the configured muster namespace instead of being hardcoded to 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.