Skip to content

SCM work - #8921

Merged
briansrls merged 1 commit into
mainfrom
session/reachability-vs-occupancy
Aug 22, 2026
Merged

briansrls merged 1 commit into
mainfrom
session/reachability-vs-occupancy

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session gentle-eagle-360.
Pushing to session/reachability-vs-occupancy advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

Two rulings landed today that read into direct contradiction, and the
collision is destructive in one direction: a check whose RED IS
UNREACHABLE is a decoration, permanently green and worse than absent
because it gets cited as coverage; and an arm whose CURRENT OCCUPANCY IS
ZERO is legitimate and must not be deleted. Read carelessly the first
licenses deleting exactly what the second protects, and the deletion looks
principled while removing a live wall.

They do not conflict. The boundary is a three-question decomposition, and
only the first two bear on whether the arm should exist:

    mechanism existence  can any governing authority produce this state?
    join reachability    can it classify an element of THIS operation's
                         denominator?
    current occupancy    does anything receive it today?

Yes / yes / zero is a healthy guard being quiet. Unreachable means the red
cannot be produced at all; empty means it can and nothing does.

Two corollaries, each from a lane that got it wrong first and neither
inferred. Reachability is judged against what a FIXTURE MAY AUTHOR, not
what the accepted corpus contains -- a regression probe is an invalid
program by definition, so a state no Accepted program holds is usually
still authorable, and scoping reachability to corpus-expressible is the
same conflation one layer out. And an arm is reachable relative to ONE
operation: the scm path-exclusion disposition is unreachable from the
floor's fold, which drops excluded subjects before inventory, and reachable
from a join over admission rows, which exclusion never removes.

Filed in the recurring-failure-modes list because that is where a reviewer
pattern-matches and where both rules are read, and because the failure has
the shape its neighbours have -- it is a state-space conflation, two states
with opposite remedies collapsed onto one observation.

Neither ruling is restated or weakened here; this names the line between
them so that applying one does not silently execute the other.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 22, 2026 17:38
@briansrls
briansrls merged commit 9056bf0 into main Aug 22, 2026
1 of 2 checks passed
@briansrls
briansrls deleted the session/reachability-vs-occupancy branch August 22, 2026 18:04
gunbai-bot Bot pushed a commit that referenced this pull request Aug 22, 2026
…verted hand-added content

Review 54786 is correct and the cause is worse than a rebase artifact.

I resolved both files as generated artifacts -- took one side to clear the
marker, then regenerated through main_wet and committed the output. That is the
right discipline for a generated file and it produced a WRONG result here,
because both files carry content that exists in NO .dag authority:

- DESIGN.md: "authority substitution" (#8880), "reachability read as occupancy"
  (#8921), and the floor-counter measurement from run 32553487573 / 967b5bc
  (#8895). git grep over origin/main finds all three in DESIGN.md and in no
  .dag file at all, and dag/gunbc/design_document.dag is BYTE-IDENTICAL between
  my HEAD and main -- so the generator never carried them and regenerating on
  main's own tree would drop them too.
- .gitignore: four !docs/probes/... allow-listings, same shape.

So the deletion was not my merge losing a hunk; it was the generator faithfully
emitting an authority that no longer describes the committed file. Both files
have DRIFTED on main by hand-editing, and any regeneration by anyone silently
reverts the hand-added half.

Restored both to main's exact bytes: this PR now touches neither. The drift
itself is main's condition, not mine, and it is reported on the PR rather than
carried -- the generated-artifact drift gates are on DESIGN's own unguarded
list since the floor cut, which is precisely why nothing caught it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Aug 22, 2026
…-required-ci stays at three phases) (#8800)

* Repair 23 of the 27 dangling cited-symbol references, and give the lens 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.

* Drop the measurement probe from the tree — it is a local instrument, not a landing artifact

* The four uncitable references get a typed counted disposition, and its 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.

* A green names its denominator: the phase reports checked=N and fails if it cannot read one

An empty refusal list means BOTH "every authored reference resolved" and "there were no references
to check". Those are different states with different remedies, and the second is an instrument
failure wearing the first one's clothes — the empty-observation narrow, on the answer lattice's
bottom rather than its top.

So the phase now prints the population beside the verdict:

  required-ci: cited-symbol OK every authored reference resolves checked=390

390 measured by execution on this head (BuildBuddy). A population it cannot read FAILS the phase
rather than reporting a green over an unknown denominator — reading "nothing refused" as coverage
while unable to establish that anything was examined is the fabricated-plausible-output arm.

Both readers share one context construction (`cited_symbol_lens_context`): two constructions would be
two chances to answer from different trees, and a denominator is only meaningful for the census it
accompanies.

`cargo check --release --bin claim_executor` clean on this change.

* The partition witness went red because the population gained a third bucket — restate it as three terms, do not relax it

required-floor: FAIL test.claim.cited_symbol_resolution_witness_test
  .cited_symbol_production_population_excludes_planted_controls returned Bool(false)

That witness asserted all-works == production + planted-controls, an identity that held while every
authored work sat in exactly one of two buckets. Marking the four references decl_facts cannot index
as OutsideDeclIndexTestWitnessModule removed them from the production projection, so the two-term sum
went short by exactly four and the floor reported it. The witness was right and my change was
incomplete.

Restated as three terms rather than relaxed. The property it protects is that NO AUTHORED WORK FALLS
OUT OF EVERY BUCKET — a reference silently dropped from the production population is precisely how a
census greens over something nobody checked, which is the failure this lens exists to catch. An
inequality, or subtracting the outside-index rows from the left side, would each make that
undetectable. The exact sum also means a fourth bucket added later reds here too.

Worth recording where the catch came from: this is the partition witness wise-boar-649 asked for when
they handed over the disposition shape, doing exactly the job they named — a row cannot fall out of
both halves. It ran on the required floor, per-PR, and failed in the same run where the new
cited-symbol phase reported green with checked=390.

* The census is a separately named required check, not a fourth --required-ci phase

The operator narrowed --required-ci from eight phases to three (#8791). That
ruling is about what one composed entry point is responsible for, so this
census -- a different subject, over the live corpus -- gets its own named
check instead of being routed back in under that mode. --required-ci is left
at exactly three phases; its invocation in witnesses.yml is unchanged.

- claim_executor gains --required-cited-symbol as its own top-level mode,
  reporting every unresolved reference with the arm that refused it and, on a
  green, the population it checked (an unreadable denominator FAILS).
- gunbc.fabric_witness_run owns the argv, as it does for the floor, so the
  transport renders a command rather than re-spelling one.
- gunbc.witness_floor_workflow emits a second JOB -- a check-run is a job, not
  a step -- with no `needs` edge, so neither job can silence the other.
- witnesses.yml regenerated through main_wet, never hand-edited.
- the capability-closure witness gains the second live job as a subject.

Measured: cited-symbol: OK every authored reference resolves checked=390.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* The check caught its first live dangling citation on the merge ref, and repointing it is the fix

`--required-cited-symbol` went red on the merge with main: the doc bind for
gate1_repr_mismatch_e0308_diagnosis_2026-07-23 named
v1.compiler.emit_rust rust_string_grounded_type_alias_decl_line, and main
DELETED that arm when the two spelling roles it was compensating for were split
apart. The citation outlived what it names -- exactly the DESIGN §3 class this
census makes decidable, arriving from a direction no branch-local measurement
could see (the subject is branch + main, not the branch).

Repointed to rust_scalar_checkpoint_grounding_base, the successor for the
question that doc diagnoses: what a DECLARATION is grounded in.

Also corrected two mechanism claims the separate-check rework falsified in my
own carriers, which would have shipped as stale citations inside the PR that
fixes citations:
- doc_graph_roots outside_index_works_note said the anti-dodge report runs as a
  `--required-ci` phase; it runs as `--required-cited-symbol` in its own job.
- the lens's required_ci_phase_note is renamed and restated for the same reason.

Measured after the repair: cited-symbol: OK every authored reference resolves
checked=390.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Move the repoint rationale out of the row: annotations are module-item grain only

The floor refused my own last push with seven `source annotation sits inside a
declaration body` errors -- the `//` block explaining the repoint sat between
the fields of a HandAuthoredDocBind row inside a data list. DESIGN §4c models
annotations at module-item grain only, so that placement is unwritable, not a
style preference.

The rationale lives in the previous commit's message and on the PR; the row
carries the corrected reference and nothing else.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Share the lens context for real, instead of a comment saying it is shared

Review 54581: cited_symbol_lens_context's doc-comment claimed the context was
"built once and shared by both readers of it", while cited_symbol_census and
cited_symbol_population each built their own -- two reads of a tree that can
change between them, the exact hazard the comment said was closed. A stale
mechanism claim inside the census whose subject is stale claims.

Fixed in the direction that makes the comment true: run() builds the context
once and lends it, so both helpers now take a &InterpContext and cannot
construct a second one. The comment records what was false rather than being
quietly reworded.

Also corrected two neighbouring sentences the separate-check rework falsified:
the header said "RUN AS A PHASE" and the route paragraph called it a phase.

Re-measured: cited-symbol: OK every authored reference resolves checked=390
(3m07s local, unchanged -- evaluation dominates, so no speedup is claimed).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Order the two jobs instead of isolating their toolchains: ETXTBSY becomes unwritable, not rare

Operator ruling 2026-08-22, deciding the trade I declined to make unilaterally.

The race is this PR's cost, not a host condition: the cited-symbol job does not
exist on main. Both jobs are byte-identical through checkout, toolchain and
build, and when they start together on one self-hosted host both installs write
the SAME /home/ghrunner/.cargo/bin/rustc -- ETXTBSY, exit 126, measured at 1 run
in 5. The census step skipped, so the job reported no verdict rather than a
wrong one; the problem is not a wrong answer, it is that a required check
redding one run in five for reasons unrelated to the diff trains reflexive
rerunning, and that is how a real failure gets rerun away.

The floor job now `needs: [cited-symbol]`, so the census runs FIRST:
- the two setups cannot coincide, so the race is structurally impossible rather
  than rare (§5 construction over mitigation);
- the shared toolchain and registry survive, so the second build stays a cache
  hit -- the rejected alternative, per-job CARGO_HOME/RUSTUP_HOME, would pay a
  cold build on every run to avoid a collision on one in five;
- both jobs keep their own check identity, which was the point of the split;
- the fast signal comes first: minutes, not after ~30 minutes of floor.

What the edge costs is named in the carrier rather than buried: a red census
leaves the floor SKIPPED, so that run yields no floor verdict.

Also de-duplicated the two jobs' preparation into prepared_bound_steps(), so
checkout/toolchain/build are authored once and rendered twice rather than
copied -- the operator's second constraint, taken now so the copy cannot
calcify into two blocks that drift.

Landed in the authority (dag/gunbc/witness_floor_workflow.dag) and regenerated
through main_wet; .github/workflows/witnesses.yml is never hand-edited.

Verified green by execution: both live capability-closure witnesses and all
four workflow-consolidation witnesses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Remove the measurement probe: it is an undeclared scaffold, not a deliverable

dag/test/claim/long/cited_symbol_dangling_probe.dag was the instrument that
produced the 27-dangling-reference measurement. It has no consumer, no witness
enrolment, and no dissolution obligation, and it will not survive the terminal
architecture -- the census it was scaffolding for now executes as a required
check, so the probe's whole function is discharged.

I removed this same file once already on the repairs branch and it reached
review here regardless, because this branch carries its own history and the
file was re-added by the commit that opened it. Naming that rather than
quietly deleting: a scaffold removed on one branch is not removed on another.

Kept out of tree, not out of reach -- the measurement it produced is recorded
in the PR body and its receipt in the commit history.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore DESIGN.md and .gitignore to main: my regeneration silently reverted hand-added content

Review 54786 is correct and the cause is worse than a rebase artifact.

I resolved both files as generated artifacts -- took one side to clear the
marker, then regenerated through main_wet and committed the output. That is the
right discipline for a generated file and it produced a WRONG result here,
because both files carry content that exists in NO .dag authority:

- DESIGN.md: "authority substitution" (#8880), "reachability read as occupancy"
  (#8921), and the floor-counter measurement from run 32553487573 / 967b5bc
  (#8895). git grep over origin/main finds all three in DESIGN.md and in no
  .dag file at all, and dag/gunbc/design_document.dag is BYTE-IDENTICAL between
  my HEAD and main -- so the generator never carried them and regenerating on
  main's own tree would drop them too.
- .gitignore: four !docs/probes/... allow-listings, same shape.

So the deletion was not my merge losing a hunk; it was the generator faithfully
emitting an authority that no longer describes the committed file. Both files
have DRIFTED on main by hand-editing, and any regeneration by anyone silently
reverts the hand-added half.

Restored both to main's exact bytes: this PR now touches neither. The drift
itself is main's condition, not mine, and it is reported on the PR rather than
carried -- the generated-artifact drift gates are on DESIGN's own unguarded
list since the floor cut, which is precisely why nothing caught it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Aug 23, 2026
…on (#8931)

* DESIGN failure-mode entries belong in the authority, not the projection

DESIGN.md IS A GENERATED ARTIFACT. `DesignArtifact => "DESIGN.md"` is in the
generated-artifact registry and .gitattributes binds the path to the
generated-artifact merge driver; the prose is projected from
dag/gunbc/design_document.dag. README.md and CLAUDE.md are symlinks to
DESIGN.md, so all three are downstream of that one module.

I edited the projection three times today. Two of those are ALREADY MERGED:

  authority substitution              #8880   authority 0 / projection 1
  reachability read as occupancy      #8921   authority 0 / projection 1
  total at the level examined         #8926   authority 0 / projection 0

So two entries currently exist only in the derived artifact on main. With
the drift gates and heal among the things the floor cut left unguarded,
nothing refuses this today -- which is worse than being caught, not better:
the next regen deletes both sentences and nobody learns why they vanished.
It is also the exact tell DESIGN section 6 lists, a hand-authored
projection the model should generate, committed in the document listing it.

This moves all three into the authority and leaves the projection matching.
Braces are escaped as \{ \} per the module's own convention (`CpuSocket \{
package: ... \}`); the prose contains no inner double quote, checked before
writing, because one closes the .dag string early and surfaces as a parse
error far from its cause.

VERIFIED TWO WAYS, AND NEITHER IS A REGEN RUN:

  parse    a scratch entry importing gunbc.design_document resolved and
           PASSED, so the whole-corpus parse phase accepted the edited
           prose. The pre-push hook runs cargo fmt and never parses .dag,
           so nothing else would have caught a broken string before CI.
  bytes    the authority row, unescaped, is byte-identical to the
           projection row: 7748 == 7748. A regen therefore reproduces
           DESIGN.md exactly rather than rewriting it.

I could NOT execute the generator to produce DESIGN.md, and say so rather
than imply otherwise: the regen cut re-derived the verifier half and not
the producer half, so run_required_regen writes a candidate tree only on
the path where the populations already agree. String equivalence plus a
parse resolve is what is available; a generator run is not.

Content is unchanged from #8880, #8921 and #8926 -- only the file. #8926 is
superseded by this and closed.

Found by swift-badger-524, who checked the authority rather than trusting
that a Markdown file is a Markdown file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* The counter refresh was projection-only too: port #8895 into the authority

A FOURTH edit of mine to DESIGN.md that never reached
dag/gunbc/design_document.dag, found by auditing the whole document rather
than only the row this PR started with. On main today:

  authority   offered=11615 routed=10253 ... run 32515441229
  projection  offered=11812 routed=10439 ... run 32553487573

#8895 repointed stale counters in DESIGN.md to stop a session planning
against a population that had moved. Putting that fix in the projection
means the next regen reverts it to the stale values -- the change would
have been undone by the mechanism it was written to protect against.

Ports all of it: the four counter substitutions, the derived 1373 / 11.6%
figure, the re-pointed meta-note, and the 437-character sentence raising
the standing question of whether a receipt line belongs in prose at all.

NO OTHER LANE HAS DRIFTED. A sliding-window comparison of every prose line
in DESIGN.md against the unescaped authority leaves exactly one candidate
that is not mine, and it is a false positive: that sentence is composed via
`documentary_ref_symbol_text(v1_maintenance_standing_ref)` rather than
stored literally, which is section 3's cite-the-symbol rule implemented
inside the generator. All four divergences were mine.

A NOTE ON THE AUDIT THAT FOUND THIS, because it nearly did not. The first
sweep probed one 100-character window per line and reported ZERO
divergences. My additions sit at the end of a 7748-character line, so it
sampled a region already known to match -- a confident clean result over a
subset of what the question ranged over, which is the class this PR's own
new entry names. It surfaced only because a zero that tidy was worth
distrusting.

Ported prose carries no double quote, backslash or brace (checked before
writing); the file's unescaped quote count stays even.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.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