Skip to content

The wall covers a spelling, not a boundary: correct the population and restate the trigger so aliasing cannot satisfy it - #9924

Merged
gunbai-bot[bot] merged 5 commits into
mainfrom
row/text-boundary-alias-population
Sep 1, 2026
Merged

gunbai-bot[bot] merged 5 commits into
mainfrom
row/text-boundary-alias-population

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

text_boundary_identity_wall bounds its subject to destinations whose exact identity is v2.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 String actual throughout:

destination as written verdict
s: v2.std.text.String REFUSES — declared Node(std.algebra.FreeMonoid<Product(Char)>), produced Primitive(String)
s: Wrapped where type Wrapped = FreeMonoid<Char> (local, structure-identical) ADMITS
s: LocalText where type LocalText = v2.std.text.String (local alias to the guarded declaration) ADMITS
cross-module control in the same file REFUSES

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.String spelling. 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.text is not a module whose bare String spellings 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 kernel String — string_head, declared s: String one line below type String = FreeMonoid<Char>, refuses a scalar sequence with declared 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 the v2. 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

…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.
gunbc-ci-auto-heal added 2 commits September 1, 2026 11:18
…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.
gunbc-ci-auto-heal and others added 2 commits September 1, 2026 11:55
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
@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

Re-running the required-witnesses-floor job, and recording why BEFORE the re-run rather than after a green.

The floor is the only failing check on this head. Its verdict:

required-floor: planned=3386 executed=3386 terminal=3386 passed=3310 known_red_held=26
                failed=0 completed_over_cost_requirement=1
required-floor: COMPLETED-OVER-COST-REQUIREMENT
  v2.test.execution.emit_host_meet_join_equals_eval.emit_host_meet_wrong_fixture_refuses_holds
  cpu budget 500ms EXCEEDED; cost=501ms EXACT
required-floor: verdict=FloorRefused unexpected_failures=0

failed=0, unexpected_failures=0. One witness, one millisecond over a 500ms ceiling — 0.2%.

The failing witness cannot be caused by this diff, structurally. This PR changes one prose string in dag/gunbc/rung_drop.dag and the paragraphs it projects into docs/design-ledgers.md. No code path, no witness, no fixture, no fold. There is no mechanism by which a rung-drop row's prose alters the execution cost of an emit-host meet/join witness. That is stronger than "unrelated" — it is non-causation by construction.

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 compiler_frontend_program_status_witness rows at 503ms and at budget refusal). The standing explanation is runner load inflating every row uniformly by roughly 8–11%; a separate lane refuted the competing re-attribution hypothesis using the floor's own [floor-shared-fill] ledger, which carries no paid_by line naming the affected module.

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

@gunbai-bot
gunbai-bot Bot merged commit a6a3477 into main Sep 1, 2026
10 of 12 checks passed
@gunbai-bot
gunbai-bot Bot deleted the row/text-boundary-alias-population branch September 1, 2026 13:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants