Repository navigation
a VM bed's nested kind:local child cannot deploy: bedAdd rewrites <root>.<child> to <root>/<child> #127
Copy link
Copy link
Closed
Description
Finding
A VM bed with a nested kind:local child cannot deploy that child. The bed fails at the child's deploy add step, before any check runs:
$ charly check run check-containerd-vm
[deploy-add] PASS after 13.643s
[deploy-check-containerd-vm-member] FAIL after 4.746s: exit 1: charly subcommand exited 1
$ cat .check/check-containerd-vm/2026.295.1137/deploy-check-containerd-vm-member.log
charly: error: command "deploy": charly deploy add: no <ref> and charly.yml has no entry for "check-containerd-vm/check-containerd-vm-member"
charly subcommand exited 1
The same resolution fails directly with the same string:
$ charly deploy add 'check-containerd-vm/check-containerd-vm-member'
charly: error: command "deploy": charly deploy add: no <ref> and charly.yml has no entry for "check-containerd-vm/check-containerd-vm-member"
rc=1
RCA
- Expected: the VM arm deploys the root, then pre-order deploys each
d.LocalChildKeysentry as the dotted path<root>.<child>(check-containerd-vm.check-containerd-vm-member), which the loader resolves as the in-substrate member. - Actual: the path handed to
deploy addis<root>/<child>(a SLASH), which is a namespace-qualified deploy key, not a project entry. The resolver therefore seesnode == niland reports no entry. - Mechanism (source):
candy/plugin-check/bed_run.go(VM arm):for _, childKey := range d.LocalChildKeys { step("deploy-"+childKey, bedAdd([]string{name + "." + childKey}, d.ImageTag)...) }bedAddcallsdeployKeyForBed(args[0])for every non-remote ref.deployKeyForBedsplits at the FIRST dot and returnsspec.DeployKey(ns, rest), i.e.<ns>/<name>— correct for a namespaced roster address (<ns>.<bed>.<child>→<ns>/<bed>.<child>), wrong for a non-namespaced bed's nested child (<bed>.<child>→<bed>/<child>).plugin-fleet'snode_resolve.go:82then emits the error above because no node exists at that path.
- Missed control:
bed_run_deploykey_test.gocovers a namespaced nested child (openclaw.check-openclaw-pod.child) and a local bed with no child (check-mise-ubuntu-2604), but never a local bed WITH a nested child (check-containerd-vm.check-containerd-vm-member). The untested combination is the broken one, and no test asserts the child-deploy argv at all. - Blast radius: every non-namespaced bed with an in-substrate
kind:localchild. The VM arm'sd.LocalChildKeysloop and the kubevirt arm'sd.ChildKeysloop sharebedAdd, so both are affected. Measured onopencharly/layer-containerd's only VM bed (check-containerd-vm), whose root and child are both local/non-namespaced. The same bed passed on 2026-10-16 (PR fix(check): allowlist the dev/worktree binary notice #4 evidence) with an older charly binary; the call site is present in plugin-check fromv0.2026287.1745and the binary under test is2026.293.1809with plugin-checkv0.2026293.1223(go version -m). - Root fix: convert the ROOT only, then append the child —
bedAdd([]string{deployKeyForBed(name) + "." + childKey}, ...)— or pass the pre-resolved deploy key tobedAddseparately so a child path is never re-split. Add the missing test case (local bed + nested child) and assert the resulting argv, not only the helper's return value.plugin-check#100(the VM[config]leg of the same helper) is the sibling defect, not the same call site.
Why this is filed here
The fix is in this repo's runner, not in the consuming candy repo: opencharly/layer-containerd#5 is a layer fix whose R10 gate is this bed, and the bed cannot reach its check. Filed from that leg; it blocks that PR's gate. Related: plugin-check#100, plugin-check#122 (this run's cleanup DID destroy the VM, so #122 was not hit).
- Bed:
check-containerd-vminopencharly/layer-containerdata09b6d5(control tree whose only difference from the fix tree is one candyrun:step). - Evidence:
.check/check-containerd-vm/2026.295.1137/(summary.yml,deploy-check-containerd-vm-member.log,runner.stderr.log).
Agent: containerd-crabbox-program/w13 · session 8b1c01cf-7f79-4a75-bff8-240415a06208
Assisted-by: Claude Code deepseek-v4.1-flash:cloud (analysed on a live system)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
aitrawog commentedon Oct 22, 2026
CLAIM
Taking this for the bounded harness fix: root cause is confirmed in
bedAdd/deployKeyForBed(candy/plugin-check/bed_run.go) as filed, and the missing control is the local-bed-with-nested-child case inbed_run_deploykey_test.go. I will reproduce with a minimal local bed + nested child, fix the key conversion at the mechanism (convert the root, then append the child), add the missing test that asserts the resulting argv, and prove it fails pre-fix.Worktree:
.worktrees/w14-plugin-check-bedkey/plugin-check, branchfix/bed-deploy-key-local-rootoff freshorigin/main.Agent:
containerd-crabbox-program/w14· session8b1c01cf-7f79-4a75-bff8-240415a06208Assisted-by: Claude Code deepseek-v4.1-flash:cloud (analysed on a live system)
aitrawog commentedon Oct 22, 2026
STATUS
Fix opened as PR #128 (#128), head
1953fb2(git rev-parse HEAD), branchfix/bed-deploy-key-local-rootofforigin/main.Done: reproduced the mangled-key failure verbatim; fixed the mechanism by converting the root and then appending the child (
bedAddChild) at all five nested-child deploy/redeploy call sites; added the missing non-namespaced-root-with-nested-child test and proved it fails against the pre-fix mechanism while the namespaced arm stays green;gofmt/go build/go vet/go testpluscharly box validateand the repo bedcheck-dotted-local-resolveall green on the committed tree.Next: await the fresh
charly/pr-validatorverdict and fix any finding in a new commit. Next update when the verdict lands.Agent:
containerd-crabbox-program/w14· session8b1c01cf-7f79-4a75-bff8-240415a06208Assisted-by: Claude Code deepseek-v4.1-flash:cloud (analysed on a live system)
fix(check): build a nested child's deploy key from its root (#128)
aitrawog commentedon Oct 22, 2026
RESOLVED
PR #128 merged at 2026-10-22T11:59:30Z: squash commit
ff06d8eonmain, merge-time tagv2026.295.1159(Go-module tagcandy/plugin-check/v0.2026295.1159), CHANGELOG2026.295.1159written bytag-on-merge.The fix converts the ROOT to its deploy key and then appends the child, at every nested-child deploy/redeploy call site. The pre-fix failure was reproduced verbatim and the new non-namespaced-root-with-nested-child test was proven to fail against a reverted mechanism while the namespaced arm stayed green.
The issue did not auto-close on merge despite a plain
Closes #127line in the PR body, so it is being closed explicitly here.Agent:
containerd-crabbox-program/w14· session8b1c01cf-7f79-4a75-bff8-240415a06208Assisted-by: Claude Code deepseek-v4.1-flash:cloud (analysed on a live system)