feat(dev-images): a harness target by digest and a controller target that follows the line — the Go ADK build through a lab registry, the kagent controller's image name from the render - #154
Merged
Conversation
4 tasks
…that follows the line platform.devImages gains the harness target: the Go ADK build is pushed to a lab registry on the kind network and the platform Harness pins it by the digest the registry computed (kagent.harness.image through the connectivity values; atelet's --localhost-registry-replacement through the substrate values), the boot asserting the pin and listing the admitted templates as they recompile. The Deployment targets resolve the image name they replace from the component chart's render (the kagent controller is the line's ghcr.io/giantswarm/kagent/controller on 4.x, the wrapper's on 3.x); an override that would match nothing is refused before the install instead of being dropped silently by kustomize. The Harness (connectivity's object) and atelet (substrate's) reconcile independently, so a rewrite flag that only arrived with a swap could lose the race to the Harness's new digest and fail the first golden boot; the flag is inert for every other ref, so it is rendered whenever the agents are. checkValues asserts both keys survived the values merge (an overlay replacing the atelet list would strand the Harness), and the name resolution notes the image each Deployment override replaces. The lab registry's host spelling, the Dex SAN and the image-ref parser share one constant. Refs #139
teemow
force-pushed
the
feat/dev-images-harness-and-line-controller
branch
from
September 11, 2026 18:58
fca38b2 to
e31521b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #139
What
platform.devImagesgains theharnesstarget — the platform Harness's workload image, the Go ADK every agent runs on under kagent API v2 — and thekagentcontroller target now follows the line the lab runs instead of a fixed image name.The
harnesstargetUnder kagent API v2 the agent runtime is no Deployment the lab could patch: the connectivity chart renders the image by digest into the
Harnessobject (the CRD rejects a tag), and Substrate's atelet pulls it from a registry into its own layer cache (/var/lib/ateom-gvisor, the actors' overlay lowerdirs) — never through the node's containerd. A kind side-load is therefore invisible to it; the path atelet implements for local development is the kind local-registry pattern (--localhost-registry-replacement, exposed by the substrate chart asatelet.extraArgs). Soagentlab platform:<clusterName>-registry(registry:3.0.0) on the kind docker network, published on127.0.0.1:<platform.devRegistryPort>(default 5001; created on demand, removed byagentlab down);kagent.harness.image: localhost:<port>/<path>@sha256:<digest>(forwarded by the meta chart to the connectivity chart's Harness) andsubstrate.atelet.extraArgs: [--localhost-registry-replacement=<clusterName>-registry:5000](forwarded to the substrate component; the lab's own Substrate values template carries the same flag) — both part of the release, so one plainhelm upgradeapplies them and removing the entry restores the chart's digest and drops the flag;platform.valuesFilesoverlay that pinskagent.harness.imageitself is refused while the target is configured.The Deployment targets
The image name a kustomize override replaces is now read off the component chart's render — the render the boot already produces to side-load the platform images — so the
kagenttarget replacesghcr.io/giantswarm/kagent/controllerunder the kagent line's chart (4.x) andgsoci.azurecr.io/giantswarm/kagent-controllerunder the 3.x wrapper, whatever Deploymentkagent-controller'scontrollercontainer names. A target whose chart rendered without that Deployment/container is refused before the install (kustomize would drop the override silently); a chart that did not render at all falls back to the table's name with a note.Also
docs/platform.md"Dev images": both targets, the digest constraint (a digest-pinned Harness recompiles every admitted template; the swap is part of the release), the 3.x/4.x controller name rule, the refusal behaviour,platform.devRegistryPort.internal/config:DevImageComponents+DevImageHarness,Platform.DevRegistryPort, validation (harnessneedsplatform.agents).Lab verification
On the shared lab
agentlab-dev2at the released agent-platform 4.7.11 (kagent line 0.11.0-gs.3, Substrate 0.0.27-gs.5 chart-owned, connectivity 4.7.11; agentlab.yaml + a values overlay for the 4.x keys the v0.33.0 template does not render yet), two swap cycles under the lab lock, 2026-09-11 16:58–17:13Z, each restored exactly to the baseline afterwards with the released agentlab v0.33.0 (agentlab.yamlbyte-identical, controller back onghcr.io/giantswarm/kagent/controller:0.11.0-gs.3with the same imageID, Harness back on the chart'sgolang-adk@sha256:a2d23f5e…, atelet args back,platform-testPASS 6/6).Dev images: real local builds of the kagent line's consumed head
fdfd405d(giantswarm/kagent-upstream, branchgiantswarm) fromgo/Dockerfile—golang-adk:dev-139-fdfd405(BUILD_PACKAGE=adk/cmd/main.go, 133 MB) andkagent-controller:dev-139-fdfd405(core/cmd/controller/main.go, 208 MB), linux/amd64.Cycle 1 (branch head
529dce4) and cycle 2 (headfca38b2, this PR's head, registry created by the run itself), eachagentlab platformexit 0 in 2:03 / 2:17:platform.devImages.kagent replaces ghcr.io/giantswarm/kagent/controller (Deployment kagent-controller, container controller in the kagent chart's render)(cycle 2),side-loaded 1 dev images,created the lab registry agentlab-dev2-registry (registry:3.0.0 on the kind network, published on localhost:5001),the platform Harness kagent pins localhost:5001/golang-adk@sha256:792306296292dff65e226707b2265948377bc8e34ba7bac7ef661ed74d472ce8, thenHarness kagent runs localhost:5001/golang-adk@sha256:7923…; 1 admitted templates recompiled on it: agentlab-agents-test 88c11e38… -> ebfce698…(cycle 2:da820540… -> 904c86c2…);kagent-controller→docker.io/library/kagent-controller:dev-139-fdfd405(pod Running on it,imagePullPolicy: IfNotPresent);Harness kagentgen 8→9 (→11)spec.workload.image: localhost:5001/golang-adk@sha256:7923…; atelet DaemonSet args gained--localhost-registry-replacement=agentlab-dev2-registry:5000; the admittedAgentTemplate agentlab-agents-test'sstatus.harnesses[kagent]moved desiredRevision and caught uplatestSuccessfulRevision, Ready=True;Image cache miss ref=localhost:5001/golang-adk@sha256:7923…→Image pulled into layer cache layers=3 took=0.63s→/atelet.AteomHerder/Run+Checkpointof the golden actoragentlab-agents-test-kagent-ebfce698…— the pull went through the lab registry, rewritten by atelet;platform-testPASS 6/6,test10/10,skills-testPASS 3/3 — its throwaway AgentTemplate booted on the dev Harness image (Harness kagent: image localhost:5001/golang-adk@sha256:7923…, Ready after 20 s, golden snapshot written), one turn through the edge answered from the skill, nothing left behind;platformmoved the Harness back to the chart's digest and the template recompiled onto it (ebfce698… -> da820540…, Ready), the controller back to the line's image.Not exercised in the lab: the refusal paths (an override matching nothing in the render, an overlay overriding the pin or the atelet list) — unit-tested;
agentlab downremoving the registry — the shared lab is not torn down.Rebased onto
mainafter #156/#155 on 2026-09-11 19:01Z (the Substrate template and the lab's own Substrate install are gone with #156: the Harness pin now sits inside the chart'skagent.harnessblock, the atelet flag inside itssubstrateblock;platformImagestakes #156's roster and returns the component renders). Verified by render: withoutdevImagesthe rebased binary'sagentlab renderoutput is identical tomain's except the documentedsubstrate.atelet.extraArgsdefault; withharness+kagentdev images it carries the controller's kustomize override and the atelet flag (the line's image name and the Harness digest areagentlab platform-time, unit-tested); an unknowndevImageskey is refused with the documented error. Unit tests green (go build,go vet,go test ./...).Not verified
--tls-verify=false, untested here (docker host).agents-test/toolsets-test/backstage-testare red on the 4.7.11 lab independent of this change (the proofs assert the POC composer shape / label — agentlab#140, backstage-test drives the Dev Portal's create and chat paths on kagent API v2: Generic chart 1.x values with commit-pinned skills and a 1.x range, a streamed turn, a resumed conversation #142); the agent proof that runs on the Harness today,skills-test, is the one exercised with the swaps in place.