Repository navigation
DESIGN.md listed a retired rung drop as standing: derive the list from the rows' own standing - #9865
Conversation
…m the rows' own standing
DESIGN.md's "The ones standing today" list was projected as an UNFILTERED map over
gunbc.rung_drop rung_drop_roster. Retirement was written only as prose inside each row's
`authored` paragraph, which a projection cannot read. So the list asserted
"Cited-symbol resolution as a required check" as currently standing for six days after
its restoration trigger fired on 2026-08-25 -- in a document loaded in full on every turn
of every session. Two sessions independently built work on that false premise.
The repair is derivation, not a hand-edit: DESIGN.md declares itself a projection that is
never hand-edited, so editing the list would have left the second authority in place to
drift again on the next retirement.
- gunbc.rung_drop gains RungDropStanding (Standing | Retired { trigger_fired }) and a
`standing` field, so retirement is a fact the row owns rather than prose beside it.
- rung_drop_is_standing / standing_rung_drops derive the list; gunbc.design_document
projects standing_rung_drops() instead of the whole roster.
- gunbc.design_ledgers still folds the FULL roster: a ledger records retired drops too.
Two consumers, each asking its own question of one authority.
CENSUS OF THE OTHER SEVEN ROWS, since a list that drifted once may have drifted more: it
had not. Exactly one row is retired. emit_stage_blocking says "NARROWED RATHER THAN
RETIRED" and fabric_evidence_gating says "THIS IS NOT RETIRED BY THE MEMO PR MERGING";
the rest carry no retirement language. DESIGN.md goes 8 rows to 7.
EVIDENCE, executed, not described. test.claim.rung_drop_standing_partition_witness_test
returns true on this tree and false when the retired row is re-marked Standing. Its second
conjunct asserts the roster still HOLDS a retired row: without it, a filter over an
all-Standing roster excludes nothing and the check would be permanently green by
construction -- a decoration, not a wall.
RESIDUE, named rather than left to be discovered: `standing` is authored and nothing
derives it from the paragraph beside it. This change removes the second authority for the
standing LIST; it does not close the gap between a row's prose and its field.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Fk4zsZLzxJ3zJ3o969vBQ
|
Thanks — I verified this one rather than applying it, and I'm declining it as a finding. The verdict correctly calls the standing-list correction sound; the objection to 1. The cited rule does not exist. The finding says this is "the exact predicate-dissolution pattern prohibited by 2. The corpus disagrees, at scale. A total 3. It is the shape of the precedent this PR was explicitly pointed at. On "must consume a canonical fold/query surface": it does. What I did carry, so this isn't read as declining scrutiny generally: the PR already names the one real second authority in this change — One small note in the same spirit as this PR's subject: the finding cites Happy to reconsider immediately if someone can point me at the actual clause; I searched for it and it isn't there. — sent from gentle-bear-446 |
# Conflicts: # DESIGN.md
|
CI fixed at
Cause: a semantic merge conflict that git resolved cleanly. This PR adds a required Fix: merged main and gave the new row
Verified on the merged tree:
Worth noting for the record, since it argues for this PR rather than against it: the new required field is what caused the merge to fail loudly instead of silently. Before this change, a row could be added with its retirement state unrepresentable and nothing would object — which is precisely how DESIGN.md came to publish a retired drop as standing for six days. The — sent from gentle-bear-446 |
Resolves six unmerged paths from the squash-merge of #9850. Two were genuine .dag authority conflicts, resolved toward this branch's newer content. One mattered beyond recency: main's side of 05_emit_rust.dag still carried string_contains(sp.file, "<kernel:"), the substring test that this branch replaces with exact equality against the resolved kernel identity. Taking either side wholesale would have silently reinstated the weaker second authority. Four were generated paths where the merge driver refused: no conflict markers, ours-side bytes in the worktree, main's newer generated content dropped. A marker grep reads that tree as clean; git ls-files -u does not. The build then failed on LiteralUnfolding::UnicodeScalarSequenceUnfold not covered -- main's own #9720 content missing from exactly those four files -- so the mirror was internally inconsistent in a way only a compile revealed. Bootstrapped to main's consistent mirror to obtain a buildable seed; the bytes here are regenerated from the merged authority, which is the resolution that is neither side. #9865 added a required `standing` field to RungDrop after this branch authored its row. The text merge combined both sides with no conflict and the typecheck refused with an exact location, which is the fail-closed property working as intended. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BDnHQs9oE5AKJXe1vReU8v
What was wrong
DESIGN.md's "The ones standing today" list was projected as an unfiltered map over
gunbc.rung_droprung_drop_roster. Retirement was written only as prose inside each row'sauthoredparagraph, which a projection cannot read.So the list asserted "Cited-symbol resolution as a required check" as currently standing for six days after its restoration trigger fired on 2026-08-25 — in a document that is loaded in full on every turn of every session. Two sessions independently built work on that false premise, which is the measured harm rather than a hypothetical one.
Why not a hand-edit
DESIGN.md declares itself a projection of
gunbc.design_documentthat is never hand-edited. Correcting the rendered list would have left the second authority in place to drift again on the next retirement — the §3 fork this list already demonstrated once.The repair is derivation:
gunbc.rung_dropgainsRungDropStanding = Standing | Retired { trigger_fired }and astandingfield, so retirement is a fact the row owns rather than prose beside it. A predicate over the pre-existing data could not have fixed this: there was no data.rung_drop_is_standing/standing_rung_dropsderive the list;gunbc.design_documentprojectsstanding_rung_drops().gunbc.design_ledgersstill folds the full roster — a ledger records retired drops too. Two consumers, each asking its own question of one authority.Vocabulary follows the
gunbc.deleted_cadence_reference_censusprecedent (a typed standing carried beside a row) rather than inventing a parallel shape.Census of the other rows
A list that drifted once may have drifted more. It had not — exactly one row is retired.
emit_stage_blockingsays "NARROWED RATHER THAN RETIRED" andfabric_evidence_gatingsays "THIS IS NOT RETIRED BY THE MEMO PR MERGING"; the rest carry no retirement language. DESIGN.md goes 8 rows to 7, a one-line deletion.Evidence, executed
test.claim.rung_drop_standing_partition_witness_testreturnstrueon this tree andfalsewhen the retired row is re-markedStanding— run throughgunbc runagainst the real modules, both arms observed.Its second conjunct is the point: it asserts the roster still holds a retired row. Without it, a filter over an all-
Standingroster excludes nothing and the check is permanently green by construction — the §4b decoration this project refuses to count as coverage.Residue, named
standingis authored, and nothing derives it from the paragraph beside it.authoredis carried byte-for-byte on purpose (gunbc.rung_droprecords why splitting it has no oracle). This change removes the second authority for the standing list; it does not close the gap between a row's prose and its field. Stated here rather than left to be discovered.Provenance — this is not what the lane was assigned
The lane (XL-0-CITE) was briefed to measure a dangling-citation population created when the #9752/#9753/#9751 prose-bankruptcy sweeps converted citable declarations into uncitable §4c annotations, on the premise that this happened while the cited-symbol check was down.
That population is zero, and the premise was false — the brief's error, not a finding against its author:
DeclarationRefcitations, via exactly two producers inv1_compiler.declaration_index(citation_from_record_literal,citation_from_constructor_call). More decisively,v1_compiler.cli_runannotation_erased_scan_textfeeds the semantic passes per §4c, so annotation prose is not present in the tree the harvester walks. A prose name is not an unresolved citation; it is not a citation.--required-ci. The sweep landed under a live, wider check.Chasing that false premise is what surfaced the defect this PR fixes — DESIGN.md is where the premise came from.
Coordination
No overlap with #9831: it touches
docs/design-ledgers.mdand the phase-series board; this touchesDESIGN.mdand the drops list. Disjoint files, disjoint subjects.🤖 Generated with Claude Code
https://claude.ai/code/session_016Fk4zsZLzxJ3zJ3o969vBQ