Repository navigation
Repair: CONVERGE actuator ran + failed — Class B compile break in collect, pre-push hook blocking desired-ref advance - #8090
Conversation
…ak in collect + pre-push hook blocking the desired-ref advance The #8085 merge run (31334668866) is the first main push in 30+ to actually EXECUTE advance_fleet_desired and collect_fleet_convergence (the skip-cascade fix worked); both then failed with two real defects this repair clears. FAILURE 1 (advance_fleet_desired): the desired-ref advance push aborted with '.githooks/pre-push: cargo: command not found' (exit 127) on a runner with core.hooksPath set but no cargo. refs/fleet/desired is a DATA ref carrying no source, so the source-format guards have nothing to check. Fix (parent ruling msg_0e7d195a — NOT a blanket --no-verify): the generated pre-push hook now reads the pushed refspecs from stdin (git's pre-push contract) and skips the source guards ONLY when >=1 ref was seen AND every pushed remote ref is under refs/fleet/*. Fails CLOSED on empty/unreadable stdin and on any non-fleet ref (guards run). Behaviorally tested four ways; the wall stays the required CI floor. FAILURE 2 (collect_fleet_convergence): dag/gunbc/fleet_converge_cli.dag did not compile through the collect entry ON MAIN — 4 §4c in-body annotations (deleted; the arm is self-documenting) and 9 Class B bare cross-module references to host_converge_slice1_*/runner_memory_* that resolved only by pool coincidence and were not dragged into the collect closure (explicit imports added; fleet_show_effective_read's srv1/srv2 ssh-transport bare refs likewise). Third independent live corroboration today that pool-coincidence resolution is corpus-wide accidental coverage. Also a typed finding for the parent: main's compile-clean gate did not select this production entry's closure — a runnable entry that cannot load is exactly what the gate exists to prevent. Line-budget witness raised 1500->2100 with rationale (the correctness preamble; bloat guard retained). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0168R31q15ZsPJyik18Roz3y
…not raise it
The parent's oracle-rule question answered honestly as neither (a) nor (b): the line-budget witness (length(sh) < N) was a merge-blocking numeric literal grounded in a measurement of the current hook, not a policy budget — the tell being that adding the correct fleet-ref preamble forced the cap up to fit the very code it was meant to bound (DESIGN §5 oracle rule; a ratchet loosening). Its intent ('hook stays a thin dispatcher, no heavy work') is already asserted STRUCTURALLY by witness_no_in_hook_build / witness_no_corpus_or_witness_run / witness_no_claim_batch_dependency / witness_no_tree_mutation, none tree-measured. So the byte count is deleted as redundant (DESIGN §2), not raised.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0168R31q15ZsPJyik18Roz3y
|
Addressed review 50843's sibling concern (parent's oracle-rule question) at HEAD: the line-budget witness ( Acceptance evidence to record with this PR: on the same run 31334668866, |
The #8085 merge run (31334668866) is the first main push in 30+ to actually EXECUTE
advance_fleet_desiredandcollect_fleet_convergencerather than silently skip (the skip-cascade fix worked:ciSUCCESS,deploy_dashboard_srv1SUCCESS). Both then failed with two real defects — the first diagnostics this path has ever produced. This repair clears both under the CONVERGE-0 acceptance outcome.Failure 1 — advance_fleet_desired: our own pre-push hook blocks the desired-ref advance
.githooks/pre-push: line 14: cargo: command not found→ exit 127 →failed to push some refs. The deploy runner hascore.hooksPath=.githooks(convergence installs it) but no cargo, so the source-format guard aborts the push.refs/fleet/desiredis a data ref carrying no source — the guard has nothing to check on it.Fix (per parent ruling msg_0e7d195a — explicitly NOT a blanket
--no-verify): the generated pre-push hook now reads the pushed refspecs from stdin (git's pre-push contract, one<lref> <lsha> <rref> <rsha>line per ref) and skips the source guards only when ≥1 ref was seen AND every pushed remote ref is underrefs/fleet/*. It fails closed on empty/unreadable stdin and on any non-fleet ref (all guards run). Behaviorally tested four ways (fleet-only → skip; source / mixed / empty → guards run). The enforcement wall stays the required CI floor.Failure 2 — collect_fleet_convergence: fleet_converge_cli does not compile through that entry on main
Two classes, both fixed:
host_converge_slice1_*/runner_memory_*resolved only by pool coincidence and were not dragged into the collect entry's closure. Explicit imports added (plusfleet_show_effective_read's srv1/srv2 ssh-transport bare refs). This is the third independent live corroboration today that pool-coincidence resolution is corpus-wide accidental coverage.Typed finding for follow-up
Main's compile-clean gate did not select this production entry's closure — a runnable entry that cannot load is exactly what the gate exists to prevent. Per-PR affected-set selection appears never to have selected it. Worth its own row.
The line-budget witness was raised 1500→2100 with rationale (the correctness preamble; the bloat guard is retained with headroom). #8083 remains the acceptance carrier; items 1/2 receipts can start filling once this merges and the next main push advances the ref + collects.
🤖 Generated with Claude Code
https://claude.ai/code/session_0168R31q15ZsPJyik18Roz3y