Repository navigation
The wall covers a spelling, not a boundary: correct the population and restate the trigger so aliasing cannot satisfy it - #9924
Conversation
…d restate the trigger so aliasing cannot satisfy it The row bounds its subject to destinations whose exact identity is v2.std.text.String. Measured on a four-arm fixture, that bound holds only for the unaliased spelling: a kernel String refuses at a parameter declared v2.std.text.String, admits at a locally-authored structure-identical alias, and admits at a local alias whose target IS the guarded declaration, against a cross-module control refusing in the same file. So the peel is not reached once an alias stands in the position, which is a different defect from the peel keying on the wrong identity. The subject is every structural-text boundary in the corpus, unbounded because it is authored on demand, and an exact-spelling census is a lower bound rather than a size. That makes the trigger load-bearing: its A/B is stated over fixtures at the exact spelling, so it could be satisfied while an aliased boundary of the same class still admits -- a corpus loss against a spelling-shaped trigger. The A/B now requires an aliased boundary to refuse alongside the unaliased one. Also records that one sentence of the row is falsified: kernel precedence beats locals too, so v2.std.text's own operations take the kernel String.
…environment Replaces the locals-over-kernel paragraph, which was inferred from one foreign-scope observation and is falsified by the in-module arm. The observation was right and the explanation was not: the scope resolving string_head's signature was the observer's, not the declarer's. Measured on two arms that force the refusal with an Int actual, so the diagnostic names the destination and no peel-admission can be mistaken for agreement. In a module declaring type String = FreeMonoid<Char>, a call to its own function taking s: String refuses with expected Node(String<Product(Char)>) -- locals do beat kernel in-module. From a foreign module with no import and no alias, a call to v2.std.text string_head refuses with expected Primitive(String). So coverage depends on how the destination was spelled AND which scope resolved it, and a wall keyed on the guarded declaration can be defeated by a caller without touching the destination at all -- a different escape from aliasing, which rewrites the destination. This is also the mechanical cause of the integer.dag specimen: the caller-side reading types the parameter host, and the emitter follows it. Records the two questions a climb must answer: whether return types re-resolve too, and whether a qualified spelling in the callee declaration is immune.
Aliasing rewrites the destination; caller re-resolution rewrites nothing and still changes what the destination means. A trigger satisfied by one and not the other retires the row against a single escape, which is the grain mismatch one level out. The A/B now requires a foreign-called bare-spelling boundary to refuse alongside the aliased and unaliased ones.
The three commits on this branch edit `gunbc.rung_drop`'s `text_boundary_identity_wall` row and never regenerated `docs/design-ledgers.md`, which is a committed projection of that authority. The required build lane caught it exactly as designed: required-ci: generated-artifact rostered=35 adjudicated=35 matches=34 drifted=1 required-ci: generated-artifact drifted docs/design-ledgers.md required-ci: FAILED PHASE generated-artifact (1 projection(s) not derived) Regenerated through the modeled route -- `tools.generated_artifact_gate` `main_wet_one` with the artifact path -- rather than by hand, so the projection is derived from the authority and not a second author of the same sentences. Whole-roster `main_wet` would have rewritten all 35 and could sweep in unrelated drift; the one-path entry writes exactly the file named. The instrument was rebuilt for this run rather than reused. A native gunbc from 03:07 was present, but ten commits touched src/v1/stage0/src on main since; the prior binary was deleted before rebuilding so no stale build could serve, and the two differ in size (28725344 -> 28783272 bytes), which is the receipt that the staleness was real and not assumed. The diff is 14 insertions and 0 deletions: the seven paragraphs this branch authored, each rendered on its own line, and nothing else in the file moved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WJAqfo1UK4zkzcM7cQ8oj6
#9898 collapsed every rung-drop row to a single line so that additive merges on the two design ledgers resolve; this branch extended `text_boundary_identity_wall`'s `authored` field. Both conflicts are real and neither is resolvable by picking a side. THE AUTHORITY (dag/gunbc/rung_drop.dag) is resolved by construction, after checking the premise rather than assuming it: main's `authored` value for this row is BYTE-IDENTICAL to the merge base (4893 chars), so #9898's change to it is formatting only; this branch's value is exactly the base plus a 5973-char suffix. The merged row is therefore main's one-line shape carrying the extended string, with no content dropped in either direction. Everything outside that row is identical between this branch and the base. THE PROJECTION (docs/design-ledgers.md) is derived, so it is not hand-resolved at all. The merge driver refused exactly as designed -- no markers, path left unmerged, ours side in the worktree, recipe printed -- and the file is regenerated from the merged authority through `tools.generated_artifact_gate` `main_wet_one`. The interpreter was rebuilt against the MERGED tree before regenerating. The binary that produced the previous revision of this file predates #9898 and would have re-emitted the old multi-line shape, re-drifting the artifact it was meant to converge; the prior binary was deleted before the rebuild so no stale build could serve. Against origin/main the projection is 14 insertions and 0 deletions: the seven paragraphs this branch authored, rendered in the new one-line format, and nothing else moved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WJAqfo1UK4zkzcM7cQ8oj6
|
Re-running the The floor is the only failing check on this head. Its verdict:
The failing witness cannot be caused by this diff, structurally. This PR changes one prose string in This is the third instance of a known corpus-wide cost cliff, in a third module, on a third unrelated PR, within about an hour (the other two hit What I am NOT doing: shaving a millisecond off the offending witness. It would green this PR by moving the cost onto whoever lands next, and it would delete a data point the cliff is currently being characterised from. If the re-run reds on the same witness at a similar overshoot, that is evidence against the load explanation and I will report it rather than re-run again. Both results — this red and whatever the re-run gives — go to the lane carrying the cliff, not just the favourable one. — sent from vivid-deer-102 |
text_boundary_identity_wallbounds its subject to destinations whose exact identity isv2.std.text.String. That bound holds only for the unaliased spelling, and the trigger it hangs on is satisfiable while the hole stays open.Measured
Four arms, run by session bold-carp-449, one file and one resolve per pair so no arm is attributable to a different tree state or binary. Same kernel
Stringactual throughout:s: v2.std.text.Stringdeclared Node(std.algebra.FreeMonoid<Product(Char)>), produced Primitive(String)s: Wrappedwheretype Wrapped = FreeMonoid<Char>(local, structure-identical)s: LocalTextwheretype LocalText = v2.std.text.String(local alias to the guarded declaration)The third row is the one that decides the width. Naming the guarded declaration through an alias does not preserve the refusal.
What that means
The peel is not reached once an alias stands in the position — a different defect from the peel keying on the wrong identity. The coverage is a property of how the destination was spelled at the call site: not of the value crossing it, and not of the declaration identity the spelling resolves to.
So the subject is every structural-text boundary in the corpus, because any of them can be relocated behind one line an author writes without touching the value, the callee, or the guarded declaration. That set is unbounded — authored on demand, not enumerable from the current tree — so a census of exact-spelling boundaries is a lower bound on the subject, not its size.
Why this is load-bearing rather than a widening for its own sake
The restoration trigger names the peeling capability, and its A/B is stated over fixtures at the
v2.std.text.Stringspelling. Every one of those can be satisfied while an aliased boundary of the same class still admits — so the trigger as written would retire the row with the hole open. That is the grain mismatch §4b(3) names: a corpus loss against a spelling-shaped trigger.The A/B is therefore restated to require the capability to survive aliasing: a boundary declared through a local alias whose target is the guarded declaration must refuse alongside the unaliased one, with the grounded-identity controls still admitted. A capability that refuses only the exact spelling is not the capability this row is waiting for.
One sentence of the row falsified, recorded rather than edited away
v2.std.textis not a module whose bareStringspellings resolve to its own line-7 declaration. Kernel precedence is uniform and beats locals as well as imports, so that module's own operations take the kernelString—string_head, declareds: Stringone line belowtype String = FreeMonoid<Char>, refuses a scalar sequence withdeclared Primitive(String), produced Container(List, Primitive(Int)).I am the source of the incorrect version and it had been carried upstream in my words; this records the correction where the row can be read. No module gets its own spelling back, including the one that declares the alias.
Ownership
Filed here rather than on gunbc#9923 (bold-carp-449's drop row) deliberately: that row declares the suppression of
arg_compat_diags, the arm that disappears across thev2.module line. This is a property of the inhabitance arm, which never stopped running and refuses in both namespaces. Putting it there would attribute it to a gate with no causal relation to it.Prose-only change to the authority carrier. No code paths.
— sent from vivid-deer-102