agent-platform release v4.12.2
Added
tests/verify-bom-charts.py, wired into make verify-meta: every chart the BOM pins is rendered against the values the meta chart forwards to it (giantswarm/agent-platform#278). verify-meta rendered the meta chart alone — it proved the HelmReleases and their values were shaped as intended, never that the chart on the other end accepts them, so a key forwarded unconditionally against a pin whose schema forbids it was invisible until an installation failed to reconcile. The check pulls each pinned chart at the version and from the registry its rendered OCIRepository names (so the ghcr.io components — kagent, Substrate — and cloudnative-pg are covered, not just the gsoci ones) and renders it with exactly the values its release carries, failing only on a schema rejection: a later template error means the values were accepted and the chart wanted an input the BOM alone does not carry, which is reported apart and counted apart. Every BOM-pinned component is enabled for the render, so a pin cannot drop out of the check because the golden render leaves that component off, and a pin with no OCIRepository or one resolved to another version fails rather than skipping silently — 21 of 21 pins covered. A self-test proves against the installed Helm that a schema rejection and a template failure are still told apart, so a reworded Helm message fails the check loudly instead of downgrading the break it exists for into a passing line. Deliberately stdlib-only, like tests/verify-toolset-presets.py: the CI image has no PyYAML. It found the two pins above on unmodified main on its first run.
Fixed
- The actors’ egress opens the host model servers model-manager fronts (giantswarm/agent-platform#278).
model-manager with a host backend (ollama, lemonade, lmstudio) wires every pulled model into kagent as a ModelConfig pointing at that server — but only model-manager’s own policy opened it, and an actor’s inference request leaves through Agent Substrate’s egress gateway (substrate-atenet-egress), whose allow-list carries muster, the kagent controller, the tool server and world:443. A host model server is on neither 443 nor HTTPS, so every such request was dropped while model-manager reported the model as wired and healthy. The egress gateway now opens each host backend at the address the ModelConfigs actually carry — model-manager.<backend>.agentHost, falling back to .endpoint — as a toCIDR for an IP and a toFQDNs plus cluster arm for a hostname, and renders nothing while model-manager is off, for a kserve-only backend list or in the kubernetes flavour. A hostname arm also switches that policy’s DNS rule to agent-platform.dnsEgressWithProxy: Cilium fills its FQDN cache only from answers its own proxy sees, so without it the toFQDNs selector never matches and the name stays blocked; an IP-only backend list keeps the plain rule, so no installation gains an L7 DNS proxy on every actor lookup it did not need. model-manager.<backend>.agentHost is now guarded like .endpoint — an http(s) URL with a host — because the policies parse it with urlParse, which answered an empty matchName with port 80 for a scheme-less value and died on a raw parse error for a host:port one. make verify-kagent-netpol covers all of it. - The customer BOM pins two charts that reject the values the meta chart forwards to them (giantswarm/agent-platform#278, found by the check below).
gateway.parameters.podAnnotations and klausGateway.podDisruptionBudget / .podAnnotations travel unconditionally since #431, and vm-manager / vmManager since #441, while the BOM pinned agent-platform-connectivity 4.8.0 and klaus-gateway 1.0.2 — both additionalProperties: false, so a BOM-pinned installation got two releases that could not install or upgrade whatever the operator set (additional properties 'podAnnotations' not allowed; additional properties 'vmManager', 'vm-manager' not allowed). Checked release by release: connectivity is rejected through 4.10.0 on the #431 keys and through 4.10.6 on the #441 ones, and accepted from 4.11.0; klaus-gateway is rejected at 1.0.3 and accepted from 1.1.0 — the release the #431 entry already names for its budget knob. A BOM-pinned installation should take these pins.