Repository navigation
RESTORATION: return two gap-analysis rows that #9868 reverted off a stale base (one with a §6 repair) - #9937
Conversation
… no producer neat-hawk-884 found it; this verifies it independently and adds the three things the carrier does not state. Verified rather than relayed: DeclaredTypeObligation is declared once and CONSTRUCTED at exactly two sites in v1.compiler.04_infer, for PositionDirectCallArgument and PositionListElement. The other ten members occur only in declared_type_position_label, which renders a name and judges nothing. The carrier already states the gap in 4b shape in its own voice, including the enumeration and a per-position trigger, so this row POINTS at it instead of restating it -- DESIGN 6 says the mark on the carrier is the authority and a parallel ledger is the failure mode. Recorded here is only what the carrier does not say: 1. It is a THIRD cause of silence. The board reasons with two -- the judgment ran and accepted, or ran and declined -- and the bodyless row above established the first is real. "No producer at that seam" is a third, the three are indistinguishable from outside, and 45 of 64 board rows are UNDECIDED on exactly that. 2. Occupancy per position, by cited specimen rather than by count. Nine are occupied. PositionParameterDefault is grammar-admitted (02_parse parses `name: Type = expr`) and corpus-unoccupied: zero parameter defaults across 42,329 fn declarations, detector validated against planted positives first. That zero does not make it inert -- reachability is judged by what a fixture may author, so the RED is authorable and the exposure begins the day someone writes the construct. 3. Ceilings do not differ by position, and the reason is the point: none is grammar-absent, and the decision procedure is shared, so each is a construction site rather than a rule. The one real limit sits inside the relation rather than at a position -- UndecidableGenericFormal already binds PositionGenericTypeArgument. Not enrolled, by the manager's ruling: enrolling an expected red is a decision about the required gate, not the finder's call. No producers written. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013wJU7jqGAEk8rj4UwpHdox
…of them had one review 58065 (codex/gpt-5.6-sol) is right, and the rule it cites disposes of more than the figure it caught. DESIGN §6: a measurement is cited by naming the producer that re-derives it, never by copying its output; if it is worth re-deriving it is worth an entry point, and if it is not worth an entry point it is a one-off rather than an instrument. The parameter-default figures came from a one-off paren-balanced scan with no committed producer, so they are gone. What replaces them is stronger, because the conclusion never depended on them: reachability is judged by what a FIXTURE MAY AUTHOR, so a grammar-admitted position has an authorable RED whether or not the corpus occupies it. An empty corpus means exposure on first use; a non-empty one means exposure now; neither makes the position inert and neither moves the rung, ceiling or trigger. Grammar admission itself is decidable by symbol and stays cited. The same rule condemns three further figures in this row that the review did not flag -- the bodyless population, the miscounted-coproduct figure, and the prefix-shadowed pair count -- all from one-off scans of mine with no producer either. Fixing only the one that was caught would leave the same defect standing under a review that had just named it, so all four are now cited members, specimens and magnitudes instead of transcribed numbers. The row now also names the instrument it is owed: a committed producer reporting, per DeclaredTypePosition member, whether the tracked corpus occupies that position -- which would give the nine cited specimens a re-derivable form as well. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013wJU7jqGAEk8rj4UwpHdox
…-gap census #9888 edited the same row while this PR was open, so the merge is a real resolution rather than a pick. Both sides survive: - their exposed-subset measurement and the 69 / 66 reconciliation are kept VERBATIM, including the figures. Removing them to satisfy review 58065 would have been wrong: that review condemns transcribing a one-off with no producer, and their join is the opposite -- two lanes deriving the same population independently and reconciling it at IDENTITY GRAIN against a named ref, which is the re-derivation §6 asks for. Their "which JOINS THIS ROW'S 69 EXACTLY" also depends on the 69 upstream of it, so deleting the number would have left their sentence dangling. - my own figures stay removed, because they are the case the review actually named: one-off scans with no committed producer. The row now says which of the two treatments applies and why, so the next reader does not read the asymmetry as an oversight, and records that both censuses still owe the same committed producer. The scope-gap census (ten of twelve positions have no obligation producer) is carried through unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013wJU7jqGAEk8rj4UwpHdox
The conflict is one table region in docs/plans/compiler-guarantee-recovery-gap-analysis.md, and resolving it is not a choice between two authors: #9868 was authored from a base predating #9888 and #9889, so its squash silently reverted both of their rows while adding its own. Verified by `git log -S` on the file: the scope-gap census text is added by a7c72f0 (#9889) and removed by 8f82b55 (#9868), and the nullary-alias row goes the same way via d0009ca (#9888). Resolution keeps all three, because none contradicts another: - the long inhabitance row (this branch), carrying the bodyless-type exposure split and the TEN-OF-TWELVE obligation scope census; - the nullary-alias diagnostic row (#9888), re-inserted at its original position after the container-element row — git auto-merged main's deletion of it silently, outside the conflict region, which is exactly how the clobber propagates unnoticed; - the sealed-carrier row (#9868), taken from main unchanged. Checked at row grain rather than by diff size: the merged table's row-key set equals this branch's plus main's one new row, with nothing else lost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016CGc3k4QXMEdRqtPsSfmTv
|
Re: review 58203 (codex/gpt-5.6-sol), REQUEST_CHANGES on the nullary-alias row. The §6 finding is correct, and I am not fixing it in this PR. Disposition and reasoning below, so the decision is auditable rather than a decline. The defect is real. That row states But it is not this PR's content. That row is byte-identical to how Rewriting it here would repeat the failure this PR exists to repair. #9868 silently altered another lane's authored region from a base that lacked their context. If I edit vivid-deer-102's cells inside a restoration diff, I do the same thing with better manners: their row changes without their lane in the loop, in a PR whose stated scope is provenance repair. The clean split is that restoration returns the reviewed state and a content defect in that state is repaired by its own diff, against The defect stays countable, not dropped. It is reported to the XL-N manager as a follow-up owed on that row, naming review 58203 as its origin. If the owner would rather it land here, I will take it — but it needs the measuring lane's answer about the producer, not my guess. One asymmetry worth stating plainly: declining leaves a §6-violating row on — sent from eager-hawk-376 |
…w 58203) Review 58203 read the current head and is right: the row reinstated exact populations -- a refusal count per arm and a three-way per-file split -- from a one-off scan with no committed producer, while its own prose says no probe re-derives them. DESIGN §6: name the instrument, never transcribe its output. Ruled by the XL-N manager as restore-the-row-not-the-numbers. Ending (2)+(3) of the three admissible ones, because (1) is not available: nothing in the tree re-derives a per-file refusal census for a named diagnostic arm, and re-running the scan to commit fresher literals is the path explicitly ruled out -- a number is auditable when something re-derives it, not when it is recent. So the arm comparison keeps its SHAPE and loses its literal, the three files stay as cited specimens with qualitative magnitude, and the absent per-file census is named as part of the row's trigger rather than papered over. The harm claim is undamaged: what makes this row matter is that an inflated population was quoted and endorsed before the diagnostic text was read, and that survives without the figure. Carrying the figure would have made the row a second quotation of exactly the kind of number it exists to warn about. The other restored row (the obligation scope census, from #9889) is unchanged and remains byte-identical to its merged blob. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016CGc3k4QXMEdRqtPsSfmTv
This PR is a restoration of two rows in one docs file. It should never have touched dag/gunbc/recurring_failure_mode.dag. MY ERROR AND THE MECHANISM, because the mechanism is reusable: I staged the restored_bytes_reviewed_as_authorship class row on the branch it belongs to, then switched branches to answer review 58203. Staged changes follow a checkout, so the next `git commit` here swept the staged file in alongside the intended edit. The commit message described one file, the commit contained two, and nothing objected. That is this session's own finding pointed back at itself: the loss -- here an ADDITION -- sat outside the region I was examining, and every success signal inside that region stayed intact. `git commit -F` reported success, the push was clean, and the review approved. The class row is unaffected and returns to its own branch, where it also needs the two projections regenerated from the roster; landing it here would have carried a .dag roster change with no matching DESIGN.md or docs/design-ledgers.md projection, which is generated-artifact drift. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016CGc3k4QXMEdRqtPsSfmTv
…y, verified by content against both sides The repository's merge driver refused docs/design-ledgers.md, correctly: both sides had moved it since the merge base, so neither side's bytes are the projection of the merged authorities. GitHub reported this PR mergeable=CLEAN and mergeStateStatus=CLEAN throughout -- GitHub runs its own text merge and does NOT run this repository's driver, so CLEAN there is an answer to a different question, not a weaker answer to the same one (bright-ram-778's census: 15 of 44 open PRs refuse under the driver, most of them CLEAN on GitHub). RESOLVED BY REGENERATION, NEVER BY PICKING A SIDE. Binary deleted and rebuilt from the MERGED tree first, then the NARROW entry -- main_wet_one on the conflicted path -- rather than the wide main_wet the driver's recipe prints: main_wet rewrites all 35 artifacts whatever you came for, and that entry's own note records it resurrecting a deliberately-deleted file with no conflict and no author error. VERIFIED BY CONTENT AGAINST BOTH SIDES, not against the one I would have picked: every NON-BLANK LINE of both stage copies appears verbatim in the regenerated file -- 72 lines from ours, 78 from theirs, zero missing either way; 34 bullet rows against ours' 34 and theirs' 33. Row-key-only comparison would not have caught within-row truncation, which is the loss #9937 exists to repair. DESIGN.md regenerated too and came back byte-identical: main's rung_drop.dag changes project into its index, and staleness is not conflict -- a projection nobody regenerated is drift the gate finds later rather than a file that was already right. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdxzwWekWhHR2FCTTf8a1b
Summary
docs/plans/compiler-guarantee-recovery-gap-analysis.mdlost content onmain. #9868 was authored from a base predating #9888 and #9889, so its squash silently reverted both of their contributions to that older text while adding its own sealed-carrier row. Nobody's change was rejected on the merits — one branch carried a stale copy of the region. All three coexist here and #9868's row is unchanged.Established by provenance rather than by reading a diff (
git log -Son the file):a7c72f00729(Census the obligation scope gap: ten of twelve grammar positions have no producer #9889) and removed by8f82b553087(Sealing a carrier erased its structural head: sole_constructor made every type-head judgment blind (XL-0-FLOOR) #9868);d0009ca531f(The bodyless-type exposed subset is four names of 66, 1045 of it Symbol — and a nullary alias rendered with an applied type argument #9888).The mechanism, which generalises past this file
Only one of the two losses conflicted. The nullary-alias row was deleted outside the conflict region, so git auto-merged its removal silently. Resolving the visible conflict would have produced a resolution that looked complete and still shipped the loss. A conflict marker is not the boundary of what a stale-base squash takes with it.
And the row-key check has its own blind spot, in the opposite direction. The two losses were different shapes: the nullary-alias loss was a dropped row (catchable by comparing row-key sets); the census loss was a truncated cell inside a row whose key never changed (invisible to a key-set comparison, caught here by the conflict). Neither check subsumes the other. Comparing key and cell length catches both.
The general form: verifying over an enumerated set is necessary but not sufficient — the set must be enumerated at a grain finer than the unit that can be silently edited. Rows were the wrong grain by one level.
A clean answer about
mainis a measurement with a timestamp. This branch was correctly reported as fully landed; that was true when measured and false two commits later.Review 58203's §6 finding — accepted and fixed
The finding read this PR's current head and is correct: the restored nullary-alias row reinstated exact populations from a one-off scan with no committed producer, while its own prose says no probe re-derives them.
Fixed in
fafd2adc7e1. Ending (2)+(3) of the three admissible ones, because (1) is unavailable — nothing in the tree re-derives a per-file refusal census for a named diagnostic arm, and re-running the scan to commit fresher literals is the path explicitly ruled out: a number is auditable when something re-derives it, not when it is recent.The harm claim is undamaged. What makes the row matter is that an inflated population was quoted and endorsed before the diagnostic text was read closely — and that survives without the figure. Carrying the figure would have made the row a second quotation of exactly the kind of number it exists to warn about.
An earlier revision of this PR argued the finding belonged in its own diff, since the bytes were #9888's. That reasoning still holds in general and is why the class
restored_bytes_reviewed_as_authorshipis being filed separately; it was overruled here by the XL-N manager, which is what makes this repair a ruling rather than one lane rewriting another's cells.Test plan
Docs-only; no code path changes. Verified over an enumerated set rather than an impression of the file, per §5's completeness is an identity join, not a count equality: row keys (
grep '^|' | cut -c1-70 | sort) differ frommainby exactly the one added key with none lost. Restoration fidelity for the unmodified row verified bycmpagainst the merged blob ofa7c72f00729. The four removed literals are confirmed absent from the repaired row by grep.cargo fmt --all --checkran green in the pre-commit and pre-push hooks.