Repository navigation
Delete the .dag residue of the deleted plan/walk CLI surface (PlanFunction, cli_invoke builders, walk_plan_stage fixture family) - #9286
Conversation
…ope-disposition witness a fixture home it owns #9228 deleted claim_executor's plan/walk surface and named its .dag residue rather than sweeping it. This is that cut, plus one repair the census surfaced. WHAT WENT, AT THE ROOT: PlanFunction and the plan argv builders. The coproduct modelled a closed roster of --plan-function targets; the flag no longer parses and the entry every variant named (src/v2/workflow/ci_floor_plan.dag) was deleted by the 2026-08-15 floor cut. Gone with it: claim_executor_run_plan_transport_argv, claim_executor_run_plan_shell, the notice-title normalizer and shell suffix that existed only to feed them, claim_executor.Executor.RunPlan, ci_spec's scheduler_invoke/scheduler_invoke_with/ floor_plan_entry/floor_plan_function/plan_artifact_plan_function, and gunbc_ci_floor_only_script. The --verify-build-artifacts half is UNTOUCHED and deliberately so: it is a live mode (fleet-converge.yml), so claim_executor_verify_artifacts_shell, claim_executor_bin_shell, release_bin_shell_path and SourceRootShellStyle all stay. cli_invoke's dissolve trigger is NARROWED to name only what survives rather than deleted, since the shell-vs-argv fork it records is still open for that one spelling. gunbc_ci_run_script emitted the release build AND a claim_executor --plan-entry line. The second half is deleted, not repointed at --required-ci: witnesses.yml already invokes that, and a second route to it here is the parallel authority the floor cut removed. The walk_plan_stage fixture family, whole: 11 fixture modules, the 379-line #[ignore] harness, its scaffold row and witness, and the seed_retention_frontier retained_test_harness row. Their sole driver was the plan.dag recipes #9228 deleted. v2.workflow.required_floor fixture_home_prefixes() and RequiredFloorDisposition:: DeclinedFixtureMember, with the cli_run.rs decode, branch, counter and TSV column. That arm's roster was one prefix and the family above was its entire population; its own header said "DISSOLVES when the fixture stops authoring test fns", and this is that condition. Coordinated with sleek-carp-211, who is modelling the enum in #9246 and asked for both sides deleted here. The pre-push witness-corpus gate. Not on the brief, found by the flag census: pre_push.rs built claim_executor and invoked --plan-entry/--plan-function on the deleted floor plan entry. Its EMISSION died 2026-07-25 when the operator made the hook fmt-only; its INVOCATION died 2026-08-25 with the flags. Two witness rows asserting "a .dag push arms a gate" are deleted rather than weakened -- measured against the roster, the corpus binding was the only thing making them true, so they were green against the plan and false about the hook anyone runs. THE REPAIR THE CENSUS SURFACED (tools.dag_compile_clean_scope): Three walk_plan_stage files were pinned as the roster and pool of the SCOPE DISPOSITION witness, which has nothing to do with plan/walk. Its own note records that these same specimens already moved once for exactly this reason -- from test/fixture/floor_skip, which died with affected-set selection. This would have been the third home. They are rehomed to src/v2/test/fixture/compile_clean_scope/, a home this witness owns: three modules, no test fn, no effects, one consumer. No discovery exclusion is needed because there is nothing to discover, which is a stronger construction than the dir-grain exclusion the old home required. AND THE PROPERTY THE NOTE CLAIMED IS NOW ASSERTED. The expectation was ExpectScopedContaining -- MEMBERSHIP -- so a selector returning the whole roster satisfied every row and the "strict-subset proof" the note describes was checked by nothing. ExpectScopedExactly compares the selected list to the expected list. EVIDENCE, by execution on a release gunbc (remote, one dispatch): control witness_touched_path_dispositions_hold -> true mutation give scope_isolated an import edge to scope_shared -> false The mutation is exactly the strict-subset violation; the old assertion could not see it. Rust: cargo check -p v1-compiler --bins clean, fmt clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Conflict: ci_layer_roots' walk_plan_stage_control_fixture_exclusion_note. Main edited the row beside it; this branch deletes the row itself with the fixture family. Took this branch's side -- the 2026-07-11 fixture-home ruling it carried is restated in witness_admission_fixture_note, which survives. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…aught dag/test/claim/dag_compile_clean_scope_witness_test.dag imports ExpectScopedContaining and pins the disposition row count. Both moved with the rehoming and I checked only the long-lane witness, so strict preparation refused with a name-resolution error before any site ran. Fixed at both ends: the import drops the deleted variant (ExpectSkip went with it -- it was imported and never used), and the pin goes 7 -> 8, which is the roster growing by one row because the strict-subset proof needs three specimens where the old home carried two. The pin doing its job here is the argument for keeping it: a count that had to be updated by hand is exactly what stopped this rehoming from silently shipping a roster of a different size than the one the note describes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…greens without running CI
REQUEST_CHANGES from codex/gpt-5.6-sol (review 56054), and the finding is correct.
WHAT I BROKE. This branch narrowed gunbc_ci_run_script to ci_release_build_script()
alone, because its other half emitted a `claim_executor --plan-entry` line naming an
entry the floor cut deleted. But `gunbc ci` is a real CLI subcommand, so what survived
was a callable verb that builds the release binaries, verifies the artifacts, and exits
0 -- under a name that says it ran CI. That is fail-open semantic dilution: the failure
mode is not a wrong answer, it is a CORRECT answer to a much smaller question, reported
under the name of the larger one. §5's absorbing-fallback rule is about a failure arm
that widens; this is its mirror at the success arm, a green that narrowed.
WHY DELETED AND NOT REBOUND. Binding the verb to `claim_executor --required-ci` was the
reviewer's other option and I am not taking it, on the grounds this branch already
argued in the commit that caused the defect: witnesses.yml invokes --required-ci, and a
second route to it is the parallel authority the floor cut removed. The verb also has no
distinct job left -- "build the release binaries and verify the artifacts" already has a
name, ci_release_build_script, and fleet-converge.yml already calls it. So the verb is
not an authority that lost its body; it is a name with nothing left to denote.
THE CENSUS, cut at the root and followed where it led:
dag/tools/gunbc_ci.dag the entry module, deleted
main.rs Commands::Ci + its arm the CLI verb
gunbc.cli_dispatch_surface "ci" row the modeled CLI surface
gunbc_cli_dispatch_surface.rs its generated mirror
v2.workflow.ci_release_build_emit gunbc_ci_run_script, the wrapper
std.emit_on_demand gunbc_ci_emission_surface the wet-surface row naming tools.gunbc_ci main
emit_on_demand_kernel_witness_test its enrollment assertion
wall_residue_live_test residue_gunbc_ci_clean a test fn whose subject was the deleted file
ci_release_build_script itself is UNTOUCHED and still has three consumers
(ci_materialization, fleet_workflow_steps, fleet-converge.yml). Only the wrapper goes.
EVIDENCE, build lane on this tree (remote, one dispatch):
required-ci: lane=build phases_run=2 failed=0
regen first_generation_equal=true -- the mirror edit is byte-equal to the emitter's
own output, established by the gate rather than
by my reading of the diff
v2-emission blocking=0, census 3792 -> 3791, the one deleted module
The emitter-gap witness still holds: gap_is_non_empty_while_the_divergence_row_stands
needs at least one AbsentFromEmitMainRs row and 17 remain after this one goes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…enty-seven witnesses that were never its DESIGN authorised this cut and got its population wrong, which is the finding rather than a footnote. The row read "v2.lens.cited_symbol_resolution and its sixteen witnesses are not deleted -- they are unreachable from any required check and are dead rather than competing". Both halves of that population claim are false, and this change corrects the row in the same diff that falsifies it. SIXTEEN WAS THE COUNT AT #7707, when the lens landed. The file grew twice after (#8673 enrolled roster_registry, #8775 the two instance-gap carriers) and held 27 `test fn` identities. `gunbc.ci_layer_roots` said "eighteen". Three numbers, three snapshots of a growing file, none of them current -- the transcribed-measurement class the standing rule already names. The replacement rows name their subject and no number. AND "DEAD" WAS TRUE OF THE LENS AND FALSE OF A THIRD OF ITS WITNESSES. Measured against the seven symbols that file imported FROM the lens, 6 of the 27 touch one. The other 21 do not. "The lens and its witnesses" was never one population, and the three-way split is: 6 LENS-BOUND -- die with it. The census-green claim, the three planted-control rows, the enrolled-population exemption identity, the ambiguous control. `declaration_index` re-derives this machinery as PLANTED_CONTROL_CITATIONS plus PlantedControlNoLongerRefuses. 6 RESOLVER-BOUND -- MOVED, not deleted, to test.claim.long.decl_ref_resolution_witness_test. They call `resolve_declaration_ref`, which lives in `v2.std.decl_ref_resolution` -- a module that SURVIVES with four other consumers -- and they are the only rows in the tree that execute its five-arm refusal. Deleting them because they sat in a file named for the lens would be the §4b(4) failure exactly: a climb deletes the redundant PRODUCTION machinery, never the discriminating RED and positive control. 15 CARRIER-BOUND -- MOVED to test.claim.long.carrier_reference_integrity_witness_test. Population and projection claims about the four carriers that PROJECT DeclarationRefs. Their resolution half is subsumed; their population half is subsumed by nothing. SUBSUMPTION IS SCOPED, not general: `declaration_index` extracts TYPED-LITERAL citations -- DeclarationRef record literals and the decl_ref/decl_field_ref constructors -- and reports computed reference fields as a coverage boundary. A prose reference inside a String is covered by nothing, before or after, and this change does not claim otherwise. THE PER-PR WITNESS IS RENAMED, NOT DELETED. test.claim.cited_symbol_resolution_witness_test never imported the lens; its one claim is a three-term bucket partition over gunbc.doc_graph_roots. Two readers independently concluded from its NAME that the resolution law was enforced per-PR -- it was not, a bucket identity was -- and after this cut it would have been the only cited-symbol-named thing left in the tree, reading as the law's residue. It is now test.claim.doc_graph_reference_partition_witness_test. Same borrowed-authority shape as #9252's fixture rehome, one layer up: there the home was borrowed, here the name. WHAT THE WALL ITSELF NAMED, because this was cut delete-first and the census is the deletion. The first corpus run after the cut reported six refusals: two IMPORT-MEMBER-ABSENT for a `CitedSymbolResolution` lens-id the registry no longer declares, and four PLANTED-CONTROL-RESOLVES for the exact rows #9211 declared as this cut's residue ("they delete with the lens, not before it"). Every one predicted, none discovered by reading. AND ONE GAP THE ROSTER DELETION WOULD HAVE OPENED, which is why those four rows are not simply removed. Each named one refusal arm of the cited-symbol wall. Three of the four arms already had controlled fixtures in tests/declaration_index_integrity.rs. THE FOURTH DID NOT: measured, the string `CitedFieldAbsent` did not occur in that file at all, so its only evidence anywhere was the planted row I was deleting. Deleting it would have left a refusal arm with nothing executing against it -- §4b(4) again, one level up from where I first hit it. `citation_to_an_absent_field_is_refused_and_a_present_field_is_not` is authored here, with its positive control, and a controlled fixture is the stronger oracle anyway (§5): the planted row only ever asserted that one hand-authored citation still refuses. PLANTED_CONTROL_CITATIONS is left EMPTY rather than deleted. Mechanism reachable, join reachable, occupancy zero -- a healthy guard being quiet, not a dead one. EVIDENCE, by execution (remote, release binaries): before after parse-clean files 4012 4011 the lens module modules 4012 4011 citations 1470 1466 the lens's four planted citations lens_modules 71 70 debt 42 42 UNCHANGED corpus findings 0 0 declaration_index_integrity 21 passed 22 passed the new field-absent pair THE DEBT COUNTS RECONCILE, and the brief's "46" is none of them. 38 = roster rows, counted. 46 = citation SITES at the time the roster's doc comment was written. 42 = citations currently suppressed by a row, the live measurement. debt is 42 before and after, and a row that stopped reproducing refuses as CitationDebtRowStale -- none did, which is the executable form of "the defects are still found". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
STACKED ON #9252 — that PR is approved and awaiting its floor lane, and this branch is cut from its head. Until it merges, this diff shows its commits too; the lens cut is WHAT THE BRIEF ASKED AND WHAT MEASUREMENT CHANGED. The brief was "delete
The middle row is the one worth reviewing. Those six are the only rows in the tree that execute a live authority's five-arm refusal. Deleting them because they sat in a file named for the lens is precisely what §4b(4) forbids — a climb deletes the redundant PRODUCTION machinery, never the discriminating RED and positive control. DESIGN'S ROW IS CORRECTED IN THIS PR because this PR is what falsifies it. It said "sixteen witnesses" and "dead". Sixteen was the count at #7707; the file grew at #8673 and #8775 to 27. CUT DELETE-FIRST, AND THE WALL NAMED THE RESIDUE. First corpus run after the deletion returned six refusals: two AND ONE GAP THOSE FOUR ROWS WERE HIDING. Each named one refusal arm of the wall. Three arms already had controlled fixtures in
EVIDENCE (remote, release binaries): THE DEBT COUNTS, since the brief said "46" and that is none of them. 38 = roster rows, counted. 46 = citation SITES when the roster's doc comment was written. 42 = citations currently suppressed by a row — the live measurement, identical before and after. A row that stopped reproducing refuses as Also renamed: — sent from crisp-swift-16 |
…sposition #9227 landed a .dag authority for the floor's admission order whose middle arm was the fixture home this branch deletes. #9227's construction is kept whole -- ModulePrefixMatch, first_module_prefix_match, and the typed LiveTreeDisposition input -- and only the fixture arm is cut, which is the wildcard-free wall doing its job: three consumers failed to compile rather than inheriting an arm. required_floor.dag: fixture_home_prefixes, DeclinedFixtureMember and the arm are gone. #9227's header argued the ordering was load-bearing BECAUSE a fixture member that also read the live tree had to report the permanent ownership fact over the staged prediction. That argument dies with the arm, so it is rewritten rather than left standing: the surviving long-home-over-live-tree precedence has no executing discriminator, since no site can be both, and the header now says so and says not to cite it as covered. discovery_census.dag: the arm is removed from census_partition_step and census_counts_add and the declined_fixture_member counter field with it. discovery_census_witness_test.dag: w_fixture_home_dominates_live_tree is deleted -- its subject is gone, and repointing it at a live fixture home is the borrowed -home move this cut already refused once. The mixed population stays at five sites, the fixture site becoming a second live-tree read, so every assertion denominated in the population size is unchanged and only the arm it lands in moved. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This branch is cut from the plan/walk residue branch, so it carries that branch's required_floor deletion and hit main's #9227 conflict identically. Merging the parent branch inherits the resolution made there rather than re-deriving it, which is the point: one resolution, not two. DESIGN.md was reported unmerged by the generated-artifact merge driver, which refuses BY POLICY whenever both sides touch a generated path -- it does not mean the content collides. It does not here: a three-way merge of the two sides is clean, and DESIGN.md and its authority dag/gunbc/design_document.dag each move by exactly the same one row, so the projection and its source stay in agreement. The drift gate is the check on that, not this message. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… the planted roster main populated Two paths conflicted. Neither was a collision in the ordinary sense; both were main landing work that ANTICIPATED this cut. declaration_index.rs. Main widened PLANTED_CONTROL_CITATIONS from a 3-tuple to a 5-tuple and actually added the four rows its own doc comment had been describing without ever adding. That comment says in terms that those rows "delete with the lens, not before it" -- and this change IS that deletion, so the empty roster is the scheduled event rather than a judgement call. The constant keeps main's 5-wide type. Main also added planted_control_findings_against, taking the roster as a parameter, with two controlled fixtures driving both directions. That is a BETTER argument for emptying than the one this branch had written, so the weaker one is deleted and main's is cited: the RED proving the arm works stays enrolled with an empty constant, which is what 4b(4) asks -- dissolve the production machinery, keep the evidence. THE PART THAT WOULD HAVE GONE RED. Main's debt roster carries seven rows citing test.claim.long.cited_symbol_resolution_witness_test, a module this branch deletes. Those citations are DELIBERATELY FALSE -- they are the evidence that the resolver refuses -- and they moved with their witnesses, so all seven are RE-POINTED to decl_ref_resolution_witness_test and carrier_reference_integrity_witness_test rather than deleted. Deleting them would have silently dropped seven obligations; leaving them stale would have refused, which is the contract catching exactly this case. The paragraph declaring the duplication "TRANSIENT, WITH A NAMED TERMINUS" is rewritten to record the terminus firing rather than left predicting a deletion that has now happened. DESIGN.md conflicted only because the generated-artifact driver refuses BY POLICY when both sides touch a generated path. A three-way merge of the two sides is clean with zero markers; the artifact's agreement with its authority is the drift gate's question, not this message's claim. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Auto-opened by session-dashboard for session
crisp-swift-16.Pushing to
session/crisp-swift-16-cited-symboladvances this PR.Worker attestation
Before flipping this PR to ready for review, confirm each item:
npm test,cargo test) and the result.Closes #Ndirective.Summary
TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.
Test plan