diff --git a/dag/gunbc/recurring_failure_mode/unlanded_citation_indistinguishable_at_the_citing_end.dag b/dag/gunbc/recurring_failure_mode/unlanded_citation_indistinguishable_at_the_citing_end.dag index 50924d38201..bec44985c24 100644 --- a/dag/gunbc/recurring_failure_mode/unlanded_citation_indistinguishable_at_the_citing_end.dag +++ b/dag/gunbc/recurring_failure_mode/unlanded_citation_indistinguishable_at_the_citing_end.dag @@ -91,7 +91,23 @@ data unlanded_citation_indistinguishable_at_the_citing_end: RecurringFailureMode "That is a cause held at one receipt and not yet filed; this row is about why the severance is invisible from the citing end, which is a different question with a different repair. ", - "If both are ever filed, the causal link is named rather than merged.)", + "If both are ever filed, the causal link is named rather than merged. ", + + "**A SECOND CAUSE FOR THE SAME INVARIANT, FILED AS A RECEIPT ON THIS ROW RATHER THAN AS A NEW CLASS (2026-09-08, gunbc#10840, review by this row's own manager).** This row's rule -- A CANONICAL ROW MAY CITE ONLY WHAT RESOLVES ON MAIN AT THE MOMENT THE ROW LANDS -- is violated by a citation that does not resolve because it is written in THE WRONG NAMESPACE, and that cause is not the timing cause the receipts above are drawn from. THE SPECIMEN: an annotation cited `v1.compiler.cli_run run_dag_parse_sweep` and `v1.compiler.bin.v1_src_dag_parse`. NEITHER MODULE EXISTS OR EVER WILL. Both are RUST items -- a crate module and a cargo bin -- spelled in .dag dotted-module syntax. ", + + "**THE DISCRIMINATOR AGAINST THIS ROW'S ORIGINAL CAUSE, and it is why the repairs differ.** The timing case cites a real identity EARLY: it resolves eventually, and the three admissible forms above all work by managing that interval -- name the PR and its openness, or describe by shape until it lands. THE NAMESPACE CASE NEVER RESOLVES, so all three forms are useless: there is no PR to name and no landing to wait for. The repair is to cite the symbol in ITS OWN namespace -- the crate path or the cargo bin, plus the function symbol -- which is not one of the forms this row ranks. Same invariant, different cause, different repair, which is why it is a receipt here and not a separate class. ", + + "**WHY IT IS WORSE THAN A BARE FILE PATH, which is the tempting comparison since DESIGN section 3 disprefers positional citation.** A dotted path LOOKS resolvable. A reader who fails to find the module cannot distinguish three states -- the module was renamed, the citation is wrong, or the thing was never a .dag module at all -- whereas a file path advertises its own kind and fails honestly. This is the same indistinguishable-at-the-citing-end mechanism this row is named for, arriving through a different door. ", + + "**IT IS A RULE GAP AND NOT FOUR SLOPPY AUTHORS, which is the whole reason it is filed.** DESIGN section 3 says cite the SYMBOL rather than the position and says nothing about NAMESPACE, so a Rust item in .dag dotted syntax violates no stated rule. The dotted form is also the idiom every in-corpus citation uses, which makes it the path of least resistance for a cross-language symbol rather than a slip -- a defect of the available vocabulary, exactly as this row's `filed` receipt is a defect of the available word. ", + + "MEASURED POPULATION, corpus-wide at origin/main and deliberately NOT REPAIRED. The instrument is a corpus grep for a `v1.compiler.` prefix naming no declared module, re-derivable against origin/main rather than the working tree; the members are named rather than counted, because a count of a live population is the transcribed-measurement decay surface DESIGN section 6 forbids and an identity list is what a later reader can actually re-join. None was authored by the filing lane: `binding_chosen_by_pool_membership_rather_than_by_the_declared_rule` (naming `v1.compiler.cli_run compile_clean_unlisted_import_census`, and `v1.compiler.cli_run ModuleGraphFactsLive reference_only_direct_import_paths`), `test.claim.algebra_receiver_callable_witness`, and `v2.lens.manufactured_dependency_census`. THE WORST SHAPE IS THE WITNESS TEST'S, which writes `v1.compiler.cli_run.compile_clean_internal_error_histogram_name` with a DOT before the symbol, so it reads as a fully-qualified declaration reference rather than a module-and-symbol pair. They are left alone because they belong to three separate authorities that are not this filing's subject, and a row that silently repairs its own evidence leaves a reader unable to check it. ", + + "**THE PROPOSED NEXT-RUNG TRIGGER WAS A LENS, AND THIS ROW ALREADY REFUTES IT -- recorded because the refutation is more useful than the proposal was.** The lens would refuse a dotted prefix, in an annotation or a String, matching no declared module. This row's own ceiling paragraph rules that out: deciding whether an identity-shaped token inside a paragraph is a CITATION or merely a MENTION is not decidable, so a scanner over prose is a heuristic and DESIGN section 5 forbids dressing one as a wall. THE DEMONSTRATION IS IMMEDIATE AND SELF-APPLYING: such a lens would red on THIS VERY PARAGRAPH, which mentions all four non-resolving spellings in order to record them, and on the specimen sentence above. A check whose own class's ledger entry is its first false positive is not a wall. ", + + "SO THE TRIGGER IS THE SAME CAPABILITY THIS ROW ALREADY NAMES, WITH ONE ADDITION THAT THE NAMESPACE CAUSE MAKES NECESSARY. A typed row-to-row citation carrier climbs the timing cause in one step, because the existing required cited-symbol check covers a typed reference the moment it is typed. IT DOES NOT COVER THIS CAUSE, because there is NO TYPED CARRIER FOR A RUST SYMBOL AT ALL: `std.decl_ref` `DeclarationRef` carries module_path plus decl_name and resolves against .dag modules, so a cross-language citation has no typed form to climb into and stays prose by necessity rather than by choice. NEXT-RUNG TRIGGER FOR THIS CAUSE, a capability and not an artifact: A TYPED CROSS-LANGUAGE SYMBOL REFERENCE -- the ability to express `this names a Rust item` as a reference that something resolves rather than as a name inside a paragraph. ITS PRODUCER IS GENUINELY UNBUILT AND THIS ROW MUST NOT BORROW ONE, which an earlier revision did and is corrected here rather than quietly: it named the seed's own declaration index as the resolver. THAT INDEX CANNOT SERVE. `ModuleDeclarationRecord` carries a .dag module_path with the item names authored in that module, built by parsing .dag sources, so Rust crate modules, functions and cargo bins are outside its population entirely -- pointing a cross-language trigger at it would have made the trigger look reachable while nothing it names could ever resolve a Rust symbol, which is the trigger-grain defect this ledger keeps recording. What the capability needs is a Rust-side producer that does not exist. Until it does the cause sits where this row already puts the class, in the outside-the-modeled-guarantee column, observed and repaired by reading. ", + + "RUNG UNCHANGED AT MITIGATABLE, and the filing lane's own honesty about it: this receipt was written by the author who introduced the specimen, two hours after fixing the identical spelling in a different PR where a reviewer flagged it. THE CENSUS AFTER A CORRECTION HAS TO RUN FORWARD OVER WHAT IS WRITTEN NEXT, not only backward over what is already written -- the second copy did not exist at the moment the first was repaired, so no backward sweep could have found it. The same pass swept the pull request body, which carried both spellings and is a second asserting site a diff-scoped check never reads.)", ], evidence: [],