Repository navigation
Split the extdeps scope-placement gate's two bases; make its refusal loud - #7660
Conversation
# Conflicts: # dag/gunbc/extdeps_scope_frontier.dag
# Conflicts: # dag/extdeps/session_dashboard.dag # dag/gunbc/extdeps_scope_frontier.dag
…loud The placement arm now reads origin/main...HEAD (what THIS change adds) while the freeze arm keeps legacy_manifest_freeze_sha..HEAD (the whole post-freeze population it inherently needs). Feeding both arms the freeze base meant one unrostered file on main refused every open branch, so the blocked party was never the party at fault. Loudness: claim_executor now projects the failure-receipt companion that cli_run has projected since the Lane B agreement work, and the companion name derives from _passes as well as _holds. Without both, the gate witnesses were unreachable from that channel and ten consecutive main reds reported nothing but 'returned Bool(false)'.
This reverts commit 77382ce.
…he base The renamed control asserts what it actually tests (an empty change set admits). The base wiring is one frame above these pure fns and is covered by executing the wet gate under a roster perturbation, recorded in the PR.
…n (review 47022) Names the lane (v1 exit), the concrete ROADMAP row (Get hand-written Rust in this repository down to zero, authority dag/gunbc/v1_deletion_plan.dag), and the dissolution trigger (deleted WITH claim_executor, not migrated ahead of it). States the measurable facts rather than asserting a census movement: zero new tracked-Rust paths, so the path-grain population is unchanged, and HandAuthoredLOC is an explicitly deferred axis of stage0_rust_honest_frontier_projection, so there is no line census to shrink.
|
Addressed in "Deleted scaffold path" — not applicable. This PR deletes no scaffold. Claiming one would be false. "Census shrink" — no census moves, and I verified this rather than asserting it.
"Explicit deferral naming a lane and concrete ROADMAP row" — this one is fair, and it is now discharged.
One constraint worth stating, since it bounds the alternative: writing this in The alternative to the ~20 seed lines was leaving the reason discarded — which is the §5 trap this PR exists to close. A refusal nobody can locate is not a refusal anyone can act on, and that is precisely what cost two sessions on the main red this follow-up came out of. — sent from nimble-seal-512 |
Main is red on extdeps.transports.rest importing ContentHash from std.types after #7480 moved it to std.content_hash. A dedicated repair PR (#7656) plus #7650 and #7648 already carry the fix, and the full repair also needs the coproduct construction in rest_exchange_replay_test.dag. Keeping #7660 scoped to the gate rather than racing three lanes on the same file.
|
Note for whoever merges, since review 47108 picked up on the rest-exchange test change: #7663 is the owner — it repairs main's second #7480 breakage (the bare string no longer inhabits the The two copies are byte-identical, so the merge is clean in either order, and the file drops out of this PR's diff once #7663 lands and this branch merges main. No action needed; flagging it so it is not read as scope creep or as a conflicting edit. Worth knowing while assessing this PR's CI: it is red on main's breakage, not on this diff. — sent from nimble-seal-512 |
The two follow-ups from the #7644 diagnosis of the ten-run
extdeps_scope_placement_gate_passesred on main.1. The gate read one base for two different questions
scope_placement_added_pathsdiffedlegacy_manifest_freeze_sha..HEADand fed both arms. The membership arm asks "does this change introduce an unrostereddag/extdepsfile"; the freeze arm asks "does any manifest row name a file created after the anchor". Only the second is inherently a whole-population question.Consequence: one unrostered file on main refused every open branch, and the party blocked was never the party at fault. #7573 added
dag/extdeps/session_dashboard.dageleven seconds after the gate landed in #7571, its own CI ran against a gate-less base, and main then refused ten consecutive runs while unrelated lanes spent sessions proving the red was not theirs.extdeps_scope_frontier_lawmeanwhile claimed "only paths the change itself introduces are judged" — true of the intent, false of the mechanism.Now: membership reads
origin/main...HEAD, freeze keepsfreeze..HEAD. One shared fold (diff_added_paths_observation) builds both, so the base is a call-site parameter rather than a duplicated parse. The verdict splits into two pure functions with the livemanifest_remove_only_verdictkept outside them, so both are hermetically testable.This is a trade, not a pure win, and it is declared rather than absorbed. The freeze-base read incidentally re-verified roster membership across the whole post-freeze population every run; merge-base grain does not.
scope_placement_base_split_noterecords the narrowing with bounded population, residual detection, and a restoration trigger (thev2.lens.mandatory_tagregion promotion), per DESIGN §4b meta-obligation 3.2. The refusal was mute in CI
The gate built a located diagnostic naming the offending path;
tools.ci_gatesexit_okdiscarded it one frame above, so CI reportedreturned Bool(false)and nothing else.The
*_failure_receiptcompanion mechanism already existed (v2.std.native_agreement, whose authority note describes this exact class). It was unreachable here for two independent reasons, and fixing either alone ships dead code:failure_receipt_companionderived the name from_holdsonly; every cheap-floor gate witness ends_passes.claim_executor— the binary CI actually runs — never invoked the companion at all, thoughcli_runhas since the Lane B work. A genuine dual-surface divergence: the same witness was loud locally and mute in CI.Both now route through the one derivation and the one runner. The Rust delta is ~20 lines and adds no new mechanism.
Verified by execution
Kernel controls, six new plus the four pre-existing ones that could have broken — all PASS via
claim_batch.The base wiring is not covered by those, and the note in the witness file says so explicitly. The verdict fns are pure in the observation handed to them, so nothing asserted there can distinguish which base produced it — a regression feeding the membership arm the freeze base would leave every witness green. An earlier draft of that note claimed the opposite; it was wrong and is corrected in-file.
The wiring is covered by executing the wet gate under a perturbation that reproduces the incident. With the
session_dashboardroster row removed, the freeze population carries an unrostered file while this change adds none:ExitSuccess— old wiring refused here; this is the fleet-block, goneExitFailurenamingdag/extdeps/tmpprobe/probe.dagreturned Bool(false) |Gate-equivalent compile-clean: 0 blocking errors.
Closing the wiring hole in-corpus needs a structural reader over the call graph asserting which observation function feeds which arm. That is the honest next step and is not built here.
🤖 Generated with Claude Code