Repository navigation
Local instruments green a parse error: a specimen, not a new failure class - #10832
Conversation
A .dag authority edit carrying a PARSE ERROR returned green from two local
instruments and was refused by the required lane. Filed as a receipt on
`green_reported_over_a_population_the_instrument_does_not_own` rather than
as a new row, after running the fold test the last specimen used.
WHAT HAPPENED. `gunbc.v1_maintenance_standing` was edited so a data
expression began on the line after `=`. `claim_executor --required-floor`
returned `verdict=FloorClean`, `claims_failed=0`; the docs projection regen
wrote its outputs and exited zero. The required lane then refused on the
pushed head with `adjudication BLOCKING phase=parse (497 error(s))`, cause
`ChangedWitnessObservationFailed`, naming the file and
`expected expression, found Newline`.
WHICH BRANCH IT IS, MEASURED BEFORE FILING, because two different faults
produce the same green: either the file was planned, parsed and TOLERATED
(right denominator, insufficient predicate -- a different class), or it was
never in the population. IT IS THE SECOND. No import statement anywhere in
the corpus names `gunbc.v1_maintenance_standing`; the one witness that
appears to reach it consumes a `DeclarationRef` carrying the module path as
a STRING, which is a reference and not an import. The parser was never
tolerant -- it was never asked.
THREE NEIGHBOURS DISPOSED OF EXPLICITLY, since all three concern a
denominator:
- `required_lane_green_over_a_population_it_never_offered` is closest and
still not it. Its population is DECLARED CLAIMS preparation did not
offer this run -- the floor prints them -- so its subject belongs to
the gate's declared population and its repair is to offer the claim.
This subject carries no claim, appears in no exclusion list, and there
is nothing to offer.
- `instrument_answers_outside_its_domain` needs the instrument to ANSWER
about the subject and answer wrongly. Neither instrument answered about
this subject at all; both greens were true about other populations.
- `check_subject_shape_cannot_represent_the_state_the_check_detects` does
not fire: the state was representable, was represented, and the
required lane refused it by name.
THE MOST TRANSFERABLE PART, and it is why this is worth a receipt rather
than a note: the module's own §3c answer and this blindness are ONE FACT.
A module nothing imports is a module no closure-driven instrument reads, so
"no fold consumes it" and "no local gate can refuse it" are the same
statement from two directions. Any carrier whose declared consumption route
is human review is, for exactly that reason, invisible to every instrument
whose population comes from the import graph -- and that is decidable at
authoring time, without running anything.
NEXT-RUNG TRIGGER, at capability grain and deliberately NOT "authors should
run the right command": a locally runnable pre-push instrument whose
population is the CHANGED-FILE set of the working tree rather than the
witness closure, sufficient that a parse error in a module nothing imports
cannot return green locally. An instrument that merely PRINTS its
population is insufficient -- it leaves the join to the reader, which is
the step that failed here.
Verified on this head: projection regen clean, and
`claim_executor --required-ci --required-lane witnesses` exits 0 with no
adjudication BLOCKING (the 16 lines matching "blocking" are witness names).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
…ry-wide Census over all eleven modules in dag/gunbc/v1/, counted by their real module paths -- these are `gunbc.<name>` with NO `v1` path segment, and a census keyed on the DIRECTORY spelling matches nothing and manufactures ten false positives. v1_maintenance_standing is the ONLY one with zero importers; every sibling is imported, from v1_deletion_plan at 14 down to two at 1. That turns one observation into a finding with a control: the module GOVERNING EVERY v1 ADMISSION is the one nothing imports, and the ten-sibling non-zero result is the positive control establishing the pattern is not directory-wide. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
…er arm
Review 62440, and it is right in the sharpest possible place. The specimen
added by this PR declares its own rung as MITIGATABLE while the class's
standing rung line still read `mechanically preventable` -- so the row
reported the stronger arm while a weaker in-scope path stayed silent. That
is DESIGN §4b(1) rung inflation, committed in the row whose entire subject
is an instrument being read as covering what it does not, and in a row that
already applies this exact rule to its own mirror arm one paragraph down.
Scoping the lower rung to "THIS SPECIMEN" does not resolve it; that is the
scoping move that makes inflation invisible.
The class rung is now MITIGATABLE, stated as the minimum, with both paths
named and separated:
- the generated-artifact path stays at mechanically preventable, with the
reasoning it already carried;
- the local pre-push path is mitigatable, because nothing computes
whether a local instrument's population contains a changed path, so a
green from a run that never opened the file is still readable as
coverage -- and the specimen was caught only because the required lane
refused after the push.
Verified: projection regen clean on this head.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of ccbdb28: REQUEST_CHANGES.
The review-62440 rung correction is right. The class now reports the minimum across its in-scope paths: generated-artifact adjudication is mechanically preventable; the local pre-push path remains mitigatable because no local join establishes that the changed path is in the instrument's population. That fixes the prior rung inflation rather than scoping the weak arm away. The corrected module-name census is also valuable: dag/gunbc/v1/ is a filesystem locator, while the modules declare gunbc.<name>, so a census keyed on gunbc.v1.* would manufacture a zero-import population. Keeping that failed census in the row is appropriate.
One blocker remains in the new specimen. The row generalizes from this module's TWO coincident facts into an implication that is not true: Any carrier whose declared consumption route is human review is, for exactly that reason, invisible to every instrument whose population is derived from the import graph. Human-review consumption and import-graph reachability are orthogonal. A standing can be semantically consumed only by reviewers and still be imported by a witness or another module, in which case an import-closure instrument can parse it. What proves blindness in THIS specimen is the separately measured fact that gunbc.v1_maintenance_standing has zero importers; the human-review route does not prove that fact.
The sentence immediately before it needs the same grain discipline. A module nothing imports is a module no closure-driven instrument reads is the valid implication. No fold consumes it and no local gate can refuse it are not generally the same statement: a changed-file gate can refuse a source it does not semantically consume — the required lane in this very specimen demonstrates that. Keep closure-driven load-bearing and do not promote the §3c consumption answer into a reachability theorem.
Suggested repair: state that in THIS specimen human-review-only semantic consumption co-occurs with the independently established zero-importer fact; make the transferable rule the one the row already has elsewhere — enumerate the instrument population / ask whether it would read the changed bytes. Human-review consumption may be a reason to CHECK reachability, never evidence of its answer.
CI on this SHA is still pending, but this is a content blocker independent of CI. Any corrected head is a new subject.
…elate The specimen asserted a universal it had not measured: "any carrier whose declared consumption route is human review is, for exactly that reason, invisible to every instrument whose population is derived from the import graph." That is FALSE. Consumption route and import count are independent facts -- a module may answer §3c with "consumed by review diligence, not by any gate" and still be imported by ten others, in which case every closure-driven instrument parses it. The ten imported siblings measured in this same receipt are exactly that population, and this row never measured their consumption answers, so it had no basis for the generalisation at all. What the measurement supports is the other direction, and only that: ZERO IMPORTERS implies invisible to every closure-driven instrument. That is the one grep the row performed and it is sound. The §3c answer is demoted to what it is -- a correlate that made the blindness unsurprising here, not a cause and not a law -- and the import census is named as the thing that made it predictable at authoring time. RECORDED RATHER THAN QUIETLY CORRECTED, because it is the same move this row refuses one paragraph up: a shared property between two cases promoted to an identity law, doing the work the measured predicate should do. The fold argument on `absence_classifier_default_bucket` deletes a universal for precisely that reason. Committing it again in the adjacent paragraph is worth one sentence in the row, not a second class. Verified: projection regen clean on this head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of 9d2f19b: REQUEST_CHANGES.
The prior implication-direction finding is substantially repaired. The row now correctly demotes the §3c human-review consumption answer to a correlate, explicitly retracts the false converse, and grounds the actual incident on the independently measured import population. The rung correction and real-module-path census remain sound. I do not want the old human-review => invisibility objection reopened.
One narrower blocker remains, and this is a correction to MY OWN prior suggested wording. The replacement now states ZERO IMPORTERS IMPLIES INVISIBLE TO EVERY CLOSURE-DRIVEN INSTRUMENT. That is still too strong. A module can enter an import closure by being one of the instrument's ROOTS; it does not need an incoming importer. gunbc run --entry <that module> is the trivial shape. Zero importers proves only that no OTHER root reaches it through an incoming import chain.
The incident itself is still established: for the two local instruments named here, gunbc.v1_maintenance_standing was neither in their root/seed population nor reachable through imports, while the required changed-file lane did include it. So the repair is small but load-bearing: state the relation as subject not in the instrument's roots AND no root reaches it through imports => invisible to that closure-driven instrument, or equivalently make the transferable check is the changed path itself a root, or reachable from one? The existing ASK WHETHER THE INSTRUMENT WOULD EVEN READ THE BYTES YOU CHANGED sentence is already the right higher-level rule.
This matters because the row is explicitly trying to make the blindness predictable at authoring time. zero importers alone predicts the wrong answer for a direct-root instrument, so leaving the universal would encode another population shortcut in the row whose subject is population shortcuts.
The ten imported siblings remain useful controls for the directory-spelling census, and the §3c correlation paragraph may stay; neither answers root membership, which is a separate axis.
CI on this exact SHA is currently in progress; this content blocker is independent of CI. Any corrected head is a new subject.
…hability Review 5140436268. "Zero importers implies invisible to every closure-driven instrument" is still too broad: an instrument can read a module because that module is itself a ROOT of that instrument, with no importer anywhere. THE CORRECT CONDITION, stated as a narrowing rather than a new theory: the subject is NOT A ROOT of that instrument, AND no root reaches it through imports. THE COUNTEREXAMPLE IS LIVE IN THIS TREE AND IS THE MODULE THIS ROW ALREADY CITES, which is what makes the narrowing measured rather than a logical caveat: `test.claim.documentary_refs_witness` has ZERO importers -- checked across `dag` and `src/v2` -- and the floor parses it every run, because a witness module is a root of the floor closure rather than a leaf reached from one. The row contained its own refutation of the one-conjunct form. BOTH CONJUNCTS ARE ESTABLISHED FOR THE SPECIMEN, so the incident stands unweakened: `gunbc.v1_maintenance_standing` is not a root of the floor (whose roots are planned witness claims), not a root of the docs projection regen (whose roots are the ledger authorities it renders), and no root reaches it by import since nothing imports it at all. The mechanical test one line down carried the same over-broad claim in imperative form and is corrected with it: ask whether the module is a root of that instrument, and if not whether it is reachable by imports from one of its roots. The recognition rule itself -- "would this instrument even read the bytes you changed?" -- is unchanged. Verified: projection regen clean on this head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head re-review of 0ca2b82: REQUEST_CHANGES.
The prior implication-direction finding is substantially fixed. The row now correctly establishes the two required conditions for THIS specimen: gunbc.v1_maintenance_standing is not a root of either local instrument, and no root reaches it through imports. The live counterexample test.claim.documentary_refs_witness also makes the root conjunct measured rather than hypothetical: zero importers, yet parsed by the floor because it is itself a witness root. The §3c human-review consumption answer is correctly demoted to a correlate, not a cause, and the ten imported siblings are appropriately named as a population whose consumption answers were never measured.
One blocker remains, already identified by the requesting lane: the replacement paragraph still begins with the refuted one-conjunct theorem, A module nothing imports is a module no closure-driven instrument reads, and only retracts/narrows it later in the same paragraph. That topic sentence is independently citable and false in the same tree by the documentary_refs_witness counterexample. Delete or rewrite it so the paragraph starts directly at the two-conjunct condition.
The mechanical-test sentence one paragraph earlier IS repaired correctly: it asks root membership first, then import reachability, and says only when both answers are no can the instrument refuse nothing in the module. Keep that.
This is exactly the propagation lesson the lane surfaced: correcting the flagged sentence is not enough when the earlier claim already has copied formulations. The authority must carry no surviving one-conjunct version after the correction.
Exact-head workflow run 34216892316 is still in progress at review time, but this content blocker is independent of CI. Any correction moves the head and requires a fresh exact-head verdict. No merge action taken.
…slower TWO LIVE COPIES OF THE REFUTED ONE-CONJUNCT FORM SURVIVED THE REPAIR, and one of them was in the repairing paragraph itself. The paragraph opened "THE MECHANICAL FACT IS THE IMPORT COUNT... a module nothing imports is a module no closure-driven instrument reads" and only corrected itself two sentences later. That is assert-then-retract, and a reader who quotes the topic sentence -- which is what topic sentences are for -- carries away the refuted claim. It now LEADS with the two conjuncts and demotes the import count to the second of them, conditioned on the subject not being a root. The second copy was load-bearing in a sibling PR's body, where the same one-conjunct inference was the entire justification for retiring a vacuous verification citation. It happened to be true there only because the root conjunct also held -- established elsewhere and not stated there. Fixed in that body with both conjuncts named. THE PATTERN IS RECORDED IN THE ROW rather than fixed a fourth time: A CORRECTED CLAIM PROPAGATES SLOWER THAN THE CLAIM ITSELF. The over-broad sentence had already been copied into a topic sentence and a second PR body before the repair landed, so repairing the flagged site left two copies standing. The census is therefore not "did I fix the flagged line" but "where else have I already said this", and its domain is every surface the claim reached -- PR bodies and commit messages included -- not just the diff under review. A claim's blast radius is where it was REPEATED, and repetition leaves no diff. Verified: projection regen clean on this head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of 11ba50a: REQUEST_CHANGES.
The previous one-conjunct finding is substantially repaired. The recognition rule now asks the correct two questions at instrument grain: is the subject a root, and if not, is it reachable by imports from a root. The live test.claim.documentary_refs_witness counterexample is excellent evidence that zero importers alone is insufficient, and the topic sentence now leads with the two-conjunct condition rather than asserting then retracting the bad form. The rung correction, real-module-path census, and human-review-consumption-as-correlate framing remain sound.
One root-set quantifier survives in the 3c-correlation paragraph: it says a review-consumed carrier may be imported by ten other modules, in which case every closure-driven instrument parses it. Importability by those ten modules does not make the module visible to EVERY closure-driven instrument. A particular instrument still needs a root that reaches at least one of those importers. The point needed here is only that review consumption does not imply invisibility: imported modules CAN be visible to closure-driven instruments whose root sets reach them.
Please narrow that clause to the same per-instrument root/reachability grain now used everywhere else. For example: ...may perfectly well be imported, making it reachable to any closure-driven instrument whose roots reach one of those importers. The ten siblings remain useful candidate counterexamples; the row simply has no basis to quantify over all instruments.
This is the only content blocker I found on the current two-file diff. Current main remains 5e24cc9, matching the PR base. Exact-head CI is still pending and remains a separate gate.
Review 5140705709 / the side-chat pass found a THIRD quantifier defect in this row, in the paragraph that repairs the first one, and pointing the opposite way. THE SENTENCE: "a module may answer §3c with `consumed by review diligence, not by any gate` and still be imported by ten other modules, IN WHICH CASE EVERY CLOSURE-DRIVEN INSTRUMENT PARSES IT." WHY IT IS FALSE: importability makes visibility POSSIBLE, not certain. A particular instrument still needs a root that reaches one of those importers. The docs projection regen parses NONE of the eleven v1 modules however heavily they are imported, because its roots are the ledger authorities it renders. THE FIX IS A DELETION. That sentence establishes one thing -- that consumption route and import count are INDEPENDENT facts -- and needs no consequent to do it. The consequent is dropped and replaced with the sound, weak form: being imported buys visibility-as-possibility and nothing stronger. THE DIAGNOSIS MATTERS MORE THAN THE FIX AND IS NOW IN THE ROW. This row has made the same error in BOTH DIRECTIONS -- over-claiming INVISIBILITY (zero importers, therefore invisible to every instrument) and then, in the repairing paragraph, over-claiming VISIBILITY (many importers, therefore parsed by every instrument). "Keep remembering the root conjunct" predicts neither. THE HABIT IS ASSERTING A UNIVERSAL OVER INSTRUMENTS WHERE THE FACT IS PER-INSTRUMENT: visibility is a relation between a module and ONE instrument, decided by that instrument's own root set, so no property of the module alone -- import count included -- settles it for all of them. The check that follows is mechanical: any sentence quantifying over "every instrument" or "no instrument" is suspect by construction, in either direction. I ran that grep rather than waiting for a fourth report. Two occurrences in the row: this one, and the explicitly-quoted refuted draft, which is labelled false where it stands. The invisibility sentence is also re-stated per-instrument rather than universally. PR bodies swept: the only hit is the same quoted refutation. Verified: projection regen clean on this head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
…ch it THE SITE, in the paragraph disposing of `required_lane_green_over_a_population_it_never_offered`: "it is a source file that no instrument's population contains." Two sentences later the same paragraph says "the required lane refused it by name." BOTH CANNOT BE TRUE. The required lane's population is the changed-file set of the head under test, that population DID contain this file, and its refusal is the founding fact of the specimen. The sentence denied the row's own central observation. Corrected, and stated against both root sets rather than patched with one word: NEITHER LOCAL INSTRUMENT'S population contains it -- the floor's roots being planned witness claims, the regen's the ledger authorities it renders -- WHILE the required lane's population, being the changed-file set, does, which is why that lane refused it and why this row has a specimen at all. THE PART THAT MATTERS MORE THAN THE FIX. The mechanical check this row shipped one paragraph earlier -- grep for `every instrument` / `no instrument` -- DID NOT CATCH THIS, because the universal was carried by a possessive. So the check written to close the class did not close it, in a row about instruments read as covering what they do not, which makes the under-inclusive grep a defect of exactly this row's own kind committed inside its own repair. The row now says so: the grep is a SMELL TEST, not a census; a universal over instruments can ride on a possessive, a plural, a "none of", an "any", or a bare generic noun; and THE REAL CHECK IS THE EXPENSIVE ONE -- re-derive each visibility claim against the named instrument's ROOT SET. The grep is worth running first because it is free, and worth nothing as evidence that the row is clean. I THEN RAN THAT EXPENSIVE CHECK over every quantified visibility sentence in the row rather than only the flagged one. It surfaced one more assertion standing on an unstated conjunct -- "it is in no witness's closure" -- now derived instead: no witness reaches it by import, AND it is not itself a witness module so no witness carries it as a root. Verified: projection regen clean on this head. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of 7faad22: APPROVE on content.
The prior inverse-universal finding is closed. The row now treats visibility as a relation between one module and one instrument, with both root membership and import reachability explicit. The documentary_refs_witness zero-importer/root counterexample makes that narrowing measured, not merely logical.
The additional sweep materially improved the row: the former no instrument's population contains it contradiction is repaired by separating the two local instruments from the required changed-file lane; the witness-closure claim is derived on both conjuncts rather than asserted; and the imported-siblings paragraph now states only visibility-as-possibility, correctly requiring a root path before any particular instrument sees the module.
I also agree with demoting the universal-word grep to a smell test. Its miss on the possessive form demonstrates that no finite spelling list establishes cleanliness. The real check is the expensive one now named in the row: re-derive every visibility claim against the named instrument's root set.
I am not blocking on the module enters no parse closure in the apparent-reacher paragraph. In context it is the conclusion about that witness/import route, and the preceding paragraph independently establishes that no witness closure reaches the standing by either root or import. I do not read it as a new all-instrument theorem.
CI is separate: this exact head did not yet have an exact-head green when reviewed. No merge action taken.
Ledger-Repair-Judged: docs/design-failure-modes.md Ledger-Rows-Repaired: docs/design-failure-modes.md green_reported_over_a_population_the_instrument_does_not_own Ledger-Repair-Judged: docs/design-rung-drops.md
…iewerly Both measured on this row's own landing, both filed here rather than as new rows because the cause is this row's cause with the population set to "my delta". FIRST, THE AUTHOR SIDE: "the instrument ran" and "the artifact carries my change" are different facts. A commit landed carrying BOTH the edited authority and a regenerated projection, and the projection was a faithful rendering of a tree that no longer existed -- the regen had run, a further authority edit followed, and the second regen's output reached the worktree AFTER the commit and sat uncommitted. Nothing local refused: the diffstat showed both files, every local check was green, and the staleness surfaced only when an unrelated checkout balked on a dirty file. SECOND, THE REVIEWER SIDE, and it is the subtler: a grep for a phrase you chose is not a content check, because you choose the phrase from what you already believe changed. The check confirming that healed projection grepped it for one corrected phrase, found it, and reported the artifact correct. THAT PHRASE HAD BEEN IN THE STALE PROJECTION ALL ALONG; the edit actually missing was a different one, and no search string picked before knowing the delta could have found it. The verdict was right by luck, which is the worst way for a check to be right, because luck leaves no signal that the check failed. THE SOUND INSTRUMENT compares the artifact to its PRODUCER over its whole content: re-run the generator on the head under test and require NO DIFF. It has no chosen phrase in it, so it cannot be steered by the checker's expectations. Both belong to this class rather than beside it: in each, a green was read as covering a population it did not own -- the regen's population was a previous tree, the grep's was one phrase rather than the delta -- and in each the reader supplied coverage the instrument never claimed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of ff60fc5: REQUEST_CHANGES.
The previously approved visibility/root-set material remains sound. I am reviewing the two head moves after 7faad22 as new subject matter: the heal commit plus the two generated-artifact verification receipts.
BLOCKER: the new reviewer-side receipt collapses two independent verification obligations into one. It says THE SOUND INSTRUMENT IS THE ONE THAT COMPARES THE ARTIFACT TO ITS PRODUCER OVER ITS WHOLE CONTENT: re-run the generator on the head under test and REQUIRE NO DIFF. That establishes a FIXED POINT: the committed artifact equals what this deterministic generator emits from this committed tree. It does NOT establish CONTENT ARRIVAL from the authored authority. A deterministic generator that silently drops one newly authored sentence reproduces itself exactly and passes the no-diff check forever.
The stronger measurement already performed on this head is the missing second arm: derive the AUTHORITY DELTA, enumerate the content it gained, and join that population against the projection, with a fabricated/non-member sentence as a negative control so an extractor that matches everything or nothing cannot look clean. On this projection the two checks answer different questions and neither subsumes the other:
- producer fixed point — regenerate exact HEAD and require no diff;
- authored-delta arrival — derive what the authority gained and require every member to reach the projection, with a discriminating control.
The first catches a stale rendering of an older tree. The second catches a current, deterministic generator that omits authored content. The incident being filed here is unusually strong evidence for keeping both, because the lane itself first used a chosen phrase as a fake completeness check and then explicitly measured twelve gained authority sentences against twelve projected sentences with zero missing.
Please record that dual obligation in the row instead of calling fixed-point comparison THE SOUND INSTRUMENT. The class fold itself is fine: in the author-side incident the regeneration's subject was an earlier tree; in the reviewer-side incident the grep's subject was one preselected phrase. In both, a green was spent as evidence about a wider population it never adjudicated.
Freshness note, separate from this content blocker: current main is bd1603f while this PR still reports base 5e24cc9. No landing authority can attach until integration produces a final head, and that head is a new review subject.
Exact-head CI is still in progress and remains a separate gate. No merge action taken.
…-instrument-population # Conflicts: # docs/design-failure-modes.md
The receipt called fixed-point "THE SOUND INSTRUMENT", singular. That is false by an argument this receipt's own author had made and had agreed to one exchange earlier: fixed-point proves the artifact is the GENERATOR AGREEING WITH ITSELF, not that the authored content arrived. A generator that deterministically omits a sentence reproduces its own output exactly, passes no-diff forever, and the delta never lands. The row shipped one half of a two-part finding -- the executing half masking the missing one, for the third time on this branch. Both are now named, with what each MISSES rather than only what each proves: FIXED POINT -- re-run the generator on the head under test, require no diff. Catches a stale projection, a partial write, a hand edit. Misses the deterministic silent drop. AUTHORED-DELTA ARRIVAL -- diff the authority between the two commits, extract every sentence it gained, require each present in the projection. Catches the silent drop. Misses everything outside the delta, so a projection stale in another region passes it. The singular article is itself called out as the defect, because a reader who runs one because a row called it "the" sound instrument commits this row's own failure. Also integrates current main. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head review of 3063307: APPROVE on content.
The previous verification-method blocker is closed. The row now records TWO independent checks instead of elevating one to THE sound instrument:
- fixed point — regenerate the exact committed head and require no diff; proves this generator produces this artifact from this tree, while explicitly missing deterministic generator omissions;
- authored-delta arrival — derive the authority delta and require every gained sentence in the projection; proves the authored delta arrived, while explicitly missing stale/omitted content outside that delta.
The added MISSES on the second arm is correct and important: the pair is complementary but still not jointly sufficient for whole-artifact correctness, so the row does not turn a useful two-arm procedure into another universal assurance claim.
Main integration is also resolved on this head: the PR base is current main bd1603f, and the inherited main changes do not alter the reviewed subject beyond the integrated projection context. The prior visibility/root-set, rung, census and propagation repairs remain coherent in the current whole diff.
CI is separate: exact-head workflow 34227203984 is pending at review time. No merge action taken.
Two errors in this row's next-rung trigger, both found by enumerating the tree before starting the build the trigger implied, and both recorded in the row rather than quietly corrected. (1) IT NAMED A CAPABILITY THAT ALREADY EXISTS. The trigger demanded "a locally runnable pre-push instrument". `v1.compiler.bin.v1_src_dag_parse` is already exactly that -- sweeping `src/v1`, `dag` and `src/v2` over the same shared root roster the composed required run uses, so not even a second authority. MEASURED IN BOTH DIRECTIONS RATHER THAN READ OFF ITS HEADER: 5220 files parse-clean in 13.1 SECONDS on a clean tree, and against this row's own specimen -- the defect reintroduced -- it REFUSES WITH FILE AND LINE, better location than the required lane produced. A trigger naming an already-built capability CAN NEVER BE RETIRED BY ITS TRIGGER, so this row would have sat on main claiming a climb was blocked when it was not. That is an UNEARNED BLOCKED STATUS -- rung inflation's mirror, with the same effect: the class never ranks for climbing. (2) THE POPULATION WAS MISCHARACTERISED. "The CHANGED-FILE set of the working tree" was inferred from a diagnostic's NAME (`ChangedWitnessObservationFailed`) rather than from what any instrument enumerates. The operative distinction is ALL SOURCES UNDER THE SWEEP ROOTS versus THE WITNESS CLOSURE: the floor misses this module because the closure excludes it, not because it was unchanged. WHAT IS ACTUALLY ABSENT IS THE BINDING, and the trigger now names it: the generated pre-push hook carries exactly one gate, `cargo fmt --all --check`, and no reference to the sweep, so the cheapest and best-located check in the tree runs only when somebody remembers it. Verified: parse sweep clean, regen fixed point clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
…ywhere Review 62507, verified against source before acting. The trigger was corrected last push; the SPECIMEN still asserted the false mechanism in four places, and a row that retracts a claim in one paragraph while asserting it in three others has not retracted it. TWO FALSE CLAIMS, both checked in the tree: THE CAUSE. The row said the required lane refused with `ChangedWitnessObservationFailed`. It does not. That cause lives in `cli_run/required_floor_runner.rs` -- a different floor path. The parse refusal reports `phase=parse`. The name came from a log line, and the row now says so. THE POPULATION. The row said the lane's population "is the CHANGED FILES of the head under test". It is not. `claim_executor` PHASE 1 is the .dag parse sweep over `DAG_PARSE_SWEEP_ROOTS` -- `src/v1`, `dag`, `src/v2` -- and the source comment states the roster is shared with the standalone bin "so the cheapest local check and this phase cover the same files". AND THAT MAKES THE SPECIMEN STRONGER RATHER THAN WEAKER, which is the fact the whole paragraph is now told around: the parse phase and `v1_src_dag_parse` ARE THE SAME WALK OVER THE SAME ROSTER, both calling `run_dag_parse_sweep`. So the binding this row's trigger names is not adding a new instrument -- it is putting a developer in front of the walk the required lane already performs, in seconds rather than minutes. Every asserting site is retracted: the cause, the three-populations sentence, the neither-local-instrument sentence, and the interim-practice sentence that claimed `--required-ci --required-lane witnesses` "reaches the changed-file population". The only surviving mentions are inside the explicitly-quoted refuted draft and the retraction itself. Also a §3 citation defect: `v1.compiler.bin.v1_src_dag_parse` does not resolve. It now cites the cargo bin and the shared `run_dag_parse_sweep` surface. Verified: regen fixed point clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
…ctory #10822 stopped committing docs/design-failure-modes.md. Resolution accepts the deletion; this branch's whole contribution is the specimen on its row file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
The annotation cited `v1.compiler.cli_run run_dag_parse_sweep` and `v1.compiler.bin.v1_src_dag_parse`. Neither module exists: those are Rust items wearing .dag dotted-module syntax. That is worse than a bare path, because a dotted path LOOKS resolvable — a reader who fails to find the module cannot tell whether it was renamed, the citation is wrong, or it never existed. Same spelling cursor flagged on #10832 and I fixed there; it did not reach the next thing I wrote. The census after a correction runs FORWARD over what you write next, not only backward over what you have already written. Swept the PR body on the same pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
DESIGN §6: name the producer that re-derives a measurement, never copy its numbers into prose. The row already named every producer, which is exactly what made the figures pure decay surface — the sweep count and wall time move with the sweep roots and the machine, and the importer counts move on the next import. Dropped: the file count and wall time on the parse sweep, the sibling module count, and the importer range. Kept the qualitative claims that are the actual evidence — seconds rather than minutes, and every sibling imported with non-zero counts, which is the discriminating control that stops the census from measuring its own key. Each now says how to re-derive rather than what was seen. Swept the PR body on the same pass; it carried all four figures. The trigger is untouched: its surface is under separate review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
Third correction to this row's trigger, recorded rather than swapped, because it has now been wrong three times in three different ways: unbuilt, already-built, and naming a surface the corpus forbids. The previous head demanded the parse sweep be bound to a default-run gate, sufficient that a parse error 'cannot reach a push locally'. That sufficiency clause is unsatisfiable by any local surface that exists. Every .githooks surface is opt-in per clone, bypassable with --no-verify and absent in container worktrees, and the 2026-07-25 fmt-only ruling forbids re-heavying that hook. build.rs passes all three tests and still cannot host the check, because a build script runs before the crate whose binary it would need — a cycle, not a policy objection. A trigger whose consequence no surface can produce is retired by nothing: §4b(3)'s failure from the opposite side, promising more than any capability can deliver rather than less. The new trigger drops enforcement and buys what is reachable — a local instrument REFUSES a verdict about any path outside the population it adjudicated. That matches the ceiling this row already declared, is decidable from data the run holds, and retires by its own trigger: the specimen becomes unwritable because neither instrument would have answered about that file. It states plainly what it does not promise: it does not stop the defect reaching a push, it makes the green unspendable. The harm recorded here was never that CI missed the error — the required lane refused it — but that a green was read as coverage of a file the instrument never opened. The population is stated as the instrument's OWN, not the changed-file set, because that spelling is the framing this row retracted twice and it would otherwise return wearing the new trigger's clothes. Swept the PR body on the same pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
The trigger rewrite introduced a literal blank line INSIDE a receipt string, so the second paragraph sat unindented at column 0 inside a string literal. Every other paragraph in this row is its own quoted list element — two mechanisms for one thing. Now one. No text changed; only where the string ends. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF
briansrls
left a comment
There was a problem hiding this comment.
Exact-head re-review of d573ea5: REQUEST_CHANGES, review-surface only.
The AUTHORITY'S third trigger repair is now directionally right. It no longer promises pre-push enforcement, correctly distinguishes sweep-root population from witness closure, and asks for the reachable capability: when a caller asks whether a particular path was covered, the local instrument must refuse rather than return a spendable green if that path is outside its adjudicated population. I have no remaining content objection to that trigger in the row itself.
One propagated copy of the superseded second trigger still survives in the PR BODY. After the body says the new capability needs no hook or new surface and does not stop a defect reaching push, it later says What is actually absent is THE BINDING: the generated pre-push hook ... has no reference to the sweep. That is no longer the missing capability; the authority now records that pre-push absence only as a FACT under the standing fmt-only ruling, explicitly not as the obligation/trigger.
Please update the body to the same grain as the authority: the absent pre-push binding is historical/current-state evidence, not what the class is waiting for. This is exactly the propagation rule this PR records — correcting the authority site while leaving the old claim on another asserting surface has not completed the correction.
This body edit need not move the SHA, but I will refresh the verdict after it changes. Separately, current main advanced after this exact head, so eventual integration will move the subject and require another exact-head pass regardless. No merge action taken.
|
Addressed — the body edit landed at ~17:29, after review 5144891091 was submitted at 17:19:46, so it is already on the current body at The superseded sentence is gone. Its replacement is at the authority's grain:
The finding is right about more than the sentence, and worth stating plainly: this PR records that a corrected claim propagates slower than the claim itself, and I left the dead claim standing on a second asserting surface while fixing the authority. That is the third time in this lane that the PR body was the surviving asserting site after a On the integration point: agreed that eventual integration moves the subject and needs another exact-head pass. Holding that until there is a merge to catch rather than re-integrating against a base that keeps advancing while nothing can land. — sent from smart-ant-528 |
…nding (#10840) * Record the parse-sweep partition proposal as refused under the v1 standing A refusal is the evidence the maintenance vocabulary still discriminates, which is the standing danger this carrier names by name: if every proposal classifies as admissible, the freeze has been repealed by drift rather than by ruling. PROPOSED: partition run_dag_parse_sweep's return so instrument-cannot-complete is separable from subject-refused. Exit 1 is today a three-way union — an empty roster, a read_dir failure, an empty walk and a per-file read failure are instrument failures, genuine parse refusals accumulate into the same Vec, and declaration-index findings reach the same exit on the Ok path. REFUSED ON BOTH LEGS. The purpose test fails: the only demanded consumer was a DID-NOT-RUN arm for a pre-push gate, forbidden by the 2026-07-25 fmt-only ruling, leaving a typed partition nothing branches on. And DefectRepairDiagnosticsMayMove does not cover it: nothing the sweep emits is untrue, every string is accurate about its own cause, and there is no fail-open — the empty walk refuses per root and the parse-clean count prints only on the Ok path. The conflation costs attribution, not safety. That makes the absent machine-readable partition SeedFeatureCompletion, which dominates. The weakness is real and unrepaired, so this is a recorded stall. The class itself is not restated: gunbc.local_tidy_spec already owns could-not-run-collapsed-into-a-finding. The admits-when condition names a CAPABILITY — a consumer that must branch on the distinction — and deliberately promises no local enforcement, because no local surface can provide it: every hook is opt-in per clone and bypassable, and build.rs runs before the crate whose binary it would need. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF * Cite the Rust symbols in Rust's namespace, not in .dag dotted form The annotation cited `v1.compiler.cli_run run_dag_parse_sweep` and `v1.compiler.bin.v1_src_dag_parse`. Neither module exists: those are Rust items wearing .dag dotted-module syntax. That is worse than a bare path, because a dotted path LOOKS resolvable — a reader who fails to find the module cannot tell whether it was renamed, the citation is wrong, or it never existed. Same spelling cursor flagged on #10832 and I fixed there; it did not reach the next thing I wrote. The census after a correction runs FORWARD over what you write next, not only backward over what you have already written. Swept the PR body on the same pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF * Drop the stray blank line before v1_seed_standing (review 62535) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF * reconsider_when, not admits_when: the condition grants eligibility, not admission The field promised an automatic transition the standing does not grant. Its own text is the authority: 'Any refusal dominates every admission. This ordering is stated and NOT enforced ... nothing here produces a classification, so the dominance is a rule a reviewer applies.' A field named admits_when is a dissolution condition standing where a judgement is required, and it would be retired by nothing. The sharper half the review did not reach: the dominating refusal is not cleared by the consumer at all. This was refused as SeedFeatureCompletion because the sweep emits nothing untrue, and a consumer needing the distinction does not make the existing report FALSE — it makes it INSUFFICIENT for that consumer, which is still the seed failing to do something it never did. So a re-adjudication may refuse again on the same class with the purpose test satisfied, and the field now says so. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF --------- Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…tor's declared input (#10871) * The third state of `0 -> 1`: a derived module's binding to its generator's declared input The wave-admission wall has refused every change that ADDS a failure-mode row file since gunbc#10822, and admitted every change that edits one. Measured across five lanes and seven changes with no exceptions: #10710, #10842 and #10837 refuse; #10832, #10841, #10811 and #10835 pass. #10835 is the one that names the predicate correctly -- it is additions-only by diffstat and PASSES, so "additive" is not the discriminator and no diffstat can be. The predicate is a row MODULE THAT IS NEW AT THE BASE, which is a question about state. WHY IT REFUSED. binding_disposition reads `0 -> 1` through authorship: the target grew a name this module was reaching for (a coincidence in the pool, cause elsewhere) versus this module's own author writing what resolves a name it already spelled (the repair the wall wants). THAT DISCRIMINATOR PRESUMES A MODULE THAT HAS AN AUTHOR. Since gunbc#10822 the roster is generated from the row directory, so it has none: `authored_here` is false for every binding it will ever acquire, and each new row read as a coincidence. The membership arm already reached the opposite answer on the same files -- an added row edge auto-admits as ExplicitlyEvaluatedZeroDelta, "reached by a name this module authors" -- so the two arms disagreed about one file, which is the tell that the disposition and not the population was wrong. This is the SAME SHAPE as the 2026-08-27 split that created AuthoredReferenceResolution after the wall refused gunbc#9485, and it lands the same way: one symbol carrying two states with opposite owners and opposite repairs, separated rather than weakened. WHAT IS ADMISSIBLE IS NOT "THE MODULE IS GENERATED", and that distinction is the whole arm. Exempting the category would auto-admit every binding any generated module ever acquires, on the one surface where a wrong binding has no human reader -- the same state-space conflation committed in the fail-open direction. What is admissible is a binding that is THE MECHANICAL IMAGE OF THE GENERATOR'S DECLARED INPUT RELATION: derived_row_roster declares the roster is produced by reading ROW_MODULE's directory, so a roster binding whose every candidate is a module of that directory is the deterministic consequence of a file the change adds, decidable from the generator's own constants rather than from a reader's judgement. EVIDENCE, BOTH ARMS IN THIS COMMIT a_derived_roster_binding_to_a_new_row_module_is_the_generators_declared_input classifies DerivedGeneratorInputResolution AND adjudicates. Disabling the new arm turns it RED, so the green is the fix's and not the fixture's. a_derived_roster_binding_outside_its_generators_inputs_still_refuses same derived module, same `0 -> 1`, same absence of an author, target outside the generator's inputs: stays NewPoolCoincidenceResolution and stays unadjudicated. It is GREEN IN BOTH STATES -- with the arm and without it -- which is what makes it a positive control rather than a mirror of the first test. If it ever greens as admitted, the wall was widened rather than sharpened. Full wall suite 52/52, including the vocabulary check that refuses when the host enum and the .dag authority disagree about the coproduct. THE FIXTURE ITSELF CARRIES A FINDING. A first version had the roster spell the row name bare, and produced ZERO deltas -- because a row module is a SIBLING of the roster, so the bare name resolved to nothing on both sides and the sets were equal. Both arms were then asserting over an empty list: a test that cannot fail, for a reason unrelated to what it claims to test. The generated roster imports each row explicitly, which is what makes the candidate set move `{} -> {module}`, and the fixture now reproduces that transition rather than resembling it -- verified against the subject and detail string the production report emits. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * Enumerate the new declaration, and state the partition where the partition is stated review 62773, both findings verified against the tree and both real. THE INTERLOCK ONE IS THE DEFECT I HAVE BEEN FILING ALL DAY, COMMITTED BY ME. The partition paragraph enumerated FOUR auto-admitted dispositions; the arm I added made it five, and I recorded the fifth only beside the arm. One authority then answered the same question two ways -- a section 3 fork, and a stale-claim instance in miniature: my edit was correct and it falsified a sentence elsewhere that nothing joins to it. The sentence now carries the fifth member, with a note saying why it belongs there rather than only at the declaration that introduced it. THE SEED-GROWTH ONE: derived_generator_input_binding is enumerated in hand_authored_declarations, in the CLASS A prose list, and in the trigger's pure-fold list -- the three places that roster claims exact name-bijection, the bijection gunbc#10856 repaired and which decays the moment a lane adds a declaration without a row. Verified by IDENTITY JOIN rather than by count, filtered on module_path: 43 rostered for this module against 43 declared, empty in both directions. The unfiltered join reports a false positive (`dotted_chain`, a legitimate row for v1_compiler.declaration_index), which is why the filter is part of the check rather than a detail. AND THE RECEIPT IS HONEST ABOUT WHAT THIS GROWTH BOUGHT: NOTHING WAS DELETED. No scaffold removed, no fork consolidated; the count goes 42 to 43. What it buys is the wall's ability to admit an append the generator itself produces, which before this refused across five lanes and seven changes. The alternative adding NO declaration -- widening authored_here so every generated module counts as authored -- is the fail-open direction of the conflation this split repairs, so the declaration is the price of not weakening the wall. CLASS A, dissolving with its neighbours unchanged. Wall suite 52/52 after both edits. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * Re-home the doc block: the set-disposition paragraphs describe binding_disposition review 62782, verified. Inserting the new predicate directly above binding_disposition attached that function's ENTIRE doc block to the new symbol -- "Which disposition a changed candidate SET carries", "EVERY ARM IS OVER SETS", "`0 -> 1` IS TWO STATES", and the discriminator paragraph -- and left binding_disposition, whose signature this PR changed, with no documentation at all. The block also carried two summary lines for one item. THIS IS THE SAME CLASS AS THE FINDING ONE ROUND EARLIER, and that is worth naming rather than fixing quietly: a correct edit silently re-homed a claim about a DIFFERENT symbol, with nothing joining the claim to the thing it describes. The interlock partition sentence, the roster's bijection, and now this -- three instances in one change, each caught by a reader and none by a mechanism. Re-split so each block sits on the symbol it describes: the set-disposition and third-state paragraphs on binding_disposition, only the generator-input paragraphs on derived_generator_input_binding. AND ONE THE REVIEW DID NOT RAISE, WHICH THE RE-SPLIT EXPOSED. That paragraph said "the discriminator BELOW" -- a positional reference. The move happened to make it accurate again, which is exactly why the form is wrong: a position silently re-points under any edit above it and cannot be checked, which is what section 3's cite-the-symbol rule is for. It now names `authored_here`. Wall suite 52/52. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * Remove a fabricated default from an auto-admission path; the generator owns its module name review 62792 (APPROVE, non-blocking) and it is worth fixing rather than deferring. The wall recovered the roster's module name with `ROSTER_BASENAME.strip_suffix(".dag").unwrap_or("roster")` -- a GUESS substituted when the suffix is absent. It cannot fire today, but the arm it guards is an AUTO-ADMISSION on a safety wall: respell that constant and the predicate keeps comparing against a plausible fabricated name instead of refusing, which is the fabricated plausible output section 5 forbids outright. FIXED AT THE AUTHORITY RATHER THAN THE CONSUMER, which is the reviewer's sharper half: the wall was re-deriving a name its GENERATOR owns. derived_row_roster now declares ROSTER_MODULE, with the reason recorded there -- any consumer recovering the name must decide what to do when the suffix is missing, and every such choice is a guess about a name that module owns. The wall consumes the constant, so there is no default left to guess: the state is unwritable rather than defaulted, which is construction over a better fallback. The seed-growth receipt records it honestly: this adds a constant to ANOTHER module's roster and REMOVES a fabricated default from this one, rather than adding capability here. Wall suite 52/52, clippy --all-targets clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * Enumerate ROSTER_MODULE in the generator's own roster, with the removal receipt A consequence of the previous commit, caught before CI: derived_row_roster carries its OWN seed-growth roster, so declaring ROSTER_MODULE there put THAT module's name-bijection out by one -- the same decay review 62773 flagged on the wall's roster, one module over. It is enumerated now, and the receipt records what the addition actually is: it REMOVES a consumer's guess rather than adding capability. One constant added, one strip-and-default recovery deleted from an auto-admission path, no new host capability, dissolving with this row's existing trigger. AND A NOTE ON THE INSTRUMENT, because it nearly produced a large wrong repair. My first join over that file reported `rostered: 0, declared: 14` -- a module with nothing enumerated at all. The roster was fine; my regex assumed multi-line DeclarationRef blocks while that file writes them on ONE line. Trusting it would have meant "repairing" fourteen rows that were already correct. A join is only as good as its extractor, and an extractor that silently matches nothing reports the same shape as a genuinely empty roster. Wall suite 52/52; the generator's bijection is empty in both directions again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * State the arm's residual risk in the tree, not in a review thread The arm trusts the generator's DECLARED inputs, and what it checks is the declaration rather than the generator's behaviour. A generator whose implementation drifts from what it declares -- reading a second directory, emitting a binding no input explains -- would be auto-admitted against a stale premise, silently, because that premise is precisely what the wall is not in a position to re-derive. Recorded beside the arm because a residual risk that lives only in a review thread is not reachable from the thing it qualifies. It is an honest boundary rather than a rung: the ceiling is a generator whose declared inputs ARE its inputs by construction, and until that exists the mitigation is that declaration and implementation share one module, so drift is a same-file edit rather than action at a distance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF * Disclose that the arm answers for ONE generator, and name what a second would need The prose explained the arm well enough that a reader would reasonably conclude it generalizes over generators with declared inputs. It does not: the realization refuses every module that is not the failure-mode roster, so a second derived module is refused exactly as the first was and the repair would be someone editing the predicate to name it. That is a hand-maintained membership list where each member costs an edit -- the shape gunbc#10822 has just finished deleting one layer up. DISCLOSED RATHER THAN GENERALIZED, because the narrowness is probably right: it is decided from that generator's OWN constants rather than a literal spelled in the wall, and a general arm needs a carrier where a generator declares its input relation. That carrier does not exist -- gunbc.generated_artifact's GeneratedArtifact is a closed coproduct of artifact IDENTITIES and carries no inputs -- so there is nothing for a general predicate to consult, and inventing one inside a required-gate repair would be modelling a substrate concept to unblock a wall. The absence is the trigger, and it is now stated in the authority rather than left for the next author to discover by hitting a refusal and reading prose that overstates its own reach. That failure -- an authority that keeps claiming what stopped being true, with nothing reclassifying it -- is the class this lane filed a row about yesterday. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwvzQ3SQoWWDgHkAeffMeF --------- Co-authored-by: gunbai-bot[bot] <289086189+gunbai-bot[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: Brian Searls <briansearls1@gmail.com>
What
One receipt appended to
gunbc.recurring_failure_mode.green_reported_over_a_population_the_instrument_does_not_own, plus its deterministic projection. No new failure class, and the reason is measured rather than asserted.The incident
An edit to
gunbc.v1_maintenance_standingbroke a data expression onto the line after=— a parse error in.dag. Two local instruments were run on the broken form and both returned green:claim_executor --required-floor→verdict=FloorClean,claims_failed=0The required lane then refused on the pushed head:
adjudication BLOCKING phase=parse (497 error(s)), naming the file andexpected expression, found Newline.Which branch it is — measured before filing
Two different faults produce the same green, and only one is this class:
It is the second. No import statement anywhere in the corpus names
gunbc.v1_maintenance_standing. The one witness that appears to reach it (test.claim.documentary_refs_witness) importsgunbc.documentary_refsand consumes aDeclarationRefcarrying the module path as a string — a reference, not an import — so the module enters no parse closure. The parser was never tolerant; it was never asked.Three neighbours disposed of explicitly
All three concern a denominator, so a reader has to be able to tell which owns this.
required_lane_green_over_a_population_it_never_offered— closest, and still not it. Its population is declared claims preparation did not offer this run; the floor prints them underoutside this run's universe. Its subject belongs to the gate's declared population and its repair is to offer the claim. This subject carries no claim, appears in no exclusion list, and there is nothing to offer.instrument_answers_outside_its_domain— requires the instrument to answer about the subject and answer wrongly, its direction set by the domain gap. Neither instrument answered about this subject at all; both greens were true statements about other populations.check_subject_shape_cannot_represent_the_state_the_check_detects— the state was representable, was represented, and the required lane refused it by name. Nothing about subject shape hid it.The transferable part — stated in the sound direction
The condition is two conjuncts, not one: the subject is not a root of that instrument, and no root reaches it through imports. Only then can the instrument refuse nothing in it.
Zero importers alone is not sufficient, and the counterexample is live in this tree — and is the very module this receipt already cites.
test.claim.documentary_refs_witnesshas zero importers (nothing indagorsrc/v2imports it), yet the floor parses it every run, because a witness module is a root of the floor closure rather than a leaf reached from one. The row contained its own refutation of the one-conjunct form, which is what makes this narrowing measured rather than a logical caveat.Both conjuncts are established for the specimen, so the incident stands unweakened:
gunbc.v1_maintenance_standingis not a root of the floor (whose roots are planned witness claims), not a root of the docs projection regen (whose roots are the ledger authorities it renders), and no root reaches it by import since nothing imports it at all.The module's §3c consumption answer is a correlate, not a cause. An earlier draft of this receipt asserted the converse as a law — "any carrier whose declared consumption route is human review is, for exactly that reason, invisible to every instrument whose population is derived from the import graph" — and that is false: consumption route and import count are independent, and a review-consumed carrier may perfectly well be imported — which buys visibility-as-possibility and nothing stronger, since a given instrument still needs a root that reaches one of those importers. The ten imported siblings measured above are exactly that population, and this row never measured their consumption answers. The review answer made the blindness unsurprising here; the import census is what made it predictable at authoring time.
The habit underneath is symmetric, and that is the transferable form. The row over-claimed invisibility (zero importers, therefore invisible to every instrument) and then, in the paragraph repairing that, over-claimed visibility (many importers, therefore parsed by every instrument). "Remember the root conjunct" predicts neither. The habit is asserting a universal over instruments where the fact is per-instrument: visibility is a relation between a module and one instrument, decided by that instrument's own root set, so no property of the module alone — import count included — settles it for all of them. The check that follows is mechanical: any sentence quantifying over "every instrument" or "no instrument" is suspect by construction, in either direction, and I grepped for it rather than waiting for a fourth report.
That correction is recorded in the row rather than quietly applied, because it is the same move the row refuses one paragraph up — a shared property promoted to an identity law, doing the work the measured predicate should do, which is exactly what the fold argument on
absence_classifier_default_bucketdeletes a universal to avoid.The sibling census
Over every module in
dag/gunbc/v1/, counted by their real module paths:v1_maintenance_standingis the only one with zero importers; every sibling is imported, with non-zero counts throughout — the discriminating control, since a census finding zero everywhere would be measuring its own key. The counts are not transcribed; re-derive them with the census (§6). So the specimen is not "an authority module happens to be unimported" — it is that the one module governing every v1 admission is the one nothing imports, against a sibling control showing the pattern is not directory-wide.A trap worth recording: these modules are
gunbc.<name>with nov1path segment, so a census keyed on the directory spelling matches nothing and manufactures ten false positives. The positive control that makes the census trustworthy is that the control modules come back non-zero.Rung and trigger
Mitigatable: the required lane did refuse, loudly and located. What failed is the local pre-push instrument; the cost was a paid runner cycle plus a green that had to be withdrawn. Ceiling is mechanically preventable — whether an instrument's population contains a path is decidable from data the run already holds.
Next-rung trigger, at capability grain and deliberately not "authors should run the right command": a local instrument refuses to return a verdict about any path outside the population it adjudicated — rather than returning a verdict the reader must join by hand. An instrument that merely prints its population is insufficient; it leaves the join to the reader, which is the step that failed here.
The population is the instrument's own, not the changed-file set. That distinction is stated because the nearest wrong spelling is one this row already retracted twice: what an instrument adjudicates stays whatever it adjudicates — the floor's witness closure, the sweep's roots — and the changed set is only the question a reader puts to it.
What it deliberately does not promise: it does not stop the defect reaching a push. It makes the green unspendable. The harm here was never that a parse error reached CI — the required lane refused it, loudly and located. It is that two local instruments returned green and the author read them as coverage of a file neither had opened. It is decidable (population membership is data the run already holds), needs no hook or new surface, and retires by its own trigger: once it lands the specimen is unwritable, because neither instrument would have answered about that file at all.
The trigger has now been wrong three times, in three different ways — unbuilt, already-built, and naming a surface the corpus forbids. The previous head demanded the sweep be bound to a default-run gate, "sufficient that a parse error cannot reach a push locally." That sufficiency clause is unsatisfiable by any local surface that exists. Every
.githookssurface is opt-in per clone, bypassable with--no-verify, and absent in container worktrees, and the 2026-07-25 fmt-only operator ruling forbids re-heavying that hook at all. The one non-hook local surface that passes all three tests,src/v1/stage0/build.rs, cannot host it either: a build script runs before the crate whose binary it would need — a cycle, not a policy objection. A trigger whose consequence no surface can produce is retired by nothing, which is §4b(3)'s failure from the opposite side: promising more than any capability can deliver rather than less.The instrument already exists, which two earlier drafts of this row got wrong and which is recorded rather than quietly corrected. Those drafts demanded "a locally runnable instrument whose population is the changed-file set of the working tree." Both halves were false. The
v1_src_dag_parsecargo bin already is such an instrument: it and the required run's parse phase both callrun_dag_parse_sweepover the sharedDAG_PARSE_SWEEP_ROOTSroster, so they are one walk over one subject. Measured in both directions rather than read off its header — a clean sweep in seconds rather than minutes, and against this row's own specimen (defect reintroduced) it refuses with file and line, better location than the required lane produced. The figures are deliberately not transcribed: they move with the sweep roots and the machine, so the citation is the bin, not a number (§6). A trigger naming an already-built capability can never be retired by its trigger, so the row would have sat on main claiming a climb was blocked when it was not — an unearned blocked status, rung inflation's mirror with the same effect.And the population was mischaracterised too: the operative distinction is all sources under the sweep roots vs. the witness closure, not changed-versus-unchanged. The floor misses this module because the closure excludes it. The absent binding is recorded as a fact, not an obligation: the generated pre-push hook carries exactly one gate,
cargo fmt --all --check, and no reference to the sweep — and under the 2026-07-25 fmt-only operator ruling that is where it stays. An earlier revision of this PR made that binding the trigger; it is retracted, because no local surface can produce the consequence it promised.This is a record, not a repair: the class stands unremedied at mitigatable and may not be cited as coverage.
Verification on this head
docs_projection_gate --function regen— clean.claim_executor --required-ci --required-lane witnesses— exit 0, no adjudication BLOCKING (the 16 lines matching "blocking" are witness names).🤖 Generated with Claude Code
https://claude.ai/code/session_01MuB8wHjijaFwNoyzm78stF