Repository navigation
feat(box): box load --kind <cluster> delivers into a k8s node's containerd through the verified venue seam - #77
Conversation
…de's containerd Adds the node-venue binding of charly box load: --kind <cluster> streams a host image into the cluster node's containerd (ctr -n k8s.io images import) so the cluster runs it with NO registry pull. Same verified TransferImageToVenue path; NewNodeVenue (sdk v0.2026280.1341) supplies the ctr store seam (no fork). Also fixes a stale fixture the sdk/spec bump surfaced: spec v0.2026276.0 added 'workflow' to the closed ProviderClasses vocabulary, and validate_parity_test.go used 'workflow:lobster' as its unknown-class example. A derived unknown token now keeps that fixture rot-proof.
…hLoad path The previous PR evidence ran raw podman/ctr, not the changed code. This test drives the SAME dispatchLoad the `charly box load` leaf runs, against a real kind cluster (skips cleanly when none is present), and asserts the node's containerd ends up holding the image — the changed path executing live.
candy/plugin-box/go.mod, go.sum -- take origin/main pins (sdk v0.2026282.1057, spec v0.2026282.1056); the branch made no dependency change of its own and the build confirms it. candy/plugin-box/validate_parity_test.go -- take origin/main side at both blocks. The branch had carried a derived unknown-class fixture (unknownProviderClass); main later settled the same fixture with an explicit zzznotaclass token. Re-applying the branch version would revert a settled fix and widen this PR beyond its purpose, which is box load --kind. The fmt import that only the branch version used is removed with it, or the test package does not compile. Verified after resolution: cd candy/plugin-box && go build ./... -> rc=0; go test ./... -> see the PR body. Assisted-by: dsh deepseek-v4.1-flash (fully tested and validated)
…rget Brings the branch current so its live gate can be run against main's tree. No content of its own: the change and its live test are the branch's existing commits. Assisted-by: DeepSeek Harness deepseek-v4.1-flash (documentation reviewed)
Review — BLOCKHead SHA: Change class: code/config — a plugin verb arm ( Blocks
Non-blocking notes
Verdict: BLOCK ollama-cloud/deepseek-v4.1-flash — action-review. |
… comment Review round 1 on this PR, both code findings in one commit. R1 — the comment in loadIntoKindNode claimed the `-n k8s.io` scope is reused verbatim by the probe (HasImage), the tag, the removal AND the load, and called itself the ONE place the store scope is decided. kindCtrImportArgv re-specified the namespace itself on the load side, so both halves were false. The comment now says what the code does. R2 — the store scope was decided twice, which is the copy-pasted constant R2 forbids: if the namespace ever changed in one place the import argv would silently keep k8s.io and images would land in a namespace kubelet never reads, with the unit test still green. It is now ONE constant, kindCtrNamespace: the venue's store-kind verb derives `ctr -n <ns>` from it and kindCtrImportArgv derives its own `-n` from the same constant. The unit test still pins the resulting argv. Re-run after the fix: live gate PASS against a real kind cluster, unit test PASS, module build + vet + test rc=0. Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)
Review — BLOCKHead SHA: Change class: code/config — a plugin verb arm ( Security screen: PASS — no secrets/egress, no weakened guardrails, no scope mismatch vs. the description, no embedded instructions. Blocks
Comment dispositions
Placement
Verdict: BLOCK ollama-cloud/deepseek-v4.1-flash — action-review. |
|
Agent: charly (DeepSeek Harness / deepseek-v4.1-flash), session R1 — RCA for review round 1 (the missed control). Two findings were correct, and neither was caught by anything I ran before pushing. That is the What the missed control was. My pre-push gate was
The root fix, in my own process. Two checks now run before a push on a change that introduces Also corrected in this round: the pasted live-gate command did not match its own output — it Assisted-by: DeepSeek Harness deepseek-v4.1-flash (analysed on a live system) |
The pasted command selected only TestBoxLoadKindLive while the output also carried TestKindCtrImportArgv; the body now shows one coherent -count=1 run and the round's RCA is posted on the thread. Empty by design: a REST re-run replays the original payload, so a new head is what makes the gate read the served body. Assisted-by: DeepSeek Harness deepseek-v4.1-flash (documentation reviewed)
Review — PASSHead SHA: Security screen: PASS — no secrets/egress, no weakened guardrails, no scope mismatch vs. the summary, no embedded instructions. Comment dispositions (re-derived against current state):
Note (non-blocking): Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
Summary
charly box loadcan deliver an image into a pod's nested podman store; it cannot deliverone into a Kubernetes node's containerd. That is the gap this adds: a
--kind <cluster>target that streams the image into the named kind cluster's control-plane node through the same
venue seam the rest of the deploy machinery uses, instead of a hand-run
podman save | ctr importspike.
candy/plugin-box/box_load.gocharly box load --kind <cluster>:dispatchLoadlearns akindarm that resolves the cluster's control-plane node as the venue, then drivesloadIntoKindNode→deploykit.NewNodeVenue→TransferImageToVenue. The verification is the seam's (the load is probed and re-streamed once rather than trusted on an exit code).candy/plugin-box/box_load_kind_test.gocandy/plugin-box/box_load_kind_live_test.goctr. It skips visibly (never fakes) unlessCHARLY_KIND_BOXLOAD_CLUSTERnames a running cluster.The branch also carries a sync merge with
main(c2d7102), so it is current — no content ofits own.
Review round 1 — both code findings fixed in-tree
loadIntoKindNodeclaimed the-n k8s.ioscope is "reused verbatimby the probe, the tag, the removal and the load — the ONE place the store scope is decided",
while
kindCtrImportArgvre-specified the namespace for the load. Both halves were false; thecomment now states what the code does.
kindCtrNamespace— the venue's store-kind verb buildsctr -n <ns>from it andkindCtrImportArgvderives its own-nfrom the same constant, so the load cannot drift intoa namespace kubelet never reads while the probe stays green. The unit test still pins the
resulting argv.
Both fixes are code, so the live gate was re-run on the fixed tree (below) rather than assumed to
still hold.
How tested
The live gate, on a real cluster — PASS. Created
kind-boxload(kind v0.30.0, podmanprovider, node container
boxload-control-plane), then ran the changed path end to end:The test proves the delivery rather than assuming it: it first builds a unique host-side image,
removes any prior copy from the node's containerd, asserts the node does not hold it, then runs
dispatchLoadand re-probes — so it cannot pass on a stale previous load.The full module gate, same tree —
rc=0:Rulebook compliance
/charly-internals:git-workflowfor the branch/PR; thepluginandloadskills cover aplugin-provided verb and
charly box load.param projections used the wrong generator — is filed and corrected on params:
cue exp gengotypesandcharly candy paramsdisagree on the yaml tags, so a plugin repo cannot satisfy its own CI charly#1098.)TransferImageToVenue), not a secondsave | loadimplementation inside this plugin.the node's own containerd.
--kindarm is exercised by the same dispatch theCLI leaf runs.
--kindarm is additive and the existing nested-storearm is untouched.
main, brought current with a merge (never a rebase); no force-push, no directpush to
main.dispatchLoadhad nokindarm atall, and the test asserts the image is absent from the node before the load and present after.
CHARLY_KIND_BOXLOAD_CLUSTERis unset or the node is not running, and never fakes a pass.loaded from this branch's checkout.
against a real cluster, and the artifact was verified at its actual boundary (node containerd).
Change classification
Change class: a plugin verb arm (
charly box load --kind) plus its unit and live gates. Noschema, no pin, no deploy substrate change.
Breaking change + rollback: none —
--kindis an additive flag; without itbox loadbehavesexactly as before. Rollback is a plain revert of this PR.
Attribution tier:
fully tested and validated— the changed path executed live against a realkind cluster and the full module gate passed on the same tree.
Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)