Skip to content

Repair 23 stale citations the cuts left behind — and say plainly that the lens which should have caught them still runs nowhere - #8774

Merged
briansrls merged 8 commits into
mainfrom
session/quiet-lark-881
Aug 21, 2026
Merged

briansrls merged 8 commits into
mainfrom
session/quiet-lark-881

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

What this fixes, and what it does not

v2.lens.cited_symbol_resolution is the mechanism DESIGN §3 names for making a stale citation decidable. Measured by execution on BuildBuddy against main: it refuses 27 production DeclarationRefs. It was not broken — it was unobserved. Every witness carrying its live-corpus claim lives in dag/test/claim/long/cited_symbol_resolution_witness_test.dag, a file classified OfflineLocalRecipe: enrolled, executed nowhere.

This PR repairs 23 of those references. It does not close the class.

The ceiling, stated rather than implied: after this PR the lens still runs nowhere. These repairs fix the instances, not the mechanism that let them ship. The remaining four references, and the enrolment that would make the class observable, are held in a separate change (below). A reader should not take a green tree here as evidence that a stale citation would now be caught. It would not be.

Why 23 references were dangling

Every one is a citation whose subject a deletion removed while the citation stayed authored — the §3 stale-citation class, in a structural carrier rather than in prose:

cause refs
v2.workflow.ci_floor_plan — module deleted by the floor cut 7
gunbc.ci_workflow — deleted by the floor cut 3
gunbc.falsifier_workflow + its witness — deleted with the falsifier 3
tools.regen_verify_transport / tools.floor_effect_gate_witness — deleted by the regen cut 2
relocated declarations (v1.compiler.emit_rust×3, v2.compiler.infer, the fast-lane rule note) 5
v2.workflow.required_floor RequiredFloorClaim — a Rust type in the seed, never a .dag declaration 1

The repairs, by class

Each class has a different correct answer, so this is not a bulk rewrite.

  • Relocated subject → repoint. v1.compiler.emit_rust → v1.compiler.coercion, v2.compiler.infer InferredTree → v2.compiler.inferred_tree, gunbc_ci_fast_lane_rule_note → gunbc.witness_row_cost (re-homed by the floor cut itself).

  • Dead work beside a live one → drop the dead reference (5 rows).

  • Dead work was the document's only one, document still live → rebind to what the document is actually about, with the rebinding recorded on the row: progress-observation-design → std.observation ObservationEvent; witness-realization-plan → std.emit_on_demand + std.realize_pack; ci-invocation-fixed-tax-attribution → the frontend root its own §5 names; floor-time-namespace-walk-regression-diagnosis → the reconcile-assembly row its §7 measures at 58% of the resolve wall; resolve-regression-journey and ci2-native-cutover-reobservation → the surviving work each already carried.

  • Whole subject deleted → enumerate, then delete the document with its bind and its inbound links. Two, each enumerated before deletion per DESIGN's rule that a prose row takes everything in it unless its contents are enumerated first:

    • falsifier-memory-root-cause-diagnosis — the A/B failure-class split, a witness list at a 2026-08-03 head, a governor receipt, an abandoned bisect, the falsifier job split. Enumerated, nothing survives the deleted falsifier; its one general lesson (BudgetExceeded is host-sensitive and is not a semantic verdict) is already carried by gunbc.witness_deferral_freeze.
    • regen-divergence-ratchet-shape — a shape proposal for a divergence ratchet on regen_stage0 --verify, deleted at the root by the regen cut. Enumerated, nothing survives; its B1 baseline-monotone idea is already DESIGN §5's monotone-debt-contract rule.

    Inbound links fixed in the same change: ROADMAP.md with its gunbc.roadmap_authority row, and seed-honesty-discharge-design.md.

Held out of this PR, deliberately

Split on my parent's direction so a scope question does not gate real repairs:

  1. The four remaining references are a different class — references into witness modules that v2.std.decl_index decl_facts deliberately never indexes, so they are uncitable through this resolver by construction, not stale. Measured with a positive control: all four target files report indexed_in_decl_facts=false / module_declared=true while src/v2/lens/cited_symbol_resolution.dag and dag/gunbc/doc_graph_roots.dag report true/true — the control proves the walk reaches src/v2, so the skip is on the file being a test file, not on the root. Their disposition consumes CitationIndexCoverage from Enroll both instance-gap carriers in cited-symbol resolution, with a counted outside-index disposition #8775.
  2. The enrolment — a cited-symbol phase in claim_executor --required-ci, measured at 2m13s, verified executing on real CI. The required floor cannot host this census: run_required_floor declines any entry that reads the live tree, and reading the live corpus is the census's whole subject. But CI keeps only the parse sweep, regen, and the witness floor: five phases leave --required-ci #8791 narrowed --required-ci from eight phases to three by operator ruling hours earlier, so whether a fourth goes in is that ruling's owner's call. Held on session/quiet-lark-881-phase.

gunbc-ci-auto-heal added 4 commits August 21, 2026 16:01
…ns an executing consumer

v2.lens.cited_symbol_resolution was RED on unmodified main and nothing ran it: every witness
carrying its live-corpus claim sits in dag/test/claim/long/, a file classified OfflineLocalRecipe.
Measured on BuildBuddy against main: 27 production DeclarationRefs refuse.

The repairs, by class rather than in bulk:
- relocated subjects, repointed: v1.compiler.emit_rust x3 -> v1.compiler.coercion,
  v2.compiler.infer InferredTree -> v2.compiler.inferred_tree,
  ci_floor_plan gunbc_ci_fast_lane_rule_note -> gunbc.witness_row_cost
- deleted subjects whose document keeps a live one: the dead additional_work is dropped
- deleted subjects that were the document's only work, document still live: rebound to the
  system the document is actually about, each with the rebinding recorded on the row
- documents whose whole subject a cut deleted: enumerated first, then deleted with their bind
  and their inbound links (falsifier-memory-root-cause-diagnosis, regen-divergence-ratchet-shape)

The four remaining refusals are a different class - references into witness modules that
decl_facts deliberately never indexes - and are wise-boar-649's typed counted disposition, not
mine to repoint.

Execution route: claim_executor --required-ci gains a cited-symbol phase. The required floor
cannot host this census - run_required_floor declines any entry that reads the live tree, and
reading the live corpus is the census's whole subject - so a phase, which is not a claim, is the
route. It reports every refusal with its typed arm instead of a count.
…s one dodge is refused by execution

Four documents bind to the witness that IS their evidence, and no resolver can reach it:
v2.std.decl_index decl_facts does not index declarations in test .dag files, so a reference into a
witness module refuses DECLARATION-ABSENT however correct it is.

Measured with a positive control rather than assumed (BuildBuddy, 2026-08-21): all four target files
report indexed_in_decl_facts=false / module_declared=true, while src/v2/lens/cited_symbol_resolution.dag
and dag/gunbc/doc_graph_roots.dag report true/true. The control is the load-bearing arm - it proves the
walk REACHES src/v2, so the skip is about the file being a TEST file and not about the root, and the
src/v2/test row is the same class as the three under dag/test/claim rather than a second one.

So the rows carry std.decl_ref CitationIndexCoverage - wise-boar-649's axis, consumed rather than
re-minted - and the population is counted, not silently subtracted.

THE DODGE THIS ADMITS IS REFUSED BY EXECUTION, NOT BY REVIEW. Marking a resolvable reference
outside-index would shrink the population and green the census over something nobody checked. The
report refuses such a row as OUTSIDE-INDEX-RESOLVES, per reference rather than by count identity: N
refusals against N claimed is satisfiable by the WRONG N refusing once the population is live.

Both arms executed on BuildBuddy against this head:
  census on the real type       -> []        (the 23 repairs hold; nothing else refuses)
  one resolvable ref marked     -> OUTSIDE-INDEX-RESOLVES gunbc.witness_row_cost gunbc_ci_fast_lane_rule_note

The guard lives in the phase rather than in a witness deliberately: a witness carrying it would land in
the same OfflineLocalRecipe file that executes nowhere, which is the defect this change exists to close.
@gunbai-bot

gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Receipts, all by execution on BuildBuddy against this head

The repairs hold. The census over the real production population returns [] — the 23 cut-orphaned citations are green, and nothing else refuses. Cost of the whole census including resolve: 2m13s wall / 2m09s CPU (~7% of a ~30 minute required-ci run).

An empty result is a claim about the instrument first, so here is the discriminating arm. Marking one resolvable reference outside-index — a mutation, reverted — makes the same report return:

OUTSIDE-INDEX-RESOLVES gunbc.witness_row_cost gunbc_ci_fast_lane_rule_note — marked outside the declaration index, but it resolves; the marking is false

So the [] is a measured green rather than a vacuous one, and the anti-dodge guard discriminates by execution rather than by review.

The four uncitable references are settled as one class, with a positive control. All four target files report indexed_in_decl_facts=false / module_declared=true; src/v2/lens/cited_symbol_resolution.dag and dag/gunbc/doc_graph_roots.dag report true/true. That control is the load-bearing half — it proves the walk reaches src/v2, so the exclusion is on the file being a test file, not on the root, and the src/v2/test row belongs to the same class as the three under dag/test/claim. One variant covers all four; no second minted.

The guard is per-reference, not per-count. A count identity (N refusals against N claimed) is satisfiable by the wrong N refusing once the population is live and moving — so each marked reference is asserted to refuse on its own.

cargo check --bin claim_executor is clean with the phase wired.

Blocked on

#8775 (CitationIndexCoverage in std.decl_ref), approved and mergeable, awaiting the operator's manual merge. Their type was overlaid locally to take the measurements above — an instrument, not part of this diff. On merge: integrate, re-measure both facts (the empty census and the 2m13s are facts about this head, not portable across the integration), then out of draft.

@gunbai-bot

gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

The failing check is the declared dependency, and the same log is the enrollment receipt

Run 32503722908 at 070fb09, required-ci: phases_run=9 failed=2. Both failures are one cause:

required-ci: phase cited-symbol (every authored DeclarationRef resolves)
required-ci: cited-symbol refused: resolve src/v2/lens/cited_symbol_resolution.dag failed:
  dag/gunbc/doc_graph_roots.dag:5:3: error: name 'CitationIndexCoverage' not found in module 'std.decl_ref'

CitationIndexCoverage lands in #8775, which is approved and mergeable and waiting on the operator's manual merge. This branch imports it; on main it does not exist yet. The floor phase refuses on the same unresolved import, which is why the count is 2 and not 1. Nothing else in the run is attributable here — the doc_reachability_witness_test and trait_derive_supplemental_generic_bound_contract_test diagnostics in the same refusal are downstream of that one unresolved module, or pre-existing on the merge base.

I am not fixing this by making the phase lenient. A census that cannot resolve its own subject is ignorance, not a pass, and the refusal above is the phase behaving exactly as specified. The fix is merge order: #8775, then integrate here.

What this run bought that no local measurement could

The phase executes on real CI. required-ci: phase cited-symbol appears in the ledger, runs, and refuses with a located, typed reason — so the enrollment is live rather than declared, which is the entire point of this PR. It also shows the phase failing without stopping the run: nine phases ran, the ledger is complete, and the merge-admission receipt was minted carrying conclusion=failure rather than a fabricated success.

Still draft. On #8775's merge: integrate, re-measure the census and its cost against the integrated head (neither figure is portable across the integration), then out of draft.

gunbc-ci-auto-heal added 2 commits August 21, 2026 18:24
# Conflicts:
#	src/v1/stage0/src/bin/claim_executor.rs
…ment moves out

The enrolment is a decision about the required lane's scope, made hours after the operator
personally narrowed that lane (#8791, eight phases to three). That is the operator's call to make
while the ink is wet, not mine to infer, so it is held as a separate change and these repairs stop
waiting on it.

Removed from this PR, unchanged and preserved on session/quiet-lark-881-phase:
- the cited-symbol phase in claim_executor --required-ci
- the lens report projection and its outside-index guard
- the CitationIndexCoverage disposition for the four uncitable references, which also depends on
  gunbc#8775 landing first

What remains is the repairs, which are independently correct and depend on nothing executing: they
fix 23 stale citations that the floor cut, the regen cut and the falsifier deletion left behind.

Also restored docs/plans/self-host-cargo-refusal-root-partition.md, which this branch had dropped
against main - another lane's document, deleted by a merge rather than by a decision.
@gunbai-bot gunbai-bot Bot changed the title cited_symbol_resolution_lens_is_green_on_live_corpus is RED on unmodified main and nothing runs it: all 16 witnesses are OfflineLocalRecipe, so the lens is enrolled but never executed in CI - find the dangling ref AND decide the execution route Repair 23 stale citations the cuts left behind — and say plainly that the lens which should have caught them still runs nowhere Aug 21, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 21, 2026 18:28
…landing artifact

dag/test/claim/long/cited_symbol_dangling_probe.dag is the throwaway module I used to read the
census and the index-coverage facts off a BuildBuddy runner. It was removed from the index once and
a later merge's `git add -A` put it back, which is how it reached review — where it read as an
intended artifact rather than as scaffolding ("the new probe module's imports all resolve").

It has no consumer, no dissolution obligation and no operator approval, so under DESIGN §6 it is an
undeclared scaffold and the correct landing state is its absence. Nothing depends on it: every
measurement it produced is already recorded in the PR discussion, and the same facts are reachable
from the lens itself in the held enrolment change.
@gunbai-bot

gunbai-bot Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Thanks — one thing in the review turned out to be a real finding, though it reads as a compliment.

The probe module should never have been here, and I have removed it (006fa48). "The new probe module's imports all resolve to existing files" is true and is exactly the problem: dag/test/claim/long/cited_symbol_dangling_probe.dag is the throwaway instrument I used to read the census and the index-coverage facts off a BuildBuddy runner. It has no consumer, no dissolution obligation and no operator approval — an undeclared scaffold under DESIGN §6, whose correct landing state is absence. I took it out of the index once and a later merge's git add -A put it back, which is how it reached you looking like an intended artifact. Every measurement it produced is recorded in this thread, and the same facts are reachable from the lens itself in the held enrolment change, so nothing is lost with it.

That is the general shape worth naming: a reviewer checking that a file is internally well-formed cannot see that it should not exist. The check that would have caught it is the one this PR's own subject is about — whether an artifact has an executing consumer.

One diff entry is not a change of mine. docs/plans/self-host-cargo-refusal-root-partition.md shows +54 lines against the PR's merge base; that content came from main through a merge, and git diff origin/main -- <that file> is empty, so my branch is byte-identical to current main there. Merge-base artifact, not an edit.

Nothing else in the review needs action — the rebinding notes, the de-linking of the two deleted plans, and the §3/§4b framing are what the review confirms rather than questions.

— sent from quiet-lark-881

@briansrls
briansrls merged commit 531a107 into main Aug 21, 2026
1 of 2 checks passed
@briansrls
briansrls deleted the session/quiet-lark-881 branch August 21, 2026 22:44
briansrls pushed a commit that referenced this pull request Aug 22, 2026
…rose has no edge to refuse along (#8910)

gunbc.ci_spec gunbc_ci_collect_fleet_convergence_invoke read, present tense,
that it is the LIVE invocation wire for collect_fleet_convergence_wet, runs on
main pushes downstream of the required ci check from srv1, and executes on a
real cadence. It has ZERO consumers and built a step for ci.yml, which #8283
deleted. Measured 2026-08-22: no file under .github/workflows names that
function; the three surviving workflows are witnesses, fleet-converge and
fleet-desired.

It cost real time. Read before the code, it agreed with what the code looked
like, and it nearly produced a report of live SSH actuation against two rack
positions with no chassis in them. Only enumerating the surviving workflows'
--entry points separated the claim from the fact.

The doctrine row is the general finding, and it is why this is ONE sentence
corrected rather than a sweep (operator ruling): delete-first rests on the
deletion BEING the census, every real dependent refusing loudly -- and a
carrier that NAMES the deleted thing rather than importing it has no edge to
refuse along. ci.yml is still named 99 times across 39 .dag files. Correcting
seven sentences would fix seven sentences and leave the class open; the next
workflow deleted decays identically. #8774 already ran that sweep once for the
adjacent cited-symbol class, one day earlier, and could not see this
population at all -- because a cited-SYMBOL lens cannot see a referent that is
not a symbol.

The next rung is verified rather than proposed: the path is ALREADY a symbol.
gunbc.generated_artifact carries WitnessFloorYamlArtifact as a variant of a
closed coproduct, so a carrier pointing at the variant instead of the filename
gets its census from match exhaustiveness -- the refusal is structural and no
lens has to run.


Claude-Session: https://claude.ai/code/session_012q31BK3okLA8vG4kdTWtBf

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant