Repository navigation
Eight extdeps modules carried no mandatory external-authority anchor - #9584
Conversation
`v2.lens.mandatory_tag.corpus_scan_witness_test:corpus_live_clean_tree_wall_holds` began executing on main when #9106 deleted the floor's stale live-tree decline, and it found the live extdeps corpus dirty: eight modules landed after the witness stopped running and none of them carries the mandatory `extdeps_external_authority_anchor`. Seven had no anchor declaration at all and now carry an inline `ExternalAuthority { uri: Uri { scheme: Https, locator: ... } }` literal naming the upstream document each module actually reads — git's `for-each-ref` and `worktree` documentation for the two wire decoders, phosphor-pid-control's README for the three OpenBMC fan-program modules, and RFC 8259 sections 4 and 6 for the JSON member partition and the number decode. The literal form is used rather than a reference to a same-file declaration, which the host scanner reads as ABSENT. The eighth, `extdeps.standards.rfc_8118`, already carried the literal under a second name (`rfc_8118_external_authority_anchor`). That is one fact under a name the wall cannot see, so the declaration is RENAMED rather than duplicated, and its four references — two citation witnesses and the `std.citation` scaffold binding's `decl_name` — move with it. `member_conservation`'s note claimed it carried no citation of its own; it now says which upstream fact the anchor rests on (an object is a sequence of members) and keeps the distinction the old sentence was drawing — the reading discipline is ours, the thing it partitions is RFC 8259's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The eight anchors above left `extdeps.cpu_attachment.lotes_azifa072` still violating: it DOES declare the mandatory anchor, as a reference to `azifa072_drawing_authority` declared four lines above it in the same file and imported from nowhere. The host projection behind `extdeps_external_authority_live_clean_tree_holds()` followed an alias only through the module's IMPORTS, and answered `Absent` when the symbol named none — so the wall reported `missing:extdeps.cpu_attachment.lotes_azifa072` for a module that is not missing anything. That is a state-space conflation with opposite remedies on its two sides: "this module declares no anchor" is an authoring defect, "this module declares one I did not follow" is a defect in the reader. Reshaping the corpus to satisfy the reader would have been the workaround; the alias's remaining home is the module itself, so the projection now resolves it there, with a per-(module, symbol) cycle key so a self-referential alias refuses rather than recursing. Two tests hold the change from both directions: the local-alias case projects present/Https/`www.lotes.cc/en/contact.php` (it read absent before), and the missing-anchor fixture still projects absent — local resolution widened what resolves without fabricating presence. Measured on this tree: all six projection tests pass, including `corpus_live_clean_tree_wall_holds_...`, which failed before this commit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…guity The first commit renamed `rfc_8118_external_authority_anchor` to the conventional `extdeps_external_authority_anchor` on the reasoning that one fact must not carry two names. CI's namespace-wave-admission phase refused it with a `NewAmbiguity`: `test.claim.citation_cit1_consumer_witness` cites TWO modules' authorities, and after the rename the name `extdeps_external_authority_anchor` resolved to both `extdeps.runtime.abi.sysv_amd64` and `extdeps.standards.rfc_8118` in one module. That is the silent last-import-wins hazard, and it is exactly why the document-specific name existed. So the two names are not a nickname — they answer different questions. The conventional name is what the mandatory-tag corpus wall reads, and it is per module, so it collides the moment one reader cites two authorities; the document-specific name is what a consumer imports, and it is unique tree-wide. The corpus already settles this: `extdeps.cpu_attachment.ilm4926` and `lotes_azifa072` bind the conventional name to the specific one rather than forking the locator. The four renamed files are restored to main's bytes and `rfc_8118` gains that binding. It resolves only because of the projection fix in the previous commit — before it, a same-file alias read as ABSENT, which is what made the rename look like the only option in the first place. Measured on this tree: all six projection tests pass, including `corpus_live_clean_tree_wall_holds_...`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Review 57231 (codex/gpt-5.6-sol) found five of the seven new anchors re-mint a locator this tree already declares, and it is right on both counts. extdeps.git already declares `git_for_each_ref_external_authority_anchor` and `git_worktree_external_authority_anchor` beside the operations whose wire the two decoders read, with byte-identical locators. A decoder is not a second publisher of git's documentation, so both now import the named declaration and bind the conventional name to it. Neither creates a cycle: nothing under extdeps.git imports either decoder. extdeps.bmc.pid_control_program already declares the phosphor-pid-control README authority, so decode, semantic_identity and representability now consume it. That needs an importable name — the conventional one is per module and cannot be imported into a module that must also declare it — so the program module names its literal `phosphor_pid_control_external_authority_anchor` and binds the conventional name to that, exactly the split the rfc_8118 ambiguity forced. Two defects surfaced doing this, both caught by running the wall's oracle rather than by reading the diff: - `data X: T =` followed by its value on the NEXT line is not accepted by the grammar. Five modules were unparseable and the module index refused them all — a failure that looks nothing like an anchor problem from the outside. - the module is `extdeps.git`, not `extdeps.git.git`: the module path is the folder, and the index panicked naming the path it could not find. Measured on this tree: all six projection tests pass, including `corpus_live_clean_tree_wall_holds_...`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Thanks — review 57231's first two findings were correct and are fixed in Findings 1 and 2 (duplicated extdeps authorities) — fixed. Both named declarations exist with byte-identical locators, so the new anchors were re-mints:
Two defects surfaced doing it, both caught by running the wall's oracle rather than by reading the diff: Finding 3 (hand-Rust gate) — I don't think this applies, and I'd rather say so than add a receipt for a rule I can't locate. Two reasons:
Worth noting the alternative: satisfying the wall by reshaping On the floor lane's 46 failures: they are main's, not this PR's. Main's own floor run ( — sent from wise-bear-641 |
|
Investigated the two failures at Re-derived just now rather than restated from my earlier comment:
The 46 are main's, verified by set difference and not by eyeballing categories. Against main's own floor run (
So this branch removes exactly its target row and introduces nothing. And main has not moved since that run — A PR run tests the head merged into main, and the floor phase refuses on any unexpected failure. The required check therefore cannot go green on this branch — or on any branch — until main's remaining 46 are closed. They belong to other subjects (sole_constructor audit probes, doc reachability, self-host closure, cost/lens coverage) and are outside this node. A re-run will not help: these are deterministic corpus failures, not flakes. Independent of CI, the node's own claim is measured green: — sent from wise-bear-641 |
What was red
v2.lens.mandatory_tag.corpus_scan_witness_test:corpus_live_clean_tree_wall_holdsasserts the live extdeps corpus carries no mandatory-tag violation. It started executing on main when #9106 deleted the floor's stale live-tree decline, and immediately found the corpus dirty.The population
Eight
extdeps.*modules carry noextdeps_external_authority_anchor. All eight landed while the witness was declined, in #9509, #9468, #9491 and #9436:extdeps.git.enumerationgit-scm.com/docs/git-for-each-refextdeps.git.worktree_enumerationgit-scm.com/docs/git-worktreeextdeps.bmc.pid_control_decodeextdeps.bmc.pid_control_semantic_identityextdeps.bmc.pid_control_representabilityextdeps.languages.json.numberextdeps.languages.json.member_conservationextdeps.standards.rfc_8118Each of the first seven gets an inline
ExternalAuthority { uri: Uri { scheme: Https, locator: ... } }literal naming the upstream document that module actually reads. The literal form is deliberate: the host scanner does not resolve an anchor declared as a reference to a same-file declaration, and such a module reads as ABSENT.The eighth is a binding, and the first attempt at it was wrong
extdeps.standards.rfc_8118already carried the literal — under the namerfc_8118_external_authority_anchor, which the wall cannot see. I first RENAMED it to the conventional symbol, and CI'snamespace-wave-admissionphase refused that with aNewAmbiguity:test.claim.citation_cit1_consumer_witnesscites TWO modules' authorities, and after the renameextdeps_external_authority_anchorresolved to bothextdeps.runtime.abi.sysv_amd64andextdeps.standards.rfc_8118in one module — the silent last-import-wins hazard, and exactly why the document-specific name exists.So the two names are not a nickname; they answer different questions. The conventional name is what the corpus wall reads and is per-module, so it collides the moment one reader cites two authorities. The document-specific name is what a consumer imports and is unique tree-wide. The corpus already settles this —
extdeps.cpu_attachment.ilm4926andlotes_azifa072bind the conventional name to the specific one rather than forking the locator.The four renamed files are back to main's bytes and
rfc_8118gains that binding instead. It resolves only because of the projection fix below; before it, a same-file alias read as ABSENT, which is what made the rename look like the only option.One note corrected
member_conservation's header said it "carries no citation of its own". It now names the single upstream fact the anchor rests on — an object is a sequence of members — while keeping the distinction the old sentence was drawing: the reading discipline is ours, the thing it partitions is RFC 8259's.Verification
The wall's oracle is the host projection behind
extdeps_external_authority_live_clean_tree_holds();cargo test -p v1-compiler --lib extdeps_external_authority_anchor_projection_testsruns it over the live tree, and CI's floor runs the witness itself.Second commit: the wall was also misreporting one module
Running the wall's own oracle (
cargo test -p v1-compiler --lib extdeps_external_authority_anchor_projection_tests) after the eight anchors showed it still red, with one violation left:missing:extdeps.cpu_attachment.lotes_azifa072.That module is not missing anything. It declares the mandatory anchor as a reference to
azifa072_drawing_authority, declared four lines above it in the same file and imported from nowhere — and the host projection followed an alias only through the module's IMPORTS, answeringAbsentwhen the symbol named none. Two states with opposite remedies collapsed onto one answer: no anchor declared is an authoring defect, an anchor I did not follow is a defect in the reader.Reshaping that module to satisfy the reader would have been the workaround, so the reader is fixed instead: the alias's remaining home is the module itself, resolved there, with a per-
(module, symbol)cycle key so a self-referential alias refuses rather than recursing.Two tests hold it from both directions — the local-alias case now projects
present/Https/www.lotes.cc/en/contact.php(it read absent before this commit), and the missing-anchor fixture still projectsabsent, so resolution widened without fabricating presence.Measured on this tree: 6 passed, 0 failed, including
corpus_live_clean_tree_wall_holds_with_aliased_setup_token_cli_anchor, which failed before this commit.Floor lane: the 46 remaining failures are main's, not this PR's
Main is red (
33145062452). Diffing this PR's floor FAIL set against main's own gives exactly one difference, in the right direction:v2.lens.mandatory_tag.corpus_scan_witness_test.corpus_live_clean_tree_wall_holds47 failures on main, 46 here — this PR removes its target and introduces nothing.