AI Agents

  • Added

    • docs/serving-presets.md: how a serving preset is added (giantswarm/agent-platform#751): the preset file, the render checks (verify-serving-slice, verify-preset-weights, the shipped count in verify-wiring) and the kubernetes-cka-v2 benchmark run against the preset as served, whose mean score and range the PR states. The pull request template carries the preset line.

    Fixed

    • Substrate workers schedule only where atelet runs: components.substrate{,-crds}.versionRange is >=1.3.0 <1.4.0 (giantswarm/agent-platform#756). atelet’s PriorityClass never preempts, so while the atelet DaemonSet rolled on a node without spare CPU, a worker pod scheduled in the gap took the CPU the old atelet pod freed: the new atelet pod stayed Pending, the rollout stopped at that node, and the substrate upgrade timed out and rolled back. The Substrate line’s 1.3.0 takes WorkerPool.spec.template.podAffinity (giantswarm/substrate#98), and from it on the chart derives kagent.substrateWorkerPool.template.podAffinity, a required term on the atelet pods (app: atelet in components.substrate.targetNamespace) with topologyKey: kubernetes.io/hostname. An installation’s own podAffinity stands instead; below 1.3.0 the key is refused. 1.3.0 is the line on kagent-dev/substrate v0.2.0-beta5, released as a minor, so the next re-pin is 1.4.0. The kagent WorkerPool’s worker image follows the floor to ateom-gvisor:1.3.0. make verify-workerpool asserts the derived term, its gate and an own podAffinity.
  • Added

    • –local-image starts an instance from a local image, no pull in #367 by @teemow

    Changed

    Full Changelog: https://github.com/giantswarm/klausctl/compare/v0.4.22...v0.5.0

  • Added

    • components.substrate{,-crds}.versionRange is >=1.2.0 <1.3.0: the Substrate line’s 1.2.0 takes substrate.atenetEgress.upstreamTrust.caBundle (giantswarm/agentlab#284). The egress gateway dials an actor’s upstream with its image’s public roots only, so a model or tool endpoint behind a private CA answered every call with 503 (invalid peer certificate: UnknownIssuer). With a PEM bundle in caBundle, the gateway trusts the public roots plus the bundle (giantswarm/substrate#92). Empty, the default, the egress gateway renders unchanged. 1.2.0 also carries otlploggrpc v0.21.0 for GO-2026-6508 (giantswarm/substrate#93) and keeps the durable pause copy out of external_snapshot (giantswarm/substrate#90). It is a patch of the line on kagent-dev/substrate v0.2.0-beta5, released as a minor, so the next re-pin is 1.3.0. The kagent WorkerPool’s worker image follows the floor to ateom-gvisor:1.2.0.
  • Fixed

    • A sign-in gets its token without waiting for the session’s SSO servers. The authorization-code exchange at /oauth/token answers at once; the session’s SSO servers connect in the background. A tool call, a listing, a workflow run and core_auth_login wait for the connects they depend on; auth://status answers at once and reports an SSO server still connecting as sso_pending.
  • Added

    • gitops.prereleases widens the agent chart line agent-manager composes for every agent. On, agent-manager.agentChart.semver admits pre-releases (>=1.5.0 <2.0.0 renders >=1.5.0-0 <2.0.0-0) and agent-manager.agentChart.semverFilter is the release tag filter, in the agent-manager release and in the connectivity release, whose migrate Job passes it as AGENT_CHART_SEMVER_FILTER. An agentChart with its own semverFilter, or pinned to an exact version, is left as written. components.agent-manager.versionRange moves to >=1.7.0 <2.0.0 and agentManager.migration.image.tag to 1.7.0, the first agent-manager whose schema and migrate take agentChart.semverFilter.
  • Added

    • gitops.prereleases lets an installation follow release candidates. On, every component’s versionRange and the self-management range admit pre-release versions: each version of the range without a pre-release gets -0, so >=5.31.4 <6.0.0 renders >=5.31.4-0 <6.0.0-0 and 0.x renders 0.x-0, with a semverFilter that admits only X.Y.Z and X.Y.Z-rc.N tags, so the branch builds pushed to the same repositories stay out. An exact pin (1.2.3, =1.2.3) and an exclusion (!=1.2.3) are left as written, and a range of those only gets no filter. A component released with this chart keeps its exact version, a range with its own semverFilter is left as written, and a range with no version (*) fails the render. Off by default: stable releases only.
  • Fixed

    • Every BackendTrafficPolicy targets its route without targetRefs[].namespace (giantswarm/agent-platform#377). Envoy Gateway has declared local policy target references (group, kind, name, sectionName) since v1.1, so helm-controller’s server-side apply refused the four policies the connectivity chart renders with ingress.backendTrafficPolicy.enabled (agentgateway, muster, kagent-controller-public) or kagent.uiRoute (the kagent UI) with .spec.targetRefs[0].namespace: field not declared in schema, and the whole connectivity upgrade failed. A client-side apply had the API server prune the field, so the stored objects there do not change. make verify-kagent-route asserts it.
  • Fixed

    • atelet pins the platform’s runtime images on the fleet shape: the kagent release moves its ConfigMap kagent-images into gitops.namespace (giantswarm/agent-platform#745). Flux resolves a HelmRelease’s valuesFrom in the HelmRelease’s own namespace. With the HelmReleases in gitops.namespace (flux-giantswarm) and the kagent release in gitops.targetNamespace, the substrate release’s optional reference to kagent-images found nothing, and atelet ran without --image-cache-pinned-images: the image cache could evict the Harness image, and the first turn after an idle spell paid the cold pull. The new component key valuesSourceObjects lists the objects a sibling reads through valuesFromRefs. When the release installs into another namespace than its HelmRelease and no remote target is set, a kustomize postRenderer on the HelmRelease moves each listed object into gitops.namespace. components.kagent lists kagent-images. verify-engine asserts the move in the fleet shape, and verify-kagent-wiring asserts that no postRenderer is rendered when the namespaces agree. Installations act: none. On the fleet shape the ConfigMap moves on the next kagent reconcile, the substrate release picks up the pinned set, and the atelet DaemonSet rolls once.
  • Fixed

    • The Valkey token store no longer keeps every forwarded ID token. The per-person revocation index kept each token issued within its TTL, the ID tokens a portal session forwarded as raw JWTs among them, so an active user’s index only grew. mcp-oauth v1.4.12 prunes expired entries on every write and stores an ID token as its digest.
    • A Dex outage during a token refresh no longer signs the person out. A refresh that met Dex answering 503, 429 or not at all was answered invalid_grant, so a client such as the Slack gateway dropped the person’s link. muster now answers 503 temporarily_unavailable with Retry-After (mcp-oauth v1.4.13), and the same refresh token works once Dex answers.
  • Changed

    • llmRouting.modelCatalog is an overlay over the gateway’s built-in price catalog (giantswarm/giantswarm#37975). The agentgateway data plane loads the catalog its release embeds as the base and merges the chart’s ConfigMap over it per model and per rate. The block now lists only anthropic/claude-opus-5-5 and anthropic/claude-sonnet-5-5, which gateway 2.1.2 does not price. The seven other Anthropic entries equalled the built-in prices and are gone. With no entries the chart renders no ConfigMap and no modelCatalog source. make verify-model-catalog fails when an overlay entry is already priced by the pinned gateway release, so the bump to a release that prices a model drops its entry. The values schema no longer closes a provider to the models the defaults name, so an installation can add one to anthropic or add another provider. Each provider is checked against the catalog’s shape instead: models, and per model rates (decimal strings for input, output, cacheRead, cacheWrite, reasoning, inputAudio, outputAudio, perPage), tiers (contextOver and rates) and tags, with no other key.