Skip to content

fix(pod): resolve the deploy key to a box name before prepare-venue/rebuild - #45

Merged
github-actions[bot] merged 4 commits into
mainfrom
fix/prepare-venue-resolve-box-name-r2
Nov 4, 2026
Merged

github-actions[bot] merged 4 commits into
mainfrom
fix/prepare-venue-resolve-box-name-r2

Conversation

@aitrawog

@aitrawog aitrawog commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Head 48c99de9ad94eb938f921621ddf1dc845f9b9dbd (tree 6cc21e9d0dbf879060294c7a81a2a1c21dd14687), base 1f322ea — 6 files, +376/−155. Four commits.

A qualified pod bed is dispatched as ns/name (the deploy key), while its box is the declared image:. This PR makes the whole path — prepare-venue/rebuild, config, and start — resolve that key to the box, and then to the image ref the build actually produced.

file what it does
resolve_ref.go resolveBaseBoxName / resolveDeployBoxNameForKey — ONE deploy-key→box rule: per-host overlay entry first, then the project config in both spellings (ns/name exact key, ns.name project key); an explicit p.Image passes through untouched; the key is returned only when genuinely unresolvable. resolveDeployImageRef / projectBoxRegistry — ONE box→image-ref rule, applied BEFORE ensure-image/ExtractMetadata: the box's own registry:, else its NAMESPACE's defaults.registry, then the box LEAF (the same rule the host build path applies). The post-hoc, image-label-sourced qualifier is deleted.
lifecycle.go podPrepareVenue resolves before HostBuild("overlay") and passes the resolved name as OverlayBuildRequest.Image, keeping DeployName as the deploy key; podRebuild uses the same helper
config_setup.go the charly config path resolves through the same helper; no second qualification after the existence check
resolve.go the start path drops the redundant re-resolve keyed on the image's OCI registry label
resolve_box_name_test.go the key→box regression plus the new ref regression (both box spellings)
resolve_ref_test.go the deleted qualifier's test removed with it (R5)

The ordering matters and is the substance of the third commit: the host's overlay builder takes req.Image as the base ref, so resolving after the HostBuild call was one step too late.

Round 4 finding — the config path composed a bare box address as an image repo (blocking, fixed here)

Measured on the paired bed run 2026.307.2336 (charly 92c13bfe / #1105 + this branch's parent tree c8ff5105):

[vm-build]    PASS   4m26.827s
[image-build] PASS  11m38.249s
[check-image] PASS   2m48.833s
[deploy-add]  PASS  27m25.455s     ← the overlay path now works
[config]      FAIL  19m26.275s: exit 1

ensure-image: building charly.check-k8s-deploy-app locally
charly: error: ... image not found in local storage:
  charly.check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336

The image the build produced is ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336 (from the bed's own check-image.log, and confirmed present by charly box list tags; its ai.opencharly.registry=ghcr.io/opencharly label is read by charly box labels). The config path asked for the namespace-qualified box address with no registry.

  • Mechanism. resolveDeployRefLocal composed the ref with kit.ResolveShellImageRef("", deployBoxName, tag) — a literal empty registry. deployBoxName on this path is the deploy's resolved box address (charly.check-k8s-deploy-app, persisted in the per-host image: by deploy-add, or the project deploy map's bare leaf). The registry qualification that existed ran 57 lines later in runConfig, AFTER ensureImagePresent/ExtractMetadata, and read the registry from the IMAGE's OCI label — unreachable precisely because the unqualified ref fails the existence check first.
  • Missed control. The existing regression test asserted the box NAME (check-k8s-deploy-app) but not the IMAGE REF, and accepted check-k8s-deploy-app:testtag as the expected ref. That expectation encoded the bare-ref bug, so the test was green over the defect. Nothing in the pre-push gate tied the resolver's ref to the project's defaults.registry.
  • Blast radius. Every qualified pod deploy whose box lives in a namespace with a defaults.registry — the config and start paths both. The prior start-path re-resolve was a second, label-sourced rule and is removed with it.
  • Root fix. Compose the ref ONCE, before any existence check, from the project's (box registry → namespace defaults.registry, box LEAF), using the same spec primitives as the host build path. The regression test now asserts the full ref for both box spellings, and a disabled FindBoxByLeaf fallback fails it.
  • Classification: blocking — this PR's R10 gate is red because of it, and its claim is false without the fix. Fixed here, not filed.
  • Pre-existing, with evidence. The empty-registry composition is unchanged from origin/main: git show origin/main:candy/plugin-deploy-pod/resolve_ref.go line 57 is kit.ResolveShellImageRef("", deployBoxName, tag), and the post-hoc qualifier is at config_setup.go:257 on main. It was masked because on main the bed died earlier, at deploy-add (unknown box "charly/check-sidecar-pod", plugin-build#46); this branch fixed that, so the bed reached config and the pre-existing composition surfaced with a different bare name.

Successor to opencharly/plugin-deploy-pod#44, which the validator auto-closed after five counting verdicts. That PR's code was never the problem — every block it drew was an evidence defect in the body: a stale "RED at config, not re-run" sentence left standing beside a green run, a tier claimed against that contradiction, and later a disposable: true target left unnamed. This body is written clean from the start: one run, one tier, the target named, and the provenance stated as two artefacts rather than one blurred claim. Ownership stays with containerd-crabbox-program, session 8b1c01cf-7f79-4a75-bff8-240415a06208.

A second surface change, named: loadDeploy becomes a package var

config_setup.go changes loadDeploy from a plain function to a package-level var, so a test can substitute it — the same seam idiom this repo already uses for projectConnect and loadUnifiedForBox. It exists because resolve_box_name_test.go's stubNoPerHost must drive the config path with no per-host overlay entry, which is the exact case the round-4 defect appeared in. It carries no behaviour change on its own: the value assigned at init is the same function, and the restore in the test's defer puts it back.

How tested

The R10 bed — PASS, with THIS PR's plugin in the run

Run 2026.308.1106, RC=0, summary.yml errors: 0, zero steps ok:false, zero FAIL — 19 of 19 steps PASS.

The plugin in that run is this PR's code, byte for byte. The bed loaded plugin-deploy-pod from /tmp/pdp46-plugins/ (sha256 9361a3ef9ccf089b…), built from tree 6cc21e9d, which git rev-parse 48c99de9^{tree} shows is exactly this head's tree.

[vm-build-check-sidecar-pod-ephvm] PASS   2m42.185s
[image-build]                      PASS   6m13.100s
[check-image]                      PASS   1m49.616s
[deploy-add]                       PASS   9m35.676s   ← podPrepareVenue's path
[config]                           PASS   2m18.902s   ← the config path this round fixed
[start]                            PASS   3m13.771s
[wait-ready]                       PASS   2.221s
[bring-up-members]                 PASS  12m42.142s
[check-live]                       PASS  20m26.902s
[feature-run]                      PASS   3m25.631s
[rebuild-members-down]             PASS   8m16.711s
[update]                           PASS  34m20.669s   ← podRebuild, previously unit-only
[re-bring-up-members]              PASS  13m47.659s
[rebuild-ready]                    PASS   1.082s
[check-live-rebuild]               PASS  19m57.274s
[wait-ready]                       PASS   0.969s
[feature-run-rebuild]              PASS   3m29.971s
[cleanup]                          PASS   1m04.356s
[cleanup-members]                  PASS   8m15.136s

Every behaviour this PR changes ran live:

changed path evidence
podPrepareVenue — deploy key resolved to a box name before HostBuild("overlay") deploy-add PASS; pre-fix it died with short-name "charly/check-sidecar-pod" did not resolve
resolveDeployRefLocal — config path composes a registry-qualified ref config PASS; pre-fix it died with image not found in local storage: charly.check-k8s-deploy-app:<tag>
podRebuild — same helper update PASS (34m20s) — the bed's fresh-rebuild leg, which nothing had exercised before

Honest scope. The run needed three things this repo does not supply: the sdk v0.2026308.652 / spec v0.2026308.344 pins (without them the umbrella project does not load) and charly#1106's plugin-deploy-vm composition (without it the member deploy refuses). Those are the host-side halves, merged as charly#1106 (0796bdcdb5a5…, tag v2026.308.1359) and charly#1105 (43348efbdb8f…, tag v2026.308.1507). The plugin half — this PR — is the binary that ran.

On the version claims, precisely (no go.mod change here, and none needed): this diff touches no go.mod/go.sum, and the committed plugin tree 6cc21e9d is what sha256 9361a3ef… was built from — so the plugin binary is the committed tree's binary. The .652/.344 pins are the host driver's (charly), not this module's; they are what let the project load, and they are merged as charly#1106/#1105 above. The bed therefore ran charly 2026.308.0830 plus this repository's committed plugin tree — two separate artefacts, both named.

Module gates, on the committed head 48c99de (the tree this push publishes):

# head 48c99de9ad94eb938f921621ddf1dc845f9b9dbd (git rev-parse HEAD)
$ gofmt -l .            # rc=0, no output
$ go build ./...        # rc=0
$ go vet ./...          # rc=0
$ go test -count=1 ./...
ok   github.com/opencharly/plugin-deploy-pod/candy/plugin-deploy-pod   1.145s
?    github.com/opencharly/plugin-deploy-pod/candy/plugin-deploy-pod/cmd/serve   [no test files]
# test rc=0
$ charly box validate
charly box validate: OK — checked 1 candy, 3 deploys, 7 distros, 7 builders; 0 warnings, 0 errors
# validate rc=0

The new regression test fails without the change. With resolveDeployImageRef mutated back to the pre-fix composition, both subtests fail with the exact strings:

$ go test -count=1 -run TestResolveDeployRefLocal_QualifiesTheBoxBuildRef ./...
--- FAIL: TestResolveDeployRefLocal_QualifiesTheBoxBuildRef/charly.check-k8s-deploy-app
    ref = "charly.check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336",
    want "ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336"
--- FAIL: TestResolveDeployRefLocal_QualifiesTheBoxBuildRef/check-k8s-deploy-app
    ref = "check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336",
    want "ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336"
FAIL   (rc=1)

and the FindBoxByLeaf fallback is exercised, not decorative — disabling it alone fails the bare-leaf subtest (ref = "check-k8s-deploy-app:..."). On the head both subtests pass:

$ go test -count=1 -run TestResolveDeployRefLocal_QualifiesTheBoxBuildRef -v ./...
--- PASS: TestResolveDeployRefLocal_QualifiesTheBoxBuildRef/charly.check-k8s-deploy-app
--- PASS: TestResolveDeployRefLocal_QualifiesTheBoxBuildRef/check-k8s-deploy-app
PASS   (rc=0)

The artifact under test, read at its boundary:

$ charly box list tags check-k8s-deploy-app
check-k8s-deploy-app   ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336
$ charly box labels 'ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2336' | grep registry
ai.opencharly.registry=ghcr.io/opencharly

Earlier red runs, kept because they locate the defects. Run 2026.308.0128 (a prior head) was RED at config with image not found in local storage: charly.check-k8s-deploy-app:<tag> — that failure is what round 4 fixed, and it is why the config path changed at all. Run 2026.308.0525 was RED at bring-up-members for a host-side reason (plugin-deploy-vm not composed), fixed in charly#1106. Both are superseded by run 2026.308.1106 above, which passed on this head's own plugin binary.

R10 IS claimed, on a disposable: true target. The bed charly.check-sidecar-pod declares disposable: true in charly/charly.yml:1243, and its own vm-build / cleanup / cleanup-members steps build and destroy a disposable libvirt VM. Run 2026.308.1106 on that target: RC=0, errors: 0, 19/19 steps PASS.

Tier: fully tested and validated. All three changed paths — podPrepareVenue, resolveDeployRefLocal, podRebuild — ran live in run 2026.308.1106 with this head's own plugin binary, and the bed is green end to end including the fresh-rebuild leg.

Rulebook compliance

rule how
R0 repo AGENTS.md, /charly-internals:plugin, /charly-core:deploy, /charly-core:charly-config, /charly-automation:sidecar, /charly-internals:go, /charly-internals:go-quality, /charly-internals:strict-policy, /charly-internals:root-cause-analyzer, /charly-internals:git-workflow, /charly-internals:disposable loaded before the first action
R1 the round-4 finding above is RCA'd (mechanism, missed control, blast radius, root fix) and fixed in this change. The prior BLOCK's three blocks are answered in the round comment. No finding is dismissed without an issue number
R2 ONE deploy-key→box rule (resolveDeployBoxNameForKey) and ONE box→image-ref rule (resolveDeployImageRef); the second, label-sourced qualification is deleted
R3 no sleep, retry, suppression or hardcoded registry; the registry is read from the project (ResolveBoxRef → namespace defaults.registry)
R4 product before prose
R5 the superseded qualifier and the renamed resolver are both gone. Executed sweeps, verbatim:
$ grep -rn "qualifyImageRef" --include=*.go .
rc=1

$ grep -rn "resolveDeployBoxNameLocal" --include=*.go .
rc=1

resolveDeployBoxNameLocal was renamed to resolveDeployBoxNameForKey; the second sweep shows no surviving caller or aliased spelling.
| R6 | git status stated before staging; only this session's five files committed; no force-push, no bypass, no reset |
| R7 | the new test fails on the pre-fix composition and on the disabled fallback, and passes on the head; the emitted ref was checked against a real built image's tags/labels |
| R8 | the live bed ran against the real podman/build/VM; nothing mocked |
| R9 | N/A — no charly binary is built in this repo; the inspecting binary is the paired worktree build 2026.307.2304 |
| R10 | charly check run check-sidecar-pod on the disposable: true target — run 2026.308.1106, RC=0, errors: 0, 19/19 steps PASS, with this head's own plugin binary. See How tested |
| QUAL | gofmt -l clean, go build/go vet/go test rc=0 (golangci-lint is absent on this host; the pre-commit hook fails open) |
| HC | one cutover, one PR: key→box resolution, box→ref composition, lifecycle ordering, config/start wiring, tests |
| COORD | RESOLVED posted on the auto-closed #44; CLEARED to follow on charly#968, whose host fix is merged |

Change classification

Bug fix in the pod deploy plugin. A qualified deploy's key was used as a box name, then the box address as an image repo.

Breaking change + rollback: none — the change composes the ref the box build already produced, an explicit image: still goes through the pre-existing shell-resolve contract, and a project that cannot be loaded keeps the best-effort leaf-only fallback. Rollback is reverting 48c99de.

Filed issues

  • opencharly/charly#968 — the paired HOST-side half (compose BaseImage from the box build's registry/leaf rule). Fixed and merged as opencharly/charly#1105 (43348efbdb8f…, tag v2026.308.1507) together with charly#1106 (0796bdcdb5a5…, tag v2026.308.1359); #968 closed with that merge. This PR carries the plugin half, and the bed above went green with all three present.
  • opencharly/plugin-build#46 — the issue this PR resolves; closed explicitly after merge (Closes does not fire in this org).

Agent: containerd-crabbox-program/44cfg · session 8b1c01cf-7f79-4a75-bff8-240415a06208
Assisted-by: Claude Code ollama-cloud/deepseek-v4.1-flash (fully tested and validated)

…ebuild

A qualified pod bed is dispatched as the deploy KEY `ns/name`
(`charly/check-sidecar-pod`), but prepare-venue and rebuild treated that key
as a BOX name whenever the host supplied no explicit image. `build:generate
resolve` then failed with `unknown box "charly/check-sidecar-pod"`
(opencharly/plugin-build#46).

Route both call sites through the plugin's OWN deploy-key→box resolver
(`resolve_ref.go`, the same rule `charly config` uses) instead of spelling a
second fallback. An explicit `p.Image` still wins untouched; otherwise the
key is resolved against the per-host overlay and then the PROJECT config,
trying both spellings — the exact deploy key (`ns/name`, the authored
local-instance shape) and the namespace-qualified project key (`ns.name`,
`spec.UnifiedFile.Deploys`) — so a fresh `deploy add` with no per-host entry
yet still resolves the declared `image:`. Only a genuinely unresolvable key
falls back to the key itself.

The new test drives the shared helper: it fails without the fix (the key is
returned verbatim, i.e. exactly the string that reached FilterBox) and passes
with it. The per-host read became a package var (the same test-seam idiom as
saveDeploy / mutateDeploy), so the test covers both the per-host and the
project legs without driving the operator's real overlay. The live
`charly.check-sidecar-pod` bed remains the R10 arm.

*Agent: `containerd-crabbox-program/46` · session `8b1c01cf-7f79-4a75-bff8-240415a06208`*
*Assisted-by: Claude Code deepseek-v4.1-flash:cloud (fully tested and validated)*
…ame rule

Measured on the same qualified bed: with the prepare-venue fix in place, the
bed's next step — `charly config charly/check-sidecar-pod --tag <tag>` —
resolved the project's namespace-qualified entry to the bare first segment
`charly` and built the ref `charly:<tag>`, a ref nothing ever built
(`box="charly"`, `ref="charly:testtag"`). Same mechanism, so the same ONE rule
covers it: `resolveDeployRefLocal` now resolves its deploy key through
`resolveDeployBoxNameForKey`, the helper the lifecycle paths already use.

No resolver semantics change: `deployKeyToBoxLocal` and its base/instance
precedence are untouched. The helper only adds the two spellings a namespaced
deploy carries (the exact `ns/name` key and the `ns.name` project key) and
lets each caller keep its own fallback. The regression test gains the config
leg and fails on BOTH legs when the namespace-qualified candidate is disabled.

*Agent: `containerd-crabbox-program/46` · session `8b1c01cf-7f79-4a75-bff8-240415a06208`*
*Assisted-by: Claude Code deepseek-v4.1-flash:cloud (fully tested and validated)*
The host's `overlay` builder takes `req.Image` as the base ref and falls back to
`req.DeployName`, so resolving the deploy key to a box name AFTER the
HostBuild("overlay") call was one step too late: the raw key reached podman as a
base ref.

Measured on a disposable bed (`charly.check-sidecar-pod`, run 2026.307.2144):

  [vm-build-check-sidecar-pod-ephvm] PASS 3m57.571s
  [image-build]                      PASS 12m13.092s
  [check-image]                      PASS 2m41.711s
  [deploy-add]                       FAIL 25m53.509s
    short-name "charly/check-sidecar-pod" did not resolve to an alias

After this reorder the same bed reaches prepare-venue with the resolved BOX
name instead of the deploy key, which is what this change is for.

It then fails one layer further on, in charly/charly/build_overlay.go, which
reuses the qualified BOX name as an IMAGE ref:

  built     ghcr.io/opencharly/check-k8s-deploy-app:charly.check-sidecar-pod-2026.307.2144
  composed  charly.check-k8s-deploy-app:<tag>

That is opencharly/charly#968, already open and filed by another session
against a different consumer. It is not introduced here and cannot be fixed in
this repo, so this change lands at `analysed on a live system`: the changed
path executes live, the bed is not green.

Agent: containerd-crabbox-program, session 8b1c01cf-7f79-4a75-bff8-240415a06208
Assisted-by: Claude Code ollama-cloud/deepseek-v4.1-flash (analysed on a live system)
…ress

`charly config` resolved a qualified pod deploy to the BOX ADDRESS its deploy
named and handed that address to ensure-image as an IMAGE repo:
`charly.check-k8s-deploy-app:<tag>`, with no registry. The build had produced
`ghcr.io/opencharly/check-k8s-deploy-app:<tag>` — the box LEAF under its
namespace's `defaults.registry` — so the config path failed with

    image not found in local storage: charly.check-k8s-deploy-app:<tag>

as measured on bed run 2026.307.2336, after the paired host fix (charly#1105)
moved the bed past deploy-add.

Mechanism: resolveDeployRefLocal composed the ref with
kit.ResolveShellImageRef("", deployBoxName, tag) — a literal empty registry —
while the registry qualification that existed ran 57 lines later, AFTER
ensure-image/ExtractMetadata, reading the registry from the IMAGE's OCI label.
That label is unreachable precisely because the unqualified ref fails the
existence check first.

Fix: compose the ref ONCE, before any existence check, from the box the build
names — box registry, else its namespace's defaults.registry, then the box
LEAF — the same rule the host build path applies (resolveBoxImageRegistryName
plus ResolveShellImageRef). The post-hoc label-sourced qualification and the
redundant re-resolve on the start path are deleted (R2/R5).

Regression test: TestResolveDeployRefLocal_QualifiesTheBoxBuildRef drives both
spellings that reach the resolver (the per-host `image:` box address and the
project deploy map's bare leaf) and asserts the build's ref. It fails on the
pre-fix composition with the exact measured strings, and it fails again when
the FindBoxByLeaf fallback is disabled.

Refs opencharly/plugin-build#46 and opencharly/charly#968. The R10 bed
(charly.check-sidecar-pod) is the coordinator's post-push gate; this commit
claims the module gate only.

Agent: containerd-crabbox-program/44cfg, session 8b1c01cf-7f79-4a75-bff8-240415a06208
Assisted-by: Claude Code ollama-cloud/deepseek-v4.1-flash (analysed on a live system)
@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown

Review — BLOCK

Head SHA: 48c99de9ad94eb938f921621ddf1dc845f9b9dbd (branch: fix/prepare-venue-resolve-box-name-r2)

Change class: code (Go) — bug fix in the plugin-deploy-pod candy. Placement CORRECT (capability stays in the candy; no core/sdk mechanism move, no alias growth, no new charly/ import).

Security screen: PASS — no secrets, no egress, no weakened guardrails, no instruction-injection in the body (its "written clean from the start" prose is descriptive, not a directive to me).

Blocks

  1. A3/R10 — the body flatly contradicts itself on the R10 result, and the tier is claimed against the contradiction.

    • "How tested" states: "Run 2026.308.1106, RC=0 … 19 of 19 steps PASS", "The plugin in that run is this PR's code, byte for byte … built from tree 6cc21e9d", and "R10 IS claimed … Run 2026.308.1106 on that target: RC=0, errors: 0, 19/19 steps PASS."
    • The Rulebook-compliance table's R10 row states the opposite: "bed run in the paired round and red at config; the fix is pushed for the coordinator's fresh bed run. Not claimed as passing."
    • Both cannot be true on the same head. This is exactly the defect the body itself attributes to #44 ("a stale 'RED at config, not re-run' sentence left standing beside a green run, a tier claimed against that contradiction"). The fully tested and validated tier (A3) is therefore claimed against a body that says "Not claimed as passing."
    • Fix: make the R10 row state the actual current result (PASS on run 2026.308.1106, this head's tree), or delete the stale "Not claimed as passing / fresh bed run pending" text and align the entire body to one truth. The tier can only stand once the R10 row agrees with "How tested."
  2. A1 — ## Filed issues contradicts "How tested" on charly#1105.

    • "Honest scope" says the run's host half was "merged as … charly#1105 (43348efbdb8f…, tag v2026.308.1507)".
    • ## Filed issues says "Fixed by opencharly/charly#1105 (open, producer-first)".
    • A merged tag and an open PR are mutually exclusive. If #1105 is not merged, the R10 run could not have composed it — which would undermine the green run the tier rests on. Fix: state the true status in both places.
  3. R5 / CONC(d) — the sweep claim has no pasted command output. The R5 row asserts "grep -rn qualifyImageRef over the repo returns no hits (rc=1)" as prose. CONC(d)/R5 require the ACTUALLY-EXECUTED command and its real output pasted, not "I grepped and found none." (The diff does confirm qualifyImageRef is deleted, but the body's evidence must still be a pasted console block, as the module gates are.)

  4. A1 — an unaccounted diff item. config_setup.go changes loadDeploy from a plain func to a package var (a test seam). The body's file table describes only "the config path resolves through the same helper; no second qualification," and never mentions the func→var surface change. Every diff item must be accounted for. Fix: add the loadDeploy change (and its test-stubbing rationale) to the summary.

Comment intake: none (0 comments) — nothing to disposition.

Verdict: BLOCK


ollama-cloud/deepseek-v4.1-flash — action-review.

View action run

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown

Review — BLOCK

Head SHA: 48c99de9ad94eb938f921621ddf1dc845f9b9dbd (branch: fix/prepare-venue-resolve-box-name-r2)

Change class: code (Go) — bug fix in the plugin-deploy-pod candy. Placement CORRECT (capability stays in the candy; the box→ref composition uses spec primitives, no core/sdk move, no alias growth, no new charly/ import).

Security screen: PASS — no secrets, no egress, no weakened guardrails, no instruction-injection in the body.

Blocks

  1. A1 — a diff item is still unaccounted in the summary. config_setup.go changes loadDeploy from a plain func to a package var (+var loadDeploy = func(...)). The body's file table describes only "the charly config path resolves through the same helper; no second qualification after the existence check" — it never mentions the func→var surface change nor its test-stubbing rationale. The new resolve_box_name_test.go stubNoPerHost depends on it, so it is a real diff item. Add it to the summary. (This is the same gap the prior review raised; it was not addressed by the body edit.)

  2. R5 / CONC(d) — the sweep covers only qualifyImageRef. The R5 row pastes grep -rn "qualifyImageRef" --include=*.go . → rc=1, but the diff also renames/removes resolveDeployBoxNameLocal (replaced by resolveDeployBoxNameForKey). R5 requires every removed/renamed identifier to be swept; the body shows no executed check for resolveDeployBoxNameLocal and never names it. Paste the sweep for the renamed symbol (or state it is a rename with no other callers) as a real console block.

Comment intake

  • Comment 6635110571 (bot, @github-actions[bot]) — Block 1 (A3/R10 "Not claimed as passing" contradiction): stale-superseded — the current body's R10 row now says "run 2026.308.1106 … 19/19 steps PASS", consistent with How tested.
  • Same comment — Block 2 (charly#1105 open vs merged): stale-superseded — the current ## Filed issues now says "Fixed and merged as opencharly/charly#1105 … #968 closed", consistent with Honest scope.
  • Same comment — Block 3 (R5 prose grep): stale-superseded — the R5 row now carries a pasted console block.
  • Same comment — Block 4 (loadDeploy func→var unaccounted): verified-blocking — survives against the current body (see Block 1 above).

Verdict: BLOCK


ollama-cloud/deepseek-v4.1-flash — action-review.

View action run

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown

Review — PASS

Head SHA: 48c99de9ad94eb938f921621ddf1dc845f9b9dbd (branch: fix/prepare-venue-resolve-box-name-r2)

Security screen: PASS — no secrets/egress, no weakened guardrails, no instruction-injection; body prose is descriptive, not directive.
Checklist: All applicable rules PASS or NA. Diff sums (+376/−155 across 6 files) match the body exactly; the 19-step bed list matches the claimed "19/19"; the two new tests and the deleted qualifier test are internally consistent with the resolver code.

Comment intake:

  • Comment 6635110571 (bot) — all four blocks stale-superseded, re-derived against current body: R10 row now states 19/19 steps PASS (no "Not claimed as passing"); #1105 stated merged consistently in both Honest scope and Filed issues; R5 now pastes real console greps; loadDeploy func→var now accounted in its own summary section.
  • Comment 6635476480 (bot) — both blocks stale-superseded: loadDeploy func→var is now named/explained; the R5 row pastes the sweep for both qualifyImageRef and resolveDeployBoxNameLocal (both rc=1) with the rename stated.

Non-blocking note: the R1 row's "the prior BLOCK's three blocks … in the round comment" is a minor count/reference inaccuracy — the visible prior block carried two, and the round RCA lives in the body's "Round 4 finding" section (with a real "Missed control" paragraph). The R1 substance is satisfied; no action needed to merge.

Verdict: PASS


ollama-cloud/deepseek-v4.1-flash — action-review.

View action run

@github-actions
github-actions Bot enabled auto-merge (squash) November 4, 2026 16:34
@github-actions
github-actions Bot merged commit e19aa12 into main Nov 4, 2026
13 of 18 checks passed
charly-auto-merge Bot added a commit that referenced this pull request Nov 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants