Repository navigation
The parser-walk projection stops fixing one exposure grounding, and its two dangling annotations stop asserting what is no longer there - #9350
Merged
Conversation
added 2 commits
August 26, 2026 18:58
…signature change These bytes are the generator's, not mine: produced by `claim_executor --required-regen`, taken from its candidate tree at target/stage0-regen-candidate, and applied as a patch rather than transcribed. Hand-editing a mirror to make the drift gate pass is the laundering that gate exists to refuse. Two notes on the mechanics, recorded because both are easy to get wrong: REGEN WRITES TO A CANDIDATE TREE, NOT THE WORKTREE. A `git diff` of the mirrors after a regen run prints nothing whether or not the mirrors need regenerating, so an empty diff there is not evidence of agreement -- the verdict is the `generated surface drift` line, which named exactly these two files. THE GENERATOR CHOSE A BETTER IMPORT SHAPE THAN THE HAND EDIT WOULD HAVE. It emitted both the type and the variant into the production-observations mirror and spelled the argument `DeclarationExposureGrounding::ModuleLocalMemberExposure` at the call site. That is its decision and it stands; had I written the mirror by hand I would have produced something else and the gate would have been right to refuse it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two changes in one file plus one caller. Both are annotation-adjacent and neither changes behaviour.
1. A dangling citation, and the claim it was propping up
declaration_exposure_from_containment_noteended with:That symbol does not exist. One occurrence corpus-wide, which is the citing prose itself; the witness was deleted 2026-08-18 in #8486.
This is not "one stale citation." It is the first measured-in-the-wild specimen of the gap the 2026-08-23 cited-symbol rung drop declared, and it escapes for a specific reason: the citation is prose inside a
String, not aDeclarationRef. The declaration index andPRE_EXISTING_CITATION_DEBToperate over authoredDeclarationRefrows, so a symbol name embedded in an annotation is not reachable from that tree at all. It is not in the debt roster because it was never a candidate.The population of such prose-citations is unmeasured. I ran a probe and got a number; the probe was wrong in both directions (ordinary English words after "see" scored as symbols; module names scored as missing), so the number is discarded rather than reported. The mechanism above does not depend on the magnitude.
The pointer was not deleted on its own. Per the standing rule that removing a dangling reference while leaving its now-unsupported assertion standing is worse than the dangling reference, the claim was checked first —
v1.std.coremake_arm_node:The pattern goes in the arm's
match_patternfield; the body goes in its children. So the claim is true, and stronger than it was stated: "sibling" names a spatial relation between two nodes, and one of them is not a node. There is no binder occurrence for a use to nest under, so binder-as-own-pathLexicalExposureis not wrong-here — it is inexpressible. The note now says that, citing a symbol that resolves.2. The projection stops fixing a grounding its callers should choose
occurrence_binding_inputs_from_transporthardcodedgrounding: ModuleLocalMemberExposure. It now takes aDeclarationExposureGrounding, and both call sites passModuleLocalMemberExposureexplicitly. No behavioural change.Why this is not a knob with no consumer — census on
origin/main, every.dagnaming a grounding:NamespaceStructuralRootExposuregunbc.type_reference_binding_context— production, passed explicitly at the call siteModuleLocalMemberExposureoccurrence_binding_parser_walk— hardcoded, no caller could say otherwiseCrossFileProviderExportedExposurecross_file_clause_e_fixture,cross_file_binding_assembly_witness_test— call sites in fixtures only;namespace_pool_independence_witness_testmentions it in proseThe corpus pattern is already each site names its own grounding. The parser walk was the one site that could not. And no production path constructs
CrossFileProviderExportedExposureat all — every construction is a hand-built fixture calling the authority directly, because the real projection function refuses to produce it. That is a hand-authored projection standing where the model should generate one, and this hardcode is its cause.Not claimed: that this retires those fixtures. It does not. The other half is a producer gap — the parser stamps Type references and no Type declarations — which is held behind an in-flight pass over
02_parse's stamp/index producer. Necessary, not sufficient.An open question this PR deliberately does not touch.
npi_cross_file_export_exposure_open_question_noterecords an operator-signed escalation from 2026-08-07 asking whetherCrossFileProviderExportedExposure => RootExposureis the right model at all, given that namespace-only design makes cross-module access projection (provider.helper) rather than bare-name root injection. Still open. This PR makes the grounding caller-supplied; it does not decide what any grounding should mean, and a reader who finds that note should not read this change as having settled it.The second annotation, which the first change created
The same note asserted the projection "delegates … under
ModuleLocalMemberExposuregrounding" — true until the function stopped fixing one. It now describes the parameter and why only the caller knows which grounding applies.That is item 1's failure mirrored, in the same file and the same PR: there a pointer dangled after its target died; here an assertion would have dangled after its support moved. The second is the more dangerous, because a dangling pointer looks broken and a dangling assertion looks fine.
Verification
The
.rsmirrors carry the identical annotation strings and are regenerated, not hand-edited — the generator owns those bytes.— sent from cool-swift-307