Repository navigation
fix(check): give the generated build steps a build-sized idle window - #124
Conversation
The bed runner's image-build/vm-build steps run `charly box build`/`vm build` through the cli seam. The CHILD's own plugin dispatch carries the plugin-invoke idle guard, whose window is the project's readiness no_progress (default 90s); a build's IO-bound phases — the OCI bridge's podman load, a cold layer export — make no host-visible progress for minutes, so the guard read them as a wedged call and SIGKILLed the build (plugin-check#123, measured: "bridging ... into the podman store: podman load ...: signal: killed" at 2m2s). The build steps now carry CHARLY_READINESS_NO_PROGRESS=30m to the child through the seam's per-call env (spec.CliRequest.Env, merged over the inherited env by the host cli handler). 30m stays within the default absolute_cap (30m), so the child's readiness ordering validates without a second override; non-build steps keep the project's windows. Proven live: the distro-cachyos check-crabbox-pod bed, run with the fixed plugin compiled into a worktree charly, PASSED 14/14 (image-build 44s) with the parent's own window at 20s — a window that would have killed that same build without the override. Test: TestBuildStepEnvSizesTheChildGuardWindow pins the env and its resolution. Agent: dsh-crabbox-079 Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)
Review — PASSHead SHA: Security screen: PASS Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
…nd 1) The build-step env pass made every call site go through bedCliCombinedEnv, so bedCliCombined was dead: the repo's declared golangci-lint flagged it (unused) and the validator job failed on that step. One body, one name: bedCliCombinedEnv is the sole combined-capture seam. Agent: dsh-crabbox-079 Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)
|
RCA — validator BLOCK round 1 (declared-lint / dead code). Missed control. My local gate ran Root fix (this round). Prevention. Before a push in a repo with its own Agent: dsh-crabbox-079 |
Review — BLOCKHead SHA: Change class: code/config — Go Security screen: T3 description↔code mismatch — the current diff deletes Blocks
Comments considered
Verdict: BLOCK ollama-cloud/deepseek-v4.1-flash — action-review. |
…validator round 2) Round 2 named two things: the PR body still pinned the pre-cleanup head (the body edit was written but never applied to the PR), and the member/vm build-step rewiring had no coverage that would fail without it. Both are addressed here: - the diff now changes exactly ONE generated build call site - the root image-build step the cited bed exercises - so every changed site has a run that fails without the change (the 20s-parent-window proof); - the member image-build and vm-build steps are REVERTED to the plain step: they were not measured, and the VM path's child (plugin-vm, out-of-process) gets CPU progress from its own process tree, so widening its window was an unproven change. The remaining member/vm gap is filed separately. Agent: dsh-crabbox-079 Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)
|
RCA — validator BLOCK round 2 (stale body + unexercised call sites). Missed controls, two.
Root fixes (this round). The body for head Evidence on the final tree. Gate: Prevention. Apply the body from the same file in the SAME step as the push (one command sequence, Agent: dsh-crabbox-079 |
Review — PASSHead SHA: Change class: code/config — Comments considered
Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
Summary
Fixes plugin-check#123: the generated root
image-buildstep now sizes the CHILD's plugin-invoke idle window to a build, instead of leaving it at the project's readinessno_progressprobe default (90s), where an IO-bound build phase is indistinguishable from a wedged call.The mechanism (RCA). The bed runner runs the build step as
charly box buildthrough the cli seam. The seam deliberately sets no deadline on that child (hostBuildCli: "the context is NOT used as a deadline") and heartbeats the CALLER's activity clock while it runs. But the CHILD is itself acharlyprocess whose own plugin dispatch (plugin-build) carries the plugin-invoke idle guard, and that guard's window is the project's readinessno_progress— 90s by default. A build's IO-bound phases (the OCI bridge'spodman load, a cold layer export) make no host-visible progress for minutes, so the guard cancels the child and SIGKILLs the build:The fix. The root
image-buildstep passesCHARLY_READINESS_NO_PROGRESS=30mto the child through the seam's per-call env —spec.CliRequest.Env, which the host cli handler merges over the inherited environment (the seam's placement-invariant carrier). 30m stays within the defaultabsolute_cap(30m), so the child's readiness ordering validates without a second override. Non-build steps keep the project's windows.The seam. The diff deletes the old
bedCliCombinedwrapper (its only caller was the step runner) and makesbedCliCombinedEnvthe sole combined-capture seam, carrying both the combined capture and the per-call env. Round 2 correctly flagged that this rename was not accounted for in the body; it is now.Scope — deliberately narrow. Only the ROOT
image-buildcall site changed: it is the one the cited bed exercises, and the one whose death was measured. The memberimage-build-<member>andvm-buildsites were rewired in round 1 and reverted here — neither has a run that would fail without the change. They are filed as plugin-check#125 with the measurement plan; the VM path is plausibly already safe becauseplugin-vmis out-of-process (its guard counts peer-tree CPU via the #699 reader), but that needs measuring, not assuming.How tested
Head
4f130bab37786944dbf9d385d68b524f7d467946, treede92d4917f42c7c9723855e2fa06078f4e374ddc. Gate: the repo's own (go build/go vet/go testincandy/plugin-check/,charly box validateat the root) plus the assembled R10 bed the fix unblocks (distro-cachyoscheck-crabbox-pod), run live on THIS tree's plugin compiled into a charly binary.The final-tree gate
TestBuildStepEnvSizesTheChildGuardWindowpins the env name/value and asserts the child's resolver ACCEPTS it (a rejected override silently falls back to the 90s default — the defect itself); it fails to compile without the change.The live proof — the override reaches the child (final tree)
The plugin from THIS head was compiled into a worktree charly via a local
replace(reverted after the run; the binary identifies as2026.293.1057), and the bed was run with the PARENT's own window deliberately lowered to 20s — a window that would kill the same 44s build if the override did not reach the child:The bed's own assertions also pass in-venue:
crabbox --versionreports 0.79.0 (cbx-verb-version) and the verb dispatches with 0.79.0.The mechanism, bisected on the live host
2026.293.1139,2026.293.1145).2026.293.1030, 2m2s).NO_PROGRESS/ABSOLUTE_CAPraised, probe bounds at defaults: 14/14 PASS — the guard window, not the probe bound, is the mechanism.Rulebook compliance
/charly-check:check,/charly-internals:plugin,/charly-internals:git-workflowand this repo'sAGENTS.mdwere loaded before the change.Solve … context canceled; the raised-window bisect). check run SIGKILLs the generated image-build step at the 120s never-hang bound, so a cold distro-base build can never pass #123 is fixed here; the member/vm sibling gap is filed as The member image-build and vm-build steps still run under the 90s probe window (unmeasured; #123 scoped to the root image-build) #125, separately measurable and unproven either way. Zero warnings in the gate.bedCliCombinedEnv), one build-window definition (buildStepNoProgress/buildStepEnv); the dead wrapper is deleted rather than kept as a second path.CHARLY_READINESS_NO_PROGRESS, resolved by the child's ownResolveReadiness); no sleep, retry, suppression, or global readiness widening.bedCliCombinedno longer exists in the tree (the round-2 finding; the diff accounts for it).origin/main; tree clean before and after; the proof build's localreplacereverted; no force-push, no bypass.command:checkbed-runner behavior. The cited assembled bed ran on the final tree: 14/14, zero warnings; the one changed call site is exactly the one the bed exercises.Change classification
Plugin command/bed-runner behavior + one unit test. Attribution tier:
fully tested and validated— the repo gate passed on the final tree and the changed path ran live in the assembled bed.Filed issues
image-buildstep.image-build-<member>andvm-buildsiblings still run under the probe window; filed with the measurement plan (the VM path is plausibly safe via peer-tree CPU).Agent: dsh-crabbox-079
Assisted-by: DeepSeek Harness deepseek-v4.1-flash (fully tested and validated)