Skip to content

(c) arm B: one named conversion at the source-text ingress - #9907

Merged
gunbai-bot[bot] merged 9 commits into
mainfrom
session/vivid-deer-102-tokenize-qualify
Sep 1, 2026
Merged

gunbai-bot[bot] merged 9 commits into
mainfrom
session/vivid-deer-102-tokenize-qualify

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

(c) ruling, arm B (operator, 2026-09-01): the filesystem reports source text; the lexer converts it into the structural character carrier. One named conversion at one ingress.

Read this before the zero-error count: the ingress is clean PARTLY BECAUSE A DECLARED HOLE EXISTS

01_tokenize passes structural values into string_head, string_tail and string_is_empty. A callee parameter type is re-resolved in the caller environment, so at those call sites those parameters are typed host, not structural — and the flows are admitted by the same compat-by-leaf-name arm that text_boundary_identity_wall declares unwalled.

So arm B being green is evidence those flows are UNGUARDED, not evidence they are correct. A green that depends on a declared hole must say so, or the next reader prices the hole as closed.

This is also why the report below has three categories and not two. Admitted by the unwalled arm is not a win and is not folded into closed.

What this contains

src/v2/compiler/01_tokenize.dag — every String position the module folds is named by declaration path, and the module's public argument stays host-valued. tokenize(text: String, …) converts exactly once, above the match, via chars; both arms and every lexical callback, prefix operation, walk state and fold below that line consume v2.std.text.String.

src/v2/std/compilers/lexing.dag — four lines: LiteralPattern.text, KeywordPattern.text, and the two matching LexPatternFold callback signatures.

src/v2/test/claim/tokenize/source_text_ingress_test.dag — the executing evidence (new).

src/v2/test/claim/tokenize/annotation_channel_test.dag — four call sites that reach below the ingress now perform the ingress conversion.

DagSourceReadWitness, source_authority_read, and source hashing are byte-unchanged: the read boundary performs one filesystem observation and no lexical interpretation.

One scalar authority, three producers

chars is the same decomposition v1.compiler.infer unfold_scalar_sequence_image calls to build the UnicodeScalarSequenceUnfold image. So the literal path and the runtime path provably share a scalar authority rather than agreeing by coincidence on ASCII — which is the failure an ad hoc loop would produce, invisible until the first non-ASCII source file.

Why the tests call below the ingress

v2.test.tokenize.annotation_channel's subject is the annotation channel. tokenize returns Outcome<TokenStream> — the semantic projection. 01_tokenize's own note records that lex_walk_artifact is the authored result and lex_walk is its projection, derived by dropping the annotation channel, so a semantic consumer cannot reach annotation text.

Annotations are unreachable through tokenize by construction. A public-door test of the annotation channel would be testing the one path that provably cannot observe its subject. This is not a test reaching below a boundary to avoid it — it is a test of the half of the artifact the boundary deliberately drops. ("Call the public door" is right until the public door is a lossy projection of the thing under test.)

Evidence

Scalar-grain rows that red on a byte or UTF-16 substitution — U+00E9 is one scalar 233 against two UTF-8 bytes; U+1F600 is one scalar 128512 against two UTF-16 code units, and the second is the only row that catches a UTF-16 swap. A public-boundary pair that fails if the conversion moves below the match. Assertions are stated over the free-monoid operations, not v2.std.text's, and the file records why.

Correction carried in the code

v2.std.text's bare String spellings do not 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 — measured: string_head refuses a scalar sequence with declared Primitive(String), produced Container(List, Primitive(Int)). An earlier revision of the witness asserted through those operations and the floor refused it. The population consequence for text_boundary_identity_wall is filed separately as #9924.

What this does NOT do

This authorizes one conversion at one ingress. It is not permission for arbitrary host Strings to inhabit structural text, and it does not retire text_boundary_identity_wall — that row's subject is the arbitrary non-literal host value crossing an exact structural-text boundary through permissive compatibility, and the declared peeling capability remains its trigger. A green ingress here is not that wall coming down.

Status

Reported at identity grain when the run is clean, in three categories, each named individually and never netted:

  • CLOSED — the refusal is gone because the value now inhabits the destination.
  • MOVED — the refusal reappeared elsewhere; reaching below an ingress obliges a caller to do what the ingress does.
  • ADMITTED BY THE UNWALLED ARM — no refusal because compat-by-leaf-name admits it. Not a win.

— sent from vivid-deer-102

gunbc-ci-auto-heal added 2 commits September 1, 2026 07:51
…on the module folds it

Every String position in v2.compiler.tokenize except the module authority note is a
value the module hands to fold_source / string_head / string_tail / string_is_empty /
is_prefix_of / list_tail, or a lexeme it measures with length and advances the line
prefix with. Those are FreeMonoid<Char>, not host text, so the reference now names the
declaration by path instead of relying on a bare token that resolver precedence sends
to the kernel String.

The module authority note keeps the bare spelling: it is a host literal, not text this
module folds.
gunbc-ci-auto-heal added 3 commits September 1, 2026 09:39
…llbacks bare

Isolates the literal case from the non-literal one. LiteralPattern.text and
KeywordPattern.text are constructed at 146 sites and every one is an authored
string literal, which is the case gunbc.structural_realization_bindings
literal_homomorphism_rows claims to carry through UnicodeScalarSequenceUnfold.
The fold callback signatures are deliberately left bare: the floor's two
in-module refusals arrive through a callback parameter, which is the non-literal
case the rung drop says is NOT walled.

If the 146 stay green the literal wall reaches construction sites and this is a
four-line change. If they red, the wall does not reach them and the rung drop
overstates what stands.
The literal probe came back clean: naming LiteralPattern.text and
KeywordPattern.text by declaration path added zero refusals across 146 authored
literal construction sites in 28 modules, so the declared KernelStringLiteral
homomorphism does reach construction sites and that population was never the
blocker.

What stayed red is the non-literal hop the rung drop says is unwalled: the fold
callback parameter reaching lex_match_prefix. The callback signatures now name
the same declaration the pattern fields do, so the value the fold receives is
typed as what LiteralPattern already holds.
@gunbai-bot gunbai-bot Bot changed the title XL-0T: structural v2.std.text.String (FreeMonoid<Char>) -- literal-to-Unicode-scalar inhabitance carried into emission, text/list op realization by operand representation, no RustStdString row BLOCKED on (c): structural text through tokenize and the lexing pattern seam — lands with the host-to-structural boundary, not before Sep 1, 2026
@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

(c) — where the host→structural text boundary sits: A vs B, costed

Written for whoever rules on (c). I have not picked a side and have not authored the converter. Everything below is measured against 6c1def3 unless stated.

The finding that reframes the choice

Medium<String> is one spelling carrying two opposite meanings, and neither option is coherent until that is separated.

  • Read side — Filesystem.Read(path).content wrapped as Medium { carried, fidelity: Lossless }, flowing into tokenize. This is text the compiler consumes and folds character by character.
  • Emit side — emit_module, 05_emit, 05_emit_orchestration, emit_produced, emit_semantic_decl, emit_host, 06_translate, 07_target_carriers all return Outcome<Medium<String>>. This is text the compiler produces and hands to the host to write to a file.

The emit side is genuinely host text and must stay that way — it is bytes destined for a filesystem write. The read side is what the lexer needs structurally. Today both are Medium<String> where String resolves to the kernel, so the two are indistinguishable by type.

Non-test occurrences, 94 total, by file:

file n side
05_emit_orchestration.dag 20 emit
source_authority.dag 16 read
emit_host.dag 14 emit
00_compile.dag 8 both (stage_tokenize in, stage_translate out)
self_host.dag 5 emit
program_partition.dag 4 emit
emit_produced, 07_target_carriers, 05_emit, self_host/* 3 each emit
emit_module, emit_semantic_decl, 06_translate, application_serializer 2 each emit
03_ingest, compiler_closure_emit, orchestration_bash_test 1 each mixed

This is a §3 meaning fork in the making, and it is the real subject of (c) — not "add a converter". A materially different contract needs a materially different name, and today input source text and output emitted text share one.

Option A — convert at the read boundary

DagSourceReadWitness.source becomes Medium<v2.std.text.String>; the conversion happens in v2.compiler.source_authority_read immediately after Filesystem.Read.

  • Declaration sites that move: the ~16 in source_authority.dag plus source_authority_read.dag's construction, plus stage_tokenize's input in 00_compile.dag. The emit-side ~70 must not move, so the change forces the read/emit split to be made explicit.
  • Carrier becomes: two distinct types where there is one today. Medium<v2.std.text.String> for consumed source, Medium<String> (host) for produced output.
  • What newly refuses: any site that passes emitted output back into a consuming position, or vice versa — currently silent and type-correct.
  • Discriminating test: construct a DagSourceReadWitness from an emit-side Medium<String> and require a typed refusal. Today it compiles.
  • Cost: larger diff, and it forces the fork into the open — which is either the main benefit or the main risk depending on whether the ruling wants that surfaced now.

Option B — convert at tokenize's door

tokenize(text:) keeps a host String; it converts once before folding.

  • Declaration sites that move: zero. 01_tokenize.dag only.
  • Carrier becomes: unchanged. Medium<String> keeps both meanings.
  • What newly refuses: nothing. The three source_authority rows close because the parameter goes back to host.
  • Discriminating test: feed tokenize text whose bytes are not valid Unicode scalars and require a located refusal rather than a fabricated fold.
  • Cost: smallest possible diff, and it leaves the meaning fork in place — the boundary becomes invisible again the moment any other consumer needs structural source.

What both need and neither has

A host→structural conversion. v2.std.text has none: String, HostStringText, host_string_text, host_string_text_value, CharResult, string_is_empty, string_head, string_tail, SourceFold, fold_source, char_eq, string_split_step, string_split, string_join, string_replace. host_string_text is not it — inside that module bare String resolves to its own line-7 declaration by locals-over-kernel, so it takes a structural string and wraps it.

The conversion is not total: Char = Int where unicode_scalar, brand("Char"), so host bytes that are not valid scalars have no image. Whichever option is chosen, the converter's return type has to admit that refusal — a total signature would be fabricating.

The thing a ruler should decide first

Not A or B. Whether input source text and output emitted text are one concept or two. A answers "two" and pays for it; B answers "one" and defers. Every other question follows from that one, and it is a §3 question, not a plumbing question.

Prerequisite for whoever owns it

v2.std.text is the one module whose bare String spellings are already correct — locals beat kernel, and line 7 declares type String = FreeMonoid<Char>. The authority is right; only its consumers are wrong. Without this, the obvious first move is to "fix" the single module that needs no change.

— sent from vivid-deer-102

gunbc-ci-auto-heal added 2 commits September 1, 2026 10:54
The operator ruling: the filesystem reports source text; the lexer converts it
into the structural character carrier. So tokenize's public argument goes back to
host-valued and the conversion happens exactly once, above every lexical
operation, with the module internals staying structural.

chars is the same scalar decomposition v1.compiler.infer
unfold_scalar_sequence_image uses to build the UnicodeScalarSequenceUnfold image,
so the runtime converter and the literal elaborator derive one meaning from one
authority instead of agreeing by coincidence on ASCII.

DagSourceReadWitness, source_authority_read and source hashing are untouched: the
read boundary performs one filesystem observation and no lexical interpretation.

The witness carries scalar-grain rows that red on a byte or UTF-16 substitution
(U+00E9 is one scalar 233 against two UTF-8 bytes; U+1F600 is one scalar 128512
against two UTF-16 code units) and a public-boundary row that fails if the
conversion moves below the match.

This authorizes one conversion at one ingress. text_boundary_identity_wall stands
and is not retired by it.
…ach below the ingress

Three defects in the first revision, all found by the floor.

The witness put annotation blocks inside declaration bodies, which DESIGN 4c
refuses: only module-item grain is modeled. Seven sites, hoisted or dropped.

The witness also asserted through v2.std.text operations. Those declare their
parameter as a bare String, which resolves to the KERNEL String under uniform
kernel precedence, so string_head and string_is_empty take host text and refuse a
scalar sequence -- declared Primitive(String), produced Container(List,
Primitive(Int)). The assertions now run over the free-monoid operations, which are
the structural carrier's own, and the file records why.

annotation_channel_test calls lex_walk_artifact directly, below the ingress, with
host literals. Those four call sites now perform the same conversion the ingress
performs, which is what reaching below an ingress obliges a caller to do.
@gunbai-bot gunbai-bot Bot changed the title BLOCKED on (c): structural text through tokenize and the lexing pattern seam — lands with the host-to-structural boundary, not before (c) arm B: one named conversion at the source-text ingress Sep 1, 2026
gunbai-bot Bot added a commit that referenced this pull request Sep 1, 2026
…ly, and only membership rows measured anything (#9908)

* The wall renders a measured radius and a constant one identically, and only the membership rows measured anything

render_delta appends the closure-blast-radius clause to every delta. blast_radius
is called only at the two membership construction sites; the binding site writes a
literal 0. So a binding row cannot report a nonzero radius for any input, and that
structural zero prints in the shape of an observation.

The discriminating specimen is transient, so it is recorded on the carrier: #9907
rebound twenty type positions in v2.compiler.tokenize, the wall enumerated sixteen
binding deltas each reading blast radius 0, and the required floor refused the same
head at three call sites in a module those zeros appear to exonerate.

Establishes what the field measures; does not repair it. The repair changes the type
every construction site fills and is not a rider on a qualification lap.

* Make the unasked closure question unrepresentable as a measured zero

closure_blast_radius becomes Option<usize>: None at the binding construction
site, Some(..) at the two membership sites, and render_delta omits the clause
rather than printing a number for a row that measured nothing.

Closure is a pure function of membership, so only a membership row can answer
the question at all. A binding row was not a row whose closure motion is zero,
it was a row that was never asked, and the two shared one spelling: every
binding delta carried a literal 0 and rendered identically to a membership row
whose closure genuinely moved nothing.

Rung reached is mechanically preventable, not structural, and the annotation
says so: Some(0) at a binding site remains authorable. It becomes unwritable
when the radius moves onto the membership subject, which DeltaSubject cannot
carry today because it is the ordered identity admissions match against.

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
gunbc-ci-auto-heal and others added 2 commits September 1, 2026 12:03
The wall refused this change as UNADJUDICATED, which is the wall working: qualifying
`String` to `v2.std.text` in `v2.compiler.tokenize` and `v2.std.compilers.lexing` changes
what seventeen spellings admit, from the kernel identity to `FreeMonoid<Char>`. The
roster names its own remedy -- "a run carrying a real namespace delta still refuses it as
UNADJUDICATED until its author adds a row here" -- so here are the rows.

FIRST TRANSITION IN THIS ROSTER WHOSE SUBJECT IS A REQUALIFICATION RATHER THAN A MOVE. No
declaration relocated and no name was minted; the destination is written where the module
already meant it. That is why all seventeen are `TargetChanged binding`, base `{<kernel>}`
-> head `{v2.std.text}`, and why none of them moves a closure.

THE DENOMINATORS TRAVEL WITH THE POPULATION, in the ledger paragraph above the rows: run
33501228511 reported `modules_compared=4475 modules_added=1 modules_removed=0
closure_rows_moved=0 deltas=17`. Seventeen is a population because those numbers are
beside it, not a count because seventeen rows were written.

EVERY ROW NAMES ONE EXACT (module, declaration, spelling) TRIPLE. No wildcard, no prefix
rule, no row admitting a module or a spelling in general -- an unintended requalification
of `String` anywhere else still refuses as UNADJUDICATED. Fifteen rows for
`v2.compiler.tokenize`, two for `v2.std.compilers.lexing`.

Dissolve-on: this PR merging, at which point base and head both carry the qualification,
all seventeen report stale, and they are removed by that trigger as the ten shrinks in the
ledger above were.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WJAqfo1UK4zkzcM7cQ8oj6
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 1, 2026 13:45
@gunbai-bot
gunbai-bot Bot merged commit 81a8b7e into main Sep 1, 2026
6 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/vivid-deer-102-tokenize-qualify branch September 1, 2026 14:02
gunbai-bot Bot pushed a commit that referenced this pull request Sep 1, 2026
One conflicting file again, the same admission roster, but NOT the same shape as the
previous merge and the previous resolution would have been wrong here. Last time main ran
a DISSOLUTION and the resolution was union-then-shrink. This time main ADDED: seventeen
XL-0T rows (gunbc#9907) adjudicating a structural-text requalification, none of whose
triggers have fired. There is nothing to shrink on either side, so this is a PLAIN UNION
to nineteen rows -- main's seventeen and this branch's two.

BOTH NAIVE RESOLUTIONS FAIL SILENTLY AND IN OPPOSITE DIRECTIONS, which is why neither side
may be taken wholesale: dropping main's seventeen leaves #9907's delta unadjudicated and
the wall then refuses unrelated PRs, and dropping this branch's two leaves this PR's own
delta unadjudicated and the wall refuses this PR.

THE ONE FACT THAT COULD HAVE FLIPPED THIS BRANCH'S SIDE WAS CHECKED RATHER THAN ASSUMED.
Had the relocation landed independently, these two rows would owe deletion instead of
survival. Read from main directly: it carries zero RLM-2b rows, and
`fleet_converge_plan_spark_typed_actions_wire_path` is still declared at its old home,
`dag/gunbc/fleet/fleet_converge_plan_cli.dag`. The delta is still unadjudicated there, so
the rows must survive.

Ordinals renumbered LAST from the settled row set: this branch's paragraph becomes TWELFTH
behind main's ELEVENTH. Numbering before the rows are settled is what forces the next
conflict, and this file has now conflicted on two consecutive main merges.

ONE SENTENCE OF THIS BRANCH'S OWN PROSE IS CORRECTED, because main made it FALSE rather
than stale. It reported both deltas as "closure blast radius: 0 module(s)"; gunbc#9908
changed `closure_blast_radius` to `Option<usize>` precisely because a binding row is never
asked that question, so it now carries `None` and renders no clause. Quoting a measured
zero there would reassert the exact conflation that change removed.

The type change reaches nothing else here, verified by reading rather than by reasoning:
`closure_blast_radius` is a field of `NamespaceDelta`, constructed only in the adjudicator,
and these rows are `TransitionAdmission` values carrying label, subject and disposition.
`cargo check --release -p v1-compiler --lib` is clean on the resolved tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1
gunbai-bot Bot pushed a commit that referenced this pull request Sep 1, 2026
…ous merge imported it

THE PREVIOUS MERGE PRESERVED SEVENTEEN ROWS WHOSE DECLARED LIFETIME HAD ENDED. The
paragraph declaring them states their dissolve-on trigger as "#9907 merging". #9907 merged
to main at 14:02:39. The merge commit that imported them was made at 14:12:13 -- ten
minutes after the trigger fired -- and carried them across anyway. They are removed here,
by their own trigger, which is the only thing that retires a row on this ledger.

THE ROSTER IS LIFECYCLE-MANAGED, NOT APPEND-ONLY, and this file says so twice about earlier
cohorts: rows are "removed by their own dissolve-on trigger, exactly as the seven shrinks
above". Base and head both carry the XL-0T qualification now, so no run can produce those
deltas, all seventeen report stale, and a stale row refuses EVERY unrelated PR in the
repository. That is why deletion is owed on the roster's next touch rather than whenever
convenient, and this merge is that touch.

THE MISTAKE WAS ASKING THE TRIGGER QUESTION OF ONE SIDE ONLY. The check was run carefully
against the rows being KEPT -- this PR's two, whose trigger is this PR merging, which has
not fired -- and it was never run against the cohort being IMPORTED. Both resolution
recipes this file has been given were therefore wrong for this merge: union-then-shrink
because it shrinks only what the previous merge taught us to shrink, and plain-union
because "preserve both sides" is not a safe default for a ledger with dissolution rules.
The rule that survives, and it is now recorded in the file itself: the resolved roster is
the old cohort, UNION newly live main cohorts, MINUS every cohort whose trigger has fired
as of the base being merged -- asked of each side independently.

NOTHING ELSE MOVES. The roster is this PR's two RLM-2b rows and nothing else; the other
sixteen files in this PR are byte-identical to defb324, verified per file by hashing each
against that head rather than by reading the diff. `cargo check --release -p v1-compiler
--lib` is clean on the resolved tree.

ONE THING DELIBERATELY NOT DONE: no explanation is offered for why the consumed-at-base
path did not refuse the previous head. I did not establish the mechanism and will not
invent one -- a stale baseline is a plausible cause and plausibility is not evidence. The
source-level lifecycle contradiction is sufficient to owe this deletion on its own, and if
the mechanism turns up it belongs in its own finding rather than folded into this fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1
gunbai-bot Bot added a commit that referenced this pull request Sep 1, 2026
…nd the board-grain report is recorded as undelivered (#9947)

* Two of the seventeen admitted rows are UNVERIFIABLE, not verified, and the board-grain report is undelivered

The seventeen TransitionAdmission rows landed by #9907 were reported as
sound. Fifteen of them are, by execution. Two are not verified and are not
refuted: they name declarations in v2.std.compilers.lexing, and the census
that verified the other fifteen returns NO ROWS for that module while
reporting success. Reading that silence as agreement is the
empty-observation narrow — lexing's zero is an ABSENCE, not a zero.

Both facts are carried beside the rows they qualify, because an
undetermined that lives only in a reviewer's inbox is indistinguishable
from a settled one six weeks from now.

Two declarations, no behavior:

- namespace_wave_admission_structural_text_row_verification states the
  split (15 verified / 2 unverifiable / 0 refuted), the coverage hole that
  causes it (845 of 1320 modules censused while subjects=1320 is printed),
  a next-rung trigger naming the CAPABILITY — ABSENT distinguishable from
  CLEAN at the instrument's boundary — and explicitly refusing the
  artifact-shaped trigger that would add lexing alone and leave 473
  omissions silent; and the alias-collision caveat that makes any
  re-derivation at fn_signature_param read the qualification as failed.

- namespace_wave_admission_structural_text_board_report_undelivered
  records the board-grain three-category report as UNDELIVERED rather than
  dropped, names what blocks it, and states what restoring the board must
  be SUFFICIENT for — a base-versus-head verdict per board module in one
  dispatch, joined at module identity. A per-call emission entry point does
  not discharge a population question.

It is stated as an absence of evidence, not as a finding that the cut is
clean at board grain.

Verified by execution: `gunbc run --source-root dag --source-root src/v2`
over the file resolves both declarations against the whole corpus and
returns their text, refusing only at the ExitSuccess wrapper.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WJAqfo1UK4zkzcM7cQ8oj6

* review 58238: the content was right and the SHAPE was prose — both facts move onto typed carriers

REQUEST_CHANGES is correct and I am taking it as filed. Two `data …:
String` declarations whose entire content was multi-paragraph prose is
exactly what DESIGN §4c names: a status, a count, a citation and a
dissolution condition are each on that section's list of things that
belong in a typed carrier, and modeled as String none of it was reachable
from anything.

The reviewer's remedy is the one applied, with one substitution.

VERIFICATION STATUS -> a typed roster, joined at the admitted rows' own key.

  type AdmissionVerificationOutcome
    = VerifiedByExecution { instrument, position_kind }
    | Unverifiable { instrument, why }
    | Refuted { instrument, what_disagreed }

`structural_text_admission_verifications` carries one
`AdmissionVerification` per admitted row, keyed on module_path plus
in_declaration — the `AdmissionSubject::Binding` shape the seed rows
carry, so the roster names its subjects at the grain they exist at rather
than by count. Fifteen `VerifiedByExecution` at declaration_field, two
`Unverifiable`. The unverifiable partition is now enumerable, which was
the reviewer's specific objection; UNVERIFIABLE exists as a third value
rather than as a word in a paragraph.

The rows themselves live in the seed and are not editable from here, so
this is the verdict ABOUT them — a receipt in the observing layer, not a
field the observed roster owns.

BOARD-GRAIN OBLIGATION -> `GuaranteeStall`, NOT the suggested
`BoardReportObligation`. The reviewer proposed a new type; this module
already imports and uses `GuaranteeStall`, whose fields are exactly
subject / current / ceiling / blocker / population / next_rung_trigger.
Minting a second shape for a concept that already has an authority is the
re-invention §2 prices as a failed decomposition. What is missing is not a
document, it is a RUNG — and a rung nothing names does not rank for
climbing.

`population` uses `UncountedNotEnumerable`, not an empty list: the
population IS the emission board, which is unavailable to this lane, and
rendering that as `[]` would read as "nothing is affected" — the
bottom-as-answer narrow that arm exists to refuse.

The alias-collision caveat moves to an annotation over the whole roster
rather than a citation inside a blob, because it bears on the verified
fifteen as much as the unverifiable two, and every outcome now names the
position_kind it was measured at — which is what makes the caveat
mechanical instead of a footnote.

WHAT I CHECKED AND DID NOT USE: I tested whether a fabricated
`DeclarationRef` in `namespace_wave_admission_bindings` refuses at
ingestion, since this module's own annotation claims citations "refuse at
ingestion rather than rotting silently". It does not — a decl_name that
exists nowhere resolves and returns clean. So I did not carry the
failure-mode citation as a DeclarationRef edge, which would have been an
inert citation dressed as an enforced one; it is named in the annotation
and in the roster's own instrument fields instead.

Verified by execution, both declarations, against the whole corpus:

  gunbc run --source-root dag --source-root src/v2 \
    --entry dag/gunbc/namespace/namespace_wave_admission.dag \
    --function structural_text_admission_verifications
  gunbc run … --function namespace_wave_admission_board_grain_stall

Both resolve and return their values; 15 VerifiedByExecution and 2
Unverifiable rows in the returned list.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WJAqfo1UK4zkzcM7cQ8oj6

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Sep 2, 2026
…nal is FullyApplied (#9832)

* RLM-2b: a typed launch-environment convergence scope whose plan terminal is FullyApplied

The RLM-2b plan run over srv1 landed
`partially_applied|33|slot=31 cap=0 timer=0 fabric-cell=0 activation=2`. Thirty-one
of those refusals are REFUSED-REMOVAL on runner slots whose ownership no provenance
signal establishes; two are the runner-service activation stall every production
caller supplies. Both belong to CI runner capacity and to its own convergence plan
(docs/plans/runner-service-capacity-convergence.md). Neither says anything about
whether the launch environment is converged -- and gunbc.roadmap_launch_deployment_receipt
accepts only FullyApplied, so RLM-2 could not close for reasons outside its subject.

The scope was answering for a wider resource set than the question, so the fix is to
make the question's resource set nameable rather than to relax the threshold.

WHAT LANDS

`FleetConvergeScope` gains `LaunchEnvironment` and `FleetConvergeRequest` gains
`LaunchEnvironmentConverge { host, observed_timers, observed_caps, observed_fabric_cells }`.
The arm has NO runner-slot field and NO activation field: not an empty list (which is
a positive claim that the host has none, and licenses removals -- the empty-observation
narrow this module already refuses one layer down), and not a selected-then-excused
refusal. The invalid state has no constructor.

Making that honest required moving `observed_activation_readiness` INTO the
`FullHostConverge` arm and turning three functions from loose-family parameters into
folds over the request:

  - `fleet_converge_apply_terminal(request)` -- each arm counts exactly its own axes.
  - `fleet_converge_apply_shell(request, terminal)` -- each arm emits exactly its own
    sections; a launch-environment script has no slot install and no activation lines.
  - `fleet_converge_plan_axis_lines` / `fleet_converge_plan_refusal_counter_lines` --
    lifted out of the full-host fold so the reviewed body and the executed script read
    one request, and so a counter row exists only for a selected axis.

While the axis set was a property of the CALL rather than of the plan, a narrower scope
could only be expressed by passing something for axes it had not selected. That is the
shape this commit removes; the module's own annotations had already ruled that the
apply-side predicates take the request for the same reason.

The artifact fold is factored into `fleet_converge_plan_artifact_of_request`, with the
full-host, launch-environment and allocation-store entries as constructors into it, so
there is one authority for the subject, the lease and the bundle digest. The
allocation-store fold's literal `FullyApplied` becomes a call to the same terminal.

Scope flows to the receipt unchanged: `scope_wire` and the member-set fingerprint come
from the subject, so a launch-environment plan with zero refusals lands `fully_applied`
honestly and RLM-2's join reads it without re-deriving anything it cannot observe.

CLI AND WORKFLOW

`fleet_converge_plan_wet` and the new `fleet_converge_launch_environment_plan_wet` are
one entry point under two scopes: the run binding, expected-revision and expected-host
admissions, the generation lease and the receipt mint are obligations of PLANNING, so
there is no second copy of them. The plan path now routes through
`observe_fleet_converge_request_wet`, the observer apply already used -- a net deletion
of a second reading of the host. The launch-environment arm does not call the slot
observer, because its arm has no field to put the answer in.

`.github/workflows/fleet-converge.yml` is regenerated from its .dag authority with a
`launch_environment_plan` mode beside `allocation_store_plan`. Default stays `plan`;
roadmap_belt and the srv fleet callers keep full-host, unchanged.

`roadmap_launch_deployment_receipt`'s FullyApplied-only acceptance is untouched.

EVIDENCE

dag/test/claim/fleet/fleet_converge_launch_environment_scope_witness_test.dag, eleven
claims, every one a PAIR over the same host observation so a red is attributable to the
scope rather than to the harness. Executed via claim_batch on this tree: 11/11 PASS,
and the 66 existing fleet_converge_plan claims plus the 13 runner_service_activation
claims stay green (90/90) -- no behaviour change for full-host.

THE DISCRIMINATING RED, RUN RATHER THAN ARGUED. The wall was perturbed into exactly the
wrong fix -- the launch-environment terminal selecting the slot and activation axes and
passing empty observations for them -- and 4 of the 11 went red
(`..._is_fully_applied_where_the_host_scope_is_not`, `..._terminal_wire_is_the_token...`,
`..._detail_has_no_slot_or_activation_position`, `..._plan_body_carries_only_its_own_axis_counters`)
while every full-host control stayed green. The perturbation is reverted.

One control caught this commit's own prose: the apply-script claim first matched the bare
spelling `runner-slot` and went red on the script's preamble note naming the omitted axes.
It asserts the emitted SECTION MARKERS now; the annotation records why, because a check
that cannot tell a section from a sentence describing its absence would dictate the prose.

WHAT IS NOT ENROLLED, AND WHY. The structural half -- that a launch-environment request
carrying a slot or activation position has no constructor -- is DESIGN 4b rung 4, and its
executing evidence is the exhaustive matches over `FleetConvergeRequest`: adding an axis
makes the terminal, the apply shell, the baseline text and the axis lines fail to compile.
A fixture-authored RED is expressible (`compile_dag_diagnostic_census` compiles a synthetic
source through the real acceptance path) and is deliberately NOT enrolled: a carrier calling
that builtin declares `ReadsLiveTree` truthfully, and the required floor DECLINES every
ReadsLiveTree identity before the fold (gunbc.guarantee_probe_corpus, measured 2026-08-22).
Enrolling it would add a never-executed identity that reads as coverage. The trigger is that
arm's deletion, which v2.workflow.required_floor already stages.

ONE OUTPUT CHANGE TO THE FULL-HOST PLAN BODY: it gains a `# scope=scope:full-host` row.
The plan.txt a reviewer reads carried no scope at all, which is fine while one scope
exists and is not once two do; carrying it for one scope and not the other would be the
fork. It changes the bundle digest of a freshly minted plan and nothing that compares
across runs.

Out of scope, untouched: the 31 surplus slots, runner-slot ownership grounding, and the
activation observation transaction.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* RLM-2b: scope-crossing mutation controls, the production-shaped srv1 control, and the structural dependency argument

Answers the controlling reviewer's stated bar. Five additions.

MUTATION CONTROLS. The scope apply routes on is read back from subject_scope.txt, so
the ways that file can lie are separate defects with separate remedies and are asserted
separately. (a) A mutated persisted wire -- truncated, respelled, empty, or extended --
refuses as ApplyScopeUndecodable rather than choosing a scope; defaulting to FullHost
would widen apply from one resource family to every family on the host, invisibly.
(b) A launch-environment observation and a full-host observation of a slot-less host
agree on every MEMBER, so a fingerprint over members alone would admit one against the
other; the scope row is inside the hashed baseline, so it does not. The claim is a
conjunction: each side's OWN fingerprint still admits, which is what makes the refusal
attributable to the crossing rather than to a fingerprint that matches nothing.
(c) The two crossing claims now pass each plan's REAL fingerprint instead of a dummy,
so they establish that scope is judged BEFORE the member set and refuse before actuation.

THE PRODUCTION-SHAPED CONTROL. The incident's exact observation is reconstructed from
the same authorities the live plan used -- srv1, the thirty-one surplus slot artifacts
(jit-runner.sh, runner-liveness-reconcile.sh, srv1-22..50), the desired caps, and the
activation readiness every production caller supplies. Under FullHost it derives
refused_axis_count 33 with slot=31 activation=2 cap=0 timer=0 fabric-cell=0 -- the run's
terminal, re-derived rather than transcribed -- and the SAME host observation under
LaunchEnvironment is FullyApplied, for no reason other than that those positions are
absent from the type. The thirty-one names are spelled out rather than generated from a
range, because for a control whose content is the number 31 a range would let a boundary
slip unobserved.

AND THE EXCLUDED FAMILIES STILL REFUSE LOUDLY under the scope that owns them: the
full-host plan body still carries REFUSED-REMOVAL runner-slot, OwnershipUnknown,
# slot-refusals=31 and # activation-refusals=2. The narrowing removed an obligation from
RLM and removed nothing from the fleet program.

THE DEPENDENCY ARGUMENT, COMPUTED RATHER THAN ASSERTED. That the deployed roadmap
service and belt path does not consume a runner unit or activation as a selected effect
is decided by a join over two populations that are both derivable, not by prose. The RLM
side is deployment_owned_steps_retract_order(deployment_spec_srv1()) -- every path the
live deployment installs, owns and retracts. The runner side is runner_slot_unit_name
over srv1's committed slot identities plus the unit template, from gunbc.runner_unit.
They are disjoint, and no owned path carries the actions-runner@ prefix at all. A
non-degeneracy guard rides with it: both populations are asserted nonempty in the same
claim, because a disjointness claim over an empty set is free and would go green if
either producer silently stopped answering.

ONE DEFECT OF MY OWN, FOUND BY RUNNING THE AFFECTED WITNESSES RATHER THAN BY REVIEW.
Three annotations sat INSIDE declaration bodies, which DESIGN 4c refuses at parse: only
module-item grain is modeled. They are hard errors that no other check reaches, and they
would have reddened the witnesses lane roughly thirty minutes into CI. They are moved to
the leading annotations of the declarations they describe, with no content lost.

BASELINE, BECAUSE THREE FAILURES IN THAT RUN ARE NOT MINE. A pristine origin/main
worktree reproduces all three identically: workflow_dispatch_choice_input_projects_options_list,
fleet_converge_workflow_has_build_job_needs_release_bins, and the
spark_serving_converge_slice entry resolve failure (serving_converge_plan.dag builds a
FleetConvergePlanArtifact literal with no apply_terminal field, and the witness does the
same). They stand on main and this branch neither causes nor repairs them.

EVIDENCE ON THIS TREE: 187/187 PASS, zero diagnostics, across the launch-environment
controls (16), fleet_converge_plan (66), runner_service_activation (13), the
fleet_converge cli / receipt / apply witnesses, roadmap_launch_deployment_receipt (44),
and workflow_capability_closure. The generated-artifact drift gate exits 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Drop the duplicate FleetConvergeScope import this PR added

review 57936 (claude/opus-4-7) is right: the import block in
gunbc.fleet_converge_plan_cli already listed FleetConvergeScope, and this branch
added a second occurrence beside fleet_converge_scope_of_wire. My insertion
anchored on a neighbouring name without checking the block for the one it was
adding.

One line, nothing else in the diff.

NOT A RESOLVER ERROR, WHICH THE REVIEW HEDGED ON AND IS WORTH SETTLING: the
interpreter accepts it. Every witness was green with the duplicate present, and
the same block carries a SECOND duplicate -- fleet_converge_plan_content_hash_path,
at the block's lines 8 and 49 -- which predates this branch and is present on
origin/main. So the class is dead syntax that reads as an editing slip, exactly as
the review's second reading says, and not a refusal.

The pre-existing duplicate is left alone: it is not this PR's, and a drive-by edit
to it would be a polish rider on a branch being held stable.

Scanned every .dag file this branch touches for the same class; this was the only
one it introduced.

Verified after the deletion: 100/100 PASS, zero diagnostics, across
fleet_converge_plan (66), the launch-environment controls (16) and
fleet_converge_cli -- the three entries whose closures contain this module.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* WIP: rebuild evidence for RLM-2b launch scope

* Type the persisted-member classification so no fourth category can exist

The persisted-member map was a table in the PR description. A prose map beside
the code is the parallel-ledger doc DESIGN section 6 warns about: it would have
gone stale the first time someone added a sidecar, and nothing could have turned
it red.

FleetConvergePersistedMemberAuthority has three arms and no wildcard --
receipt-bound, derived-and-recomputed, non-authoritative-presentation. There is
deliberately no arm for 'covered incidentally by another fingerprint', because
that is the sentence under which subject_member_set.txt and observed_baseline.hex
went unexamined: each was folded into a hash somewhere, so nobody asked whether
apply READ them, and it did.

The classification fold is total over the path and answers
UnclassifiedPersistedMember for anything it does not recognize, so an eleventh
sidecar fails loudly rather than acquiring whatever category a default arm
happened to name.

Five witness rows join the map to the behaviour it describes, so the two cannot
drift: every rostered member classifies; an unrecognized path is refused; each
receipt-bound classification is paired with the executed refusal naming that same
path; the derived members name the value they are recomputed into; and category
three is measured empty rather than asserted empty -- every rostered member is
asked, and none answers NonAuthoritativePresentation.

Path literals in the witness are replaced by the declared path symbols.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Exact-head repairs A-E, plus the two gate failures the CI run surfaced

Evidence corrections (A):

- admitted_with_no_diagnostic_change asserted a class-wide FieldNotFound == 0.
  These probes compile against the LIVE TREE, so that could redden from an
  unrelated future corpus diagnostic -- an assertion about the corpus wearing the
  name of an assertion about this field. It now asserts the exact identity naming
  the INSERTED field, plus the empty added/removed identity multiset.
- The initializer-analysis row proved only +1 total and +1 blocking. It now names
  its added identity exactly (InternalError|function:totally_undefined_fn_zz|true,
  measured rather than guessed), requires zero of it in the baseline and exactly
  one in the mutant, and requires every other identity unchanged.
- The plain-product sight control asserted blocking counts only, which permitted
  matching nonblocking residue on both sides. Its total cannot be asserted
  absolutely -- the census module's own closure contributes 95 nonblocking counts
  to BOTH sides, measured -- so the residue is pinned by difference instead, which
  is strictly stronger: total is clean + 1 exactly and every other identity is
  required equal.

Rung-language corrections (B, C, D): the source authority still carried the
withdrawn claims -- that the bad state has no spelling, that a launch request
carrying a foreign axis has no constructor, that the terminal folds exactly three
axes (it folds one), and the CLI line about having no field to put an answer in.
All are corrected in place rather than deleted, because the pattern is the lesson.
The non-interference header carried the superseded sibling-variant mechanism and
now carries the established one. The compile-control enrollment comment reasoned
from the deleted DeclinedLiveTree arm to routed-and-executed; it now states the
actual mechanism, changed-witness selection, and says plainly that an unchanged
fleet witness is not guaranteed to execute on a later PR.

Two gate failures the required run surfaced:

- .github/workflows/fleet-converge.yml was stale. Regenerated; the delta is the
  launch-environment step label, which still advertised caps and fabric cells --
  the axes this PR removed as foreign. A correctness fix, not just a hash.
- namespace-wave-admission refused two unadjudicated deltas, both mine:
  fleet_converge_plan_spark_typed_actions_wire_path moved from the CLI to the
  module that mints the bundle digest it is a member of. Rostered, with the two
  SPARK-PAIR-0 rows the same run reported CONSUMED removed by their own trigger,
  since this is the roster's next touch.

Also review 57982: a cited witness symbol was spelled with a witness_ prefix the
test does not carry.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Correct what the paired sight control proves, and stop freezing a corpus number

Two stale descriptions, both flattering, both removed.

The compile-control source carried two contradictory paragraphs beside each
other: a newer one measuring that the census module's own closure contributes a
common nonblocking population to BOTH sides of the plain-product pair, and an
older one still asserting that absolute total-zero assertions are honest there
because the closure "really is empty". The older paragraph is deleted. The
implemented logic was already the paired one; only its description was wrong.

The surviving description also overstated the result. "Strictly stronger than the
absolute" is false: a genuinely clean total-zero-versus-total-one pair would also
prove the ABSENCE of all common residue, which a paired delta cannot claim. The
accepted formulation is that the paired identity-multiset delta is stronger than a
net-count comparison and is the strongest SUBJECT-RELATIVE control available under
a shared nonblocking closure residue.

The residue count is no longer written in prose. It is a corpus property, and
writing it down makes an acceptance number out of it -- the same transcription
DESIGN warns against. The paragraph now names the instrument that reports it.

* Drop a same-tree count literal from the persisted-member roster join

every_rostered_persisted_member_is_classified asserted the roster length at ten.
That literal was a measurement of the same tree it was checking: automate its
update and the row collapses to measure() == measure(), which is the change
detector DESIGN forbids as an oracle. Review 57997 caught it.

The identity join over the roster is the whole content of the row. Non-vacuity is
kept as a positive bound rather than an equality, because `all` over an empty
roster is true for free and a roster that silently stopped being populated would
otherwise satisfy the row without classifying anything.

The second finding in that review -- the acknowledged-unenforced "22 declarations,
22 entries" count in ci_spec, bumped 21 to 22 here -- is pre-existing, is flagged
by its own comment, and is not repaired under this brief.

* Re-home the launch site-census walk to the falsifier cadence, and fix its three cost-shape defects

The required floor's own cost artifact (run 33459143928 at 1ac3485) falsified the
premise this PR previously argued from. Eight of the eleven non-terminal rows cost
6-10ms and were only collateral of a budget their neighbours consumed; the floor uses
batch clamps rather than a per-witness wall; and the 47-183s figures quoted earlier were
workstation numbers that do not describe the runner.

Only three rows are genuinely expensive, and they were the three most expensive
witnesses in the whole 3426-row run: 13532ms, 14044ms and 19342ms against 488ms for the
next-worst row. A census of every decl_facts consumer under dag/test/claim shows why --
every witness outside test/claim/long walks a fixture pool, and this was the sole
whole-production-corpus walk sitting on the per-PR floor.

Fix the cost shape before re-homing anything, so the cadence row carries a measurement
of the subject rather than of a defect:

  - the copied accumulator in sites_constructing is gone (DESIGN section 6 prices this
    regardless of the realized n, and the roster it feeds is expected to grow)
  - the corpus is folded once carrying both targets, not once per target
  - the dotted suffixes are built once instead of per Atom node

The double fold has a visible receipt: pre-fix the sentinel row cost 1.43x its siblings
because it walked twice; post-fix all three measure within 0.8% of each other.

Then move the module to dag/test/claim/long with its module path renamed to
test.claim.long.* (the floor's long_home_storage_agreement enforces
long_path_but_executing_module = 0, so path and module name must agree), and enroll the
three check_fns on FalsifierCadenceJob in the same commit. The pairing is load-bearing:
long/ is excluded from floor discovery at dir grain, and falsifier_cadence_surface_note
records that of 63 files under the two long/ dirs only 9 are enrolled while the rest are
enrolled nowhere -- a move without the enrollment converts deferred into unscheduled.

The eight compile-control check_fns stay per-PR unchanged. No exemption, no declared
drop, no adjudicated non-terminal.

A fourth candidate was tested and rejected rather than shipped: identity_deltas_empty_except
is a genuine quadratic, and an n*log(n) sort_by rewrite measured 183296ms before and
183296ms after. The census dominates, not the fold.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Revert the re-home onto a dark lane; keep the cost fixes and state the blocker honestly

c6c57ab moved this module under test/claim/long and enrolled its three check_fns on
FalsifierCadenceJob. That enrollment was wrong and is reverted here.

FalsifierCadenceJob has no executing realization. main carries fleet-converge.yml,
fleet-desired.yml and witnesses.yml, none with a schedule: trigger, and there is no
falsifier.yml -- gunbc.deleted_cadence_reference_census records the cadence as
"scheduled by .github/workflows/falsifier.yml, deleted at 611fd02770 (#8283,
2026-08-15)". So the enrollment would have moved three witnesses off an executing
surface onto one with no executor, while reading as coverage. That is the bare
de-enrollment falsifier_cadence_surface_note says re-homing never is.

Two reasons nothing catches that, both filed as findings outside this PR: the surface
note is not among the twelve sites in the deleted-cadence census even though it is the
live re-home destination, and enrollment_is_scheduled answers structurally on the
surface's name, so the walls that police bare de-enrollment check that a row rides A
surface and never that the surface executes.

What is kept from that commit is only the cost work, which stands on its own:

  - the copied accumulator in sites_constructing is gone (DESIGN section 6 prices this
    regardless of realized n)
  - the dotted suffixes are built once instead of per Atom node
  - one fold per target, NOT the pair fold c6c57ab introduced: only the sentinel row
    needs two counts, so the pair fold made the two single-target rows compute a count
    they never read

Two false sentences are deleted rather than softened. One claimed three rows converging
within 0.8% as a receipt for the pair fold; the measurement showed three rows doing
identical work, not less work, so there is no true version of it. The other claimed
eight sibling rows "cost 6-10ms each", which came from reading wall_ms on rows the floor
had marked verdict_reached=false, where the diagnostic states the cost is UNMEASURED and
above the budget with no upper bound. The file now quotes no cost figures at all and
names the floor's artifact as the re-derivable instrument instead.

The annotation states the landing state without implying a plan: these witnesses exceed
the per-witness budget, both arms of the floor's remedy sentence are unreachable on this
tree, and the blockers are filed elsewhere. No re-home is claimed and none is pending.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Consume the skeleton's construction-edge walk, and stop calling a refused witness executed

Both findings from codex review 58047, both confirmed against the tree.

FORKED EDGE PREDICATE AND FORKED WALKER. This module declared its own
edge_is_construction (match on Named { name } == record_construction_spelling) and its
own fold_node algebra to count target constructions. v2.std.decl_facts_skeleton already
owns that interpretation as skeleton_edge_is_construction_spelling, and already walks a
node with it in skeleton_atom_lexeme_census_fold, whose construction_spelling_lexemes is
exactly the population this census needs. The review named the predicate; the walker was
the same defect one level up, so both are dissolved rather than only the one cited. The
ConstructionCount type, the predicate and the algebra are deleted and the count is now
count_where over the skeleton's census.

Semantics are preserved and the discriminating control still holds: the roster is still
exactly the two declarations, the total is still two, and the sentinel row still sees
FullHostConverge constructions, so the walk is proven non-empty rather than passing
vacuously.

A REFUSED WITNESS WAS BEING CITED AS EXECUTED. gunbc.fleet_converge_plan introduced the
site census under a heading reading "what is executed rather than read off the
declaration". That witness is BUDGET-REFUSED BEFORE VERDICT by the required floor, so it
establishes nothing at the gate grain, and presenting it as executed evidence was rung
inflation in a load-bearing file -- worse than sitting low, because an inflated class
never ranks for climbing.

The bullet now states that it is NOT ESTABLISHED AT THE GATE, that passing when run
directly is not the same claim, and that WHERE construction happens is currently covered
by review of the two named declarations and by nothing executing. The guarantee that does
hold is the non-interference matrix, which executes on the floor and passes.

This lowers the claim; it does not fix the underlying defect, which is not fixable inside
this module. Both blockers are named in the annotation: the required floor tests
changed-witness membership before the long-home decline, so the move to a lane declaring
its own ceiling cannot be performed; and FalsifierCadenceJob, the lane that would declare
one, has no executing realization.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Re-point the excess-field matrix at a two-module fixture so its eight probes actually execute

The eight excess-field probes were BUDGET-REFUSED BEFORE VERDICT by the required floor on
its 8000ms per-witness wall, so they established nothing. The cause was the probe source:
each one imported gunbc.fleet_converge_plan and therefore compiled that module's whole
production closure. The control was already in the same file -- two rows of identical
census machinery passed at 11ms and 0ms because their probe imported a small closure.

The subject was wrong, not just the cost. The compiler does not know
LaunchEnvironmentConverge is special: "a payload-carrying coproduct arm literal receives
no unknown-field judgment" is a SUBSTRATE fact that had been pinned to a production type
by accident of where it was first written. DESIGN section 3 puts a fact's home at its
layer, so this moves to its own. The launch-specific claim was never carried here; it is
carried by test.claim.fleet_converge_launch_scope_non_interference, which executes.

THE FIXTURE IS TWO MODULES ON PURPOSE. test.fixture.payload_arm_excess_field.carrier
declares the arm; the synthetic probe imports it and constructs it. Declaration and literal
therefore live in different modules, which is the configuration a real construction site
has -- a single-module probe would have measured the local-declaration resolution path and
reported a rung for a path production does not use. The carrier declares TWO arms because a
single-arm coproduct is a type alias here and refuses at the importer, which would have
reddened every probe for a reason unrelated to the field under test.

WHAT THIS GRAIN CANNOT SEE is declared in the annotation beside what it establishes: it
says nothing about which fields a production constructor supplies, nothing about name
resolution (variant spellings resolve corpus-wide, and a same-spelled arm in another module
is a case this fixture does not construct -- the sibling record_construction_census family
models that homonym case deliberately and this one does not), and nothing about arm shapes
the carrier does not express.

Renamed throughout to the real subject: module test.claim.payload_arm_excess_field_admission,
file moved to match, no launch vocabulary in any check name. A name promising a
launch-specific claim over a fixture-grain mechanism would be the
diagnostic_name_mechanism_silent class. The four axis-named rows are now four distinct
arbitrary names; at this grain the names ARE arbitrary, so those rows are weaker per-row
than their production-grain predecessors while establishing the same fact -- and unlike
their predecessors they reach a verdict.

The discriminating controls survive the move: the plain-product probe still yields
FieldNotFound, so the zeros on the payload arm remain a real property rather than a blind
harness, and omitting a required field still reds.

THE THREE SITE-CENSUS ROWS DO NOT MOVE. They are a claim about which sites in the REAL tree
construct the arm, and a fixture standing in for that would be the empty-observation narrow.
They stay refused. This takes interrupted_before_verdict from 11 to 3; that is NOT progress
toward a green floor, it is eight witnesses moving from establishing nothing to establishing
something. CI stays red and both escalated blockers stand unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ZHWK38CsX9K77f3HS7hMw

* Remove the site census: it answered on no run, and the loss is typed rather than re-homed

test.claim.fleet_converge_launch_scope_constructor_site_census is DELETED, and what
it covered -- WHERE in the corpus a LaunchEnvironmentConverge request is constructed --
is REMOVED by this commit. Not preserved, not deferred, not covered elsewhere. Nothing
executing stands over that question after this commit; review of the two named
declarations is what is left.

IT ESTABLISHED NOTHING AT THE GATE, ON ANY HEAD THAT CARRIED IT. Every required floor
run over a head carrying the module reports its three identities as
standing=planned-without-terminal-verdict / outcome=budget-refused-before-verdict --
runs 33452449083, 33459143928, 33464344273, 33469217185 and 33472882885, read from the
runs rather than transcribed. A row preempted before verdict asserts neither pass nor
fail, so the enrolled census informed the gate on no run while being counted as an
enrolled witness: the inert shape DESIGN 4b names, which is worse than absence because
it reads as coverage.

BOTH REMEDY ARMS THE FLOOR ITSELF NAMES ARE CLOSED TO A CHANGE MADE HERE. "Reduce the
cost" cannot hold while the subject is the corpus: this was the only
whole-production-corpus decl_facts walk under dag/test/claim -- every other consumer
there walks a fixture pool -- so the import-closure reduction that brought this PR's
other eight probes inside the budget does not reach a walk whose n IS the corpus.
"Move it to a lane declaring its own ceiling" is unreachable for a different reason,
which is not this branch's to fix: the floor's selector tests changed-witness
membership before the long-home decline, so the very edit that performs the move also
selects the witness and refuses it on the budget the move exists to escape. The
cost-debt roster is not a third arm: it is an operator shrink-only contract that admits
no identity the floor did not already discover.

NO SECTION 4b(3) ROW IS OWED, AND THAT WAS CHECKED RATHER THAN ASSUMED. A declared rung
drop presupposes a rung that executed evidence established. These rows reached a verdict
on no run of any head that carried them, on the evidence above, and the module never
reached main. There is no rung to drop, so a drop row would be a claim about a
guarantee this repository never had.

RE-FILED AT node://adhoc-cfdf3366-bc3, and its trigger names capabilities rather than
artifacts, both required before it can start: a floor selector able to route a CHANGED,
cost-bound witness to a lane declaring its own ceiling; and a substrate-readable
per-field label on record-literal children, sufficient for a witness to assert the exact
field-name set of a named construction site. A patch to any one file satisfies neither.

The annotation in gunbc.fleet_converge_plan that cited the census is rewritten in place
to say what is now true -- that the site question is covered by nothing executing -- so
the file does not carry a citation to a deleted module or an unearned bullet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* Remedy 1, attempted rather than argued: the census reaches for construction spellings, not for every atom

THE ARGUMENT THIS COMMIT WITHDRAWS IS MY OWN. The deletion commit said the census's
cost was subject-shaped -- "n IS the corpus" -- and therefore irreducible. That is an
argument about the WALK, and it was made without measuring what the witness REACHES FOR,
which is the separable half and the one DESIGN section 6's bare-minimum-cost rule is
written to catch. The census is restored and the reduction is applied.

WHAT IT WAS REACHING FOR NEEDLESSLY. The per-declaration fold consumed
skeleton_atom_lexeme_census_fold, whose AtomLexemeCensus materialises EVERY atom lexeme in
a subtree and appends both lists at every step. This census reads only the
construction-spelling members, so a single-spelling question over the production corpus
paid for the corpus's entire atom population and for the list copies on top of it.
v2.std.decl_facts_skeleton now also projects that same edge-provenance fact as a count:
skeleton_construction_spelling_count_where carries one Int and no list, takes the "names my
target" predicate as a parameter so no naming convention moves into std, and lives beside
the list projection so the fact keeps one authority rather than gaining a second walker.

THE SUBJECT IS UNCHANGED, AND THAT IS THE POINT. Same pool roots, same production corpus,
same over-approximating authored-spelling grain, same three verdicts, same roster of two.
A cheaper witness over a smaller subject would have been the empty-observation narrow;
this is the same question asked without acquiring what it never reads.

THE MEASUREMENT THAT DECIDES THIS IS THE FLOOR'S, NOT A LOCAL RUN. A local claim_batch
probe established the closure half -- the module's imports resolve in ~2s and the
closure-only control reaches a verdict at cpu=0ms, so closure acquisition is not what was
refusing these rows -- but the walk half could not be measured in that frame: the probe
host has 7 GiB and post-resolve RSS is already 5.4 GiB, so every whole-corpus run there
was OOM-killed before a verdict. A number from a frame that cannot complete the work is
not a cost. The required floor is the instrument with the right frame and the right
accounting (marginal CPU, shared fill netted out), so this head IS the experiment: its
disposition line for these three identities is the answer, either a terminal verdict or a
second budget refusal. No figure is transcribed into the source for it.

If the floor still refuses them, the deletion returns as a final disposition on measured
evidence rather than on the withdrawn argument -- and the re-file's trigger is a lane with
a dated ceiling that actually executes the exact enrolled witness identity and returns a
candidate-bound terminal verdict.

Also in this head, from review 58080: fleet_converge_plan_content_hash_path joins the
explicit import list in gunbc.fleet_converge_plan_manifest. It is a DECLARED-dependency
correspondence repair (DESIGN section 3), not a name-resolution floor fix -- imports do not
bind here, the name is corpus-unique and pullable, and the use is a value reference rather
than a match arm, so it resolved before this edit and the floor was never violated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* The reach reduction was measured and did not move the gate: the census deletion is final, on evidence

REMEDY 1 WAS ATTEMPTED AND HAS FAILED, WHICH IS A RESULT RATHER THAN A SETBACK. d824d35
restored test.claim.fleet_converge_launch_scope_constructor_site_census with its reach cut
-- one Int per node through skeleton_construction_spelling_count_where instead of
materialising every atom lexeme of every declaration -- and with its subject deliberately
untouched. The required floor's own run on that head refused all three rows again:
standing=planned-without-terminal-verdict, outcome=budget-refused-before-verdict.

NO BEFORE/AFTER COST IS CLAIMED HERE, AND THE FLOOR'S DIAGNOSTIC IS WHY. A preempted row
reports interrupt_point, which that diagnostic states is a property of the BUDGET and not
of the row; both shapes were refused with cost=UNMEASURED and above 500ms with no upper
bound, so the honest comparison is of OUTCOMES, which are identical, and there is no
measured figure on either side to compare. What the run did measure is memory: the
census's worst row grew the run's resident set by 2.01GB, the largest single claim in the
run, so this walk is not only over the CPU line.

WHAT WAS TRIED AND WHAT REMAINS, so the record does not have to be reconstructed:
closure acquisition was NOT the cause -- a probe carrying the census's exact imports
resolves in about two seconds and its witness reaches a verdict at cpu=0ms, so the
import-closure reduction that rescued this PR's eight excess-field probes does not apply
to this witness. The walk could not be measured off-gate at all: the probe host has 7 GiB
and post-resolve RSS is already 5.4 GiB there, so every whole-corpus run was OOM-killed
before verdict, and a frame that cannot finish the work does not produce a cost.
The floor's other remedy arm is a lane declaring its own ceiling, and none exists that
EXECUTES anything; moving the source into a non-executing home is the bare de-enrollment
the 2026-08-04 admission ruling forbids, deleting coverage while retaining the source.

SO THE DELETION RETURNS AS FINAL, ON MEASURED EVIDENCE. The coverage -- WHERE in the
corpus a LaunchEnvironmentConverge request is constructed -- is REMOVED. Not preserved,
not deferred, not covered elsewhere; what stands over that question is review of the two
named declarations and nothing executing.

skeleton_construction_spelling_count_where GOES WITH IT. Its only consumer was the census,
and a std projection with no consumer is dead weight that would also have owed a
corpus-scale agreement check against the list projection it sits beside -- two projections
of one edge-provenance fact are two authorities the moment they can disagree. Removing the
consumer removes the obligation rather than deferring it; the fact keeps one projection and
one authority.

NO SECTION 4b(3) ROW IS OWED. A declared drop presupposes a rung that executed evidence
established. These rows reached a verdict on no run of any head, in either shape, and the
module never reached main. There is no rung to drop.

RE-FILED AT node://adhoc-cfdf3366-bc3, and it cannot start until BOTH hold: a lane with a
dated ceiling that actually executes the exact enrolled witness identity and returns a
candidate-bound terminal verdict; and a substrate-readable per-field record-literal label
sufficient for a witness to assert the exact field-name set of a named construction site.
The first clause is deliberate: a lane that runs the row but reaches no verdict does not
satisfy it, which is exactly the state this census has been in throughout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* The re-file trigger gains the memory term the experiment discovered, so it cannot be satisfied in form alone

THE TRIGGER AS WRITTEN WAS SATISFIABLE WHILE THE CAPABILITY STAYED DEAD, which is the
exact §4b(3) failure the rule about triggers naming capabilities exists to prevent. "A
lane with a dated ceiling that actually executes the exact enrolled witness identity and
returns a candidate-bound terminal verdict" can be met in FORM by standing up a lane with
a generous dated CPU ceiling -- and that lane would then die the way the off-gate probe
host died, leaving the trigger reading as fired while the witness still reached no verdict.

The reduction experiment measured a constraint the earlier trigger did not imply: this
census's worst row was the LARGEST single claim in its floor run by resident-set growth,
in gigabytes, while its CPU stayed UNMEASURED and above the per-claim ceiling with no
upper bound. Those are two different resources and only one of them was named. The clause
now requires a candidate lane to afford the row's measured resource cost rather than
merely a looser CPU number, and both facts are cited by naming the producing run rather
than by transcribing figures into an annotation no Accepted program can read.

This also makes the two halves of the evidence corroborate instead of merely coexist: the
gigabyte-scale growth is why every off-gate probe was OOM-killed on a 7 GiB host before
reaching a verdict, rather than two unrelated observations about the same witness.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* Two defects I reported as fixed and had not verified: the dead projection is really gone, and the roster gains a uniqueness wall

BOTH FOUND BY READERS, NOT BY THE GATE, AND ONE OF THEM CONTRADICTED MY OWN REPORT.

1. skeleton_construction_spelling_count_where AND ConstructionSpellingMatchCount WERE
STILL IN THE TREE. The previous commit's message says the projection goes with the census
and names that census as its only consumer; the source disagreed with it, which is worse
than either state alone. The cause was mechanical and worth recording: the addition had
been COMMITTED on the experiment head, so `git checkout -- <path>` restored HEAD's version
-- the one carrying it -- rather than reverting the addition, and I reported the intent
instead of reading the result. They are now actually deleted, leaving one projection of
the construction-spelling fact and no unconsumed second implementation.
This is exactly the residue the deletion existed to avoid: a dead projection introduced
for a refuted experiment, with no consumer and therefore no possible agreement check --
and no green can see it, because an unconsumed projection cannot make a disagreement
observable.

2. fleet_converge_persisted_member_paths CARRIED fleet_converge_plan_content_hash_path
TWICE. Review 58080 asked for one addition, the missing import; the edit that made it also
inserted the path into the roster below, where it was already present. A roster whose own
annotation calls it "a closed map rather than a lookup nobody enumerates", joined at
identity grain, cannot hold an identity twice and still be what it says it is.

WHY EVERY WITNESS STAYED GREEN OVER IT, which is the part that needed fixing rather than
the line. every_rostered_persisted_member_is_classified requires nonemptiness and that
every occurrence classifies, so a duplicate of an ALREADY-CLASSIFIED path satisfies it BY
CONSTRUCTION. The row passed for a reason unrelated to the property it names.

So the duplicate is removed AND the hole is closed: no_persisted_member_path_is_rostered_twice
asserts multiplicity PER IDENTITY over the real roster -- each member occurs exactly once --
with no length literal, because a count copied from the tree it checks collapses to
measure() == measure(). Its mutation control,
a_repeated_existing_identity_is_refused_by_the_uniqueness_wall, runs the same predicate over
the real roster with one existing identity repeated, which is precisely the defect committed
here, and requires it to refuse. Without that control the new green would be
indistinguishable from a check that cannot see a duplicate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* State the uniqueness wall's rung honestly: mechanically enforced, and the word "wall" was inviting the higher reading

The new row asserts that every rostered persisted-member identity occurs exactly once,
and nothing about that makes a duplicate UNWRITABLE. The roster is a List<String>: a
repeated identity is still perfectly expressible, and safety depends on this row executing
and staying enrolled, which is DESIGN 4b rung 2 and not rung 3 or 4. Naming a raw list "a
closed map" does not elevate it -- a name is not a constructor -- and the annotation now
says so at the point where a reader would otherwise infer more from the word "wall".

The next-rung trigger is stated as the CAPABILITY rather than as an artifact: a
keyed-roster carrier whose construction admits at most one member per identity, so the
duplicate this row catches has nowhere to be written. It is deliberately NOT adopted here.
Generalizing on a single site trades a proven local wall for an admission problem, and the
bar for lifting the law into a shared carrier is at least two genuine closed-identity
populations; this repository has one today. Ordered sequences, bags, retry histories and
evidence transcripts may legitimately repeat a projected identity, so an all-distinct
helper applied by list-shaped resemblance would strengthen their semantics incorrectly.

Annotation only. No check, roster or predicate changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* Delete the XL-0T cohort: its trigger had already fired when the previous merge imported it

THE PREVIOUS MERGE PRESERVED SEVENTEEN ROWS WHOSE DECLARED LIFETIME HAD ENDED. The
paragraph declaring them states their dissolve-on trigger as "#9907 merging". #9907 merged
to main at 14:02:39. The merge commit that imported them was made at 14:12:13 -- ten
minutes after the trigger fired -- and carried them across anyway. They are removed here,
by their own trigger, which is the only thing that retires a row on this ledger.

THE ROSTER IS LIFECYCLE-MANAGED, NOT APPEND-ONLY, and this file says so twice about earlier
cohorts: rows are "removed by their own dissolve-on trigger, exactly as the seven shrinks
above". Base and head both carry the XL-0T qualification now, so no run can produce those
deltas, all seventeen report stale, and a stale row refuses EVERY unrelated PR in the
repository. That is why deletion is owed on the roster's next touch rather than whenever
convenient, and this merge is that touch.

THE MISTAKE WAS ASKING THE TRIGGER QUESTION OF ONE SIDE ONLY. The check was run carefully
against the rows being KEPT -- this PR's two, whose trigger is this PR merging, which has
not fired -- and it was never run against the cohort being IMPORTED. Both resolution
recipes this file has been given were therefore wrong for this merge: union-then-shrink
because it shrinks only what the previous merge taught us to shrink, and plain-union
because "preserve both sides" is not a safe default for a ledger with dissolution rules.
The rule that survives, and it is now recorded in the file itself: the resolved roster is
the old cohort, UNION newly live main cohorts, MINUS every cohort whose trigger has fired
as of the base being merged -- asked of each side independently.

NOTHING ELSE MOVES. The roster is this PR's two RLM-2b rows and nothing else; the other
sixteen files in this PR are byte-identical to defb324f, verified per file by hashing each
against that head rather than by reading the diff. `cargo check --release -p v1-compiler
--lib` is clean on the resolved tree.

ONE THING DELIBERATELY NOT DONE: no explanation is offered for why the consumed-at-base
path did not refuse the previous head. I did not establish the mechanism and will not
invent one -- a stale baseline is a plausible cause and plausibility is not evidence. The
source-level lifecycle contradiction is sufficient to owe this deletion on its own, and if
the mechanism turns up it belongs in its own finding rather than folded into this fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

* The Spark consumer's second apply-shell spelling had no caller to migrate, so it is deleted and the terminal identity is asserted on the route production actually takes (review 5070355515 P1-4)

SUBSTITUTED REMEDY, NOT COMPLIANCE. The review asks for "an executing target proving
the real consumer resolves and constructs the artifact through the same terminal
authority", and its literal remedy is a caller for
spark_serving_fleet_converge_apply_shell. This does not add one.

That wrapper composed fleet_converge_apply_shell with fleet_converge_apply_terminal
over one request -- exactly what fleet_converge_plan_artifact_of_request already does,
computing the terminal once and handing that same value to the plan body line, to
apply_terminal, and to the apply script. A second spelling of one composition is a
second name for one fact (DESIGN section 3), and the two reconstructions could
disagree about the terminal with nothing joining them.

IT HAD NO CALLER TO MIGRATE. #9763 deleted the Spark-specific artifact route and with
it this wrapper's only caller; the symbol has occurred exactly once in the tree -- its
own declaration -- on every commit since, including origin/main today. Giving a dead
wrapper a caller would have minted the parallel authority rather than removing it. The
reviewer is free to reject this substitution; it should not be discovered.

THE BLOCKER'S DESCRIPTION IS ONE HEAD STALE, stated rather than repaired around. P1-4
says the module's FleetConvergePlanArtifact literal still omits apply_terminal. That
was accurate at the reviewed head c67b2d26e83; it is not accurate here, because the
main merge brought in #9763, which deleted that literal and its whole assembler. The
defect is real -- the orphan is what survives -- but its description no longer matches
the tree.

WHY THIS REPAIR BELONGS ON THIS BRANCH AND NOT IN A PREREQUISITE. The acceptance bar
requires the apply shell bound to the SAME request and terminal authority. That seam
exists only here: fleet_converge_plan_artifact_of_request is absent from origin/main.
A prerequisite would have asserted a true property about a route that does not carry
the seam under review.

WHAT IS ASSERTED, on the consumer's own route. The witness module already builds the
artifact through gunbc.fleet_converge_plan fleet_converge_plan_artifact with a
populated Spark axis (slice_artifact / spark_serving_axis_for_observation), which
routes through fleet_converge_plan_artifact_of_request. Two rows:

  the_spark_populated_artifact_names_its_own_terminal_in_body_and_script -- the plan
  body and the apply script both name fleet_converge_apply_terminal_line of the
  artifact's own apply_terminal. One terminal, two projections.

  a_terminal_no_observation_produced_is_named_by_neither_projection -- the control. A
  PartiallyApplied terminal nothing produced must be named by neither. Without it the
  positive passes on any artifact whose script contains some terminal line, which is
  precisely what a disagreeing second assembler emits.

WHAT "EXECUTING TARGET" MEANS HERE, and it is weaker than it sounds.
v2.workflow.required_floor required_gate_prefixes carries no spark, fleet or roadmap
prefix. These witnesses reach the required floor through the changed-witness sublane,
which seeds changed modules into the prepared closure. So they execute because the
modules are changed in this PR, and after merge they are outside the required gate
again -- the population of the declared rung drop gunbc.rung_drop
required_gate_bankruptcy, not a new defect. The same qualifier applies to the P0-1,
P0-2 and P0-3 evidence on this PR. No roster was widened to change that.

Ten imports the deleted wrapper alone kept alive are removed with it; each was
verified import-only before removal. No other path is touched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aYqbapkp3MEjXYLDcXSc1

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Sep 2, 2026
…th sides

main's #9832 landed two RLM-2b rows AND deleted the seventeen XL-0T rows, so the
roster conflicted head-on with this branch's nine. Resolved by the rule main's own
thirteenth entry states: the roster is the old cohort, UNION newly live main
cohorts, MINUS every cohort whose trigger has fired as of the base being merged,
ASKED OF EACH SIDE INDEPENDENTLY.

Asked of both sides, that leaves this change's nine and nothing else.

- The seventeen XL-0T rows: trigger #9907, fired. Both sides had already deleted
  them, so there was nothing to decide.
- RLM-2b's two rows: trigger "#9832 merging", and #9832 IS the base being merged --
  main's head is that merge commit. Their lifetime ended as this merge began. Base
  and head both carry the constant's relocation, so both rows would report stale
  and refuse every unrelated PR, exactly as the seventeen did.
- This change's nine: trigger #9985 merging, not fired. They stay.

Keeping RLM-2b's rows because they arrived from main would have been the precise
mistake its own paragraph documents -- asking the trigger question only of the
rows being kept, never of the cohort being imported -- one iteration later with
the roles swapped. The entry recording this says so, because the recipe is the
thing worth carrying, not the arithmetic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MTyLH5T2TxJgM86miXZXhh
cursor Bot pushed a commit that referenced this pull request Sep 7, 2026
…s at the boundaries

The receipt_2 census's fifteen identities, resolved at their sources:

- lexing.dag, dag.dag, python.dag, typescript.dag: LexPattern.text is the
  structural carrier (v2.std.text.String); the construction sites held host
  Strings. Convert at construction with chars() -- the #9907 ingress pattern.
- python.dag / typescript.dag bool groundings: qualify the annotation as
  BooleanAlgebra<v2.std.logic.Bool>; with the emitter's substituted-
  declaration provenance guard the qualified arg now renders structural.
- target_model.dag: target_lex_rule_literal_step returns the host carrier
  (chars_to_string over the structural pattern text); TargetText.source
  converts at the is_empty boundary; the unicode-scalar symbol intern converts
  its single-codepoint list to the host carrier.
- qualified_name.dag: qualified_name_from_dotted_string uses the host-carrier
  emptiness check (string_length == 0) instead of routing through the
  structural string_is_empty.
- 02_parse.dag: parse_looks_like_match_arm_start rewritten on host-carrier
  operations (string_length, char_at, code_point) rather than converting to
  the structural carrier for a two-character lookahead;
  parse_char_is_arm_pattern_lead takes the codepoint Int directly.
- v1_interpreter_primitive_surface.dag row_key: the concat pipeline lowered
  to a .concat() method call on std::string::String (E0599); rewritten as
  nested concat calls.

Measured: the 00_compile closure emits 172 files and cargo check reports
cargo_clean=true, cargo_error_population=0 under the pinned 1.93.0 toolchain.
briansrls added a commit that referenced this pull request Sep 9, 2026
…0692)

* Land the add-slice per-stage verdict instrument named as the floor_expected_red note's producer

The add-slice roster note in v2.workflow.floor_expected_red carried a dated
receipt (main 3a8344b5c: infer accepts dag_add_emitted_root; the
infer-then-translate composition refuses headed by infer_grounding_not_derived)
and named its own next-rung trigger: a .dag entry returning the per-stage
verdicts for one root, so the paragraph can name a producer instead of a
commit.

v2.compiler.self_host.candidate_generation_stage_verdicts is that entry,
parameterized over root and target: the receipt's verdict vocabulary
(infer_accepted / infer_rejected; candidate_accepted or the rejection head
reason) plus the carried-reasons lists -- the half the verdict symbols cannot
say, namely that infer accepts while carrying the frontier diagnostic on its
accepted path, so the enrolled witness's d == None conjunct fails even where
the composition reaches acceptance.

v2.test.execution.self_host_candidate_generation_stage_verdicts binds the
instrument to the slice's own fixture, with add_slice_stage_verdicts_entry the
runnable gunbc run --function form (ExitSuccess only when infer accepts clean
and the composition accepts clean). Two witnesses: infer-accepts as a
permanent positive control, and the frontier-state pin that is expected to red
the day the add-slice stall's trigger lands, flipping to a permanent
regression control in the same change that removes the roster row (DESIGN
4b(4)).

Measured by execution on this branch: the entry exits 1 printing
infer=infer_accepted, infer_carried=[infer_grounding_not_derived x10],
composition=infer_grounding_not_derived, composition_carried=[x11] -- the
receipt reproduced, with bind_outcome's pending-plus-gate chain counted. Both
witnesses PASS; the enrolled semantic witness still fails as enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for dag declared inhabitants: the add slice greens end-to-end

infer gains the declared-inhabitant membership derivation: a node declared in
the dag language authority's declared-inhabitants roster derives its grounding
by lookup, with the roster as evidence -- the namespacing answer to the atom
authority question, at specimen scope. The add slice's ten type-spine nodes
(Arrow, Conj, Atom) are all roster members, so:

- candidate_generation_translate_self_emit_dag_add_slice_holds passes; its
  floor_expected_red roster row and per-row note delete per the roster's own
  stale-quarantine arm
- the dag same-language ingest path compiles end-to-end: cross_language_compile
  accepts, byte-equal to the authority's own serialization, no carried
  diagnostics
- the add-slice stall narrows to its four python/typescript round-trip members;
  the original trigger's causal clause was refuted by execution and is restated
  against the grammar parse-product population
- the instrument's frontier guard flips to add_slice_composition_accepts_holds
  (DESIGN 4b(4): frontier guard to permanent regression control)
- five manual witnesses flip with it: two root flips rewritten to assert the
  green state, three transitive conjunctions updated

The kinds stay frontier: non-member Arrow/Conj/Atom specimens carry
GroundingNotDerived exactly as before, and all fourteen enrolled
refusal/acceptance controls pass unchanged. The door's production path still
reds inside rust emission, untouched by this rule.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for canonical binding atoms: dag_binding_denotation joins binding to inhabitant once

The resolver already binds the surface spelling Int to the canonical binding
symbol dag_binding_type_int; what that binding DENOTES is the Int inhabitant
declared at dag_declared_inhabitants_core. Every hand-rolled fixture facts
lookup re-authored that join (dag_add_canonical_grounding_for,
record_construct_canonical_grounding_for). The language authority now declares
it once as dag_binding_denotation, and infer_node_facts consumes it: an Atom
whose identity is a canonical dag binding with a declared denotation derives
with that denotation as its grounding evidence.

Direct-rust-door specimen census: 14 underived -> 10 underived (the four
dag_binding_type_int atoms derive; grammar-production atoms, algebra atoms,
bare operand atoms, and the arrow/conj spine stay on the frontier unchanged).

Specimen-scope interim in the same frame as
infer_node_declared_in_dag_inhabitants: both delete in favor of consuming
resolution output when the resolver hands infer declaration-resolved
identities directly (the namespace migration's completed state).

Witness: v2.test.execution.dag_binding_denotation — all four Int binding
atoms in the door specimen derive with dag_int_inhabitant_node() as
structural evidence, and the two bare operand atoms stay GroundingNotDerived
(boundary control). Refusal suite 14/14, ingest bridge 7/7, add-slice
instruments 2/2 green; every remaining red in the at-risk population
reproduces identically on the pre-change tree and is enrolled in
floor_expected_red.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Add v2 self-host direct-path orientation: axes, sequence, autonomy contract

A point-in-time orientation that defers to the existing authorities
(DESIGN section 7, the four-wave self-host program, the roadmap node
chain, the three frontier carriers, the guarantee-stall roster, XL-N)
rather than restating them: state is re-derived by the named
instruments, never transcribed here. Sequences the remaining work in
roadmap order (door, parse-product grounding, first behavioral module,
XL-N milestones, native bootstrap, fixed point, v1 deletion) and states
which decisions stay operator-gated.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for fully-evidenced Conj and Arrow products

The sixth and seventh kind rules: a non-roster Conj or Arrow whose every
child carries DerivedGrounding derives, its evidence the same shape
re-formed over the children's grounding evidence (a fresh
OccurrenceSynthetic node, never the source — the self-evidence wall holds
by construction). A product with any frontier or absent child stays on the
frontier with its typed diagnostic; a childless product has no evidence to
compose and stays frontier. Roster members keep their roster evidence.

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
10 underived of 15 -> 6. The parameter conj, the module-structure conjs,
and the bodied add arrow derive; what remains is the algebra atoms from
the + operation (AlgebraPrimitive, ring_field_add), the module atom
(dag_surface_module), the parameter references (x, y), and the
grammar-projection root conj that cascades once they land.

Enrolled witnesses (src/v2/test/claim/execution/infer_product_introduction_test.dag):
- product_introduction_derives_fully_evidenced_products_holds — census:
  4 Conj (3 derived, 1 frontier-by-frontier-child) + 1 Arrow (derived).
- product_introduction_composed_evidence_carries_child_groundings_holds —
  the params conj's evidence is a Conj whose x/y children target the dag
  authority's Int inhabitant.
- product_introduction_leaves_childless_conj_on_the_frontier_holds —
  boundary control via direct infer over a hand-built childless Conj.

Flip census (pre- and post-change, zero unexpected flips):
translate_underived_refusal 14/14, infer_self_grounding_wall 12/12,
branch_infer_if_then_else 2/2, compile_eval_thesis_proof 6/6,
ingest_bridge 9/9, cross_language_add_python_to_typescript 4/4,
inhabitant_neutralization 6/6 + e2e 6/6, emit_host_classical_not 14/14,
dag_binding_denotation 2/2, stage-verdicts instrument 2/2,
dag_add_emit_round_trip 4/6 (the 2 enrolled reds unchanged), door
production group still enrolled-red (unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground canonical-operation and grammar-production atoms by authority roster membership

Two more specimen-scope derivations in infer_node_facts, both lookups into
declared authorities, never inventions:

- Canonical-operations roster (target_model.dag): every CanonicalOperation
  the target-model authority declares, rendered by
  target_model_canonical_operation_wire_node and gathered under one Conj
  root. The resolver canonicalizes surface operators (e.g. +) to those
  declared operations, so the wire atoms -- the operation discriminant and
  its field references -- derive by membership with the roster root as
  evidence. General over all 14 declared operations, not add-narrow.

- Grammar-productions roster (dag.dag): every production in
  dag_grammar_root() projected to its emitted surface atom under one Conj
  root keyed by production name. The bridge projects a production's parse
  into (identity atom, captured content) pairs, so the identity atom
  (dag_surface_module) derives by membership with the roster root as
  evidence. The roster derives from the grammar root, so a production
  added to the grammar joins by construction.

Both roster roots are Conj nodes, never structurally equal to any member
atom, so the self-evidence wall holds by construction (the first attempt
at the operations rule used the wire node itself as evidence and was
refused by grounding_evidence_is_source -- the wall doing its work).

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
6 underived of 15 -> 2 (only the operand atoms x and y remain; the
grammar-projection root conj cascades once the module atom grounds).

Enrolled witnesses (infer_atom_grounding_rules_test.dag): each roster rule
pins derivation + evidence identity + census; a boundary control pins that
a bare atom with no authority membership stays frontier; the closing
control pins the 2-of-15 state.

Flip census: the product-introduction census witness updates 3->4 derived
conjs (the top conj now cascades) and gains a hand-built
partially-evidenced boundary control to replace the in-specimen one the
cascade consumed. Full battery otherwise unchanged: refusal suite 14/14,
grounding wall 12/12, instrument 2/2, binding-denotation 2/2, round-trips,
bridge, cross-language, neutralization, emit-host all green; enrolled reds
unchanged.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground binding-reference atoms from the enclosing arrow's domain declaration

The fifth specimen-scope derivation, closing the direct-rust-door
specimen's inference frontier: an Atom whose binding an enclosing arrow's
domain declares derives with the declared domain type as its evidence --
the declaration-site annotation, itself derived (x: Int grounds the x
reference). This is the same lookup the branch-operand path already
performs (infer_find_arrow_domain_type_in_tree), now written to the
operand atom's own facts; it is scope-naive (whole-tree, first match),
recorded in the frontier note, and deletes with the other specimen-scope
rules when the resolver hands infer declaration-resolved identities. The
tree is threaded through the fold's init chain to reach infer_node_facts;
the helper had exactly one caller.

Measured on the door specimen (scratch probe, uncommitted): 2 underived
of 15 -> 0. The specimen's inference frontier is fully closed, and the
production observation advances from InferenceRejected
(infer_grounding_not_derived) to EmissionRejected
(target_use_site_ownership_lookup_miss) -- a new, typed, located deficit
in the emitter, the next gate on the path.

Flip census (all three rewrites verified by execution):
- dag_binding_denotation_leaves_unbound_operand_atoms_on_the_frontier_holds
  -> dag_binding_denotation_declares_no_denotation_for_operand_bindings_holds:
  the boundary moves to the authority itself (the denotation table returns
  Absent for x/y), true regardless of infer's other rules.
- The three emit_host classical-not refusal guards (canonical, staging,
  staging-swapped) flip to acceptance witnesses pinning the emitted text's
  shape -- the real-infer tree now fully derives, and the emission is the
  same one the equals-eval witness proves behaviorally correct. The
  translate-refuses-underived behavior stays enrolled on hand-staged
  fixtures in translate_underived_refusal_test.dag (14/14 green). The
  renames are carried into the commit_workflow and witness_deferral_freeze
  rosters.
- New witnesses: binding_reference_derives_parameter_atoms_holds (evidence
  is the domain's Int binding atom, census 2) and
  door_specimen_fully_derives_holds (0 frontier of 15).

Full battery at this state: refusal suite 14/14, grounding wall 12/12,
instrument 2/2, binding-denotation 2/2, product-introduction 4/4,
atom-rules 5/5, emit_host 14/14, round-trips 4/6 (2 enrolled reds
unchanged), bridge 9/9, cross-language 4/4, neutralization 6/6 + e2e 6/6,
branch 2/2, eval-thesis 6/6; door production group still enrolled-red
(unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Green the direct-rust-door: route emission through produced-decl composition and decode canonical operator wires

The door specimen's inference frontier is fully closed, so its production
observation now reaches the emission stage. Two defects surfaced there, both
fixed here:

Emission composition. generate_rust_emission_candidate served two lanes with
one root shape: the door's production path (a dag module shell) and a fixture
lane (a bare rust Arrow). The translate ownership gate queried the module
atom's ownership at a struct-field use site and refused with
target_use_site_ownership_lookup_miss, because the module's grammar-projection
conj was misread as a type record. The door's real composition is the
produced-decl path: collect declaration conjuncts from the inferred tree and
emit via emit_produced_decl. A new generate_rust_module_emission_candidate does
exactly that, enforcing an exactly-one-declaration admission policy
(rust_module_emission_decl_absent / _ambiguous). The observation and production
mint paths switch to it; the fixture-lane candidate is retained with a note
that it is fixture-only. A pure collector, produced_decl_conjs_in_tree, finds
nodes of produced-decl shape (a Conj whose first child is a Named edge to an
Arrow). Its decl-head match routes through a declared FreeMonoid<Edge>
parameter because the v1 seed stamps pattern variables from a declared
parameter type, not from a field-access scrutinee.

Operator decode. With composition fixed, source fidelity still refused: the
door emitted fn add(x: i32, y: i32) -> i32 { AlgebraPrimitive(x, y) } instead
of { x + y }. Resolution canonicalizes a surface operator atom into a
canonical-operation wire node, so a production tree's transform operator
position carries the wire, while fixture trees that bypass resolution still
carry the surface token atom. translate_project_transform_in_arrow_scope only
knew the surface-token table, so the wire missed and fell to callable apply,
rendering the discriminant identity. The projection now tries the wire decode
first (canonical_operation_from_wire_node) and only on a wire miss falls to
the surface-token table, then to callable apply; the arms are disjoint, so the
dispatch adds no fallback widening. target_transform_operator_child extracts
the operator child safely.

The door's closing expectation now greens by execution, so its known_red_probe
row in explicit_witness_admission is deleted per its own dissolution condition,
and the roadmap authority note, the door contract note, and the direct-path
plan are updated to record the green state. realized_closure_for_v2_direct_
rust_door_emit_run's module list reflects the produced-decl route.

Verified by execution: the door witness greens; the fixture, containment,
algebra, produced-decl, add-slice, and classical-not witnesses stay green;
claim_executor required-ci lanes build and witnesses both exit 0; cargo fmt and
clippy --all-targets -D warnings are clean. One pre-existing red,
witness_projection_is_active_only in the floor_cost_debt containment roster,
reproduces on the base revision and is unrelated to this change.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the parse-product grounding frontier: widen declared-inhabitant membership to the closed ingest set

The declared-inhabitant roster-membership derivation in 04_infer generalized
from the dag roster to the closed ingest set (dag, python, typescript):
infer_node_declared_in_language_inhabitants returns the declaring authority's
roster root as evidence, with deep subtree membership so a declared
inhabitant's leaf fact atoms derive exactly as the inhabitant node itself.

Measured: the python fixture's 19-node frontier and the typescript fixture's
28-node frontier both close to zero; all four add-slice stall population
round-trip witnesses green; the python->typescript cross-language compile
accepts, byte-identical to ts_source_text.

Section 4b(4) flips (expecting-red probes becoming permanent regression
controls for the acceptances):
- cross_language_compile_refuses_canonical_underived_holds ->
  cross_language_compile_python_to_typescript_round_trip_holds
- inhabitant_neutralization_emit_after_neutralize / same_flavor_python /
  go_int64_to_ts refusal helpers -> round-trip controls
- inhabitant_neutralization_python_to_ts_cross_language_compile (e2e) ->
  round-trip control; python->go members stay refusal guards (go is outside
  the closed ingest set)
- cross_language_emit_inhabitant_neutralization_refuses_underived_holds ->
  round-trip control; the python->typescript emit-matrix row reads ChainProven

The add-slice stall's next-rung trigger fired, so it retired per DESIGN
4b(4): removed from all_guarantee_stalls, row file deleted, witnesses stay
enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Promote the add family to SelfEmittedNative: native-only verdict witness for the emitted add crate

First InterpreterRetained -> SelfEmittedNative promotion after classical_not,
executing the v2-emitter-first-behavioral-module first slice at the
coverage-frontier grain: the add family (fewest dependencies — integer
literals plus one canonical operation) now carries a native-only verdict
witness, so its behavior is established by the emitted crate's own stdout
with eval() unreachable from the verdict path.

- emit_host_native_only_add_holds: real emit -> cargo build -> native run,
  stdout pinned to the family's expected octet, sharing the kernel family's
  one-build cache key exactly as the classical_not arm shares its family's
  key (no duplicated cold build).
- emit_host_native_only_add_wrong_octet_mismatch_detected_holds: the broken
  control — a no-eval verdict has no oracle leg to break, so the expectation
  side breaks (an octet the run never produces must not match); program-side
  discrimination stays with the family's equals_eval primitive-five/six pair.
- The add coverage row flips disposition with its backing citation enrolled
  by construction (the verdict entry is file-grain enrolled in
  falsifier_self_host_wet_template_entries).
- Frontier census tests updated at identity grain: natives are exactly
  {classical_not, add}; split 2/13.

Verified by execution: all six native-only verdict tests green locally
(real wet legs — compile_skipped receipts show cold builds and native runs);
all eight emit_coverage_frontier tests green, including the unbacked-claim
RED control.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Record the add-slice defect's repair in the declined-live-tree classification

The row classified candidate_generation_translate_self_emit_dag_add_slice_holds
as RealDefect/CompilerBehaviourRefusal with measured evidence that translate
refuses infer_grounding_not_derived. The owner lane (v2 self-host) repaired the
subject: the declared-inhabitant roster-membership derivation grounds the
slice's type spine by lookup, and the witness passes under claim_batch
--hermetic on the merged tree. The dated classification is kept verbatim; the
disposition flips RoutedToOwner -> RepairedInThisChange with the repair
measurement appended to the evidence, so the routing carrier stops dispatching
a fixed defect. Structural witnesses (count 13, no NotReproduced, exact
partition) are untouched and pass.

* Hoist two in-body annotation blocks to module-item grain

Main's annotation-placement wall (source annotations admit only standalone
leading blocks attached to module-scope declarations; in-body forms refuse)
reached this branch through the merge and refused 8 blocking errors on the
00_compile closure: the add-family promotion note inside the
emit_coverage_frontier_roster list and the python->typescript row note inside
the cross_language_emit_matrix list. Both blocks move above their enclosing
declarations, rephrased to name their subject row. Measured: gunbc compile of
src/v2/compiler/00_compile.dag now emits 172 files with 0 blocking errors;
both files' suites stay green (8/8 and 4/4).

* Promote the complement family to SelfEmittedNative: native-only verdict witness for the emitted logic family crate

The complement family's native execution runs family-grain per the
witness_family_build_grain_ruling (one crate for meet + join + complement,
argv-dispatched), so the native-only arm emits the logic family crate and
runs the complement member through the family dispatcher, sharing the
family witness's one-build cache key. The verdict is decided solely by the
emitted native run's stdout (expected octet 0, complement(True) = False);
the broken control flips the expectation side (octet 1 can never match),
with the comparator pinned by the stdout mock pair. Program-side
discrimination stays with the equals_eval agreement pair and the family
witness's all-alt leg.

The frontier row's backing citation lands in the already
file-grain-enrolled native-only verdict entry, so it is enrolled by
construction; the roster comment is rephrased to cover both 2026-09-07
promotions (add and complement). The frontier test's split and native
membership assertions move to 3 native / 12 retained.

Verified by execution: claim_batch --hermetic on
emit_host_native_only_verdict_test.dag passes all 8 witnesses (the two
new complement arms included), and emit_coverage_frontier_test.dag
passes all 8.

* Key the emitter's host-String arm on declaration provenance, not spelling

is_host_text_carrier_type answered true for any type expression whose
authored name reads "String", including references to the structural
alias v2.std.text.String (type String = FreeMonoid<Char>) that the
namespace lane (gunbc#9907) requalified the v2 corpus's text-carrier
fields to. The emitter rendered every one of those references as the
host String while value-position consumers rendered the structure -- the
E0308 family dominating the self-host compile-phase frontier (41 of 64
in v2_compiler_tokenize.rs on the post-merge board).

The String arm now consults the resolved declaration's provenance
against v1.compiler.coercion structural_declaration_modules_for -- the
same roster type_realization_decision reads -- so the legacy arm and the
strict decision cannot diverge on one node (DESIGN section 3, and
gunbc.recurring_failure_mode alias_resolution_collides_with_kernel_spelling).
Kernel mints and unresolved references keep the host answer exactly as
before.

Regen: the only drifted stage0 mirror is v1_compiler_emit_rust.rs
itself (no module in the stage0 closure references a structurally
declared String -- verified by the whole-population candidate tree),
installed from target/stage0-regen-candidate after the priced round's
partitioned rebuild refused MirrorHasNoOwningPackage on the emitter
(the emitter is monolith-shell, not partition-owned). Fixed point
verified by execution: claim_executor --required-regen on the rebuilt
seed reports first_generation_equal=true over 158 adjudicated mirrors.

* Peel qualified String alias leaves in field position: XL-N closure 72 -> 28 errors

A field authored v2.std.text.String reached the Rust emitter as an overlay-less
resolved reference leaf and rendered the bare terminal name, which binds the
prelude String cross-module (#9813: kernel names are never overridden by
imports, so the use-line is dropped) while every value position renders the
structural carrier Rc<Vec<i64>> -- the v2_compiler_tokenize.rs E0308 family,
41 of 72 errors on the XL-N phase board.

The new rust_overlayless_alias_leaf_requires_peel arm in
render_rust_type_without_applied_binding detects the population (overlay-less
zero-parameter alias leaf, qualified spelling, String terminal segment,
closed_alias_peel_verdict agrees) and renders the alias declaration's resolved
right-hand side, projecting the same realization the fn-signature positions
already produce.

The qualified gate is load-bearing: inside the declaring module the bare name
is the correct render (the emitted module carries the alias declaration), and
the local binding's resolved_type drops the RHS type argument, so an ungated
peel rendered Rc<FreeMonoid> there (E0107 x13, E0282 x2 on the probe). Bare
String keeps denoting the kernel scalar through the host-carrier arm.

Measured: probe specimen (qualified/bare/direct-FreeMonoid/container/variant/
local-alias positions) compiles clean; XL-N compiler closure cargo check
72 -> 28 errors with the residual census dominated by the declared
text_boundary_identity_wall class (kernel String vs structural carrier at
bare-authored boundaries, 17 of 20 E0308s); v1-corpus fixed point holds
(first_generation_equal=true, 158/158 adjudicated).

* Resolve the 12 non-hop XL-N closure errors at source: text-wall conversions + witness_violates helper

Four clusters, all measured non-hop additions between receipt_1 (155) and the
post-peel census (28); the live gate now measures 15 with zero unadmitted
regressions:

- integer.dag: integer_string_to_decimal_digits_step takes v2.std.text.String;
  the public boundary converts with chars() (text_boundary_identity_wall
  specimen discharged at this site).
- 01_tokenize.dag: Token/UnboundSourceAnnotation lexemes convert structural
  -> host String with chars_to_string() at construction, mirroring the v1
  tokenizer's host-lexeme carrier.
- target_model.dag + bash.dag: EmitSpellingEscape.from/to and
  apply_emit_spelling_escapes go structural (v2.std.text.String); the
  EmitSpellingQuote arm converts host->structural->host at its boundary;
  bash's escape rows wrap their kernel String literals with chars().
- witness.dag + 3 call sites (collection list_nth, provenance
  span_index_resolve_textual_locus_from_ids, compile outcome_with_diagnostics):
  new witness_violates<C> helper puts Violates constructions in a
  Witness-headed position so the emitter resolves the carrier type argument;
  dissolves once inference records per-call substitutions.

Verified: 48 targeted claim witnesses green (tokenize behavioral, shell
conformance, string brace escape, string length, map-lookup violates, source
text ingress, bash materialize x12, int literal smoke x6, provenance span
index x2).

* Record receipt_2 on the self-host compile-phase frontier: 15-error census at 66765317ec

The census at the XL-N lane tip: 155 -> 15 net, credited to the qualified-alias
peel (60cbd7b697, 72 -> 28) and the twelve-error source cluster (66765317ec,
28 -> 15). The epoch changes on the instrument's target pinning (found by
review on gunbc#9857), admitted with receipt_1's board as the reclassified
predecessor under the identity map. Nine added identities are hop relocations
admitted by the hop index; four sit in python/typescript modules newly entered
into the emitted closure, admitted as ExposedByNewEmittedModule.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* Emitter: a substituted declaration node carries its own provenance

Inference substitutes the resolved declaration into a data annotation's
type-argument position, so BooleanAlgebra<v2.std.logic.Bool> reaches the
emitter with the arg BEING the type Bool = True | False declaration itself
(Disj connective, ident_span in src/v2/std/logic.dag, no Resolved wrapper).
type_reference_provenance_in_env's bare-leaf arm re-resolved that leaf in the
REFERENCING module's scope, where post-#9813 a kernel-shadowed spelling
answers the kernel declaration -- so the structural enum rendered as host
bool against a value of BooleanAlgebra<Bool> (the python.rs:328 /
typescript.rs:177 E0308 pair on the XL-N compile-phase frontier).

The connective is the discriminator: a reference node is a bare name
(NoConnective); a node carrying Conj/Disj structure IS the declaration, and
type_reference_provenance's own-span fallback already answers that shape
correctly. The guard routes declaration-shaped nodes there directly, bypassing
the scope lookup that #9813 makes answer the kernel.

Mirror regenerated via the regen round; fixed-point verified
(claim_executor --required-regen PASS).

* Clear the remaining XL-N closure errors at source: carrier conversions at the boundaries

The receipt_2 census's fifteen identities, resolved at their sources:

- lexing.dag, dag.dag, python.dag, typescript.dag: LexPattern.text is the
  structural carrier (v2.std.text.String); the construction sites held host
  Strings. Convert at construction with chars() -- the #9907 ingress pattern.
- python.dag / typescript.dag bool groundings: qualify the annotation as
  BooleanAlgebra<v2.std.logic.Bool>; with the emitter's substituted-
  declaration provenance guard the qualified arg now renders structural.
- target_model.dag: target_lex_rule_literal_step returns the host carrier
  (chars_to_string over the structural pattern text); TargetText.source
  converts at the is_empty boundary; the unicode-scalar symbol intern converts
  its single-codepoint list to the host carrier.
- qualified_name.dag: qualified_name_from_dotted_string uses the host-carrier
  emptiness check (string_length == 0) instead of routing through the
  structural string_is_empty.
- 02_parse.dag: parse_looks_like_match_arm_start rewritten on host-carrier
  operations (string_length, char_at, code_point) rather than converting to
  the structural carrier for a two-character lookahead;
  parse_char_is_arm_pattern_lead takes the codepoint Int directly.
- v1_interpreter_primitive_surface.dag row_key: the concat pipeline lowered
  to a .concat() method call on std::string::String (E0599); rewritten as
  nested concat calls.

Measured: the 00_compile closure emits 172 files and cargo check reports
cargo_clean=true, cargo_error_population=0 under the pinned 1.93.0 toolchain.

* Pin the cargo half's toolchain channel by construction

The cargo half runs with cwd = a fresh mktemp directory; with no
rust-toolchain.toml there, rustup resolves the host's DEFAULT toolchain, so a
census under cargo 1.83 and one under cargo 1.93 would compare as equal epochs
while different compilers did the measuring -- the fabricated comparability
the target pin (gunbc#9857) excludes, one level up. Measured 2026-09-07: a
host default of 1.83.0 met a crates.io index whose freshly published
dependency manifests require edition2024, resolution failed before any
diagnostic existed, and the zero-diagnostic refusal fired on an unmeasured
tree.

The pin is propagated by copying the repo's rust-toolchain.toml into out_dir:
the file remains the sole in-repo channel authority (its header forbids a
second pinned literal), and the copy makes the measured channel true by
construction on any host. The gate's read_live_toolchain observes the same
channel because every documented actuator invokes from the repository root,
which the same file governs.

* Record receipt_3 on the self-host compile-phase frontier: the emitted closure's cargo census is empty

Measured at 5ee4892b70 by the one-entry instrument: the 172-file emitted crate
reports zero cargo error diagnostics, so the board attributes every phase a
count of zero and furthest_phase_reached stands at Borrowck. The fifteen
removals against receipt_2 need no disposition; nothing was added.

The epoch does not change: the cargo half now pins the toolchain channel by
copying the repo's rust-toolchain.toml into the scratch crate, and every
recorded comparison field is identical to receipt_2 (whose census the
fingerprint evidence shows the same 1.93.0 toolchain already compiled), so the
same-epoch arm carries no reclassified predecessor.

The frontier-state pin flips per DESIGN 4b(4):
the_published_frontier_standing_does_not_claim_typeck_or_borrowck_passed
becomes the_published_frontier_standing_claims_typeck_and_borrowck_passed, the
permanent regression control over the green state.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Repair-Judged: docs/design-rung-drops.md

* Remove the stale PointwisePower inhabitant rows from the four language rosters

First native-parity divergence class found by running the emitted closure on a
discriminating fixture: the algebra inhabitant rosters still carried
PointwisePower after its authority row was cut, so the emitted compiler panicked
at 12 record-shaped carrier sites while the interpreted seed refused cleanly.
The roster rows are removed in rust/python/go/typescript types.dag, the derived
coercion assertions in compiler_tests.rs regenerate without them, and two
witnesses pin the boundary: the record shape constructs its structural carrier,
and FinitePowerSet still refuses while its row stands.

Mirrors regenerated by a converged regen round (fixed point Reached, stage-1
PromoteGenerationInputs over the three language types mirrors).

* Regen gen-2 gate: compare executable digests in one spelling

The admitted side of run_built_seed_regen carries the executable-digest
spelling (current_exe_digest, next_pass_executable_digest) while the observed
side hashed the file through path_digest, which prepends the fnv1a64: tag.
Same bytes, two spellings, so the gate could never pass -- unpassable since
fa2d403dc8 (#9771). Factor current_exe_on_disk as the single path authority
and read the observed digest through current_exe_digest so both sides spell
the same bytes the same way.

* Model ReleaseScopeEmpty for release-excluded mirrors, end to end

A regen round whose only stage-2 drift was compiler_tests.rs (the PointwisePower
roster removal rewrote its derived coercion assertions) refused the rebuild
MirrorHasNoOwningPackage: the mirror is owned by no partition package, because
every item it defines is #[cfg(test)] and no release unit elaborates it. The
refusal conflated two different states -- unowned (a coverage hole) and excluded
from the release build by construction (a precise empty scope).

The model now names the class: rebuild_scope_release_excluded_mirrors rosters
its members (compiler_tests.rs, cited to emit_compiler_tests_module), the
decision answers ReleaseScopeEmpty when the whole change set is excluded, and
the actuation shape is actuatable with an empty package closure and every
partition package excluded -- the build still runs as verification, and a
compiled partition package refuses the stage. The host admits the empty closure
only when the new stage0_partition_rebuild_release_scope_empty_today query
answers true; any other empty closure still refuses. A mixed change set scopes
on its release-visible members alone.

Verified by execution: the 2026-09-08 round converged (fixed point Reached)
with stage-2 installing compiler_tests.rs alone; cargo recompiled the shell
crate on its fingerprint (the outer mod line is ungated, so rustc reads the
file) while the produced executable was byte-identical -- stage input seed
digest == output seed digest. Four new witnesses pin the arm, its actuation
shape, the mixed set, and the host-facing query's two arms; the boundary
witness (unowned cli_run.rs still refuses) keeps the roster from decaying into
the absorbing fallback.

* Round-cost receipt: project installed mirrors to the model's vocabulary

The receipt's partition-rebuild line is rendered by the model over
receipt.installed_mirrors, which the host populated from the stages'
projected_paths -- full paths -- while the partition rows and rosters key on
basenames. Every drifted round's receipt therefore rendered a spurious
RebuildScopeRefused MirrorHasNoOwningPackage line naming a full path, a false
claim on the round's own receipt. Route the projection through
emit_path_basename, the module's single path-to-basename bridge, so the field
carries the mirror names the model's vocabulary means.

* Hoist ReleaseScopeEmpty annotations to module-item grain

The ReleaseScopeEmpty modeling commit placed three // blocks inside
declaration bodies (stage0_partition_rebuild_is_actuatable,
stage0_partition_rebuild_decision, stage0_partition_rebuild_excluded_today).
The .dag realization admits annotations at module-item grain only, so the
floor lane's parse phase refused the file with 12 located errors and the
run ended floor refused. The prose is unchanged; each block now sits above
the declaration it describes.

* Spell the PointwisePower witness's finite-set exclusion as the applied realization

The witness added with the fossil-row removal excluded the bare spelling
"BTreeSet", but every emitted file's preamble imports OrdSet as BTreeSet,
so the row could never green. The exclusion's subject is the finite-set
REALIZATION the fossil row would have asserted; spell it applied
(BTreeSet<i64), which the preamble's import line does not contain.

* Emit fieldless-record data values as null for the unit-struct carrier

The second native-parity divergence class, measured 2026-09-08 on the
native run of the emitted 00_compile closure: emit_data_value_json spelled
EVERY record literal as a JSON map, including the zero-field record, while
emit_struct_from_children renders that same declaration as a Rust unit
struct (pub struct BoolEncodingFact;). serde's derived unit-struct
Deserialize reads null and rejects {}, so the emitted compiler panicked at
first touch of v2.std.logic's bool_primitive_facts: "invalid type: map,
expected unit struct BoolEncodingFact". The JSON spelling of a data value
must deserialize into the Rust type the same declaration emitted; the
record arm now spells the zero-field value null and keeps the map spelling
for non-empty records.

The mirror is taken from the required-regen candidate, not hand-edited.
Two witnesses enroll: the discriminating red (zero-field record spells
null, never {}) and the boundary control (a record with fields keeps the
map spelling).

* Bind the duplicate-definition filter ahead of its branch condition

Main's FilterInBranchCondition wall (#10699) refuses to publish a module
whose filter call sits in a branch condition, and the v2 00_compile closure
emission names primitive_duplicate_semantic_definition_violation as such a
site. The filter is pure and total; binding it with a let ahead of the
branch is the authored remediation the wall exists to force, and the
emitted closure is unchanged in behavior.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md rust_unit_tests_off_the_merge_path
Ledger-Rows-Repaired: docs/design-rung-drops.md determinism_transitive_reachability
Ledger-Rows-Repaired: docs/design-rung-drops.md transitional_admission_exception

* Emitter: three native-parity repairs for the post-merge 00_compile closure build

Three divergence classes measured as the 21 rustc errors on the natively
emitted 00_compile closure after the main merge, each repaired at the .dag
source with a discriminating witness:

- Locality wins over a foreign ambiguity (12 E0433 in v2_std_integer.rs):
  alias_rhs_base_module_filename asked the global leaf index, saw
  LeafAmbiguous for Compose, and emitted the poison marker even inside
  v2.std.integer itself, where source resolution binds the local
  declaration before any cross-module lookup. The local physical
  declaration now shadows foreign declarers; the poison marker still
  stands for a leaf two FOREIGN modules declare.
- The qualifier is the disambiguator (8 E0425/E0433 in
  v2_lens_fact_density.rs): the qualified use-line route declined any
  globally-ambiguous leaf, but a qualified reference names its provider
  in its own spelling. The route now resolves by DeclaredCallableIdentity
  at the qualifier, keeping the type-declared and export-proof walls.
  The dotted spelling reaches the route through the value surface (a
  qualified value projection's borrowed type stamps the match patterns'
  parent_enum); the witness reproduces that chain exactly, and its
  exclude half pins the E0603 boundary (the dotted VARIANT head must
  still be declined).
- Clone-bound forwarding is transitive (1 E0277 in
  std_realization_measurement.rs): the call-forwarding derivation
  re-derived only each callee's SELF-derived half, so a callee whose
  bound is itself forwarded re-derived to empty. The derivation now
  recurses over the call graph with the module's visited-set
  termination; the equality half stays one-hop as declared.

Witnesses: 56/56 PASS on the rebuilt seed; regen fixed point holds.

* Refuse variant record literals on the serde_json data path fail-closed

A record literal with parent_enum present is a variant construction whose
wire spelling is the parent coproduct's declared VariantEncoding policy --
a module-local fact of the parent's home module that emit_data_value_json
does not carry. The zero-field arm's null and the map arm's untagged fields
are both measured to fail serde deserialization under the internal-tag
default, so the arm now refuses and the caller renders compile_error!, a
build-time located refusal where a runtime panic on the data definition's
expect was the latent alternative. The refusal names its trigger: a
closure-wide wire-policy index beside EmitGraphInfo.type_decl_items.

Witness: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
forces the JSON path with a nested-record Holder and asserts the
compile_error! spelling while excluding the former null mis-serialization.

* Spell variant record literals on the serde_json data path from a closure-wide wire-policy index

The fail-closed refusal landed in 73b582dea6 fired on 5 real corpus sites
(SugarKey x2, CopiedPortCitationFrontierDisposition x3), proving variant
record literals reach the JSON data path in the 00_compile closure. This
change replaces the refusal with the correct spelling, driven by a new
closure-wide index:

- v1.compiler.infer_emit_info gains DataVariantWireSpelling, the
  language-general projection of a coproduct's Rust wire serde policy
  for one variant (InternalTagged { tag_field, tag } | BareString { tag }
  | Untagged | SpellingRefused { reason }), and EmitGraphInfo carries
  data_variant_wire_spellings: Map<String, DataVariantWireSpelling>
  keyed by coproduct.variant.
- v1.compiler.emit_rust builds the index once per emission root via
  build_data_variant_wire_spellings, resolving each coproduct's policy
  through the new shared resolve_emission_coproduct_wire_policy (the
  same function the type-emission side now calls, so the two cannot
  drift), projecting each variant through data_path_wire_variant_tag
  (rename_all and StripAffix aware), and poisoning collisions as
  SpellingRefused so ambiguity stays fail-closed.
- v1.compiler.emit's emit_data_value_json variant arm reads the index:
  internal-tagged spells {"_variant": tag, ...fields}, bare-string
  spells "tag" for nullary and refuses fielded, untagged spells the
  bare fields or null; unindexed keys and stored refusals remain
  compile-time errors. The service mock-property chain threads
  emit_info through so dry-run data spells identically.

Witnesses: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
is rewritten as ..._spells_the_internal_tag (asserts the internal-tag
map, excludes the former null mis-serialization and the refusal), and
w_fielded_variant_record_lit_on_the_json_data_path_spells_tag_and_fields
pins the fielded case. 57/57 witnesses pass; regen fixed-point holds.

* Promote field_access to SelfEmittedNative on the emit coverage frontier

Fourth native-eval construct promotion, after classical_not, add, and
complement. The native-only verdict arm pair lands in the already
file-grain-enrolled long/ entry, so the backing citation is enrolled by
construction:

- emit_host_native_only_field_access_holds pins the family one-build
  cache run's stdout to octet 9 (the byte the family witness's warm leg
  pins on the same build), eval() never called.
- emit_host_native_only_field_access_wrong_octet_mismatch_detected_holds
  breaks the expectation side with octet 1, the alt tree's byte.

Both arms verified wet locally (real cargo build + native run, sharing
the field_access family one-build cache key). The roster row flips to
SelfEmittedNative; the two census guards update per 4b(4) — the split
moves to 4 native / 11 retained and the identity-grain membership guard
is renamed to name the four-member population. The family's equals_eval
agreement pair stays enrolled as its program-side discrimination leg.

* Drop the scratch parity probe from the tree

The probe is a manual parity-loop instrument (the interpreted leg of the
native-vs-interpreted comparison), not a corpus declaration with an
executing consumer (DESIGN 6 experimental residue). It stays in use
locally as an untracked file.

* Promote match, loop, and fold_closure to SelfEmittedNative

Fifth, sixth, and seventh native-eval construct promotions. The three
match_loop_fold family rows flip together on one shared family-crate
arm shape, per the witness_family_build_grain_ruling: each arm emits
the three-member family crate once and runs its own member through the
argv dispatcher against the family one-build cache key.

- emit_host_native_only_{match,loop,fold_closure}_holds pin the warm
  legs' stdout to the family's declared octet lists (match/loop
  [0,1,0,0,0], fold [0,7,0,0,0]), eval() never called.
- The wrong-octet controls break the expectation side with each
  member's own alt octets (match/loop [0,2,0,0,0], fold
  [0,255,255,255,255]).

All six arms verified wet locally. The census guards update per 4b(4):
7 native / 8 retained, and the identity-grain membership guard is
renamed to witness_native_rows_closed_membership_holds so the name
stops encoding the volatile population.

* Promote meet_join to SelfEmittedNative on the emit coverage frontier

The meet_join family's native-only verdict arms land on the complement arm's
helper, generalized to take the family member_id: meet and join run through
the same argv-dispatched logic family crate (one-build cache key shared with
complement, per the witness_family_build_grain_ruling), eval() never called,
verdict decoded from stdout. Octets meet=1 join=1 are the bytes the family
witness's warm legs pin on this same build; the wrong-octet control expects
each member's alt byte (0), which the primary runs can never produce.

Both arms verified wet: cold build then warm hits, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (eighth promotion); census
guards move to 8 native / 7 retained with meet_join_eval_subject named in the
closed membership.

* Promote variant_construct to SelfEmittedNative on the emit coverage frontier

The variant_construct family's native-only verdict arms follow the
field_access arm shape exactly: the tree is the family's own equals_eval
tree value (emit_variant_construct_eval_tree, no eval leg reachable), the
run shares the family one-build cache key that
emit_on_demand_variant_construct_native_one_build_holds colds, and the
expected octet 9 is the byte the family witness's warm leg pins on this
same build. The wrong-octet control expects the alt tree's byte (1), which
the primary run can never produce; the wrong-value alt leg in the family
witness keeps the program-side discrimination.

Both arms verified wet: cold build then warm hit, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (ninth promotion); census
guards move to 9 native / 6 retained with
emit_variant_construct_eval_subgraph_node named in the closed membership.

* Close the emit coverage frontier: final six rows to SelfEmittedNative

The last six InterpreterRetained rows flip to SelfEmittedNative, taking the
roster to 15 native / 0 retained:

- filesystem_read and shell_exec_run (host-effect transport families, no
  translated arrow body): the arms reuse each family's own native leg with
  the expectation pinned as a literal grounded by the family's enrolled
  fixture pin (dag/extdeps/shell/exec.dag contains bash; its shell.Exec.Run
  argv materializes to exactly [bash, -s]), run through the families' fixed
  witness workspaces.
- module and produced_module: the arms execute the exact sources the
  equals_eval pairs run (emit_module over the add fixture tree;
  produced_add_module_source's ingested two-fn module), octet 5 pinned
  against the add family's primitive-five/six oracle leg.
- call and record_construct: the arms emit the families' own producer trees
  against their target models, octets 7 and 9 pinned against the
  primitive-seven/eight and wrong-field oracle legs.

The four families without a one-build cache witness run under per-family
fixed workspace roots; content-safety comes from the realization-digest
nesting in run_host_process_admitted (changed source colds, never serves
stale), the same mechanism the filesystem_read fixed workspace relies on.
All twelve arms verified wet: PASS/PASS each, cold builds then warm hits.

With zero retained rows the retained_via_eval_agreement constructor loses
its last consumer and is deleted (DESIGN 3c); the InterpreterRetained
variant stays as the disposition authority's other state. Census guards
move to 15 native / 0 retained with all fifteen decl names in the closed
membership.

* Record the emit coverage frontier closure in the direct-path plan

Axis C line: all fifteen roster rows are SelfEmittedNative as of
2026-09-08, interpreter_retained_rows() is empty, and the row constructor
was deleted with the last flip. Notes explicitly that this closes axis (a)
(witness-body-runs-native) only; axis (b) (the regen-grain production
flip) remains operator-gated.

* Restore structural text reads in 02_parse: the chars(String) <- Variant cluster

Commit 285b02eed2 converted three structural-text reads in the parser to
host-string builtins (chars(s:), string_length, char_at, code_point) while
chasing emitted-closure compile errors. Lexeme is v2.std.text.String, which
interprets as a Variant value, so every claim that parses tokens failed at
runtime with 'chars expects a string argument, got Variant' — 10 claims in
the required floor lane.

parse_lexeme_digest folds the Lexeme list directly again,
parse_char_is_arm_pattern_lead takes Char again, and
parse_looks_like_match_arm_start matches string_head's CharFound/CharAbsent
again. Verified locally: all 10 claims of the cluster pass.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the prepare_grammar shared-fill cost class: portable nullable carrier + preparation-time warming

Two defects composed into the required floor's twelve FillBudgetExceeded
refusals, both repaired at source:

(1) GrammarFirstAnalysis.nullable_set was a PointwisePower<Symbol>
characteristic function — a nested closure tower the cross-claim pure tier's
publication walk refuses totally (ServeCacheValueNotPortable), so the one
fill every parse of .dag source demands could never store and every
demanding claim recomputed it. The carrier is now the enumeration it always
was (List<Symbol>, the GrammarRoot.sync_tokens repair's own precedent):
set_symbol_insert de-duplicates over symbol_list_contains (first_list_contains
renamed, it was never first-specific), the fixpoint's convergence measure is
the list's own length, and nullable_member_count dissolves into it.

(2) The fill costs more than one claim's CPU budget on the lane's runner, so
an in-fold first touch could never complete. The nullary
v2.compiler.program_assembly.dag_prepared_grammar producer moves that first
touch to strict preparation via floor_cross_claim_pure_producers_warm —
outside every per-claim budget — and every claim then serves the landed fill.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Split the meet/join native-only arms: one member per claim under the 500ms line

The two-member shape put two native-run verdicts inside one claim's 500ms
CPU budget — emit of the family crate plus the cached-run receipt walk,
twice over — and the required floor measured both meet_join arms over the
line. The ceiling is the floor's own and does not move to admit a claim
shape; the arm splits by member instead, the grain the family's equals_eval
pair already claims at (emit_host_meet_equals_eval_holds /
emit_host_join_equals_eval_holds). Each claim now pays one native run; the
family crate build stays shared through the same one-build cache key. The
coverage frontier's meet_join row re-cites emit_host_native_only_meet_holds;
the join claim carries the family's other half.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Adjudicate the five structural-text/logic requalification deltas at their exact subjects

The branch's required-witnesses lane reports five TargetChanged binding
deltas, all one change class: three String sites (EmitSpellingEscape,
apply_emit_spelling_escapes, integer_string_to_decimal_digits_step)
requalified to v2.std.text and two Bool grounding sites (py_bool_grounding,
ts_bool_grounding) requalified to v2.std.logic — the gunbc#9907
namespace-lane requalification reaching the sites the XL-N closure repair
and the chars(String) <- Variant cluster repair touched. The spelling is
identical on both sides in every row; only the declarer moved, from the
ambient kernel type set to the named authority. Five exact-subject
TransitionAdmission rows, enumerated never patterned, with the dissolution
trigger on gunbc#10692's merge.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Share the ingested-fixture pipelines across claims: three warm producers for the five over-ceiling claims

The prepare_grammar warm-store unmasked five changed witnesses over the
500ms per-claim ceiling: the classical_not family's three emit claims
(marginal 474-501ms, each re-running the full tokenize->resolve pipeline
on a module-constant source) and the produced_module pair (505-542ms,
each re-assembling the same two-decl module). CI's runner is ~1.8x this
lane's local host (median ratio over the 25 claims present in both
ledgers), so these project to ~900ms there — structurally over, not
variance.

The repair is the roster's own named one — stop recomputing a pure
function of program content — in its WARM arm, because a ~370-382ms
claim-forced fill leaves under 130ms of headroom and would die
mid-flight on the lane exactly as prepare_grammar's did:

- produced_add_module_source (already nullary) is enrolled directly.
- ingested_classical_not_arrow_with_body and its swapped sibling are new
  nullary producers in the ingested_fixture_arrows idiom; the three
  failing claims' tree helpers now take the arrow outcome, with the
  source-taking staging variant delegating so unselected claims keep
  their spans untouched. The arrow is the deepest pipeline stage whose
  value is closure-free and therefore portable; the InferredTree above
  it carries the facts PartialFunction and can never store.

claim_batch: 14/14 classical_not claims pass with identical verdicts.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Share the door-specimen resolved tree across claims: one warm producer for the seven unmasked over-ceiling grounding claims

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Share the family-crate emitted pairs across claims: two warm producers for the twelve ceiling-band native-only verdict claims

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>
Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
briansrls added a commit that referenced this pull request Sep 10, 2026
… named before native bootstrap (#10886)

* Land the add-slice per-stage verdict instrument named as the floor_expected_red note's producer

The add-slice roster note in v2.workflow.floor_expected_red carried a dated
receipt (main 3a8344b5c: infer accepts dag_add_emitted_root; the
infer-then-translate composition refuses headed by infer_grounding_not_derived)
and named its own next-rung trigger: a .dag entry returning the per-stage
verdicts for one root, so the paragraph can name a producer instead of a
commit.

v2.compiler.self_host.candidate_generation_stage_verdicts is that entry,
parameterized over root and target: the receipt's verdict vocabulary
(infer_accepted / infer_rejected; candidate_accepted or the rejection head
reason) plus the carried-reasons lists -- the half the verdict symbols cannot
say, namely that infer accepts while carrying the frontier diagnostic on its
accepted path, so the enrolled witness's d == None conjunct fails even where
the composition reaches acceptance.

v2.test.execution.self_host_candidate_generation_stage_verdicts binds the
instrument to the slice's own fixture, with add_slice_stage_verdicts_entry the
runnable gunbc run --function form (ExitSuccess only when infer accepts clean
and the composition accepts clean). Two witnesses: infer-accepts as a
permanent positive control, and the frontier-state pin that is expected to red
the day the add-slice stall's trigger lands, flipping to a permanent
regression control in the same change that removes the roster row (DESIGN
4b(4)).

Measured by execution on this branch: the entry exits 1 printing
infer=infer_accepted, infer_carried=[infer_grounding_not_derived x10],
composition=infer_grounding_not_derived, composition_carried=[x11] -- the
receipt reproduced, with bind_outcome's pending-plus-gate chain counted. Both
witnesses PASS; the enrolled semantic witness still fails as enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for dag declared inhabitants: the add slice greens end-to-end

infer gains the declared-inhabitant membership derivation: a node declared in
the dag language authority's declared-inhabitants roster derives its grounding
by lookup, with the roster as evidence -- the namespacing answer to the atom
authority question, at specimen scope. The add slice's ten type-spine nodes
(Arrow, Conj, Atom) are all roster members, so:

- candidate_generation_translate_self_emit_dag_add_slice_holds passes; its
  floor_expected_red roster row and per-row note delete per the roster's own
  stale-quarantine arm
- the dag same-language ingest path compiles end-to-end: cross_language_compile
  accepts, byte-equal to the authority's own serialization, no carried
  diagnostics
- the add-slice stall narrows to its four python/typescript round-trip members;
  the original trigger's causal clause was refuted by execution and is restated
  against the grammar parse-product population
- the instrument's frontier guard flips to add_slice_composition_accepts_holds
  (DESIGN 4b(4): frontier guard to permanent regression control)
- five manual witnesses flip with it: two root flips rewritten to assert the
  green state, three transitive conjunctions updated

The kinds stay frontier: non-member Arrow/Conj/Atom specimens carry
GroundingNotDerived exactly as before, and all fourteen enrolled
refusal/acceptance controls pass unchanged. The door's production path still
reds inside rust emission, untouched by this rule.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for canonical binding atoms: dag_binding_denotation joins binding to inhabitant once

The resolver already binds the surface spelling Int to the canonical binding
symbol dag_binding_type_int; what that binding DENOTES is the Int inhabitant
declared at dag_declared_inhabitants_core. Every hand-rolled fixture facts
lookup re-authored that join (dag_add_canonical_grounding_for,
record_construct_canonical_grounding_for). The language authority now declares
it once as dag_binding_denotation, and infer_node_facts consumes it: an Atom
whose identity is a canonical dag binding with a declared denotation derives
with that denotation as its grounding evidence.

Direct-rust-door specimen census: 14 underived -> 10 underived (the four
dag_binding_type_int atoms derive; grammar-production atoms, algebra atoms,
bare operand atoms, and the arrow/conj spine stay on the frontier unchanged).

Specimen-scope interim in the same frame as
infer_node_declared_in_dag_inhabitants: both delete in favor of consuming
resolution output when the resolver hands infer declaration-resolved
identities directly (the namespace migration's completed state).

Witness: v2.test.execution.dag_binding_denotation — all four Int binding
atoms in the door specimen derive with dag_int_inhabitant_node() as
structural evidence, and the two bare operand atoms stay GroundingNotDerived
(boundary control). Refusal suite 14/14, ingest bridge 7/7, add-slice
instruments 2/2 green; every remaining red in the at-risk population
reproduces identically on the pre-change tree and is enrolled in
floor_expected_red.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Add v2 self-host direct-path orientation: axes, sequence, autonomy contract

A point-in-time orientation that defers to the existing authorities
(DESIGN section 7, the four-wave self-host program, the roadmap node
chain, the three frontier carriers, the guarantee-stall roster, XL-N)
rather than restating them: state is re-derived by the named
instruments, never transcribed here. Sequences the remaining work in
roadmap order (door, parse-product grounding, first behavioral module,
XL-N milestones, native bootstrap, fixed point, v1 deletion) and states
which decisions stay operator-gated.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for fully-evidenced Conj and Arrow products

The sixth and seventh kind rules: a non-roster Conj or Arrow whose every
child carries DerivedGrounding derives, its evidence the same shape
re-formed over the children's grounding evidence (a fresh
OccurrenceSynthetic node, never the source — the self-evidence wall holds
by construction). A product with any frontier or absent child stays on the
frontier with its typed diagnostic; a childless product has no evidence to
compose and stays frontier. Roster members keep their roster evidence.

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
10 underived of 15 -> 6. The parameter conj, the module-structure conjs,
and the bodied add arrow derive; what remains is the algebra atoms from
the + operation (AlgebraPrimitive, ring_field_add), the module atom
(dag_surface_module), the parameter references (x, y), and the
grammar-projection root conj that cascades once they land.

Enrolled witnesses (src/v2/test/claim/execution/infer_product_introduction_test.dag):
- product_introduction_derives_fully_evidenced_products_holds — census:
  4 Conj (3 derived, 1 frontier-by-frontier-child) + 1 Arrow (derived).
- product_introduction_composed_evidence_carries_child_groundings_holds —
  the params conj's evidence is a Conj whose x/y children target the dag
  authority's Int inhabitant.
- product_introduction_leaves_childless_conj_on_the_frontier_holds —
  boundary control via direct infer over a hand-built childless Conj.

Flip census (pre- and post-change, zero unexpected flips):
translate_underived_refusal 14/14, infer_self_grounding_wall 12/12,
branch_infer_if_then_else 2/2, compile_eval_thesis_proof 6/6,
ingest_bridge 9/9, cross_language_add_python_to_typescript 4/4,
inhabitant_neutralization 6/6 + e2e 6/6, emit_host_classical_not 14/14,
dag_binding_denotation 2/2, stage-verdicts instrument 2/2,
dag_add_emit_round_trip 4/6 (the 2 enrolled reds unchanged), door
production group still enrolled-red (unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground canonical-operation and grammar-production atoms by authority roster membership

Two more specimen-scope derivations in infer_node_facts, both lookups into
declared authorities, never inventions:

- Canonical-operations roster (target_model.dag): every CanonicalOperation
  the target-model authority declares, rendered by
  target_model_canonical_operation_wire_node and gathered under one Conj
  root. The resolver canonicalizes surface operators (e.g. +) to those
  declared operations, so the wire atoms -- the operation discriminant and
  its field references -- derive by membership with the roster root as
  evidence. General over all 14 declared operations, not add-narrow.

- Grammar-productions roster (dag.dag): every production in
  dag_grammar_root() projected to its emitted surface atom under one Conj
  root keyed by production name. The bridge projects a production's parse
  into (identity atom, captured content) pairs, so the identity atom
  (dag_surface_module) derives by membership with the roster root as
  evidence. The roster derives from the grammar root, so a production
  added to the grammar joins by construction.

Both roster roots are Conj nodes, never structurally equal to any member
atom, so the self-evidence wall holds by construction (the first attempt
at the operations rule used the wire node itself as evidence and was
refused by grounding_evidence_is_source -- the wall doing its work).

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
6 underived of 15 -> 2 (only the operand atoms x and y remain; the
grammar-projection root conj cascades once the module atom grounds).

Enrolled witnesses (infer_atom_grounding_rules_test.dag): each roster rule
pins derivation + evidence identity + census; a boundary control pins that
a bare atom with no authority membership stays frontier; the closing
control pins the 2-of-15 state.

Flip census: the product-introduction census witness updates 3->4 derived
conjs (the top conj now cascades) and gains a hand-built
partially-evidenced boundary control to replace the in-specimen one the
cascade consumed. Full battery otherwise unchanged: refusal suite 14/14,
grounding wall 12/12, instrument 2/2, binding-denotation 2/2, round-trips,
bridge, cross-language, neutralization, emit-host all green; enrolled reds
unchanged.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground binding-reference atoms from the enclosing arrow's domain declaration

The fifth specimen-scope derivation, closing the direct-rust-door
specimen's inference frontier: an Atom whose binding an enclosing arrow's
domain declares derives with the declared domain type as its evidence --
the declaration-site annotation, itself derived (x: Int grounds the x
reference). This is the same lookup the branch-operand path already
performs (infer_find_arrow_domain_type_in_tree), now written to the
operand atom's own facts; it is scope-naive (whole-tree, first match),
recorded in the frontier note, and deletes with the other specimen-scope
rules when the resolver hands infer declaration-resolved identities. The
tree is threaded through the fold's init chain to reach infer_node_facts;
the helper had exactly one caller.

Measured on the door specimen (scratch probe, uncommitted): 2 underived
of 15 -> 0. The specimen's inference frontier is fully closed, and the
production observation advances from InferenceRejected
(infer_grounding_not_derived) to EmissionRejected
(target_use_site_ownership_lookup_miss) -- a new, typed, located deficit
in the emitter, the next gate on the path.

Flip census (all three rewrites verified by execution):
- dag_binding_denotation_leaves_unbound_operand_atoms_on_the_frontier_holds
  -> dag_binding_denotation_declares_no_denotation_for_operand_bindings_holds:
  the boundary moves to the authority itself (the denotation table returns
  Absent for x/y), true regardless of infer's other rules.
- The three emit_host classical-not refusal guards (canonical, staging,
  staging-swapped) flip to acceptance witnesses pinning the emitted text's
  shape -- the real-infer tree now fully derives, and the emission is the
  same one the equals-eval witness proves behaviorally correct. The
  translate-refuses-underived behavior stays enrolled on hand-staged
  fixtures in translate_underived_refusal_test.dag (14/14 green). The
  renames are carried into the commit_workflow and witness_deferral_freeze
  rosters.
- New witnesses: binding_reference_derives_parameter_atoms_holds (evidence
  is the domain's Int binding atom, census 2) and
  door_specimen_fully_derives_holds (0 frontier of 15).

Full battery at this state: refusal suite 14/14, grounding wall 12/12,
instrument 2/2, binding-denotation 2/2, product-introduction 4/4,
atom-rules 5/5, emit_host 14/14, round-trips 4/6 (2 enrolled reds
unchanged), bridge 9/9, cross-language 4/4, neutralization 6/6 + e2e 6/6,
branch 2/2, eval-thesis 6/6; door production group still enrolled-red
(unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Green the direct-rust-door: route emission through produced-decl composition and decode canonical operator wires

The door specimen's inference frontier is fully closed, so its production
observation now reaches the emission stage. Two defects surfaced there, both
fixed here:

Emission composition. generate_rust_emission_candidate served two lanes with
one root shape: the door's production path (a dag module shell) and a fixture
lane (a bare rust Arrow). The translate ownership gate queried the module
atom's ownership at a struct-field use site and refused with
target_use_site_ownership_lookup_miss, because the module's grammar-projection
conj was misread as a type record. The door's real composition is the
produced-decl path: collect declaration conjuncts from the inferred tree and
emit via emit_produced_decl. A new generate_rust_module_emission_candidate does
exactly that, enforcing an exactly-one-declaration admission policy
(rust_module_emission_decl_absent / _ambiguous). The observation and production
mint paths switch to it; the fixture-lane candidate is retained with a note
that it is fixture-only. A pure collector, produced_decl_conjs_in_tree, finds
nodes of produced-decl shape (a Conj whose first child is a Named edge to an
Arrow). Its decl-head match routes through a declared FreeMonoid<Edge>
parameter because the v1 seed stamps pattern variables from a declared
parameter type, not from a field-access scrutinee.

Operator decode. With composition fixed, source fidelity still refused: the
door emitted fn add(x: i32, y: i32) -> i32 { AlgebraPrimitive(x, y) } instead
of { x + y }. Resolution canonicalizes a surface operator atom into a
canonical-operation wire node, so a production tree's transform operator
position carries the wire, while fixture trees that bypass resolution still
carry the surface token atom. translate_project_transform_in_arrow_scope only
knew the surface-token table, so the wire missed and fell to callable apply,
rendering the discriminant identity. The projection now tries the wire decode
first (canonical_operation_from_wire_node) and only on a wire miss falls to
the surface-token table, then to callable apply; the arms are disjoint, so the
dispatch adds no fallback widening. target_transform_operator_child extracts
the operator child safely.

The door's closing expectation now greens by execution, so its known_red_probe
row in explicit_witness_admission is deleted per its own dissolution condition,
and the roadmap authority note, the door contract note, and the direct-path
plan are updated to record the green state. realized_closure_for_v2_direct_
rust_door_emit_run's module list reflects the produced-decl route.

Verified by execution: the door witness greens; the fixture, containment,
algebra, produced-decl, add-slice, and classical-not witnesses stay green;
claim_executor required-ci lanes build and witnesses both exit 0; cargo fmt and
clippy --all-targets -D warnings are clean. One pre-existing red,
witness_projection_is_active_only in the floor_cost_debt containment roster,
reproduces on the base revision and is unrelated to this change.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the parse-product grounding frontier: widen declared-inhabitant membership to the closed ingest set

The declared-inhabitant roster-membership derivation in 04_infer generalized
from the dag roster to the closed ingest set (dag, python, typescript):
infer_node_declared_in_language_inhabitants returns the declaring authority's
roster root as evidence, with deep subtree membership so a declared
inhabitant's leaf fact atoms derive exactly as the inhabitant node itself.

Measured: the python fixture's 19-node frontier and the typescript fixture's
28-node frontier both close to zero; all four add-slice stall population
round-trip witnesses green; the python->typescript cross-language compile
accepts, byte-identical to ts_source_text.

Section 4b(4) flips (expecting-red probes becoming permanent regression
controls for the acceptances):
- cross_language_compile_refuses_canonical_underived_holds ->
  cross_language_compile_python_to_typescript_round_trip_holds
- inhabitant_neutralization_emit_after_neutralize / same_flavor_python /
  go_int64_to_ts refusal helpers -> round-trip controls
- inhabitant_neutralization_python_to_ts_cross_language_compile (e2e) ->
  round-trip control; python->go members stay refusal guards (go is outside
  the closed ingest set)
- cross_language_emit_inhabitant_neutralization_refuses_underived_holds ->
  round-trip control; the python->typescript emit-matrix row reads ChainProven

The add-slice stall's next-rung trigger fired, so it retired per DESIGN
4b(4): removed from all_guarantee_stalls, row file deleted, witnesses stay
enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Promote the add family to SelfEmittedNative: native-only verdict witness for the emitted add crate

First InterpreterRetained -> SelfEmittedNative promotion after classical_not,
executing the v2-emitter-first-behavioral-module first slice at the
coverage-frontier grain: the add family (fewest dependencies — integer
literals plus one canonical operation) now carries a native-only verdict
witness, so its behavior is established by the emitted crate's own stdout
with eval() unreachable from the verdict path.

- emit_host_native_only_add_holds: real emit -> cargo build -> native run,
  stdout pinned to the family's expected octet, sharing the kernel family's
  one-build cache key exactly as the classical_not arm shares its family's
  key (no duplicated cold build).
- emit_host_native_only_add_wrong_octet_mismatch_detected_holds: the broken
  control — a no-eval verdict has no oracle leg to break, so the expectation
  side breaks (an octet the run never produces must not match); program-side
  discrimination stays with the family's equals_eval primitive-five/six pair.
- The add coverage row flips disposition with its backing citation enrolled
  by construction (the verdict entry is file-grain enrolled in
  falsifier_self_host_wet_template_entries).
- Frontier census tests updated at identity grain: natives are exactly
  {classical_not, add}; split 2/13.

Verified by execution: all six native-only verdict tests green locally
(real wet legs — compile_skipped receipts show cold builds and native runs);
all eight emit_coverage_frontier tests green, including the unbacked-claim
RED control.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Record the add-slice defect's repair in the declined-live-tree classification

The row classified candidate_generation_translate_self_emit_dag_add_slice_holds
as RealDefect/CompilerBehaviourRefusal with measured evidence that translate
refuses infer_grounding_not_derived. The owner lane (v2 self-host) repaired the
subject: the declared-inhabitant roster-membership derivation grounds the
slice's type spine by lookup, and the witness passes under claim_batch
--hermetic on the merged tree. The dated classification is kept verbatim; the
disposition flips RoutedToOwner -> RepairedInThisChange with the repair
measurement appended to the evidence, so the routing carrier stops dispatching
a fixed defect. Structural witnesses (count 13, no NotReproduced, exact
partition) are untouched and pass.

* Hoist two in-body annotation blocks to module-item grain

Main's annotation-placement wall (source annotations admit only standalone
leading blocks attached to module-scope declarations; in-body forms refuse)
reached this branch through the merge and refused 8 blocking errors on the
00_compile closure: the add-family promotion note inside the
emit_coverage_frontier_roster list and the python->typescript row note inside
the cross_language_emit_matrix list. Both blocks move above their enclosing
declarations, rephrased to name their subject row. Measured: gunbc compile of
src/v2/compiler/00_compile.dag now emits 172 files with 0 blocking errors;
both files' suites stay green (8/8 and 4/4).

* Promote the complement family to SelfEmittedNative: native-only verdict witness for the emitted logic family crate

The complement family's native execution runs family-grain per the
witness_family_build_grain_ruling (one crate for meet + join + complement,
argv-dispatched), so the native-only arm emits the logic family crate and
runs the complement member through the family dispatcher, sharing the
family witness's one-build cache key. The verdict is decided solely by the
emitted native run's stdout (expected octet 0, complement(True) = False);
the broken control flips the expectation side (octet 1 can never match),
with the comparator pinned by the stdout mock pair. Program-side
discrimination stays with the equals_eval agreement pair and the family
witness's all-alt leg.

The frontier row's backing citation lands in the already
file-grain-enrolled native-only verdict entry, so it is enrolled by
construction; the roster comment is rephrased to cover both 2026-09-07
promotions (add and complement). The frontier test's split and native
membership assertions move to 3 native / 12 retained.

Verified by execution: claim_batch --hermetic on
emit_host_native_only_verdict_test.dag passes all 8 witnesses (the two
new complement arms included), and emit_coverage_frontier_test.dag
passes all 8.

* Key the emitter's host-String arm on declaration provenance, not spelling

is_host_text_carrier_type answered true for any type expression whose
authored name reads "String", including references to the structural
alias v2.std.text.String (type String = FreeMonoid<Char>) that the
namespace lane (gunbc#9907) requalified the v2 corpus's text-carrier
fields to. The emitter rendered every one of those references as the
host String while value-position consumers rendered the structure -- the
E0308 family dominating the self-host compile-phase frontier (41 of 64
in v2_compiler_tokenize.rs on the post-merge board).

The String arm now consults the resolved declaration's provenance
against v1.compiler.coercion structural_declaration_modules_for -- the
same roster type_realization_decision reads -- so the legacy arm and the
strict decision cannot diverge on one node (DESIGN section 3, and
gunbc.recurring_failure_mode alias_resolution_collides_with_kernel_spelling).
Kernel mints and unresolved references keep the host answer exactly as
before.

Regen: the only drifted stage0 mirror is v1_compiler_emit_rust.rs
itself (no module in the stage0 closure references a structurally
declared String -- verified by the whole-population candidate tree),
installed from target/stage0-regen-candidate after the priced round's
partitioned rebuild refused MirrorHasNoOwningPackage on the emitter
(the emitter is monolith-shell, not partition-owned). Fixed point
verified by execution: claim_executor --required-regen on the rebuilt
seed reports first_generation_equal=true over 158 adjudicated mirrors.

* Peel qualified String alias leaves in field position: XL-N closure 72 -> 28 errors

A field authored v2.std.text.String reached the Rust emitter as an overlay-less
resolved reference leaf and rendered the bare terminal name, which binds the
prelude String cross-module (#9813: kernel names are never overridden by
imports, so the use-line is dropped) while every value position renders the
structural carrier Rc<Vec<i64>> -- the v2_compiler_tokenize.rs E0308 family,
41 of 72 errors on the XL-N phase board.

The new rust_overlayless_alias_leaf_requires_peel arm in
render_rust_type_without_applied_binding detects the population (overlay-less
zero-parameter alias leaf, qualified spelling, String terminal segment,
closed_alias_peel_verdict agrees) and renders the alias declaration's resolved
right-hand side, projecting the same realization the fn-signature positions
already produce.

The qualified gate is load-bearing: inside the declaring module the bare name
is the correct render (the emitted module carries the alias declaration), and
the local binding's resolved_type drops the RHS type argument, so an ungated
peel rendered Rc<FreeMonoid> there (E0107 x13, E0282 x2 on the probe). Bare
String keeps denoting the kernel scalar through the host-carrier arm.

Measured: probe specimen (qualified/bare/direct-FreeMonoid/container/variant/
local-alias positions) compiles clean; XL-N compiler closure cargo check
72 -> 28 errors with the residual census dominated by the declared
text_boundary_identity_wall class (kernel String vs structural carrier at
bare-authored boundaries, 17 of 20 E0308s); v1-corpus fixed point holds
(first_generation_equal=true, 158/158 adjudicated).

* Resolve the 12 non-hop XL-N closure errors at source: text-wall conversions + witness_violates helper

Four clusters, all measured non-hop additions between receipt_1 (155) and the
post-peel census (28); the live gate now measures 15 with zero unadmitted
regressions:

- integer.dag: integer_string_to_decimal_digits_step takes v2.std.text.String;
  the public boundary converts with chars() (text_boundary_identity_wall
  specimen discharged at this site).
- 01_tokenize.dag: Token/UnboundSourceAnnotation lexemes convert structural
  -> host String with chars_to_string() at construction, mirroring the v1
  tokenizer's host-lexeme carrier.
- target_model.dag + bash.dag: EmitSpellingEscape.from/to and
  apply_emit_spelling_escapes go structural (v2.std.text.String); the
  EmitSpellingQuote arm converts host->structural->host at its boundary;
  bash's escape rows wrap their kernel String literals with chars().
- witness.dag + 3 call sites (collection list_nth, provenance
  span_index_resolve_textual_locus_from_ids, compile outcome_with_diagnostics):
  new witness_violates<C> helper puts Violates constructions in a
  Witness-headed position so the emitter resolves the carrier type argument;
  dissolves once inference records per-call substitutions.

Verified: 48 targeted claim witnesses green (tokenize behavioral, shell
conformance, string brace escape, string length, map-lookup violates, source
text ingress, bash materialize x12, int literal smoke x6, provenance span
index x2).

* Record receipt_2 on the self-host compile-phase frontier: 15-error census at 66765317ec

The census at the XL-N lane tip: 155 -> 15 net, credited to the qualified-alias
peel (60cbd7b697, 72 -> 28) and the twelve-error source cluster (66765317ec,
28 -> 15). The epoch changes on the instrument's target pinning (found by
review on gunbc#9857), admitted with receipt_1's board as the reclassified
predecessor under the identity map. Nine added identities are hop relocations
admitted by the hop index; four sit in python/typescript modules newly entered
into the emitted closure, admitted as ExposedByNewEmittedModule.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* Emitter: a substituted declaration node carries its own provenance

Inference substitutes the resolved declaration into a data annotation's
type-argument position, so BooleanAlgebra<v2.std.logic.Bool> reaches the
emitter with the arg BEING the type Bool = True | False declaration itself
(Disj connective, ident_span in src/v2/std/logic.dag, no Resolved wrapper).
type_reference_provenance_in_env's bare-leaf arm re-resolved that leaf in the
REFERENCING module's scope, where post-#9813 a kernel-shadowed spelling
answers the kernel declaration -- so the structural enum rendered as host
bool against a value of BooleanAlgebra<Bool> (the python.rs:328 /
typescript.rs:177 E0308 pair on the XL-N compile-phase frontier).

The connective is the discriminator: a reference node is a bare name
(NoConnective); a node carrying Conj/Disj structure IS the declaration, and
type_reference_provenance's own-span fallback already answers that shape
correctly. The guard routes declaration-shaped nodes there directly, bypassing
the scope lookup that #9813 makes answer the kernel.

Mirror regenerated via the regen round; fixed-point verified
(claim_executor --required-regen PASS).

* Clear the remaining XL-N closure errors at source: carrier conversions at the boundaries

The receipt_2 census's fifteen identities, resolved at their sources:

- lexing.dag, dag.dag, python.dag, typescript.dag: LexPattern.text is the
  structural carrier (v2.std.text.String); the construction sites held host
  Strings. Convert at construction with chars() -- the #9907 ingress pattern.
- python.dag / typescript.dag bool groundings: qualify the annotation as
  BooleanAlgebra<v2.std.logic.Bool>; with the emitter's substituted-
  declaration provenance guard the qualified arg now renders structural.
- target_model.dag: target_lex_rule_literal_step returns the host carrier
  (chars_to_string over the structural pattern text); TargetText.source
  converts at the is_empty boundary; the unicode-scalar symbol intern converts
  its single-codepoint list to the host carrier.
- qualified_name.dag: qualified_name_from_dotted_string uses the host-carrier
  emptiness check (string_length == 0) instead of routing through the
  structural string_is_empty.
- 02_parse.dag: parse_looks_like_match_arm_start rewritten on host-carrier
  operations (string_length, char_at, code_point) rather than converting to
  the structural carrier for a two-character lookahead;
  parse_char_is_arm_pattern_lead takes the codepoint Int directly.
- v1_interpreter_primitive_surface.dag row_key: the concat pipeline lowered
  to a .concat() method call on std::string::String (E0599); rewritten as
  nested concat calls.

Measured: the 00_compile closure emits 172 files and cargo check reports
cargo_clean=true, cargo_error_population=0 under the pinned 1.93.0 toolchain.

* Pin the cargo half's toolchain channel by construction

The cargo half runs with cwd = a fresh mktemp directory; with no
rust-toolchain.toml there, rustup resolves the host's DEFAULT toolchain, so a
census under cargo 1.83 and one under cargo 1.93 would compare as equal epochs
while different compilers did the measuring -- the fabricated comparability
the target pin (gunbc#9857) excludes, one level up. Measured 2026-09-07: a
host default of 1.83.0 met a crates.io index whose freshly published
dependency manifests require edition2024, resolution failed before any
diagnostic existed, and the zero-diagnostic refusal fired on an unmeasured
tree.

The pin is propagated by copying the repo's rust-toolchain.toml into out_dir:
the file remains the sole in-repo channel authority (its header forbids a
second pinned literal), and the copy makes the measured channel true by
construction on any host. The gate's read_live_toolchain observes the same
channel because every documented actuator invokes from the repository root,
which the same file governs.

* Record receipt_3 on the self-host compile-phase frontier: the emitted closure's cargo census is empty

Measured at 5ee4892b70 by the one-entry instrument: the 172-file emitted crate
reports zero cargo error diagnostics, so the board attributes every phase a
count of zero and furthest_phase_reached stands at Borrowck. The fifteen
removals against receipt_2 need no disposition; nothing was added.

The epoch does not change: the cargo half now pins the toolchain channel by
copying the repo's rust-toolchain.toml into the scratch crate, and every
recorded comparison field is identical to receipt_2 (whose census the
fingerprint evidence shows the same 1.93.0 toolchain already compiled), so the
same-epoch arm carries no reclassified predecessor.

The frontier-state pin flips per DESIGN 4b(4):
the_published_frontier_standing_does_not_claim_typeck_or_borrowck_passed
becomes the_published_frontier_standing_claims_typeck_and_borrowck_passed, the
permanent regression control over the green state.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Repair-Judged: docs/design-rung-drops.md

* Remove the stale PointwisePower inhabitant rows from the four language rosters

First native-parity divergence class found by running the emitted closure on a
discriminating fixture: the algebra inhabitant rosters still carried
PointwisePower after its authority row was cut, so the emitted compiler panicked
at 12 record-shaped carrier sites while the interpreted seed refused cleanly.
The roster rows are removed in rust/python/go/typescript types.dag, the derived
coercion assertions in compiler_tests.rs regenerate without them, and two
witnesses pin the boundary: the record shape constructs its structural carrier,
and FinitePowerSet still refuses while its row stands.

Mirrors regenerated by a converged regen round (fixed point Reached, stage-1
PromoteGenerationInputs over the three language types mirrors).

* Regen gen-2 gate: compare executable digests in one spelling

The admitted side of run_built_seed_regen carries the executable-digest
spelling (current_exe_digest, next_pass_executable_digest) while the observed
side hashed the file through path_digest, which prepends the fnv1a64: tag.
Same bytes, two spellings, so the gate could never pass -- unpassable since
fa2d403dc8 (#9771). Factor current_exe_on_disk as the single path authority
and read the observed digest through current_exe_digest so both sides spell
the same bytes the same way.

* Model ReleaseScopeEmpty for release-excluded mirrors, end to end

A regen round whose only stage-2 drift was compiler_tests.rs (the PointwisePower
roster removal rewrote its derived coercion assertions) refused the rebuild
MirrorHasNoOwningPackage: the mirror is owned by no partition package, because
every item it defines is #[cfg(test)] and no release unit elaborates it. The
refusal conflated two different states -- unowned (a coverage hole) and excluded
from the release build by construction (a precise empty scope).

The model now names the class: rebuild_scope_release_excluded_mirrors rosters
its members (compiler_tests.rs, cited to emit_compiler_tests_module), the
decision answers ReleaseScopeEmpty when the whole change set is excluded, and
the actuation shape is actuatable with an empty package closure and every
partition package excluded -- the build still runs as verification, and a
compiled partition package refuses the stage. The host admits the empty closure
only when the new stage0_partition_rebuild_release_scope_empty_today query
answers true; any other empty closure still refuses. A mixed change set scopes
on its release-visible members alone.

Verified by execution: the 2026-09-08 round converged (fixed point Reached)
with stage-2 installing compiler_tests.rs alone; cargo recompiled the shell
crate on its fingerprint (the outer mod line is ungated, so rustc reads the
file) while the produced executable was byte-identical -- stage input seed
digest == output seed digest. Four new witnesses pin the arm, its actuation
shape, the mixed set, and the host-facing query's two arms; the boundary
witness (unowned cli_run.rs still refuses) keeps the roster from decaying into
the absorbing fallback.

* Round-cost receipt: project installed mirrors to the model's vocabulary

The receipt's partition-rebuild line is rendered by the model over
receipt.installed_mirrors, which the host populated from the stages'
projected_paths -- full paths -- while the partition rows and rosters key on
basenames. Every drifted round's receipt therefore rendered a spurious
RebuildScopeRefused MirrorHasNoOwningPackage line naming a full path, a false
claim on the round's own receipt. Route the projection through
emit_path_basename, the module's single path-to-basename bridge, so the field
carries the mirror names the model's vocabulary means.

* Hoist ReleaseScopeEmpty annotations to module-item grain

The ReleaseScopeEmpty modeling commit placed three // blocks inside
declaration bodies (stage0_partition_rebuild_is_actuatable,
stage0_partition_rebuild_decision, stage0_partition_rebuild_excluded_today).
The .dag realization admits annotations at module-item grain only, so the
floor lane's parse phase refused the file with 12 located errors and the
run ended floor refused. The prose is unchanged; each block now sits above
the declaration it describes.

* Spell the PointwisePower witness's finite-set exclusion as the applied realization

The witness added with the fossil-row removal excluded the bare spelling
"BTreeSet", but every emitted file's preamble imports OrdSet as BTreeSet,
so the row could never green. The exclusion's subject is the finite-set
REALIZATION the fossil row would have asserted; spell it applied
(BTreeSet<i64), which the preamble's import line does not contain.

* Emit fieldless-record data values as null for the unit-struct carrier

The second native-parity divergence class, measured 2026-09-08 on the
native run of the emitted 00_compile closure: emit_data_value_json spelled
EVERY record literal as a JSON map, including the zero-field record, while
emit_struct_from_children renders that same declaration as a Rust unit
struct (pub struct BoolEncodingFact;). serde's derived unit-struct
Deserialize reads null and rejects {}, so the emitted compiler panicked at
first touch of v2.std.logic's bool_primitive_facts: "invalid type: map,
expected unit struct BoolEncodingFact". The JSON spelling of a data value
must deserialize into the Rust type the same declaration emitted; the
record arm now spells the zero-field value null and keeps the map spelling
for non-empty records.

The mirror is taken from the required-regen candidate, not hand-edited.
Two witnesses enroll: the discriminating red (zero-field record spells
null, never {}) and the boundary control (a record with fields keeps the
map spelling).

* Bind the duplicate-definition filter ahead of its branch condition

Main's FilterInBranchCondition wall (#10699) refuses to publish a module
whose filter call sits in a branch condition, and the v2 00_compile closure
emission names primitive_duplicate_semantic_definition_violation as such a
site. The filter is pure and total; binding it with a let ahead of the
branch is the authored remediation the wall exists to force, and the
emitted closure is unchanged in behavior.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md rust_unit_tests_off_the_merge_path
Ledger-Rows-Repaired: docs/design-rung-drops.md determinism_transitive_reachability
Ledger-Rows-Repaired: docs/design-rung-drops.md transitional_admission_exception

* Emitter: three native-parity repairs for the post-merge 00_compile closure build

Three divergence classes measured as the 21 rustc errors on the natively
emitted 00_compile closure after the main merge, each repaired at the .dag
source with a discriminating witness:

- Locality wins over a foreign ambiguity (12 E0433 in v2_std_integer.rs):
  alias_rhs_base_module_filename asked the global leaf index, saw
  LeafAmbiguous for Compose, and emitted the poison marker even inside
  v2.std.integer itself, where source resolution binds the local
  declaration before any cross-module lookup. The local physical
  declaration now shadows foreign declarers; the poison marker still
  stands for a leaf two FOREIGN modules declare.
- The qualifier is the disambiguator (8 E0425/E0433 in
  v2_lens_fact_density.rs): the qualified use-line route declined any
  globally-ambiguous leaf, but a qualified reference names its provider
  in its own spelling. The route now resolves by DeclaredCallableIdentity
  at the qualifier, keeping the type-declared and export-proof walls.
  The dotted spelling reaches the route through the value surface (a
  qualified value projection's borrowed type stamps the match patterns'
  parent_enum); the witness reproduces that chain exactly, and its
  exclude half pins the E0603 boundary (the dotted VARIANT head must
  still be declined).
- Clone-bound forwarding is transitive (1 E0277 in
  std_realization_measurement.rs): the call-forwarding derivation
  re-derived only each callee's SELF-derived half, so a callee whose
  bound is itself forwarded re-derived to empty. The derivation now
  recurses over the call graph with the module's visited-set
  termination; the equality half stays one-hop as declared.

Witnesses: 56/56 PASS on the rebuilt seed; regen fixed point holds.

* Refuse variant record literals on the serde_json data path fail-closed

A record literal with parent_enum present is a variant construction whose
wire spelling is the parent coproduct's declared VariantEncoding policy --
a module-local fact of the parent's home module that emit_data_value_json
does not carry. The zero-field arm's null and the map arm's untagged fields
are both measured to fail serde deserialization under the internal-tag
default, so the arm now refuses and the caller renders compile_error!, a
build-time located refusal where a runtime panic on the data definition's
expect was the latent alternative. The refusal names its trigger: a
closure-wide wire-policy index beside EmitGraphInfo.type_decl_items.

Witness: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
forces the JSON path with a nested-record Holder and asserts the
compile_error! spelling while excluding the former null mis-serialization.

* Spell variant record literals on the serde_json data path from a closure-wide wire-policy index

The fail-closed refusal landed in 73b582dea6 fired on 5 real corpus sites
(SugarKey x2, CopiedPortCitationFrontierDisposition x3), proving variant
record literals reach the JSON data path in the 00_compile closure. This
change replaces the refusal with the correct spelling, driven by a new
closure-wide index:

- v1.compiler.infer_emit_info gains DataVariantWireSpelling, the
  language-general projection of a coproduct's Rust wire serde policy
  for one variant (InternalTagged { tag_field, tag } | BareString { tag }
  | Untagged | SpellingRefused { reason }), and EmitGraphInfo carries
  data_variant_wire_spellings: Map<String, DataVariantWireSpelling>
  keyed by coproduct.variant.
- v1.compiler.emit_rust builds the index once per emission root via
  build_data_variant_wire_spellings, resolving each coproduct's policy
  through the new shared resolve_emission_coproduct_wire_policy (the
  same function the type-emission side now calls, so the two cannot
  drift), projecting each variant through data_path_wire_variant_tag
  (rename_all and StripAffix aware), and poisoning collisions as
  SpellingRefused so ambiguity stays fail-closed.
- v1.compiler.emit's emit_data_value_json variant arm reads the index:
  internal-tagged spells {"_variant": tag, ...fields}, bare-string
  spells "tag" for nullary and refuses fielded, untagged spells the
  bare fields or null; unindexed keys and stored refusals remain
  compile-time errors. The service mock-property chain threads
  emit_info through so dry-run data spells identically.

Witnesses: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
is rewritten as ..._spells_the_internal_tag (asserts the internal-tag
map, excludes the former null mis-serialization and the refusal), and
w_fielded_variant_record_lit_on_the_json_data_path_spells_tag_and_fields
pins the fielded case. 57/57 witnesses pass; regen fixed-point holds.

* Promote field_access to SelfEmittedNative on the emit coverage frontier

Fourth native-eval construct promotion, after classical_not, add, and
complement. The native-only verdict arm pair lands in the already
file-grain-enrolled long/ entry, so the backing citation is enrolled by
construction:

- emit_host_native_only_field_access_holds pins the family one-build
  cache run's stdout to octet 9 (the byte the family witness's warm leg
  pins on the same build), eval() never called.
- emit_host_native_only_field_access_wrong_octet_mismatch_detected_holds
  breaks the expectation side with octet 1, the alt tree's byte.

Both arms verified wet locally (real cargo build + native run, sharing
the field_access family one-build cache key). The roster row flips to
SelfEmittedNative; the two census guards update per 4b(4) — the split
moves to 4 native / 11 retained and the identity-grain membership guard
is renamed to name the four-member population. The family's equals_eval
agreement pair stays enrolled as its program-side discrimination leg.

* Drop the scratch parity probe from the tree

The probe is a manual parity-loop instrument (the interpreted leg of the
native-vs-interpreted comparison), not a corpus declaration with an
executing consumer (DESIGN 6 experimental residue). It stays in use
locally as an untracked file.

* Promote match, loop, and fold_closure to SelfEmittedNative

Fifth, sixth, and seventh native-eval construct promotions. The three
match_loop_fold family rows flip together on one shared family-crate
arm shape, per the witness_family_build_grain_ruling: each arm emits
the three-member family crate once and runs its own member through the
argv dispatcher against the family one-build cache key.

- emit_host_native_only_{match,loop,fold_closure}_holds pin the warm
  legs' stdout to the family's declared octet lists (match/loop
  [0,1,0,0,0], fold [0,7,0,0,0]), eval() never called.
- The wrong-octet controls break the expectation side with each
  member's own alt octets (match/loop [0,2,0,0,0], fold
  [0,255,255,255,255]).

All six arms verified wet locally. The census guards update per 4b(4):
7 native / 8 retained, and the identity-grain membership guard is
renamed to witness_native_rows_closed_membership_holds so the name
stops encoding the volatile population.

* Promote meet_join to SelfEmittedNative on the emit coverage frontier

The meet_join family's native-only verdict arms land on the complement arm's
helper, generalized to take the family member_id: meet and join run through
the same argv-dispatched logic family crate (one-build cache key shared with
complement, per the witness_family_build_grain_ruling), eval() never called,
verdict decoded from stdout. Octets meet=1 join=1 are the bytes the family
witness's warm legs pin on this same build; the wrong-octet control expects
each member's alt byte (0), which the primary runs can never produce.

Both arms verified wet: cold build then warm hits, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (eighth promotion); census
guards move to 8 native / 7 retained with meet_join_eval_subject named in the
closed membership.

* Promote variant_construct to SelfEmittedNative on the emit coverage frontier

The variant_construct family's native-only verdict arms follow the
field_access arm shape exactly: the tree is the family's own equals_eval
tree value (emit_variant_construct_eval_tree, no eval leg reachable), the
run shares the family one-build cache key that
emit_on_demand_variant_construct_native_one_build_holds colds, and the
expected octet 9 is the byte the family witness's warm leg pins on this
same build. The wrong-octet control expects the alt tree's byte (1), which
the primary run can never produce; the wrong-value alt leg in the family
witness keeps the program-side discrimination.

Both arms verified wet: cold build then warm hit, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (ninth promotion); census
guards move to 9 native / 6 retained with
emit_variant_construct_eval_subgraph_node named in the closed membership.

* Close the emit coverage frontier: final six rows to SelfEmittedNative

The last six InterpreterRetained rows flip to SelfEmittedNative, taking the
roster to 15 native / 0 retained:

- filesystem_read and shell_exec_run (host-effect transport families, no
  translated arrow body): the arms reuse each family's own native leg with
  the expectation pinned as a literal grounded by the family's enrolled
  fixture pin (dag/extdeps/shell/exec.dag contains bash; its shell.Exec.Run
  argv materializes to exactly [bash, -s]), run through the families' fixed
  witness workspaces.
- module and produced_module: the arms execute the exact sources the
  equals_eval pairs run (emit_module over the add fixture tree;
  produced_add_module_source's ingested two-fn module), octet 5 pinned
  against the add family's primitive-five/six oracle leg.
- call and record_construct: the arms emit the families' own producer trees
  against their target models, octets 7 and 9 pinned against the
  primitive-seven/eight and wrong-field oracle legs.

The four families without a one-build cache witness run under per-family
fixed workspace roots; content-safety comes from the realization-digest
nesting in run_host_process_admitted (changed source colds, never serves
stale), the same mechanism the filesystem_read fixed workspace relies on.
All twelve arms verified wet: PASS/PASS each, cold builds then warm hits.

With zero retained rows the retained_via_eval_agreement constructor loses
its last consumer and is deleted (DESIGN 3c); the InterpreterRetained
variant stays as the disposition authority's other state. Census guards
move to 15 native / 0 retained with all fifteen decl names in the closed
membership.

* Record the emit coverage frontier closure in the direct-path plan

Axis C line: all fifteen roster rows are SelfEmittedNative as of
2026-09-08, interpreter_retained_rows() is empty, and the row constructor
was deleted with the last flip. Notes explicitly that this closes axis (a)
(witness-body-runs-native) only; axis (b) (the regen-grain production
flip) remains operator-gated.

* Restore structural text reads in 02_parse: the chars(String) <- Variant cluster

Commit 285b02eed2 converted three structural-text reads in the parser to
host-string builtins (chars(s:), string_length, char_at, code_point) while
chasing emitted-closure compile errors. Lexeme is v2.std.text.String, which
interprets as a Variant value, so every claim that parses tokens failed at
runtime with 'chars expects a string argument, got Variant' — 10 claims in
the required floor lane.

parse_lexeme_digest folds the Lexeme list directly again,
parse_char_is_arm_pattern_lead takes Char again, and
parse_looks_like_match_arm_start matches string_head's CharFound/CharAbsent
again. Verified locally: all 10 claims of the cluster pass.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the prepare_grammar shared-fill cost class: portable nullable carrier + preparation-time warming

Two defects composed into the required floor's twelve FillBudgetExceeded
refusals, both repaired at source:

(1) GrammarFirstAnalysis.nullable_set was a PointwisePower<Symbol>
characteristic function — a nested closure tower the cross-claim pure tier's
publication walk refuses totally (ServeCacheValueNotPortable), so the one
fill every parse of .dag source demands could never store and every
demanding claim recomputed it. The carrier is now the enumeration it always
was (List<Symbol>, the GrammarRoot.sync_tokens repair's own precedent):
set_symbol_insert de-duplicates over symbol_list_contains (first_list_contains
renamed, it was never first-specific), the fixpoint's convergence measure is
the list's own length, and nullable_member_count dissolves into it.

(2) The fill costs more than one claim's CPU budget on the lane's runner, so
an in-fold first touch could never complete. The nullary
v2.compiler.program_assembly.dag_prepared_grammar producer moves that first
touch to strict preparation via floor_cross_claim_pure_producers_warm —
outside every per-claim budget — and every claim then serves the landed fill.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Split the meet/join native-only arms: one member per claim under the 500ms line

The two-member shape put two native-run verdicts inside one claim's 500ms
CPU budget — emit of the family crate plus the cached-run receipt walk,
twice over — and the required floor measured both meet_join arms over the
line. The ceiling is the floor's own and does not move to admit a claim
shape; the arm splits by member instead, the grain the family's equals_eval
pair already claims at (emit_host_meet_equals_eval_holds /
emit_host_join_equals_eval_holds). Each claim now pays one native run; the
family crate build stays shared through the same one-build cache key. The
coverage frontier's meet_join row re-cites emit_host_native_only_meet_holds;
the join claim carries the family's other half.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Adjudicate the five structural-text/logic requalification deltas at their exact subjects

The branch's required-witnesses lane reports five TargetChanged binding
deltas, all one change class: three String sites (EmitSpellingEscape,
apply_emit_spelling_escapes, integer_string_to_decimal_digits_step)
requalified to v2.std.text and two Bool grounding sites (py_bool_grounding,
ts_bool_grounding) requalified to v2.std.logic — the gunbc#9907
namespace-lane requalification reaching the sites the XL-N closure repair
and the chars(String) <- Variant cluster repair touched. The spelling is
identical on both sides in every row; only the declarer moved, from the
ambient kernel type set to the named authority. Five exact-subject
TransitionAdmission rows, enumerated never patterned, with the dissolution
trigger on gunbc#10692's merge.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Share the ingested-fixture pipelines across claims: three warm producers for the five over-ceiling claims

The prepare_grammar warm-store unmasked five changed witnesses over the
500ms per-claim ceiling: the classical_not family's three emit claims
(marginal 474-501ms, each re-running the full tokenize->resolve pipeline
on a module-constant source) and the produced_module pair (505-542ms,
each re-assembling the same two-decl module). CI's runner is ~1.8x this
lane's local host (median ratio over the 25 claims present in both
ledgers), so these project to ~900ms there — structurally over, not
variance.

The repair is the roster's own named one — stop recomputing a pure
function of program content — in its WARM arm, because a ~370-382ms
claim-forced fill leaves under 130ms of headroom and would die
mid-flight on the lane exactly as prepare_grammar's did:

- produced_add_module_source (already nullary) is enrolled directly.
- ingested_classical_not_arrow_with_body and its swapped sibling are new
  nullary producers in the ingested_fixture_arrows idiom; the three
  failing claims' tree helpers now take the arrow outcome, with the
  source-taking staging variant delegating so unselected claims keep
  their spans untouched. The arrow is the deepest pipeline stage whose
  value is closure-free and therefore portable; the InferredTree above
  it carries the facts PartialFunction and can never store.

claim_batch: 14/14 classical_not claims pass with identical verdicts.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Share the door-specimen resolved tree across claims: one warm producer for the seven unmasked over-ceiling grounding claims

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Stage0 emission boundary as a target profile: visibility and integer carrier selected, measured over the disk route

The regen-grain flip's presumptive subject (std.integer) is not producible by the
v2 generator, and neither is any other real corpus mirror. Measured, not assumed:
of the 152 committed stage0 mirrors joined to their .dag sources, exactly one
module carries a single declaration -- the shape the production composition
admits -- and that module's body stops emission. So this change lands the two
BOUNDARY selections the flip needs, and names the remainder.

The two selections are not emitter generalization. Rust owns what Rust is; this
adds what the stage0 SEED CRATE requires of a module emitted into it:

  visibility -- every committed mirror is `pub`, because the crate calls across
  module boundaries (gunbc_rust_decl_type_overlay's function is called from
  v1_compiler_emit_rust). The .dag source spells no visibility and Rust emission
  in general must not: a private item is correct at a boundary with no external
  consumer. The keyword is a Rust row; the SELECTION is the profile's.

  integer carrier -- the language's Int is unbounded and a Rust realization picks
  a primitive. The committed stage0 ABI is i64; the direct-door fixtures are
  organized around i32 and stay that way. rust_binding_spellings_for_int takes
  the carrier as a parameter rather than the base target being relabelled, which
  would have fused two boundaries into one row (DESIGN section 3).

Evidence, all three PASS by execution (claim_batch, wet -- the specimen is read
off disk, not carried inline): the profile emits
`pub fn probe_add(x: i64, y: i64) -> i64 { x + y }` through
source_ref_for_observed_storage_path -> ingest -> assemble -> infer -> the
production single-declaration composition; and two controls, one per capability
class, observe the base target emitting no `pub` and emitting i32 at the exact
positions the crate fixes. Each fails for its own reason, so a regression in one
cannot be masked by the other. No enrolled claim exercised the disk-backed
production seam before this one -- the door's own specimen carries its module
source inline.

THE REMAINDER, measured per form over real files rather than predicted. The
overlay module's body needs five further capabilities, and three of them are
inference frontier, not emission:

  x > y          EMIT refuses (transform shape invalid at the first operand)
  !a             EMIT refuses (same site)
  x + 1          INFER refuses -- integer literals are Value-kind, no rule
  let z = ...    INFER refuses -- Bind-kind, no rule
  Int? param     EMIT refuses -- type ref renders only Atom shapes
  match v {...}  ASSEMBLE refuses -- Present/Absent unbound with no import

04_infer's node_grounding_frontier_note already states this: v2 derives six of
twelve node kinds, "Transform add-shape only". So the production-compatible
corpus module is gated on that open frontier, not on a handful of spellings, and
a > b working while a && b works is a resolution/layout question rather than a
missing operator row (the canonicalization table already carries op_gt).

Also noted, unfixed and deliberately so: an unspelled type binding prints its
symbol lexeme (`bool_node_symbol`) instead of refusing, and the Rust bool
spelling exists twice -- once as a TargetAtomRealization, once as a
binding-spellings row. The repair is for produced-decl type refs to consult the
atom realization catalog, which is the first missing join rather than a new row.

One roadmap transition added between the direct door and the flip
(v2-emitter-production-compatible-corpus-module), so the flip node keeps its own
different fact: that production regeneration actually selected v2 and could not
reach the old generator.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011X5tyxfVrw3chDNbQ3sVD3

* Share the family-crate emitted pairs across claims: two warm producers for the twelve ceiling-band native-only verdict claims

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Keep the base Rust spelling map byte-identical, and share the two stage0-boundary emissions

The floor refused this branch's first head two ways, and both are cost, not
content. Fixed at the cause rather than by raising a line.

FIRST: twelve of #10692's native-only rows tipped 6-118ms over the 500ms
per-claim ceiling. They sit deliberately just under it -- the parent's last two
commits are about keeping them there -- and this branch had re-parameterized
rust_binding_spellings, which every one of them evaluates. The profile now
OVERLAYS the single key it changes (map_insert over the Rust map) instead, so the
base map is byte-for-byte what it was and every claim already sharing one
evaluation of it keeps sharing exactly that one. A profile's delta belongs to the
profile; charging every other witness for it was the defect.

SECOND: this branch's own three claims were INTERRUPTED BEFORE VERDICT at
~1200ms each -- a full ingest-assemble-infer-emit walk per claim. Split by an
ingest-only/assemble-only probe pair, the disk read and its content-hash
verification cost 0ms and assembly costs 878ms, so the recompute was assembly,
three times, of a pure function of one file's content. Two repairs, both the
roster's own named one:

  The emission claims now run over direct_rust_door_specimen_resolved, the
  already-warm-enrolled producer of a resolved add-shaped module. A second
  producer for a specimen of the same shape would have been the duplication that
  roster exists to end.

  The two emissions themselves (profile target, base target) are nullary
  producers enrolled warm, the same shape as produced_add_module_source. Each
  claim is then a string comparison, and infer+emit is evaluated once at
  preparation rather than three times inside three budgets.

THE READ IS CLAIMED SEPARATELY, because it is a separate fact and it is free
(0-5ms): the committed fixture reaches source_ref_for_observed_storage_path and
source_root_ingest_from_source_refs, whose content-hash verification is the seam
no enrolled claim covered -- the door's specimen carries its module source
inline. The assertion is a containment, not a whole-text golden, so editing the
fixture's prose is not a test failure (a change detector, not a check).

claim_batch over the entry: 5/5 PASS. The emission claims read the door
specimen, so the expected sources name its declaration (`add`) rather than the
fixture's.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011X5tyxfVrw3chDNbQ3sVD3

* The probe file states the seam it is actually the subject of

Review 62939 is right, and the gap is exactly where it says: the fixture's own
annotation still described the enrolled fact as disk -> ingest -> assemble ->
infer -> emit. That was true when written and stopped being true one commit
later, when the three emission claims moved onto the door's warm-shared resolved
specimen to fit the floor's per-claim ceiling. An annotation describing a route
no claim executes is DESIGN section 5's specification-without-execution, and it
is worse than absent because it reads as coverage.

The file now states what it is the subject of -- the storage-read seam, claimed
by the two read claims over the bytes actually on disk -- and says outright that
no claim ingests, assembles, infers or emits it, with the reason the split
happened. The two facts stay separate on purpose: the READ is claimed over a real
file, the two target-profile SELECTIONS over the shared specimen, and neither
claim covers the other.

No behavior changes; the claims are unchanged and still PASS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011X5tyxfVrw3chDNbQ3sVD3

* One measurement, one home: the claim file names the instrument and stops transcribing it

Review 62942 caught the drift as it happened. The same measurement -- these three
claims against the per-claim ceiling -- was transcribed twice in one diff, into
the test file and into the enrolment row, and the two copies already disagreed
(713-805 against 713-834). DESIGN section 6 forbids exactly this: name the
producer that re-derives a measurement, never copy its numbers into prose,
because a transcribed number is unreachable from the run that owns it and rots
without either end being touched. The disagreement is that rot arriving on day
zero.

The figures now live once, at the enrolment row in
v2.workflow.floor_pure_producer_share, which is where the ceiling arithmetic is
argued and where every neighbouring row already argues its own. The test file
names the instrument -- claim_batch's [witness] receipt over this entry, with the
ingest-only / assemble-only probe pair that splits the pipeline -- and states the
shape of the fact (unshared, each claim costs multiples of the ceiling; the read
pair is the cheapest in the file) without restating a number beside it.

Claims unchanged: 5/5 PASS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011X5tyxfVrw3chDNbQ3sVD3

* The…
briansrls added a commit that referenced this pull request Sep 10, 2026
… taxonomy, admission, enrolment gate (#10882)

* Land the add-slice per-stage verdict instrument named as the floor_expected_red note's producer

The add-slice roster note in v2.workflow.floor_expected_red carried a dated
receipt (main 3a8344b5c: infer accepts dag_add_emitted_root; the
infer-then-translate composition refuses headed by infer_grounding_not_derived)
and named its own next-rung trigger: a .dag entry returning the per-stage
verdicts for one root, so the paragraph can name a producer instead of a
commit.

v2.compiler.self_host.candidate_generation_stage_verdicts is that entry,
parameterized over root and target: the receipt's verdict vocabulary
(infer_accepted / infer_rejected; candidate_accepted or the rejection head
reason) plus the carried-reasons lists -- the half the verdict symbols cannot
say, namely that infer accepts while carrying the frontier diagnostic on its
accepted path, so the enrolled witness's d == None conjunct fails even where
the composition reaches acceptance.

v2.test.execution.self_host_candidate_generation_stage_verdicts binds the
instrument to the slice's own fixture, with add_slice_stage_verdicts_entry the
runnable gunbc run --function form (ExitSuccess only when infer accepts clean
and the composition accepts clean). Two witnesses: infer-accepts as a
permanent positive control, and the frontier-state pin that is expected to red
the day the add-slice stall's trigger lands, flipping to a permanent
regression control in the same change that removes the roster row (DESIGN
4b(4)).

Measured by execution on this branch: the entry exits 1 printing
infer=infer_accepted, infer_carried=[infer_grounding_not_derived x10],
composition=infer_grounding_not_derived, composition_carried=[x11] -- the
receipt reproduced, with bind_outcome's pending-plus-gate chain counted. Both
witnesses PASS; the enrolled semantic witness still fails as enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for dag declared inhabitants: the add slice greens end-to-end

infer gains the declared-inhabitant membership derivation: a node declared in
the dag language authority's declared-inhabitants roster derives its grounding
by lookup, with the roster as evidence -- the namespacing answer to the atom
authority question, at specimen scope. The add slice's ten type-spine nodes
(Arrow, Conj, Atom) are all roster members, so:

- candidate_generation_translate_self_emit_dag_add_slice_holds passes; its
  floor_expected_red roster row and per-row note delete per the roster's own
  stale-quarantine arm
- the dag same-language ingest path compiles end-to-end: cross_language_compile
  accepts, byte-equal to the authority's own serialization, no carried
  diagnostics
- the add-slice stall narrows to its four python/typescript round-trip members;
  the original trigger's causal clause was refuted by execution and is restated
  against the grammar parse-product population
- the instrument's frontier guard flips to add_slice_composition_accepts_holds
  (DESIGN 4b(4): frontier guard to permanent regression control)
- five manual witnesses flip with it: two root flips rewritten to assert the
  green state, three transitive conjunctions updated

The kinds stay frontier: non-member Arrow/Conj/Atom specimens carry
GroundingNotDerived exactly as before, and all fourteen enrolled
refusal/acceptance controls pass unchanged. The door's production path still
reds inside rust emission, untouched by this rule.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for canonical binding atoms: dag_binding_denotation joins binding to inhabitant once

The resolver already binds the surface spelling Int to the canonical binding
symbol dag_binding_type_int; what that binding DENOTES is the Int inhabitant
declared at dag_declared_inhabitants_core. Every hand-rolled fixture facts
lookup re-authored that join (dag_add_canonical_grounding_for,
record_construct_canonical_grounding_for). The language authority now declares
it once as dag_binding_denotation, and infer_node_facts consumes it: an Atom
whose identity is a canonical dag binding with a declared denotation derives
with that denotation as its grounding evidence.

Direct-rust-door specimen census: 14 underived -> 10 underived (the four
dag_binding_type_int atoms derive; grammar-production atoms, algebra atoms,
bare operand atoms, and the arrow/conj spine stay on the frontier unchanged).

Specimen-scope interim in the same frame as
infer_node_declared_in_dag_inhabitants: both delete in favor of consuming
resolution output when the resolver hands infer declaration-resolved
identities directly (the namespace migration's completed state).

Witness: v2.test.execution.dag_binding_denotation — all four Int binding
atoms in the door specimen derive with dag_int_inhabitant_node() as
structural evidence, and the two bare operand atoms stay GroundingNotDerived
(boundary control). Refusal suite 14/14, ingest bridge 7/7, add-slice
instruments 2/2 green; every remaining red in the at-risk population
reproduces identically on the pre-change tree and is enrolled in
floor_expected_red.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Add v2 self-host direct-path orientation: axes, sequence, autonomy contract

A point-in-time orientation that defers to the existing authorities
(DESIGN section 7, the four-wave self-host program, the roadmap node
chain, the three frontier carriers, the guarantee-stall roster, XL-N)
rather than restating them: state is re-derived by the named
instruments, never transcribed here. Sequences the remaining work in
roadmap order (door, parse-product grounding, first behavioral module,
XL-N milestones, native bootstrap, fixed point, v1 deletion) and states
which decisions stay operator-gated.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for fully-evidenced Conj and Arrow products

The sixth and seventh kind rules: a non-roster Conj or Arrow whose every
child carries DerivedGrounding derives, its evidence the same shape
re-formed over the children's grounding evidence (a fresh
OccurrenceSynthetic node, never the source — the self-evidence wall holds
by construction). A product with any frontier or absent child stays on the
frontier with its typed diagnostic; a childless product has no evidence to
compose and stays frontier. Roster members keep their roster evidence.

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
10 underived of 15 -> 6. The parameter conj, the module-structure conjs,
and the bodied add arrow derive; what remains is the algebra atoms from
the + operation (AlgebraPrimitive, ring_field_add), the module atom
(dag_surface_module), the parameter references (x, y), and the
grammar-projection root conj that cascades once they land.

Enrolled witnesses (src/v2/test/claim/execution/infer_product_introduction_test.dag):
- product_introduction_derives_fully_evidenced_products_holds — census:
  4 Conj (3 derived, 1 frontier-by-frontier-child) + 1 Arrow (derived).
- product_introduction_composed_evidence_carries_child_groundings_holds —
  the params conj's evidence is a Conj whose x/y children target the dag
  authority's Int inhabitant.
- product_introduction_leaves_childless_conj_on_the_frontier_holds —
  boundary control via direct infer over a hand-built childless Conj.

Flip census (pre- and post-change, zero unexpected flips):
translate_underived_refusal 14/14, infer_self_grounding_wall 12/12,
branch_infer_if_then_else 2/2, compile_eval_thesis_proof 6/6,
ingest_bridge 9/9, cross_language_add_python_to_typescript 4/4,
inhabitant_neutralization 6/6 + e2e 6/6, emit_host_classical_not 14/14,
dag_binding_denotation 2/2, stage-verdicts instrument 2/2,
dag_add_emit_round_trip 4/6 (the 2 enrolled reds unchanged), door
production group still enrolled-red (unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground canonical-operation and grammar-production atoms by authority roster membership

Two more specimen-scope derivations in infer_node_facts, both lookups into
declared authorities, never inventions:

- Canonical-operations roster (target_model.dag): every CanonicalOperation
  the target-model authority declares, rendered by
  target_model_canonical_operation_wire_node and gathered under one Conj
  root. The resolver canonicalizes surface operators (e.g. +) to those
  declared operations, so the wire atoms -- the operation discriminant and
  its field references -- derive by membership with the roster root as
  evidence. General over all 14 declared operations, not add-narrow.

- Grammar-productions roster (dag.dag): every production in
  dag_grammar_root() projected to its emitted surface atom under one Conj
  root keyed by production name. The bridge projects a production's parse
  into (identity atom, captured content) pairs, so the identity atom
  (dag_surface_module) derives by membership with the roster root as
  evidence. The roster derives from the grammar root, so a production
  added to the grammar joins by construction.

Both roster roots are Conj nodes, never structurally equal to any member
atom, so the self-evidence wall holds by construction (the first attempt
at the operations rule used the wire node itself as evidence and was
refused by grounding_evidence_is_source -- the wall doing its work).

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
6 underived of 15 -> 2 (only the operand atoms x and y remain; the
grammar-projection root conj cascades once the module atom grounds).

Enrolled witnesses (infer_atom_grounding_rules_test.dag): each roster rule
pins derivation + evidence identity + census; a boundary control pins that
a bare atom with no authority membership stays frontier; the closing
control pins the 2-of-15 state.

Flip census: the product-introduction census witness updates 3->4 derived
conjs (the top conj now cascades) and gains a hand-built
partially-evidenced boundary control to replace the in-specimen one the
cascade consumed. Full battery otherwise unchanged: refusal suite 14/14,
grounding wall 12/12, instrument 2/2, binding-denotation 2/2, round-trips,
bridge, cross-language, neutralization, emit-host all green; enrolled reds
unchanged.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground binding-reference atoms from the enclosing arrow's domain declaration

The fifth specimen-scope derivation, closing the direct-rust-door
specimen's inference frontier: an Atom whose binding an enclosing arrow's
domain declares derives with the declared domain type as its evidence --
the declaration-site annotation, itself derived (x: Int grounds the x
reference). This is the same lookup the branch-operand path already
performs (infer_find_arrow_domain_type_in_tree), now written to the
operand atom's own facts; it is scope-naive (whole-tree, first match),
recorded in the frontier note, and deletes with the other specimen-scope
rules when the resolver hands infer declaration-resolved identities. The
tree is threaded through the fold's init chain to reach infer_node_facts;
the helper had exactly one caller.

Measured on the door specimen (scratch probe, uncommitted): 2 underived
of 15 -> 0. The specimen's inference frontier is fully closed, and the
production observation advances from InferenceRejected
(infer_grounding_not_derived) to EmissionRejected
(target_use_site_ownership_lookup_miss) -- a new, typed, located deficit
in the emitter, the next gate on the path.

Flip census (all three rewrites verified by execution):
- dag_binding_denotation_leaves_unbound_operand_atoms_on_the_frontier_holds
  -> dag_binding_denotation_declares_no_denotation_for_operand_bindings_holds:
  the boundary moves to the authority itself (the denotation table returns
  Absent for x/y), true regardless of infer's other rules.
- The three emit_host classical-not refusal guards (canonical, staging,
  staging-swapped) flip to acceptance witnesses pinning the emitted text's
  shape -- the real-infer tree now fully derives, and the emission is the
  same one the equals-eval witness proves behaviorally correct. The
  translate-refuses-underived behavior stays enrolled on hand-staged
  fixtures in translate_underived_refusal_test.dag (14/14 green). The
  renames are carried into the commit_workflow and witness_deferral_freeze
  rosters.
- New witnesses: binding_reference_derives_parameter_atoms_holds (evidence
  is the domain's Int binding atom, census 2) and
  door_specimen_fully_derives_holds (0 frontier of 15).

Full battery at this state: refusal suite 14/14, grounding wall 12/12,
instrument 2/2, binding-denotation 2/2, product-introduction 4/4,
atom-rules 5/5, emit_host 14/14, round-trips 4/6 (2 enrolled reds
unchanged), bridge 9/9, cross-language 4/4, neutralization 6/6 + e2e 6/6,
branch 2/2, eval-thesis 6/6; door production group still enrolled-red
(unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Green the direct-rust-door: route emission through produced-decl composition and decode canonical operator wires

The door specimen's inference frontier is fully closed, so its production
observation now reaches the emission stage. Two defects surfaced there, both
fixed here:

Emission composition. generate_rust_emission_candidate served two lanes with
one root shape: the door's production path (a dag module shell) and a fixture
lane (a bare rust Arrow). The translate ownership gate queried the module
atom's ownership at a struct-field use site and refused with
target_use_site_ownership_lookup_miss, because the module's grammar-projection
conj was misread as a type record. The door's real composition is the
produced-decl path: collect declaration conjuncts from the inferred tree and
emit via emit_produced_decl. A new generate_rust_module_emission_candidate does
exactly that, enforcing an exactly-one-declaration admission policy
(rust_module_emission_decl_absent / _ambiguous). The observation and production
mint paths switch to it; the fixture-lane candidate is retained with a note
that it is fixture-only. A pure collector, produced_decl_conjs_in_tree, finds
nodes of produced-decl shape (a Conj whose first child is a Named edge to an
Arrow). Its decl-head match routes through a declared FreeMonoid<Edge>
parameter because the v1 seed stamps pattern variables from a declared
parameter type, not from a field-access scrutinee.

Operator decode. With composition fixed, source fidelity still refused: the
door emitted fn add(x: i32, y: i32) -> i32 { AlgebraPrimitive(x, y) } instead
of { x + y }. Resolution canonicalizes a surface operator atom into a
canonical-operation wire node, so a production tree's transform operator
position carries the wire, while fixture trees that bypass resolution still
carry the surface token atom. translate_project_transform_in_arrow_scope only
knew the surface-token table, so the wire missed and fell to callable apply,
rendering the discriminant identity. The projection now tries the wire decode
first (canonical_operation_from_wire_node) and only on a wire miss falls to
the surface-token table, then to callable apply; the arms are disjoint, so the
dispatch adds no fallback widening. target_transform_operator_child extracts
the operator child safely.

The door's closing expectation now greens by execution, so its known_red_probe
row in explicit_witness_admission is deleted per its own dissolution condition,
and the roadmap authority note, the door contract note, and the direct-path
plan are updated to record the green state. realized_closure_for_v2_direct_
rust_door_emit_run's module list reflects the produced-decl route.

Verified by execution: the door witness greens; the fixture, containment,
algebra, produced-decl, add-slice, and classical-not witnesses stay green;
claim_executor required-ci lanes build and witnesses both exit 0; cargo fmt and
clippy --all-targets -D warnings are clean. One pre-existing red,
witness_projection_is_active_only in the floor_cost_debt containment roster,
reproduces on the base revision and is unrelated to this change.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the parse-product grounding frontier: widen declared-inhabitant membership to the closed ingest set

The declared-inhabitant roster-membership derivation in 04_infer generalized
from the dag roster to the closed ingest set (dag, python, typescript):
infer_node_declared_in_language_inhabitants returns the declaring authority's
roster root as evidence, with deep subtree membership so a declared
inhabitant's leaf fact atoms derive exactly as the inhabitant node itself.

Measured: the python fixture's 19-node frontier and the typescript fixture's
28-node frontier both close to zero; all four add-slice stall population
round-trip witnesses green; the python->typescript cross-language compile
accepts, byte-identical to ts_source_text.

Section 4b(4) flips (expecting-red probes becoming permanent regression
controls for the acceptances):
- cross_language_compile_refuses_canonical_underived_holds ->
  cross_language_compile_python_to_typescript_round_trip_holds
- inhabitant_neutralization_emit_after_neutralize / same_flavor_python /
  go_int64_to_ts refusal helpers -> round-trip controls
- inhabitant_neutralization_python_to_ts_cross_language_compile (e2e) ->
  round-trip control; python->go members stay refusal guards (go is outside
  the closed ingest set)
- cross_language_emit_inhabitant_neutralization_refuses_underived_holds ->
  round-trip control; the python->typescript emit-matrix row reads ChainProven

The add-slice stall's next-rung trigger fired, so it retired per DESIGN
4b(4): removed from all_guarantee_stalls, row file deleted, witnesses stay
enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Promote the add family to SelfEmittedNative: native-only verdict witness for the emitted add crate

First InterpreterRetained -> SelfEmittedNative promotion after classical_not,
executing the v2-emitter-first-behavioral-module first slice at the
coverage-frontier grain: the add family (fewest dependencies — integer
literals plus one canonical operation) now carries a native-only verdict
witness, so its behavior is established by the emitted crate's own stdout
with eval() unreachable from the verdict path.

- emit_host_native_only_add_holds: real emit -> cargo build -> native run,
  stdout pinned to the family's expected octet, sharing the kernel family's
  one-build cache key exactly as the classical_not arm shares its family's
  key (no duplicated cold build).
- emit_host_native_only_add_wrong_octet_mismatch_detected_holds: the broken
  control — a no-eval verdict has no oracle leg to break, so the expectation
  side breaks (an octet the run never produces must not match); program-side
  discrimination stays with the family's equals_eval primitive-five/six pair.
- The add coverage row flips disposition with its backing citation enrolled
  by construction (the verdict entry is file-grain enrolled in
  falsifier_self_host_wet_template_entries).
- Frontier census tests updated at identity grain: natives are exactly
  {classical_not, add}; split 2/13.

Verified by execution: all six native-only verdict tests green locally
(real wet legs — compile_skipped receipts show cold builds and native runs);
all eight emit_coverage_frontier tests green, including the unbacked-claim
RED control.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Record the add-slice defect's repair in the declined-live-tree classification

The row classified candidate_generation_translate_self_emit_dag_add_slice_holds
as RealDefect/CompilerBehaviourRefusal with measured evidence that translate
refuses infer_grounding_not_derived. The owner lane (v2 self-host) repaired the
subject: the declared-inhabitant roster-membership derivation grounds the
slice's type spine by lookup, and the witness passes under claim_batch
--hermetic on the merged tree. The dated classification is kept verbatim; the
disposition flips RoutedToOwner -> RepairedInThisChange with the repair
measurement appended to the evidence, so the routing carrier stops dispatching
a fixed defect. Structural witnesses (count 13, no NotReproduced, exact
partition) are untouched and pass.

* Hoist two in-body annotation blocks to module-item grain

Main's annotation-placement wall (source annotations admit only standalone
leading blocks attached to module-scope declarations; in-body forms refuse)
reached this branch through the merge and refused 8 blocking errors on the
00_compile closure: the add-family promotion note inside the
emit_coverage_frontier_roster list and the python->typescript row note inside
the cross_language_emit_matrix list. Both blocks move above their enclosing
declarations, rephrased to name their subject row. Measured: gunbc compile of
src/v2/compiler/00_compile.dag now emits 172 files with 0 blocking errors;
both files' suites stay green (8/8 and 4/4).

* Promote the complement family to SelfEmittedNative: native-only verdict witness for the emitted logic family crate

The complement family's native execution runs family-grain per the
witness_family_build_grain_ruling (one crate for meet + join + complement,
argv-dispatched), so the native-only arm emits the logic family crate and
runs the complement member through the family dispatcher, sharing the
family witness's one-build cache key. The verdict is decided solely by the
emitted native run's stdout (expected octet 0, complement(True) = False);
the broken control flips the expectation side (octet 1 can never match),
with the comparator pinned by the stdout mock pair. Program-side
discrimination stays with the equals_eval agreement pair and the family
witness's all-alt leg.

The frontier row's backing citation lands in the already
file-grain-enrolled native-only verdict entry, so it is enrolled by
construction; the roster comment is rephrased to cover both 2026-09-07
promotions (add and complement). The frontier test's split and native
membership assertions move to 3 native / 12 retained.

Verified by execution: claim_batch --hermetic on
emit_host_native_only_verdict_test.dag passes all 8 witnesses (the two
new complement arms included), and emit_coverage_frontier_test.dag
passes all 8.

* Key the emitter's host-String arm on declaration provenance, not spelling

is_host_text_carrier_type answered true for any type expression whose
authored name reads "String", including references to the structural
alias v2.std.text.String (type String = FreeMonoid<Char>) that the
namespace lane (gunbc#9907) requalified the v2 corpus's text-carrier
fields to. The emitter rendered every one of those references as the
host String while value-position consumers rendered the structure -- the
E0308 family dominating the self-host compile-phase frontier (41 of 64
in v2_compiler_tokenize.rs on the post-merge board).

The String arm now consults the resolved declaration's provenance
against v1.compiler.coercion structural_declaration_modules_for -- the
same roster type_realization_decision reads -- so the legacy arm and the
strict decision cannot diverge on one node (DESIGN section 3, and
gunbc.recurring_failure_mode alias_resolution_collides_with_kernel_spelling).
Kernel mints and unresolved references keep the host answer exactly as
before.

Regen: the only drifted stage0 mirror is v1_compiler_emit_rust.rs
itself (no module in the stage0 closure references a structurally
declared String -- verified by the whole-population candidate tree),
installed from target/stage0-regen-candidate after the priced round's
partitioned rebuild refused MirrorHasNoOwningPackage on the emitter
(the emitter is monolith-shell, not partition-owned). Fixed point
verified by execution: claim_executor --required-regen on the rebuilt
seed reports first_generation_equal=true over 158 adjudicated mirrors.

* Peel qualified String alias leaves in field position: XL-N closure 72 -> 28 errors

A field authored v2.std.text.String reached the Rust emitter as an overlay-less
resolved reference leaf and rendered the bare terminal name, which binds the
prelude String cross-module (#9813: kernel names are never overridden by
imports, so the use-line is dropped) while every value position renders the
structural carrier Rc<Vec<i64>> -- the v2_compiler_tokenize.rs E0308 family,
41 of 72 errors on the XL-N phase board.

The new rust_overlayless_alias_leaf_requires_peel arm in
render_rust_type_without_applied_binding detects the population (overlay-less
zero-parameter alias leaf, qualified spelling, String terminal segment,
closed_alias_peel_verdict agrees) and renders the alias declaration's resolved
right-hand side, projecting the same realization the fn-signature positions
already produce.

The qualified gate is load-bearing: inside the declaring module the bare name
is the correct render (the emitted module carries the alias declaration), and
the local binding's resolved_type drops the RHS type argument, so an ungated
peel rendered Rc<FreeMonoid> there (E0107 x13, E0282 x2 on the probe). Bare
String keeps denoting the kernel scalar through the host-carrier arm.

Measured: probe specimen (qualified/bare/direct-FreeMonoid/container/variant/
local-alias positions) compiles clean; XL-N compiler closure cargo check
72 -> 28 errors with the residual census dominated by the declared
text_boundary_identity_wall class (kernel String vs structural carrier at
bare-authored boundaries, 17 of 20 E0308s); v1-corpus fixed point holds
(first_generation_equal=true, 158/158 adjudicated).

* Resolve the 12 non-hop XL-N closure errors at source: text-wall conversions + witness_violates helper

Four clusters, all measured non-hop additions between receipt_1 (155) and the
post-peel census (28); the live gate now measures 15 with zero unadmitted
regressions:

- integer.dag: integer_string_to_decimal_digits_step takes v2.std.text.String;
  the public boundary converts with chars() (text_boundary_identity_wall
  specimen discharged at this site).
- 01_tokenize.dag: Token/UnboundSourceAnnotation lexemes convert structural
  -> host String with chars_to_string() at construction, mirroring the v1
  tokenizer's host-lexeme carrier.
- target_model.dag + bash.dag: EmitSpellingEscape.from/to and
  apply_emit_spelling_escapes go structural (v2.std.text.String); the
  EmitSpellingQuote arm converts host->structural->host at its boundary;
  bash's escape rows wrap their kernel String literals with chars().
- witness.dag + 3 call sites (collection list_nth, provenance
  span_index_resolve_textual_locus_from_ids, compile outcome_with_diagnostics):
  new witness_violates<C> helper puts Violates constructions in a
  Witness-headed position so the emitter resolves the carrier type argument;
  dissolves once inference records per-call substitutions.

Verified: 48 targeted claim witnesses green (tokenize behavioral, shell
conformance, string brace escape, string length, map-lookup violates, source
text ingress, bash materialize x12, int literal smoke x6, provenance span
index x2).

* Record receipt_2 on the self-host compile-phase frontier: 15-error census at 66765317ec

The census at the XL-N lane tip: 155 -> 15 net, credited to the qualified-alias
peel (60cbd7b697, 72 -> 28) and the twelve-error source cluster (66765317ec,
28 -> 15). The epoch changes on the instrument's target pinning (found by
review on gunbc#9857), admitted with receipt_1's board as the reclassified
predecessor under the identity map. Nine added identities are hop relocations
admitted by the hop index; four sit in python/typescript modules newly entered
into the emitted closure, admitted as ExposedByNewEmittedModule.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* Emitter: a substituted declaration node carries its own provenance

Inference substitutes the resolved declaration into a data annotation's
type-argument position, so BooleanAlgebra<v2.std.logic.Bool> reaches the
emitter with the arg BEING the type Bool = True | False declaration itself
(Disj connective, ident_span in src/v2/std/logic.dag, no Resolved wrapper).
type_reference_provenance_in_env's bare-leaf arm re-resolved that leaf in the
REFERENCING module's scope, where post-#9813 a kernel-shadowed spelling
answers the kernel declaration -- so the structural enum rendered as host
bool against a value of BooleanAlgebra<Bool> (the python.rs:328 /
typescript.rs:177 E0308 pair on the XL-N compile-phase frontier).

The connective is the discriminator: a reference node is a bare name
(NoConnective); a node carrying Conj/Disj structure IS the declaration, and
type_reference_provenance's own-span fallback already answers that shape
correctly. The guard routes declaration-shaped nodes there directly, bypassing
the scope lookup that #9813 makes answer the kernel.

Mirror regenerated via the regen round; fixed-point verified
(claim_executor --required-regen PASS).

* Clear the remaining XL-N closure errors at source: carrier conversions at the boundaries

The receipt_2 census's fifteen identities, resolved at their sources:

- lexing.dag, dag.dag, python.dag, typescript.dag: LexPattern.text is the
  structural carrier (v2.std.text.String); the construction sites held host
  Strings. Convert at construction with chars() -- the #9907 ingress pattern.
- python.dag / typescript.dag bool groundings: qualify the annotation as
  BooleanAlgebra<v2.std.logic.Bool>; with the emitter's substituted-
  declaration provenance guard the qualified arg now renders structural.
- target_model.dag: target_lex_rule_literal_step returns the host carrier
  (chars_to_string over the structural pattern text); TargetText.source
  converts at the is_empty boundary; the unicode-scalar symbol intern converts
  its single-codepoint list to the host carrier.
- qualified_name.dag: qualified_name_from_dotted_string uses the host-carrier
  emptiness check (string_length == 0) instead of routing through the
  structural string_is_empty.
- 02_parse.dag: parse_looks_like_match_arm_start rewritten on host-carrier
  operations (string_length, char_at, code_point) rather than converting to
  the structural carrier for a two-character lookahead;
  parse_char_is_arm_pattern_lead takes the codepoint Int directly.
- v1_interpreter_primitive_surface.dag row_key: the concat pipeline lowered
  to a .concat() method call on std::string::String (E0599); rewritten as
  nested concat calls.

Measured: the 00_compile closure emits 172 files and cargo check reports
cargo_clean=true, cargo_error_population=0 under the pinned 1.93.0 toolchain.

* Pin the cargo half's toolchain channel by construction

The cargo half runs with cwd = a fresh mktemp directory; with no
rust-toolchain.toml there, rustup resolves the host's DEFAULT toolchain, so a
census under cargo 1.83 and one under cargo 1.93 would compare as equal epochs
while different compilers did the measuring -- the fabricated comparability
the target pin (gunbc#9857) excludes, one level up. Measured 2026-09-07: a
host default of 1.83.0 met a crates.io index whose freshly published
dependency manifests require edition2024, resolution failed before any
diagnostic existed, and the zero-diagnostic refusal fired on an unmeasured
tree.

The pin is propagated by copying the repo's rust-toolchain.toml into out_dir:
the file remains the sole in-repo channel authority (its header forbids a
second pinned literal), and the copy makes the measured channel true by
construction on any host. The gate's read_live_toolchain observes the same
channel because every documented actuator invokes from the repository root,
which the same file governs.

* Record receipt_3 on the self-host compile-phase frontier: the emitted closure's cargo census is empty

Measured at 5ee4892b70 by the one-entry instrument: the 172-file emitted crate
reports zero cargo error diagnostics, so the board attributes every phase a
count of zero and furthest_phase_reached stands at Borrowck. The fifteen
removals against receipt_2 need no disposition; nothing was added.

The epoch does not change: the cargo half now pins the toolchain channel by
copying the repo's rust-toolchain.toml into the scratch crate, and every
recorded comparison field is identical to receipt_2 (whose census the
fingerprint evidence shows the same 1.93.0 toolchain already compiled), so the
same-epoch arm carries no reclassified predecessor.

The frontier-state pin flips per DESIGN 4b(4):
the_published_frontier_standing_does_not_claim_typeck_or_borrowck_passed
becomes the_published_frontier_standing_claims_typeck_and_borrowck_passed, the
permanent regression control over the green state.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Repair-Judged: docs/design-rung-drops.md

* Remove the stale PointwisePower inhabitant rows from the four language rosters

First native-parity divergence class found by running the emitted closure on a
discriminating fixture: the algebra inhabitant rosters still carried
PointwisePower after its authority row was cut, so the emitted compiler panicked
at 12 record-shaped carrier sites while the interpreted seed refused cleanly.
The roster rows are removed in rust/python/go/typescript types.dag, the derived
coercion assertions in compiler_tests.rs regenerate without them, and two
witnesses pin the boundary: the record shape constructs its structural carrier,
and FinitePowerSet still refuses while its row stands.

Mirrors regenerated by a converged regen round (fixed point Reached, stage-1
PromoteGenerationInputs over the three language types mirrors).

* Regen gen-2 gate: compare executable digests in one spelling

The admitted side of run_built_seed_regen carries the executable-digest
spelling (current_exe_digest, next_pass_executable_digest) while the observed
side hashed the file through path_digest, which prepends the fnv1a64: tag.
Same bytes, two spellings, so the gate could never pass -- unpassable since
fa2d403dc8 (#9771). Factor current_exe_on_disk as the single path authority
and read the observed digest through current_exe_digest so both sides spell
the same bytes the same way.

* Model ReleaseScopeEmpty for release-excluded mirrors, end to end

A regen round whose only stage-2 drift was compiler_tests.rs (the PointwisePower
roster removal rewrote its derived coercion assertions) refused the rebuild
MirrorHasNoOwningPackage: the mirror is owned by no partition package, because
every item it defines is #[cfg(test)] and no release unit elaborates it. The
refusal conflated two different states -- unowned (a coverage hole) and excluded
from the release build by construction (a precise empty scope).

The model now names the class: rebuild_scope_release_excluded_mirrors rosters
its members (compiler_tests.rs, cited to emit_compiler_tests_module), the
decision answers ReleaseScopeEmpty when the whole change set is excluded, and
the actuation shape is actuatable with an empty package closure and every
partition package excluded -- the build still runs as verification, and a
compiled partition package refuses the stage. The host admits the empty closure
only when the new stage0_partition_rebuild_release_scope_empty_today query
answers true; any other empty closure still refuses. A mixed change set scopes
on its release-visible members alone.

Verified by execution: the 2026-09-08 round converged (fixed point Reached)
with stage-2 installing compiler_tests.rs alone; cargo recompiled the shell
crate on its fingerprint (the outer mod line is ungated, so rustc reads the
file) while the produced executable was byte-identical -- stage input seed
digest == output seed digest. Four new witnesses pin the arm, its actuation
shape, the mixed set, and the host-facing query's two arms; the boundary
witness (unowned cli_run.rs still refuses) keeps the roster from decaying into
the absorbing fallback.

* Round-cost receipt: project installed mirrors to the model's vocabulary

The receipt's partition-rebuild line is rendered by the model over
receipt.installed_mirrors, which the host populated from the stages'
projected_paths -- full paths -- while the partition rows and rosters key on
basenames. Every drifted round's receipt therefore rendered a spurious
RebuildScopeRefused MirrorHasNoOwningPackage line naming a full path, a false
claim on the round's own receipt. Route the projection through
emit_path_basename, the module's single path-to-basename bridge, so the field
carries the mirror names the model's vocabulary means.

* Hoist ReleaseScopeEmpty annotations to module-item grain

The ReleaseScopeEmpty modeling commit placed three // blocks inside
declaration bodies (stage0_partition_rebuild_is_actuatable,
stage0_partition_rebuild_decision, stage0_partition_rebuild_excluded_today).
The .dag realization admits annotations at module-item grain only, so the
floor lane's parse phase refused the file with 12 located errors and the
run ended floor refused. The prose is unchanged; each block now sits above
the declaration it describes.

* Spell the PointwisePower witness's finite-set exclusion as the applied realization

The witness added with the fossil-row removal excluded the bare spelling
"BTreeSet", but every emitted file's preamble imports OrdSet as BTreeSet,
so the row could never green. The exclusion's subject is the finite-set
REALIZATION the fossil row would have asserted; spell it applied
(BTreeSet<i64), which the preamble's import line does not contain.

* Emit fieldless-record data values as null for the unit-struct carrier

The second native-parity divergence class, measured 2026-09-08 on the
native run of the emitted 00_compile closure: emit_data_value_json spelled
EVERY record literal as a JSON map, including the zero-field record, while
emit_struct_from_children renders that same declaration as a Rust unit
struct (pub struct BoolEncodingFact;). serde's derived unit-struct
Deserialize reads null and rejects {}, so the emitted compiler panicked at
first touch of v2.std.logic's bool_primitive_facts: "invalid type: map,
expected unit struct BoolEncodingFact". The JSON spelling of a data value
must deserialize into the Rust type the same declaration emitted; the
record arm now spells the zero-field value null and keeps the map spelling
for non-empty records.

The mirror is taken from the required-regen candidate, not hand-edited.
Two witnesses enroll: the discriminating red (zero-field record spells
null, never {}) and the boundary control (a record with fields keeps the
map spelling).

* Bind the duplicate-definition filter ahead of its branch condition

Main's FilterInBranchCondition wall (#10699) refuses to publish a module
whose filter call sits in a branch condition, and the v2 00_compile closure
emission names primitive_duplicate_semantic_definition_violation as such a
site. The filter is pure and total; binding it with a let ahead of the
branch is the authored remediation the wall exists to force, and the
emitted closure is unchanged in behavior.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md rust_unit_tests_off_the_merge_path
Ledger-Rows-Repaired: docs/design-rung-drops.md determinism_transitive_reachability
Ledger-Rows-Repaired: docs/design-rung-drops.md transitional_admission_exception

* Emitter: three native-parity repairs for the post-merge 00_compile closure build

Three divergence classes measured as the 21 rustc errors on the natively
emitted 00_compile closure after the main merge, each repaired at the .dag
source with a discriminating witness:

- Locality wins over a foreign ambiguity (12 E0433 in v2_std_integer.rs):
  alias_rhs_base_module_filename asked the global leaf index, saw
  LeafAmbiguous for Compose, and emitted the poison marker even inside
  v2.std.integer itself, where source resolution binds the local
  declaration before any cross-module lookup. The local physical
  declaration now shadows foreign declarers; the poison marker still
  stands for a leaf two FOREIGN modules declare.
- The qualifier is the disambiguator (8 E0425/E0433 in
  v2_lens_fact_density.rs): the qualified use-line route declined any
  globally-ambiguous leaf, but a qualified reference names its provider
  in its own spelling. The route now resolves by DeclaredCallableIdentity
  at the qualifier, keeping the type-declared and export-proof walls.
  The dotted spelling reaches the route through the value surface (a
  qualified value projection's borrowed type stamps the match patterns'
  parent_enum); the witness reproduces that chain exactly, and its
  exclude half pins the E0603 boundary (the dotted VARIANT head must
  still be declined).
- Clone-bound forwarding is transitive (1 E0277 in
  std_realization_measurement.rs): the call-forwarding derivation
  re-derived only each callee's SELF-derived half, so a callee whose
  bound is itself forwarded re-derived to empty. The derivation now
  recurses over the call graph with the module's visited-set
  termination; the equality half stays one-hop as declared.

Witnesses: 56/56 PASS on the rebuilt seed; regen fixed point holds.

* Refuse variant record literals on the serde_json data path fail-closed

A record literal with parent_enum present is a variant construction whose
wire spelling is the parent coproduct's declared VariantEncoding policy --
a module-local fact of the parent's home module that emit_data_value_json
does not carry. The zero-field arm's null and the map arm's untagged fields
are both measured to fail serde deserialization under the internal-tag
default, so the arm now refuses and the caller renders compile_error!, a
build-time located refusal where a runtime panic on the data definition's
expect was the latent alternative. The refusal names its trigger: a
closure-wide wire-policy index beside EmitGraphInfo.type_decl_items.

Witness: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
forces the JSON path with a nested-record Holder and asserts the
compile_error! spelling while excluding the former null mis-serialization.

* Spell variant record literals on the serde_json data path from a closure-wide wire-policy index

The fail-closed refusal landed in 73b582dea6 fired on 5 real corpus sites
(SugarKey x2, CopiedPortCitationFrontierDisposition x3), proving variant
record literals reach the JSON data path in the 00_compile closure. This
change replaces the refusal with the correct spelling, driven by a new
closure-wide index:

- v1.compiler.infer_emit_info gains DataVariantWireSpelling, the
  language-general projection of a coproduct's Rust wire serde policy
  for one variant (InternalTagged { tag_field, tag } | BareString { tag }
  | Untagged | SpellingRefused { reason }), and EmitGraphInfo carries
  data_variant_wire_spellings: Map<String, DataVariantWireSpelling>
  keyed by coproduct.variant.
- v1.compiler.emit_rust builds the index once per emission root via
  build_data_variant_wire_spellings, resolving each coproduct's policy
  through the new shared resolve_emission_coproduct_wire_policy (the
  same function the type-emission side now calls, so the two cannot
  drift), projecting each variant through data_path_wire_variant_tag
  (rename_all and StripAffix aware), and poisoning collisions as
  SpellingRefused so ambiguity stays fail-closed.
- v1.compiler.emit's emit_data_value_json variant arm reads the index:
  internal-tagged spells {"_variant": tag, ...fields}, bare-string
  spells "tag" for nullary and refuses fielded, untagged spells the
  bare fields or null; unindexed keys and stored refusals remain
  compile-time errors. The service mock-property chain threads
  emit_info through so dry-run data spells identically.

Witnesses: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
is rewritten as ..._spells_the_internal_tag (asserts the internal-tag
map, excludes the former null mis-serialization and the refusal), and
w_fielded_variant_record_lit_on_the_json_data_path_spells_tag_and_fields
pins the fielded case. 57/57 witnesses pass; regen fixed-point holds.

* Promote field_access to SelfEmittedNative on the emit coverage frontier

Fourth native-eval construct promotion, after classical_not, add, and
complement. The native-only verdict arm pair lands in the already
file-grain-enrolled long/ entry, so the backing citation is enrolled by
construction:

- emit_host_native_only_field_access_holds pins the family one-build
  cache run's stdout to octet 9 (the byte the family witness's warm leg
  pins on the same build), eval() never called.
- emit_host_native_only_field_access_wrong_octet_mismatch_detected_holds
  breaks the expectation side with octet 1, the alt tree's byte.

Both arms verified wet locally (real cargo build + native run, sharing
the field_access family one-build cache key). The roster row flips to
SelfEmittedNative; the two census guards update per 4b(4) — the split
moves to 4 native / 11 retained and the identity-grain membership guard
is renamed to name the four-member population. The family's equals_eval
agreement pair stays enrolled as its program-side discrimination leg.

* Drop the scratch parity probe from the tree

The probe is a manual parity-loop instrument (the interpreted leg of the
native-vs-interpreted comparison), not a corpus declaration with an
executing consumer (DESIGN 6 experimental residue). It stays in use
locally as an untracked file.

* Promote match, loop, and fold_closure to SelfEmittedNative

Fifth, sixth, and seventh native-eval construct promotions. The three
match_loop_fold family rows flip together on one shared family-crate
arm shape, per the witness_family_build_grain_ruling: each arm emits
the three-member family crate once and runs its own member through the
argv dispatcher against the family one-build cache key.

- emit_host_native_only_{match,loop,fold_closure}_holds pin the warm
  legs' stdout to the family's declared octet lists (match/loop
  [0,1,0,0,0], fold [0,7,0,0,0]), eval() never called.
- The wrong-octet controls break the expectation side with each
  member's own alt octets (match/loop [0,2,0,0,0], fold
  [0,255,255,255,255]).

All six arms verified wet locally. The census guards update per 4b(4):
7 native / 8 retained, and the identity-grain membership guard is
renamed to witness_native_rows_closed_membership_holds so the name
stops encoding the volatile population.

* Promote meet_join to SelfEmittedNative on the emit coverage frontier

The meet_join family's native-only verdict arms land on the complement arm's
helper, generalized to take the family member_id: meet and join run through
the same argv-dispatched logic family crate (one-build cache key shared with
complement, per the witness_family_build_grain_ruling), eval() never called,
verdict decoded from stdout. Octets meet=1 join=1 are the bytes the family
witness's warm legs pin on this same build; the wrong-octet control expects
each member's alt byte (0), which the primary runs can never produce.

Both arms verified wet: cold build then warm hits, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (eighth promotion); census
guards move to 8 native / 7 retained with meet_join_eval_subject named in the
closed membership.

* Promote variant_construct to SelfEmittedNative on the emit coverage frontier

The variant_construct family's native-only verdict arms follow the
field_access arm shape exactly: the tree is the family's own equals_eval
tree value (emit_variant_construct_eval_tree, no eval leg reachable), the
run shares the family one-build cache key that
emit_on_demand_variant_construct_native_one_build_holds colds, and the
expected octet 9 is the byte the family witness's warm leg pins on this
same build. The wrong-octet control expects the alt tree's byte (1), which
the primary run can never produce; the wrong-value alt leg in the family
witness keeps the program-side discrimination.

Both arms verified wet: cold build then warm hit, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (ninth promotion); census
guards move to 9 native / 6 retained with
emit_variant_construct_eval_subgraph_node named in the closed membership.

* Close the emit coverage frontier: final six rows to SelfEmittedNative

The last six InterpreterRetained rows flip to SelfEmittedNative, taking the
roster to 15 native / 0 retained:

- filesystem_read and shell_exec_run (host-effect transport families, no
  translated arrow body): the arms reuse each family's own native leg with
  the expectation pinned as a literal grounded by the family's enrolled
  fixture pin (dag/extdeps/shell/exec.dag contains bash; its shell.Exec.Run
  argv materializes to exactly [bash, -s]), run through the families' fixed
  witness workspaces.
- module and produced_module: the arms execute the exact sources the
  equals_eval pairs run (emit_module over the add fixture tree;
  produced_add_module_source's ingested two-fn module), octet 5 pinned
  against the add family's primitive-five/six oracle leg.
- call and record_construct: the arms emit the families' own producer trees
  against their target models, octets 7 and 9 pinned against the
  primitive-seven/eight and wrong-field oracle legs.

The four families without a one-build cache witness run under per-family
fixed workspace roots; content-safety comes from the realization-digest
nesting in run_host_process_admitted (changed source colds, never serves
stale), the same mechanism the filesystem_read fixed workspace relies on.
All twelve arms verified wet: PASS/PASS each, cold builds then warm hits.

With zero retained rows the retained_via_eval_agreement constructor loses
its last consumer and is deleted (DESIGN 3c); the InterpreterRetained
variant stays as the disposition authority's other state. Census guards
move to 15 native / 0 retained with all fifteen decl names in the closed
membership.

* Record the emit coverage frontier closure in the direct-path plan

Axis C line: all fifteen roster rows are SelfEmittedNative as of
2026-09-08, interpreter_retained_rows() is empty, and the row constructor
was deleted with the last flip. Notes explicitly that this closes axis (a)
(witness-body-runs-native) only; axis (b) (the regen-grain production
flip) remains operator-gated.

* Model the required-v2-native lane authority: route receipt, exclusion taxonomy, admission, enrolment gate

Parallel track B (operator authorization 2026-09-09): one additional required
CI job whose subject is the compiler/test execution route itself — the
emitted-native compiler binary invoked by explicit path over a derived
v2.test.* population.

The lane is modelled in full in gunbc.witness_v2_native_route: the prefix
universe derivation, the per-member verdict rows (head + fatal reason grain),
the exclusion taxonomy delegating attribution to the door ledger's
known_frontier_causes, the counted exclusion census with a totality check,
the terminal-observation receipt carrier, the admission predicate (one
predicate per contract clause, all causes collected), and the enrolment gate
with today's standing as data.

Enrolment is BLOCKED, as data with a named capability trigger: the measured
census over the derived universe (882 members, seed withdrawn during the run)
refused every member — the emitted DirectIngestDriver admits only the
hard-coded compile_driver_subject name with empty imports, and the compile
door is at its modelled frontier — so the contracted positive population is
empty and native_route_admission over the real receipt executed to
'refused: positive_population_empty'. The exact enrolment edit (phase-roster
variants, claim_executor mirror, workflow lane, aggregate join, YAML regen)
is carried on the standing row.

The census measured five fatal-grain refusal causes the door ledger's
head-grain attribution table did not carry; they are added to
known_frontier_causes with their owning lanes (three MigrationOwned under
nimble-boar-198, two normalize/body-lowering SharedSelfHostCriticalPath).

Seventeen floor witnesses (v2.test.v2_native_route) consume the authority and
execute green through the seed interpreter.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Split preparation predicates so EmittedClosureUnrecorded is reachable

Review on #10882 (briansrls, point 7): native_route_preparation_recorded
folded the seed and closure observations into one && predicate, so a
receipt with a recorded seed and an unrecorded closure misreported as
preparation_seed_unrecorded and the emitted_closure_unrecorded cause had
no reachable construction — the grain-mismatch class DESIGN 4b(3) names.

One predicate per observation, one admission clause per predicate, and
two witnesses pinning each refusal name against its own receipt shape
(including the negative: each refuses ONLY by its own name).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Key cause ownership by diagnostic grain; classify native refusals at fatal grain

The door ledger's known_frontier_causes was a head-grain authority; the
native route classified fatal reasons through it, crossing grains (review
on #10882). Generalize the ownership key with DiagnosticGrain so one
table answers both grains: the door ledger's cause_is_attributed keeps
its head-grain contract, and the native route's exclusion classifier
asks the fatal-grain question of the same table. The head advisory is
live receipt data again: every refused row's head reason must be owned
at head grain (or by this lane's driver-limit roster), and an unowned
advisory blocks admission by its own clause name.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Hoist known_frontier_causes row-group notes above the declaration

The grain-keyed ownership change left its row-group commentary inside the
list literal; the annotation channel admits only module-item grain, so the
emitted closure refused with nine annotation-grain diagnostics. Move the
notes to a single block above the declaration. No semantic change.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Parse test fn as a contextual production in the v2 dag grammar

The emitted native compiler could not parse any v2.test.* module: the
modeled dag grammar had no test fn production, so every floor witness
module refused with parse_g0_tokens_remain (706 of 882 in the census).

test stays an ordinary identifier — typescript/program.dag models the
TypeScript compiler's Cond.test field under real-upstream-names — so the
production is the contextual sequence(ident, fn_decl): a new choice arm
in top_level_item with no FIRST overlap with the keyword-led arms, a
body-lowering arm that lifts the nested fn member after checking the
marker lexeme is literally test (a typed refusal otherwise), and a
forward-producer row for the new surface identity.

Verified against the emitted native binary: probe_testfn.dag moves from
parse_g0_tokens_remain to resolve_module_not_found (the driver's
synthetic-subject limit, identical to a plain fn), and the standing
choice-overlap residue roster is unchanged at seven rows.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add SourceRootEvalDriver: native whole-ingest test-execution route

The required-v2-native lane's terminal subject is an exact test identity
reaching a native Eval verdict, not a module accepted for translation.
DirectIngestDriver (one source, no peers, synthetic subject) stays as the
front-door census instrument; the new driver renders a main that reads a
host-derived universe of qualified test identities plus the declared
source roots, assembles the ingest once, prepares each module (resolve +
infer), and Evals each named test body -- one typed verdict row per
member, with a prepare-refusal fan-out so no member is silently dropped.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Escape literal braces in SourceRootEvalDriver main.rs template

The .dag string lexer reads '{' followed by an identifier as
interpolation, so the emitted Rust use::-import lists and format!
captures must spell literal braces as \{ \}. The single parse error
desynced the file parse and cascaded into 2618 unattributed-annotation
errors; with the escapes the emitter compiles clean (0 blocking, 107
files emitted).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Collect per-file front-end refusals in the native test context fold

The SourceRootEvalDriver's context fold reused program_assembly_fold_ingest,
which is wholesale fail-closed: one source hitting the v2 front-end's live
corpus frontier would deny verdict rows for every other universe member. The
fold now collects each source's tokenize/parse/normalize refusal as a
NativeTestFileRefusal row (head and fatal reason grains, matching the door
ledger's grain-keyed ownership) and keeps folding; a refused file contributes
no root, so its test identities surface as Context-stage refusal rows and
nothing is widened. The emitted main.rs prints the file-refusal rows and
counts them in the terminal marker, and prepare/eval refusals now classify at
the fatal (last diagnostic) grain consistently.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add native lane control fixtures

Two controls for the required-v2-native lane's host harness:
src/v2/native_lane_fixture/control.dag carries the live-verdict pair (a
well-formed false control and its true positive half) as plain fns outside
the v2.test. prefix, so floor discovery enrolls no universe rows for them;
fixtures/native_lane_malformed/poison.dag is a deliberately unterminating
string that any honest front-end must refuse at tokenize, kept outside every
declared source root so the broken bytes never enter an honest ingest.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Fix Vec/Vector type mismatches in the SourceRootEvalDriver main.rs template

The emitted driver crate aliases im::Vector as Vec, so the template's
std Vec-typed bindings and collect calls failed to compile in the
emitted crate: universe rows and module order carry Rc<Vector<String>>,
the reads vector moves into the FreeMonoid parameter with .into(), and
the dotted module name is built from an iterator collect.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Harden the v2-native route contract: test-identity grain, exact join, paired reference

Reframe the terminal subject from module-grain acceptance to the exact
test identity reaching a native verdict. The receipt's universe is a
list of qualified NativeRouteTestIdentity rows; the observed population
joins it exactly (uniqueness, no foreign rows, no omissions); every
member verdict is paired against the floor's own expected-red and
route-gap rosters for agreement, exclusion, or divergence; refusals are
classified from stage and provenance with cause ownership at fatal and
head grains; and the four controls (true, false, malformed specimen,
old-route withdrawal) are admission clauses. The 46 tests cover
universe derivation, identity qualification, reference pairing, refusal
classification, disposition, census counting, and every admission
clause.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Wire the required-v2-native lane into the roster, workflow, and aggregate

Add V2NativeLane/V2NativePhase to the required-CI roster, the lane's
claim_executor command to fabric_witness_run, and the
required-v2-native job to the witness floor workflow with the aggregate
witnesses job needing it in both verdict arms. Regenerate
witnesses.yml.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add the required-v2-native host harness and phase dispatch

The lane's one phase derives the v2.test.* universe with the floor's
own discovery producer over the full module inventory, prepares the
emitted-native compiler through the emit-compile phase's crate writer
and cargo invocation, withdraws the old-route gunbc binary for the
spawn window, runs the emitted binary by explicit path over the
universe plus the named controls, reclassifies context-stage refusals
against the observed file refusals, mints the NativeRouteReceipt as the
authority's own types, and hands it to native_route_admission for the
verdict. claim_executor gains the V2Native lane and phase with the
roster sizes moved to six.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Regenerate stage0 mirrors for the SourceRootEvalDriver emitter arm

std_compiler_entry.rs gains the SourceRootEvalDriver variant and
v1_compiler_emit_rust.rs the emit_source_root_eval_driver_main_rs
template with its dispatch arm, emitted by the regenerated seed and
verified at the fixed point (first_generation_equal=true over the whole
155-module population).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Name the probe crate's lib target v1_compiled, the emitter's self-name contract

emit_rust_selected binds the self-emitted crate's name to v1_compiled
for every non-retained-host pipeline entry, and the SourceRootEvalDriver
and DirectIngestDriver mains reach the closure through use v1_compiled::.
The probe manifest's per-entry package name left the lib target named
after the package, so a pipeline entry's driver main failed E0433 in the
probe build -- unreachable while every probe entry was pipeline-free, and
measured on the required-v2-native lane's first preparation. The lib path
stays cargo's default; only the name is stated.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Release retained emission arena before the native cargo build

The lane's first run held ~15GiB RSS from the emission's resolved graph
into the cargo build of the emitted compiler and was SIGKILLed (rc=137)
with no diagnostic. Drop the emission run and malloc_trim the retained
arena at both derivation-to-emission and emission-to-build handoffs,
reporting the reclaimed KB so a trim that cannot release live memory
shows in the lane log.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Apply rustfmt to the v2-native lane host changes

Co-authored-by: briansrls <briansrls@gunb.ai>

* Lower FreeMonoid tail to im::Vector::skip — O(log n) share, not O(n) copy

The emitter lowered every cons-match tail on a FreeMonoid to
iter().skip(1).cloned().collect(), materializing the whole tail per
step: every fold over a FreeMonoid was quadratic. Measured on the
required-v2-native lane's first native run (2026-09-09): the
self-hosted lexer, which tails the remaining source per character and
per rule attempt, tokenized a 22KB file in 23.3s against 70ms for
899B, projecting a multi-hour whole-corpus context fold — the lane's
dominant term. im::Vector::skip shares the RRB tree in O(log n).

Two mirrors carry the only cons-tail sites in the stage0 corpus:
v1_compiler_emit_rust.rs (the emitter itself) and
std_occurrence_binding_candidates.rs. The e0599 emitter-decision
census and its witness tests move to the new (skip, __fm) site with
the measured rationale. Fixed-point regen green: the rebuilt seed
regenerates both mirrors byte-identically.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Route FreeMonoid length/snoc through the count/list_push primitives

length folded the whole carrier per call (O(n)); the parse repeat loop
calls it on the remaining-token list twice per element — an O(elements x
tokens) quadratic measured at 40% of self-hosted parse self-time on the
required-v2-native lane's first native run (2026-09-09). list_snoc_item
routed through list_append, paying a full O(n) right-fold per snoc and
making every build-by-appending accumulator quadratic (measured on the
first-set union fold). count is O(1) and list_push amortized O(log n) on
the persistent-vector realization. Probe-measured on the emitted crate:
25s -> 6.6s parse on a 4k-element synthetic, 209s -> 33s on a 315KB
table module.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Hoist first-fold knowledge into prepared grammar expressions

The parse choice dispatch recomputed expr_first_fold on both branches at
every Choice node at every token position: right-nested choice chains
made that O(k^2) per position with O(t^2) union constants — the dominant
self-hosted parse cost once the algebra carriers were fixed. The grammar
is fixed for a whole parse, so each node's first fold (and each Choice's
ambiguity verdict) is a pure function of the grammar: compute it once at
preparation, bottom-up, and carry it on a PreparedGrammarExpr tree hung
off GrammarFirstAnalysis / ParseTableRealization. parse_expr keeps its
GrammarExpr signature as a compat wrapper that prepares on the fly;
parse_nonterminal_memoized_core reads the prepared map. Forecast by a
pointer-keyed memo probe on the emitted crate: 33s -> 14s on the 315KB
table module.

parse_minted_id_list also moves off list_append-per-node (O(n^2) per
captured repeat) onto a snoc fold over the list_push primitive.

Verified by execution: 29-test battery over parse_table_claims,
grammar_validation (left-recursion suite), parse_token_first_empty_
semantics, parse_table_content_key and parse_table_memo_governed_witness
all green through the seed interpreter.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Deref boxed variant fields in enum shared accessors

The storage side boxes a variant record field w…
gunbai-bot Bot added a commit that referenced this pull request Sep 12, 2026
… seed-prepared artifact (lands after #10990) (#10940)

* Land the add-slice per-stage verdict instrument named as the floor_expected_red note's producer

The add-slice roster note in v2.workflow.floor_expected_red carried a dated
receipt (main 3a8344b5c: infer accepts dag_add_emitted_root; the
infer-then-translate composition refuses headed by infer_grounding_not_derived)
and named its own next-rung trigger: a .dag entry returning the per-stage
verdicts for one root, so the paragraph can name a producer instead of a
commit.

v2.compiler.self_host.candidate_generation_stage_verdicts is that entry,
parameterized over root and target: the receipt's verdict vocabulary
(infer_accepted / infer_rejected; candidate_accepted or the rejection head
reason) plus the carried-reasons lists -- the half the verdict symbols cannot
say, namely that infer accepts while carrying the frontier diagnostic on its
accepted path, so the enrolled witness's d == None conjunct fails even where
the composition reaches acceptance.

v2.test.execution.self_host_candidate_generation_stage_verdicts binds the
instrument to the slice's own fixture, with add_slice_stage_verdicts_entry the
runnable gunbc run --function form (ExitSuccess only when infer accepts clean
and the composition accepts clean). Two witnesses: infer-accepts as a
permanent positive control, and the frontier-state pin that is expected to red
the day the add-slice stall's trigger lands, flipping to a permanent
regression control in the same change that removes the roster row (DESIGN
4b(4)).

Measured by execution on this branch: the entry exits 1 printing
infer=infer_accepted, infer_carried=[infer_grounding_not_derived x10],
composition=infer_grounding_not_derived, composition_carried=[x11] -- the
receipt reproduced, with bind_outcome's pending-plus-gate chain counted. Both
witnesses PASS; the enrolled semantic witness still fails as enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for dag declared inhabitants: the add slice greens end-to-end

infer gains the declared-inhabitant membership derivation: a node declared in
the dag language authority's declared-inhabitants roster derives its grounding
by lookup, with the roster as evidence -- the namespacing answer to the atom
authority question, at specimen scope. The add slice's ten type-spine nodes
(Arrow, Conj, Atom) are all roster members, so:

- candidate_generation_translate_self_emit_dag_add_slice_holds passes; its
  floor_expected_red roster row and per-row note delete per the roster's own
  stale-quarantine arm
- the dag same-language ingest path compiles end-to-end: cross_language_compile
  accepts, byte-equal to the authority's own serialization, no carried
  diagnostics
- the add-slice stall narrows to its four python/typescript round-trip members;
  the original trigger's causal clause was refuted by execution and is restated
  against the grammar parse-product population
- the instrument's frontier guard flips to add_slice_composition_accepts_holds
  (DESIGN 4b(4): frontier guard to permanent regression control)
- five manual witnesses flip with it: two root flips rewritten to assert the
  green state, three transitive conjunctions updated

The kinds stay frontier: non-member Arrow/Conj/Atom specimens carry
GroundingNotDerived exactly as before, and all fourteen enrolled
refusal/acceptance controls pass unchanged. The door's production path still
reds inside rust emission, untouched by this rule.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for canonical binding atoms: dag_binding_denotation joins binding to inhabitant once

The resolver already binds the surface spelling Int to the canonical binding
symbol dag_binding_type_int; what that binding DENOTES is the Int inhabitant
declared at dag_declared_inhabitants_core. Every hand-rolled fixture facts
lookup re-authored that join (dag_add_canonical_grounding_for,
record_construct_canonical_grounding_for). The language authority now declares
it once as dag_binding_denotation, and infer_node_facts consumes it: an Atom
whose identity is a canonical dag binding with a declared denotation derives
with that denotation as its grounding evidence.

Direct-rust-door specimen census: 14 underived -> 10 underived (the four
dag_binding_type_int atoms derive; grammar-production atoms, algebra atoms,
bare operand atoms, and the arrow/conj spine stay on the frontier unchanged).

Specimen-scope interim in the same frame as
infer_node_declared_in_dag_inhabitants: both delete in favor of consuming
resolution output when the resolver hands infer declaration-resolved
identities directly (the namespace migration's completed state).

Witness: v2.test.execution.dag_binding_denotation — all four Int binding
atoms in the door specimen derive with dag_int_inhabitant_node() as
structural evidence, and the two bare operand atoms stay GroundingNotDerived
(boundary control). Refusal suite 14/14, ingest bridge 7/7, add-slice
instruments 2/2 green; every remaining red in the at-risk population
reproduces identically on the pre-change tree and is enrolled in
floor_expected_red.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Add v2 self-host direct-path orientation: axes, sequence, autonomy contract

A point-in-time orientation that defers to the existing authorities
(DESIGN section 7, the four-wave self-host program, the roadmap node
chain, the three frontier carriers, the guarantee-stall roster, XL-N)
rather than restating them: state is re-derived by the named
instruments, never transcribed here. Sequences the remaining work in
roadmap order (door, parse-product grounding, first behavioral module,
XL-N milestones, native bootstrap, fixed point, v1 deletion) and states
which decisions stay operator-gated.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Derive grounding for fully-evidenced Conj and Arrow products

The sixth and seventh kind rules: a non-roster Conj or Arrow whose every
child carries DerivedGrounding derives, its evidence the same shape
re-formed over the children's grounding evidence (a fresh
OccurrenceSynthetic node, never the source — the self-evidence wall holds
by construction). A product with any frontier or absent child stays on the
frontier with its typed diagnostic; a childless product has no evidence to
compose and stays frontier. Roster members keep their roster evidence.

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
10 underived of 15 -> 6. The parameter conj, the module-structure conjs,
and the bodied add arrow derive; what remains is the algebra atoms from
the + operation (AlgebraPrimitive, ring_field_add), the module atom
(dag_surface_module), the parameter references (x, y), and the
grammar-projection root conj that cascades once they land.

Enrolled witnesses (src/v2/test/claim/execution/infer_product_introduction_test.dag):
- product_introduction_derives_fully_evidenced_products_holds — census:
  4 Conj (3 derived, 1 frontier-by-frontier-child) + 1 Arrow (derived).
- product_introduction_composed_evidence_carries_child_groundings_holds —
  the params conj's evidence is a Conj whose x/y children target the dag
  authority's Int inhabitant.
- product_introduction_leaves_childless_conj_on_the_frontier_holds —
  boundary control via direct infer over a hand-built childless Conj.

Flip census (pre- and post-change, zero unexpected flips):
translate_underived_refusal 14/14, infer_self_grounding_wall 12/12,
branch_infer_if_then_else 2/2, compile_eval_thesis_proof 6/6,
ingest_bridge 9/9, cross_language_add_python_to_typescript 4/4,
inhabitant_neutralization 6/6 + e2e 6/6, emit_host_classical_not 14/14,
dag_binding_denotation 2/2, stage-verdicts instrument 2/2,
dag_add_emit_round_trip 4/6 (the 2 enrolled reds unchanged), door
production group still enrolled-red (unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground canonical-operation and grammar-production atoms by authority roster membership

Two more specimen-scope derivations in infer_node_facts, both lookups into
declared authorities, never inventions:

- Canonical-operations roster (target_model.dag): every CanonicalOperation
  the target-model authority declares, rendered by
  target_model_canonical_operation_wire_node and gathered under one Conj
  root. The resolver canonicalizes surface operators (e.g. +) to those
  declared operations, so the wire atoms -- the operation discriminant and
  its field references -- derive by membership with the roster root as
  evidence. General over all 14 declared operations, not add-narrow.

- Grammar-productions roster (dag.dag): every production in
  dag_grammar_root() projected to its emitted surface atom under one Conj
  root keyed by production name. The bridge projects a production's parse
  into (identity atom, captured content) pairs, so the identity atom
  (dag_surface_module) derives by membership with the roster root as
  evidence. The roster derives from the grammar root, so a production
  added to the grammar joins by construction.

Both roster roots are Conj nodes, never structurally equal to any member
atom, so the self-evidence wall holds by construction (the first attempt
at the operations rule used the wire node itself as evidence and was
refused by grounding_evidence_is_source -- the wall doing its work).

Measured on the direct-rust-door specimen (scratch probe, uncommitted):
6 underived of 15 -> 2 (only the operand atoms x and y remain; the
grammar-projection root conj cascades once the module atom grounds).

Enrolled witnesses (infer_atom_grounding_rules_test.dag): each roster rule
pins derivation + evidence identity + census; a boundary control pins that
a bare atom with no authority membership stays frontier; the closing
control pins the 2-of-15 state.

Flip census: the product-introduction census witness updates 3->4 derived
conjs (the top conj now cascades) and gains a hand-built
partially-evidenced boundary control to replace the in-specimen one the
cascade consumed. Full battery otherwise unchanged: refusal suite 14/14,
grounding wall 12/12, instrument 2/2, binding-denotation 2/2, round-trips,
bridge, cross-language, neutralization, emit-host all green; enrolled reds
unchanged.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Ground binding-reference atoms from the enclosing arrow's domain declaration

The fifth specimen-scope derivation, closing the direct-rust-door
specimen's inference frontier: an Atom whose binding an enclosing arrow's
domain declares derives with the declared domain type as its evidence --
the declaration-site annotation, itself derived (x: Int grounds the x
reference). This is the same lookup the branch-operand path already
performs (infer_find_arrow_domain_type_in_tree), now written to the
operand atom's own facts; it is scope-naive (whole-tree, first match),
recorded in the frontier note, and deletes with the other specimen-scope
rules when the resolver hands infer declaration-resolved identities. The
tree is threaded through the fold's init chain to reach infer_node_facts;
the helper had exactly one caller.

Measured on the door specimen (scratch probe, uncommitted): 2 underived
of 15 -> 0. The specimen's inference frontier is fully closed, and the
production observation advances from InferenceRejected
(infer_grounding_not_derived) to EmissionRejected
(target_use_site_ownership_lookup_miss) -- a new, typed, located deficit
in the emitter, the next gate on the path.

Flip census (all three rewrites verified by execution):
- dag_binding_denotation_leaves_unbound_operand_atoms_on_the_frontier_holds
  -> dag_binding_denotation_declares_no_denotation_for_operand_bindings_holds:
  the boundary moves to the authority itself (the denotation table returns
  Absent for x/y), true regardless of infer's other rules.
- The three emit_host classical-not refusal guards (canonical, staging,
  staging-swapped) flip to acceptance witnesses pinning the emitted text's
  shape -- the real-infer tree now fully derives, and the emission is the
  same one the equals-eval witness proves behaviorally correct. The
  translate-refuses-underived behavior stays enrolled on hand-staged
  fixtures in translate_underived_refusal_test.dag (14/14 green). The
  renames are carried into the commit_workflow and witness_deferral_freeze
  rosters.
- New witnesses: binding_reference_derives_parameter_atoms_holds (evidence
  is the domain's Int binding atom, census 2) and
  door_specimen_fully_derives_holds (0 frontier of 15).

Full battery at this state: refusal suite 14/14, grounding wall 12/12,
instrument 2/2, binding-denotation 2/2, product-introduction 4/4,
atom-rules 5/5, emit_host 14/14, round-trips 4/6 (2 enrolled reds
unchanged), bridge 9/9, cross-language 4/4, neutralization 6/6 + e2e 6/6,
branch 2/2, eval-thesis 6/6; door production group still enrolled-red
(unchanged).

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Green the direct-rust-door: route emission through produced-decl composition and decode canonical operator wires

The door specimen's inference frontier is fully closed, so its production
observation now reaches the emission stage. Two defects surfaced there, both
fixed here:

Emission composition. generate_rust_emission_candidate served two lanes with
one root shape: the door's production path (a dag module shell) and a fixture
lane (a bare rust Arrow). The translate ownership gate queried the module
atom's ownership at a struct-field use site and refused with
target_use_site_ownership_lookup_miss, because the module's grammar-projection
conj was misread as a type record. The door's real composition is the
produced-decl path: collect declaration conjuncts from the inferred tree and
emit via emit_produced_decl. A new generate_rust_module_emission_candidate does
exactly that, enforcing an exactly-one-declaration admission policy
(rust_module_emission_decl_absent / _ambiguous). The observation and production
mint paths switch to it; the fixture-lane candidate is retained with a note
that it is fixture-only. A pure collector, produced_decl_conjs_in_tree, finds
nodes of produced-decl shape (a Conj whose first child is a Named edge to an
Arrow). Its decl-head match routes through a declared FreeMonoid<Edge>
parameter because the v1 seed stamps pattern variables from a declared
parameter type, not from a field-access scrutinee.

Operator decode. With composition fixed, source fidelity still refused: the
door emitted fn add(x: i32, y: i32) -> i32 { AlgebraPrimitive(x, y) } instead
of { x + y }. Resolution canonicalizes a surface operator atom into a
canonical-operation wire node, so a production tree's transform operator
position carries the wire, while fixture trees that bypass resolution still
carry the surface token atom. translate_project_transform_in_arrow_scope only
knew the surface-token table, so the wire missed and fell to callable apply,
rendering the discriminant identity. The projection now tries the wire decode
first (canonical_operation_from_wire_node) and only on a wire miss falls to
the surface-token table, then to callable apply; the arms are disjoint, so the
dispatch adds no fallback widening. target_transform_operator_child extracts
the operator child safely.

The door's closing expectation now greens by execution, so its known_red_probe
row in explicit_witness_admission is deleted per its own dissolution condition,
and the roadmap authority note, the door contract note, and the direct-path
plan are updated to record the green state. realized_closure_for_v2_direct_
rust_door_emit_run's module list reflects the produced-decl route.

Verified by execution: the door witness greens; the fixture, containment,
algebra, produced-decl, add-slice, and classical-not witnesses stay green;
claim_executor required-ci lanes build and witnesses both exit 0; cargo fmt and
clippy --all-targets -D warnings are clean. One pre-existing red,
witness_projection_is_active_only in the floor_cost_debt containment roster,
reproduces on the base revision and is unrelated to this change.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Close the parse-product grounding frontier: widen declared-inhabitant membership to the closed ingest set

The declared-inhabitant roster-membership derivation in 04_infer generalized
from the dag roster to the closed ingest set (dag, python, typescript):
infer_node_declared_in_language_inhabitants returns the declaring authority's
roster root as evidence, with deep subtree membership so a declared
inhabitant's leaf fact atoms derive exactly as the inhabitant node itself.

Measured: the python fixture's 19-node frontier and the typescript fixture's
28-node frontier both close to zero; all four add-slice stall population
round-trip witnesses green; the python->typescript cross-language compile
accepts, byte-identical to ts_source_text.

Section 4b(4) flips (expecting-red probes becoming permanent regression
controls for the acceptances):
- cross_language_compile_refuses_canonical_underived_holds ->
  cross_language_compile_python_to_typescript_round_trip_holds
- inhabitant_neutralization_emit_after_neutralize / same_flavor_python /
  go_int64_to_ts refusal helpers -> round-trip controls
- inhabitant_neutralization_python_to_ts_cross_language_compile (e2e) ->
  round-trip control; python->go members stay refusal guards (go is outside
  the closed ingest set)
- cross_language_emit_inhabitant_neutralization_refuses_underived_holds ->
  round-trip control; the python->typescript emit-matrix row reads ChainProven

The add-slice stall's next-rung trigger fired, so it retired per DESIGN
4b(4): removed from all_guarantee_stalls, row file deleted, witnesses stay
enrolled.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Promote the add family to SelfEmittedNative: native-only verdict witness for the emitted add crate

First InterpreterRetained -> SelfEmittedNative promotion after classical_not,
executing the v2-emitter-first-behavioral-module first slice at the
coverage-frontier grain: the add family (fewest dependencies — integer
literals plus one canonical operation) now carries a native-only verdict
witness, so its behavior is established by the emitted crate's own stdout
with eval() unreachable from the verdict path.

- emit_host_native_only_add_holds: real emit -> cargo build -> native run,
  stdout pinned to the family's expected octet, sharing the kernel family's
  one-build cache key exactly as the classical_not arm shares its family's
  key (no duplicated cold build).
- emit_host_native_only_add_wrong_octet_mismatch_detected_holds: the broken
  control — a no-eval verdict has no oracle leg to break, so the expectation
  side breaks (an octet the run never produces must not match); program-side
  discrimination stays with the family's equals_eval primitive-five/six pair.
- The add coverage row flips disposition with its backing citation enrolled
  by construction (the verdict entry is file-grain enrolled in
  falsifier_self_host_wet_template_entries).
- Frontier census tests updated at identity grain: natives are exactly
  {classical_not, add}; split 2/13.

Verified by execution: all six native-only verdict tests green locally
(real wet legs — compile_skipped receipts show cold builds and native runs);
all eight emit_coverage_frontier tests green, including the unbacked-claim
RED control.

Co-authored-by: Brian Searls <briansrls@users.noreply.github.com>

* Record the add-slice defect's repair in the declined-live-tree classification

The row classified candidate_generation_translate_self_emit_dag_add_slice_holds
as RealDefect/CompilerBehaviourRefusal with measured evidence that translate
refuses infer_grounding_not_derived. The owner lane (v2 self-host) repaired the
subject: the declared-inhabitant roster-membership derivation grounds the
slice's type spine by lookup, and the witness passes under claim_batch
--hermetic on the merged tree. The dated classification is kept verbatim; the
disposition flips RoutedToOwner -> RepairedInThisChange with the repair
measurement appended to the evidence, so the routing carrier stops dispatching
a fixed defect. Structural witnesses (count 13, no NotReproduced, exact
partition) are untouched and pass.

* Hoist two in-body annotation blocks to module-item grain

Main's annotation-placement wall (source annotations admit only standalone
leading blocks attached to module-scope declarations; in-body forms refuse)
reached this branch through the merge and refused 8 blocking errors on the
00_compile closure: the add-family promotion note inside the
emit_coverage_frontier_roster list and the python->typescript row note inside
the cross_language_emit_matrix list. Both blocks move above their enclosing
declarations, rephrased to name their subject row. Measured: gunbc compile of
src/v2/compiler/00_compile.dag now emits 172 files with 0 blocking errors;
both files' suites stay green (8/8 and 4/4).

* Promote the complement family to SelfEmittedNative: native-only verdict witness for the emitted logic family crate

The complement family's native execution runs family-grain per the
witness_family_build_grain_ruling (one crate for meet + join + complement,
argv-dispatched), so the native-only arm emits the logic family crate and
runs the complement member through the family dispatcher, sharing the
family witness's one-build cache key. The verdict is decided solely by the
emitted native run's stdout (expected octet 0, complement(True) = False);
the broken control flips the expectation side (octet 1 can never match),
with the comparator pinned by the stdout mock pair. Program-side
discrimination stays with the equals_eval agreement pair and the family
witness's all-alt leg.

The frontier row's backing citation lands in the already
file-grain-enrolled native-only verdict entry, so it is enrolled by
construction; the roster comment is rephrased to cover both 2026-09-07
promotions (add and complement). The frontier test's split and native
membership assertions move to 3 native / 12 retained.

Verified by execution: claim_batch --hermetic on
emit_host_native_only_verdict_test.dag passes all 8 witnesses (the two
new complement arms included), and emit_coverage_frontier_test.dag
passes all 8.

* Key the emitter's host-String arm on declaration provenance, not spelling

is_host_text_carrier_type answered true for any type expression whose
authored name reads "String", including references to the structural
alias v2.std.text.String (type String = FreeMonoid<Char>) that the
namespace lane (gunbc#9907) requalified the v2 corpus's text-carrier
fields to. The emitter rendered every one of those references as the
host String while value-position consumers rendered the structure -- the
E0308 family dominating the self-host compile-phase frontier (41 of 64
in v2_compiler_tokenize.rs on the post-merge board).

The String arm now consults the resolved declaration's provenance
against v1.compiler.coercion structural_declaration_modules_for -- the
same roster type_realization_decision reads -- so the legacy arm and the
strict decision cannot diverge on one node (DESIGN section 3, and
gunbc.recurring_failure_mode alias_resolution_collides_with_kernel_spelling).
Kernel mints and unresolved references keep the host answer exactly as
before.

Regen: the only drifted stage0 mirror is v1_compiler_emit_rust.rs
itself (no module in the stage0 closure references a structurally
declared String -- verified by the whole-population candidate tree),
installed from target/stage0-regen-candidate after the priced round's
partitioned rebuild refused MirrorHasNoOwningPackage on the emitter
(the emitter is monolith-shell, not partition-owned). Fixed point
verified by execution: claim_executor --required-regen on the rebuilt
seed reports first_generation_equal=true over 158 adjudicated mirrors.

* Peel qualified String alias leaves in field position: XL-N closure 72 -> 28 errors

A field authored v2.std.text.String reached the Rust emitter as an overlay-less
resolved reference leaf and rendered the bare terminal name, which binds the
prelude String cross-module (#9813: kernel names are never overridden by
imports, so the use-line is dropped) while every value position renders the
structural carrier Rc<Vec<i64>> -- the v2_compiler_tokenize.rs E0308 family,
41 of 72 errors on the XL-N phase board.

The new rust_overlayless_alias_leaf_requires_peel arm in
render_rust_type_without_applied_binding detects the population (overlay-less
zero-parameter alias leaf, qualified spelling, String terminal segment,
closed_alias_peel_verdict agrees) and renders the alias declaration's resolved
right-hand side, projecting the same realization the fn-signature positions
already produce.

The qualified gate is load-bearing: inside the declaring module the bare name
is the correct render (the emitted module carries the alias declaration), and
the local binding's resolved_type drops the RHS type argument, so an ungated
peel rendered Rc<FreeMonoid> there (E0107 x13, E0282 x2 on the probe). Bare
String keeps denoting the kernel scalar through the host-carrier arm.

Measured: probe specimen (qualified/bare/direct-FreeMonoid/container/variant/
local-alias positions) compiles clean; XL-N compiler closure cargo check
72 -> 28 errors with the residual census dominated by the declared
text_boundary_identity_wall class (kernel String vs structural carrier at
bare-authored boundaries, 17 of 20 E0308s); v1-corpus fixed point holds
(first_generation_equal=true, 158/158 adjudicated).

* Resolve the 12 non-hop XL-N closure errors at source: text-wall conversions + witness_violates helper

Four clusters, all measured non-hop additions between receipt_1 (155) and the
post-peel census (28); the live gate now measures 15 with zero unadmitted
regressions:

- integer.dag: integer_string_to_decimal_digits_step takes v2.std.text.String;
  the public boundary converts with chars() (text_boundary_identity_wall
  specimen discharged at this site).
- 01_tokenize.dag: Token/UnboundSourceAnnotation lexemes convert structural
  -> host String with chars_to_string() at construction, mirroring the v1
  tokenizer's host-lexeme carrier.
- target_model.dag + bash.dag: EmitSpellingEscape.from/to and
  apply_emit_spelling_escapes go structural (v2.std.text.String); the
  EmitSpellingQuote arm converts host->structural->host at its boundary;
  bash's escape rows wrap their kernel String literals with chars().
- witness.dag + 3 call sites (collection list_nth, provenance
  span_index_resolve_textual_locus_from_ids, compile outcome_with_diagnostics):
  new witness_violates<C> helper puts Violates constructions in a
  Witness-headed position so the emitter resolves the carrier type argument;
  dissolves once inference records per-call substitutions.

Verified: 48 targeted claim witnesses green (tokenize behavioral, shell
conformance, string brace escape, string length, map-lookup violates, source
text ingress, bash materialize x12, int literal smoke x6, provenance span
index x2).

* Record receipt_2 on the self-host compile-phase frontier: 15-error census at 66765317ec

The census at the XL-N lane tip: 155 -> 15 net, credited to the qualified-alias
peel (60cbd7b697, 72 -> 28) and the twelve-error source cluster (66765317ec,
28 -> 15). The epoch changes on the instrument's target pinning (found by
review on gunbc#9857), admitted with receipt_1's board as the reclassified
predecessor under the identity map. Nine added identities are hop relocations
admitted by the hop index; four sit in python/typescript modules newly entered
into the emitted closure, admitted as ExposedByNewEmittedModule.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* Emitter: a substituted declaration node carries its own provenance

Inference substitutes the resolved declaration into a data annotation's
type-argument position, so BooleanAlgebra<v2.std.logic.Bool> reaches the
emitter with the arg BEING the type Bool = True | False declaration itself
(Disj connective, ident_span in src/v2/std/logic.dag, no Resolved wrapper).
type_reference_provenance_in_env's bare-leaf arm re-resolved that leaf in the
REFERENCING module's scope, where post-#9813 a kernel-shadowed spelling
answers the kernel declaration -- so the structural enum rendered as host
bool against a value of BooleanAlgebra<Bool> (the python.rs:328 /
typescript.rs:177 E0308 pair on the XL-N compile-phase frontier).

The connective is the discriminator: a reference node is a bare name
(NoConnective); a node carrying Conj/Disj structure IS the declaration, and
type_reference_provenance's own-span fallback already answers that shape
correctly. The guard routes declaration-shaped nodes there directly, bypassing
the scope lookup that #9813 makes answer the kernel.

Mirror regenerated via the regen round; fixed-point verified
(claim_executor --required-regen PASS).

* Clear the remaining XL-N closure errors at source: carrier conversions at the boundaries

The receipt_2 census's fifteen identities, resolved at their sources:

- lexing.dag, dag.dag, python.dag, typescript.dag: LexPattern.text is the
  structural carrier (v2.std.text.String); the construction sites held host
  Strings. Convert at construction with chars() -- the #9907 ingress pattern.
- python.dag / typescript.dag bool groundings: qualify the annotation as
  BooleanAlgebra<v2.std.logic.Bool>; with the emitter's substituted-
  declaration provenance guard the qualified arg now renders structural.
- target_model.dag: target_lex_rule_literal_step returns the host carrier
  (chars_to_string over the structural pattern text); TargetText.source
  converts at the is_empty boundary; the unicode-scalar symbol intern converts
  its single-codepoint list to the host carrier.
- qualified_name.dag: qualified_name_from_dotted_string uses the host-carrier
  emptiness check (string_length == 0) instead of routing through the
  structural string_is_empty.
- 02_parse.dag: parse_looks_like_match_arm_start rewritten on host-carrier
  operations (string_length, char_at, code_point) rather than converting to
  the structural carrier for a two-character lookahead;
  parse_char_is_arm_pattern_lead takes the codepoint Int directly.
- v1_interpreter_primitive_surface.dag row_key: the concat pipeline lowered
  to a .concat() method call on std::string::String (E0599); rewritten as
  nested concat calls.

Measured: the 00_compile closure emits 172 files and cargo check reports
cargo_clean=true, cargo_error_population=0 under the pinned 1.93.0 toolchain.

* Pin the cargo half's toolchain channel by construction

The cargo half runs with cwd = a fresh mktemp directory; with no
rust-toolchain.toml there, rustup resolves the host's DEFAULT toolchain, so a
census under cargo 1.83 and one under cargo 1.93 would compare as equal epochs
while different compilers did the measuring -- the fabricated comparability
the target pin (gunbc#9857) excludes, one level up. Measured 2026-09-07: a
host default of 1.83.0 met a crates.io index whose freshly published
dependency manifests require edition2024, resolution failed before any
diagnostic existed, and the zero-diagnostic refusal fired on an unmeasured
tree.

The pin is propagated by copying the repo's rust-toolchain.toml into out_dir:
the file remains the sole in-repo channel authority (its header forbids a
second pinned literal), and the copy makes the measured channel true by
construction on any host. The gate's read_live_toolchain observes the same
channel because every documented actuator invokes from the repository root,
which the same file governs.

* Record receipt_3 on the self-host compile-phase frontier: the emitted closure's cargo census is empty

Measured at 5ee4892b70 by the one-entry instrument: the 172-file emitted crate
reports zero cargo error diagnostics, so the board attributes every phase a
count of zero and furthest_phase_reached stands at Borrowck. The fifteen
removals against receipt_2 need no disposition; nothing was added.

The epoch does not change: the cargo half now pins the toolchain channel by
copying the repo's rust-toolchain.toml into the scratch crate, and every
recorded comparison field is identical to receipt_2 (whose census the
fingerprint evidence shows the same 1.93.0 toolchain already compiled), so the
same-epoch arm carries no reclassified predecessor.

The frontier-state pin flips per DESIGN 4b(4):
the_published_frontier_standing_does_not_claim_typeck_or_borrowck_passed
becomes the_published_frontier_standing_claims_typeck_and_borrowck_passed, the
permanent regression control over the green state.

Validated: all 36 self_host_compile_phase_frontier_witness claims PASS,
including current_persisted_compile_phase_frontier_holds.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-failure-modes.md
Ledger-Repair-Judged: docs/design-rung-drops.md

* Remove the stale PointwisePower inhabitant rows from the four language rosters

First native-parity divergence class found by running the emitted closure on a
discriminating fixture: the algebra inhabitant rosters still carried
PointwisePower after its authority row was cut, so the emitted compiler panicked
at 12 record-shaped carrier sites while the interpreted seed refused cleanly.
The roster rows are removed in rust/python/go/typescript types.dag, the derived
coercion assertions in compiler_tests.rs regenerate without them, and two
witnesses pin the boundary: the record shape constructs its structural carrier,
and FinitePowerSet still refuses while its row stands.

Mirrors regenerated by a converged regen round (fixed point Reached, stage-1
PromoteGenerationInputs over the three language types mirrors).

* Regen gen-2 gate: compare executable digests in one spelling

The admitted side of run_built_seed_regen carries the executable-digest
spelling (current_exe_digest, next_pass_executable_digest) while the observed
side hashed the file through path_digest, which prepends the fnv1a64: tag.
Same bytes, two spellings, so the gate could never pass -- unpassable since
fa2d403dc8 (#9771). Factor current_exe_on_disk as the single path authority
and read the observed digest through current_exe_digest so both sides spell
the same bytes the same way.

* Model ReleaseScopeEmpty for release-excluded mirrors, end to end

A regen round whose only stage-2 drift was compiler_tests.rs (the PointwisePower
roster removal rewrote its derived coercion assertions) refused the rebuild
MirrorHasNoOwningPackage: the mirror is owned by no partition package, because
every item it defines is #[cfg(test)] and no release unit elaborates it. The
refusal conflated two different states -- unowned (a coverage hole) and excluded
from the release build by construction (a precise empty scope).

The model now names the class: rebuild_scope_release_excluded_mirrors rosters
its members (compiler_tests.rs, cited to emit_compiler_tests_module), the
decision answers ReleaseScopeEmpty when the whole change set is excluded, and
the actuation shape is actuatable with an empty package closure and every
partition package excluded -- the build still runs as verification, and a
compiled partition package refuses the stage. The host admits the empty closure
only when the new stage0_partition_rebuild_release_scope_empty_today query
answers true; any other empty closure still refuses. A mixed change set scopes
on its release-visible members alone.

Verified by execution: the 2026-09-08 round converged (fixed point Reached)
with stage-2 installing compiler_tests.rs alone; cargo recompiled the shell
crate on its fingerprint (the outer mod line is ungated, so rustc reads the
file) while the produced executable was byte-identical -- stage input seed
digest == output seed digest. Four new witnesses pin the arm, its actuation
shape, the mixed set, and the host-facing query's two arms; the boundary
witness (unowned cli_run.rs still refuses) keeps the roster from decaying into
the absorbing fallback.

* Round-cost receipt: project installed mirrors to the model's vocabulary

The receipt's partition-rebuild line is rendered by the model over
receipt.installed_mirrors, which the host populated from the stages'
projected_paths -- full paths -- while the partition rows and rosters key on
basenames. Every drifted round's receipt therefore rendered a spurious
RebuildScopeRefused MirrorHasNoOwningPackage line naming a full path, a false
claim on the round's own receipt. Route the projection through
emit_path_basename, the module's single path-to-basename bridge, so the field
carries the mirror names the model's vocabulary means.

* Hoist ReleaseScopeEmpty annotations to module-item grain

The ReleaseScopeEmpty modeling commit placed three // blocks inside
declaration bodies (stage0_partition_rebuild_is_actuatable,
stage0_partition_rebuild_decision, stage0_partition_rebuild_excluded_today).
The .dag realization admits annotations at module-item grain only, so the
floor lane's parse phase refused the file with 12 located errors and the
run ended floor refused. The prose is unchanged; each block now sits above
the declaration it describes.

* Spell the PointwisePower witness's finite-set exclusion as the applied realization

The witness added with the fossil-row removal excluded the bare spelling
"BTreeSet", but every emitted file's preamble imports OrdSet as BTreeSet,
so the row could never green. The exclusion's subject is the finite-set
REALIZATION the fossil row would have asserted; spell it applied
(BTreeSet<i64), which the preamble's import line does not contain.

* Emit fieldless-record data values as null for the unit-struct carrier

The second native-parity divergence class, measured 2026-09-08 on the
native run of the emitted 00_compile closure: emit_data_value_json spelled
EVERY record literal as a JSON map, including the zero-field record, while
emit_struct_from_children renders that same declaration as a Rust unit
struct (pub struct BoolEncodingFact;). serde's derived unit-struct
Deserialize reads null and rejects {}, so the emitted compiler panicked at
first touch of v2.std.logic's bool_primitive_facts: "invalid type: map,
expected unit struct BoolEncodingFact". The JSON spelling of a data value
must deserialize into the Rust type the same declaration emitted; the
record arm now spells the zero-field value null and keeps the map spelling
for non-empty records.

The mirror is taken from the required-regen candidate, not hand-edited.
Two witnesses enroll: the discriminating red (zero-field record spells
null, never {}) and the boundary control (a record with fields keeps the
map spelling).

* Bind the duplicate-definition filter ahead of its branch condition

Main's FilterInBranchCondition wall (#10699) refuses to publish a module
whose filter call sits in a branch condition, and the v2 00_compile closure
emission names primitive_duplicate_semantic_definition_violation as such a
site. The filter is pure and total; binding it with a let ahead of the
branch is the authored remediation the wall exists to force, and the
emitted closure is unchanged in behavior.

* chore: regenerate drifted generated artifacts (ci auto-heal)

Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md rust_unit_tests_off_the_merge_path
Ledger-Rows-Repaired: docs/design-rung-drops.md determinism_transitive_reachability
Ledger-Rows-Repaired: docs/design-rung-drops.md transitional_admission_exception

* Emitter: three native-parity repairs for the post-merge 00_compile closure build

Three divergence classes measured as the 21 rustc errors on the natively
emitted 00_compile closure after the main merge, each repaired at the .dag
source with a discriminating witness:

- Locality wins over a foreign ambiguity (12 E0433 in v2_std_integer.rs):
  alias_rhs_base_module_filename asked the global leaf index, saw
  LeafAmbiguous for Compose, and emitted the poison marker even inside
  v2.std.integer itself, where source resolution binds the local
  declaration before any cross-module lookup. The local physical
  declaration now shadows foreign declarers; the poison marker still
  stands for a leaf two FOREIGN modules declare.
- The qualifier is the disambiguator (8 E0425/E0433 in
  v2_lens_fact_density.rs): the qualified use-line route declined any
  globally-ambiguous leaf, but a qualified reference names its provider
  in its own spelling. The route now resolves by DeclaredCallableIdentity
  at the qualifier, keeping the type-declared and export-proof walls.
  The dotted spelling reaches the route through the value surface (a
  qualified value projection's borrowed type stamps the match patterns'
  parent_enum); the witness reproduces that chain exactly, and its
  exclude half pins the E0603 boundary (the dotted VARIANT head must
  still be declined).
- Clone-bound forwarding is transitive (1 E0277 in
  std_realization_measurement.rs): the call-forwarding derivation
  re-derived only each callee's SELF-derived half, so a callee whose
  bound is itself forwarded re-derived to empty. The derivation now
  recurses over the call graph with the module's visited-set
  termination; the equality half stays one-hop as declared.

Witnesses: 56/56 PASS on the rebuilt seed; regen fixed point holds.

* Refuse variant record literals on the serde_json data path fail-closed

A record literal with parent_enum present is a variant construction whose
wire spelling is the parent coproduct's declared VariantEncoding policy --
a module-local fact of the parent's home module that emit_data_value_json
does not carry. The zero-field arm's null and the map arm's untagged fields
are both measured to fail serde deserialization under the internal-tag
default, so the arm now refuses and the caller renders compile_error!, a
build-time located refusal where a runtime panic on the data definition's
expect was the latent alternative. The refusal names its trigger: a
closure-wide wire-policy index beside EmitGraphInfo.type_decl_items.

Witness: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
forces the JSON path with a nested-record Holder and asserts the
compile_error! spelling while excluding the former null mis-serialization.

* Spell variant record literals on the serde_json data path from a closure-wide wire-policy index

The fail-closed refusal landed in 73b582dea6 fired on 5 real corpus sites
(SugarKey x2, CopiedPortCitationFrontierDisposition x3), proving variant
record literals reach the JSON data path in the 00_compile closure. This
change replaces the refusal with the correct spelling, driven by a new
closure-wide index:

- v1.compiler.infer_emit_info gains DataVariantWireSpelling, the
  language-general projection of a coproduct's Rust wire serde policy
  for one variant (InternalTagged { tag_field, tag } | BareString { tag }
  | Untagged | SpellingRefused { reason }), and EmitGraphInfo carries
  data_variant_wire_spellings: Map<String, DataVariantWireSpelling>
  keyed by coproduct.variant.
- v1.compiler.emit_rust builds the index once per emission root via
  build_data_variant_wire_spellings, resolving each coproduct's policy
  through the new shared resolve_emission_coproduct_wire_policy (the
  same function the type-emission side now calls, so the two cannot
  drift), projecting each variant through data_path_wire_variant_tag
  (rename_all and StripAffix aware), and poisoning collisions as
  SpellingRefused so ambiguity stays fail-closed.
- v1.compiler.emit's emit_data_value_json variant arm reads the index:
  internal-tagged spells {"_variant": tag, ...fields}, bare-string
  spells "tag" for nullary and refuses fielded, untagged spells the
  bare fields or null; unindexed keys and stored refusals remain
  compile-time errors. The service mock-property chain threads
  emit_info through so dry-run data spells identically.

Witnesses: w_variant_record_lit_on_the_json_data_path_refuses_fail_closed
is rewritten as ..._spells_the_internal_tag (asserts the internal-tag
map, excludes the former null mis-serialization and the refusal), and
w_fielded_variant_record_lit_on_the_json_data_path_spells_tag_and_fields
pins the fielded case. 57/57 witnesses pass; regen fixed-point holds.

* Promote field_access to SelfEmittedNative on the emit coverage frontier

Fourth native-eval construct promotion, after classical_not, add, and
complement. The native-only verdict arm pair lands in the already
file-grain-enrolled long/ entry, so the backing citation is enrolled by
construction:

- emit_host_native_only_field_access_holds pins the family one-build
  cache run's stdout to octet 9 (the byte the family witness's warm leg
  pins on the same build), eval() never called.
- emit_host_native_only_field_access_wrong_octet_mismatch_detected_holds
  breaks the expectation side with octet 1, the alt tree's byte.

Both arms verified wet locally (real cargo build + native run, sharing
the field_access family one-build cache key). The roster row flips to
SelfEmittedNative; the two census guards update per 4b(4) — the split
moves to 4 native / 11 retained and the identity-grain membership guard
is renamed to name the four-member population. The family's equals_eval
agreement pair stays enrolled as its program-side discrimination leg.

* Drop the scratch parity probe from the tree

The probe is a manual parity-loop instrument (the interpreted leg of the
native-vs-interpreted comparison), not a corpus declaration with an
executing consumer (DESIGN 6 experimental residue). It stays in use
locally as an untracked file.

* Promote match, loop, and fold_closure to SelfEmittedNative

Fifth, sixth, and seventh native-eval construct promotions. The three
match_loop_fold family rows flip together on one shared family-crate
arm shape, per the witness_family_build_grain_ruling: each arm emits
the three-member family crate once and runs its own member through the
argv dispatcher against the family one-build cache key.

- emit_host_native_only_{match,loop,fold_closure}_holds pin the warm
  legs' stdout to the family's declared octet lists (match/loop
  [0,1,0,0,0], fold [0,7,0,0,0]), eval() never called.
- The wrong-octet controls break the expectation side with each
  member's own alt octets (match/loop [0,2,0,0,0], fold
  [0,255,255,255,255]).

All six arms verified wet locally. The census guards update per 4b(4):
7 native / 8 retained, and the identity-grain membership guard is
renamed to witness_native_rows_closed_membership_holds so the name
stops encoding the volatile population.

* Promote meet_join to SelfEmittedNative on the emit coverage frontier

The meet_join family's native-only verdict arms land on the complement arm's
helper, generalized to take the family member_id: meet and join run through
the same argv-dispatched logic family crate (one-build cache key shared with
complement, per the witness_family_build_grain_ruling), eval() never called,
verdict decoded from stdout. Octets meet=1 join=1 are the bytes the family
witness's warm legs pin on this same build; the wrong-octet control expects
each member's alt byte (0), which the primary runs can never produce.

Both arms verified wet: cold build then warm hits, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (eighth promotion); census
guards move to 8 native / 7 retained with meet_join_eval_subject named in the
closed membership.

* Promote variant_construct to SelfEmittedNative on the emit coverage frontier

The variant_construct family's native-only verdict arms follow the
field_access arm shape exactly: the tree is the family's own equals_eval
tree value (emit_variant_construct_eval_tree, no eval leg reachable), the
run shares the family one-build cache key that
emit_on_demand_variant_construct_native_one_build_holds colds, and the
expected octet 9 is the byte the family witness's warm leg pins on this
same build. The wrong-octet control expects the alt tree's byte (1), which
the primary run can never produce; the wrong-value alt leg in the family
witness keeps the program-side discrimination.

Both arms verified wet: cold build then warm hit, PASS/PASS. The roster row
flips InterpreterRetained -> SelfEmittedNative (ninth promotion); census
guards move to 9 native / 6 retained with
emit_variant_construct_eval_subgraph_node named in the closed membership.

* Close the emit coverage frontier: final six rows to SelfEmittedNative

The last six InterpreterRetained rows flip to SelfEmittedNative, taking the
roster to 15 native / 0 retained:

- filesystem_read and shell_exec_run (host-effect transport families, no
  translated arrow body): the arms reuse each family's own native leg with
  the expectation pinned as a literal grounded by the family's enrolled
  fixture pin (dag/extdeps/shell/exec.dag contains bash; its shell.Exec.Run
  argv materializes to exactly [bash, -s]), run through the families' fixed
  witness workspaces.
- module and produced_module: the arms execute the exact sources the
  equals_eval pairs run (emit_module over the add fixture tree;
  produced_add_module_source's ingested two-fn module), octet 5 pinned
  against the add family's primitive-five/six oracle leg.
- call and record_construct: the arms emit the families' own producer trees
  against their target models, octets 7 and 9 pinned against the
  primitive-seven/eight and wrong-field oracle legs.

The four families without a one-build cache witness run under per-family
fixed workspace roots; content-safety comes from the realization-digest
nesting in run_host_process_admitted (changed source colds, never serves
stale), the same mechanism the filesystem_read fixed workspace relies on.
All twelve arms verified wet: PASS/PASS each, cold builds then warm hits.

With zero retained rows the retained_via_eval_agreement constructor loses
its last consumer and is deleted (DESIGN 3c); the InterpreterRetained
variant stays as the disposition authority's other state. Census guards
move to 15 native / 0 retained with all fifteen decl names in the closed
membership.

* Record the emit coverage frontier closure in the direct-path plan

Axis C line: all fifteen roster rows are SelfEmittedNative as of
2026-09-08, interpreter_retained_rows() is empty, and the row constructor
was deleted with the last flip. Notes explicitly that this closes axis (a)
(witness-body-runs-native) only; axis (b) (the regen-grain production
flip) remains operator-gated.

* Model the required-v2-native lane authority: route receipt, exclusion taxonomy, admission, enrolment gate

Parallel track B (operator authorization 2026-09-09): one additional required
CI job whose subject is the compiler/test execution route itself — the
emitted-native compiler binary invoked by explicit path over a derived
v2.test.* population.

The lane is modelled in full in gunbc.witness_v2_native_route: the prefix
universe derivation, the per-member verdict rows (head + fatal reason grain),
the exclusion taxonomy delegating attribution to the door ledger's
known_frontier_causes, the counted exclusion census with a totality check,
the terminal-observation receipt carrier, the admission predicate (one
predicate per contract clause, all causes collected), and the enrolment gate
with today's standing as data.

Enrolment is BLOCKED, as data with a named capability trigger: the measured
census over the derived universe (882 members, seed withdrawn during the run)
refused every member — the emitted DirectIngestDriver admits only the
hard-coded compile_driver_subject name with empty imports, and the compile
door is at its modelled frontier — so the contracted positive population is
empty and native_route_admission over the real receipt executed to
'refused: positive_population_empty'. The exact enrolment edit (phase-roster
variants, claim_executor mirror, workflow lane, aggregate join, YAML regen)
is carried on the standing row.

The census measured five fatal-grain refusal causes the door ledger's
head-grain attribution table did not carry; they are added to
known_frontier_causes with their owning lanes (three MigrationOwned under
nimble-boar-198, two normalize/body-lowering SharedSelfHostCriticalPath).

Seventeen floor witnesses (v2.test.v2_native_route) consume the authority and
execute green through the seed interpreter.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Split preparation predicates so EmittedClosureUnrecorded is reachable

Review on #10882 (briansrls, point 7): native_route_preparation_recorded
folded the seed and closure observations into one && predicate, so a
receipt with a recorded seed and an unrecorded closure misreported as
preparation_seed_unrecorded and the emitted_closure_unrecorded cause had
no reachable construction — the grain-mismatch class DESIGN 4b(3) names.

One predicate per observation, one admission clause per predicate, and
two witnesses pinning each refusal name against its own receipt shape
(including the negative: each refuses ONLY by its own name).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Key cause ownership by diagnostic grain; classify native refusals at fatal grain

The door ledger's known_frontier_causes was a head-grain authority; the
native route classified fatal reasons through it, crossing grains (review
on #10882). Generalize the ownership key with DiagnosticGrain so one
table answers both grains: the door ledger's cause_is_attributed keeps
its head-grain contract, and the native route's exclusion classifier
asks the fatal-grain question of the same table. The head advisory is
live receipt data again: every refused row's head reason must be owned
at head grain (or by this lane's driver-limit roster), and an unowned
advisory blocks admission by its own clause name.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Hoist known_frontier_causes row-group notes above the declaration

The grain-keyed ownership change left its row-group commentary inside the
list literal; the annotation channel admits only module-item grain, so the
emitted closure refused with nine annotation-grain diagnostics. Move the
notes to a single block above the declaration. No semantic change.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Parse test fn as a contextual production in the v2 dag grammar

The emitted native compiler could not parse any v2.test.* module: the
modeled dag grammar had no test fn production, so every floor witness
module refused with parse_g0_tokens_remain (706 of 882 in the census).

test stays an ordinary identifier — typescript/program.dag models the
TypeScript compiler's Cond.test field under real-upstream-names — so the
production is the contextual sequence(ident, fn_decl): a new choice arm
in top_level_item with no FIRST overlap with the keyword-led arms, a
body-lowering arm that lifts the nested fn member after checking the
marker lexeme is literally test (a typed refusal otherwise), and a
forward-producer row for the new surface identity.

Verified against the emitted native binary: probe_testfn.dag moves from
parse_g0_tokens_remain to resolve_module_not_found (the driver's
synthetic-subject limit, identical to a plain fn), and the standing
choice-overlap residue roster is unchanged at seven rows.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add SourceRootEvalDriver: native whole-ingest test-execution route

The required-v2-native lane's terminal subject is an exact test identity
reaching a native Eval verdict, not a module accepted for translation.
DirectIngestDriver (one source, no peers, synthetic subject) stays as the
front-door census instrument; the new driver renders a main that reads a
host-derived universe of qualified test identities plus the declared
source roots, assembles the ingest once, prepares each module (resolve +
infer), and Evals each named test body -- one typed verdict row per
member, with a prepare-refusal fan-out so no member is silently dropped.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Escape literal braces in SourceRootEvalDriver main.rs template

The .dag string lexer reads '{' followed by an identifier as
interpolation, so the emitted Rust use::-import lists and format!
captures must spell literal braces as \{ \}. The single parse error
desynced the file parse and cascaded into 2618 unattributed-annotation
errors; with the escapes the emitter compiles clean (0 blocking, 107
files emitted).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Collect per-file front-end refusals in the native test context fold

The SourceRootEvalDriver's context fold reused program_assembly_fold_ingest,
which is wholesale fail-closed: one source hitting the v2 front-end's live
corpus frontier would deny verdict rows for every other universe member. The
fold now collects each source's tokenize/parse/normalize refusal as a
NativeTestFileRefusal row (head and fatal reason grains, matching the door
ledger's grain-keyed ownership) and keeps folding; a refused file contributes
no root, so its test identities surface as Context-stage refusal rows and
nothing is widened. The emitted main.rs prints the file-refusal rows and
counts them in the terminal marker, and prepare/eval refusals now classify at
the fatal (last diagnostic) grain consistently.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add native lane control fixtures

Two controls for the required-v2-native lane's host harness:
src/v2/native_lane_fixture/control.dag carries the live-verdict pair (a
well-formed false control and its true positive half) as plain fns outside
the v2.test. prefix, so floor discovery enrolls no universe rows for them;
fixtures/native_lane_malformed/poison.dag is a deliberately unterminating
string that any honest front-end must refuse at tokenize, kept outside every
declared source root so the broken bytes never enter an honest ingest.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Fix Vec/Vector type mismatches in the SourceRootEvalDriver main.rs template

The emitted driver crate aliases im::Vector as Vec, so the template's
std Vec-typed bindings and collect calls failed to compile in the
emitted crate: universe rows and module order carry Rc<Vector<String>>,
the reads vector moves into the FreeMonoid parameter with .into(), and
the dotted module name is built from an iterator collect.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Harden the v2-native route contract: test-identity grain, exact join, paired reference

Reframe the terminal subject from module-grain acceptance to the exact
test identity reaching a native verdict. The receipt's universe is a
list of qualified NativeRouteTestIdentity rows; the observed population
joins it exactly (uniqueness, no foreign rows, no omissions); every
member verdict is paired against the floor's own expected-red and
route-gap rosters for agreement, exclusion, or divergence; refusals are
classified from stage and provenance with cause ownership at fatal and
head grains; and the four controls (true, false, malformed specimen,
old-route withdrawal) are admission clauses. The 46 tests cover
universe derivation, identity qualification, reference pairing, refusal
classification, disposition, census counting, and every admission
clause.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Wire the required-v2-native lane into the roster, workflow, and aggregate

Add V2NativeLane/V2NativePhase to the required-CI roster, the lane's
claim_executor command to fabric_witness_run, and the
required-v2-native job to the witness floor workflow with the aggregate
witnesses job needing it in both verdict arms. Regenerate
witnesses.yml.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Add the required-v2-native host harness and phase dispatch

The lane's one phase derives the v2.test.* universe with the floor's
own discovery producer over the full module inventory, prepares the
emitted-native compiler through the emit-compile phase's crate writer
and cargo invocation, withdraws the old-route gunbc binary for the
spawn window, runs the emitted binary by explicit path over the
universe plus the named controls, reclassifies context-stage refusals
against the observed file refusals, mints the NativeRouteReceipt as the
authority's own types, and hands it to native_route_admission for the
verdict. claim_executor gains the V2Native lane and phase with the
roster sizes moved to six.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Regenerate stage0 mirrors for the SourceRootEvalDriver emitter arm

std_compiler_entry.rs gains the SourceRootEvalDriver variant and
v1_compiler_emit_rust.rs the emit_source_root_eval_driver_main_rs
template with its dispatch arm, emitted by the regenerated seed and
verified at the fixed point (first_generation_equal=true over the whole
155-module population).

Co-authored-by: briansrls <briansrls@gunb.ai>

* Name the probe crate's lib target v1_compiled, the emitter's self-name contract

emit_rust_selected binds the self-emitted crate's name to v1_compiled
for every non-retained-host pipeline entry, and the SourceRootEvalDriver
and DirectIngestDriver mains reach the closure through use v1_compiled::.
The probe manifest's per-entry package name left the lib target named
after the package, so a pipeline entry's driver main failed E0433 in the
probe build -- unreachable while every probe entry was pipeline-free, and
measured on the required-v2-native lane's first preparation. The lib path
stays cargo's default; only the name is stated.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Release retained emission arena before the native cargo build

The lane's first run held ~15GiB RSS from the emission's resolved graph
into the cargo build of the emitted compiler and was SIGKILLed (rc=137)
with no diagnostic. Drop the emission run and malloc_trim the retained
arena at both derivation-to-emission and emission-to-build handoffs,
reporting the reclaimed KB so a trim that cannot release live memory
shows in the lane log.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Apply rustfmt to the v2-native lane host changes

Co-authored-by: briansrls <briansrls@gunb.ai>

* Lower FreeMonoid tail to im::Vector::skip — O(log n) share, not O(n) copy

The emitter lowered every cons-match tail on a FreeMonoid to
iter().skip(1).cloned().collect(), materializing the whole tail per
step: every fold over a FreeMonoid was quadratic. Measured on the
required-v2-native lane's first native run (2026-09-09): the
self-hosted lexer, which tails the remaining source per character and
per rule attempt, tokenized a 22KB file in 23.3s against 70ms for
899B, projecting a multi-hour whole-corpus context fold — the lane's
dominant term. im::Vector::skip shares the RRB tree in O(log n).

Two mirrors carry the only cons-tail sites in the stage0 corpus:
v1_compiler_emit_rust.rs (the emitter itself) and
std_occurrence_binding_candidates.rs. The e0599 emitter-decision
census and its witness tests move to the new (skip, __fm) site with
the measured rationale. Fixed-point regen green: the rebuilt seed
regenerates both mirrors byte-identically.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Route FreeMonoid length/snoc through the count/list_push primitives

length folded the whole carrier per call (O(n)); the parse repeat loop
calls it on the remaining-token list twice per element — an O(elements x
tokens) quadratic measured at 40% of self-hosted parse self-time on the
required-v2-native lane's first native run (2026-09-09). list_snoc_item
routed through list_append, paying a full O(n) right-fold per snoc and
making every build-by-appending accumulator quadratic (measured on the
first-set union fold). count is O(1) and list_push amortized O(log n) on
the persistent-vector realization. Probe-measured on the emitted crate:
25s -> 6.6s parse on a 4k-element synthetic, 209s -> 33s on a 315KB
table module.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Hoist first-fold knowledge into prepared grammar expressions

The parse choice dispatch recomputed expr_first_fold on both branches at
every Choice node at every token position: right-nested choice chains
made that O(k^2) per position with O(t^2) union constants — the dominant
self-hosted parse cost once the algebra carriers were fixed. The grammar
is fixed for a whole parse, so each node's first fold (and each Choice's
ambiguity verdict) is a pure function of the grammar: compute it once at
preparation, bottom-up, and carry it on a PreparedGrammarExpr tree hung
off GrammarFirstAnalysis / ParseTableRealization. parse_expr keeps its
GrammarExpr signature as a compat wrapper that prepares on the fly;
parse_nonterminal_memoized_core reads the prepared map. Forecast by a
pointer-keyed memo probe on the emitted crate: 33s -> 14s on the 315KB
table module.

parse_minted_id_list also moves off list_append-per-node (O(n^2) per
captured repeat) onto a snoc fold over the list_push primitive.

Verified by execution: 29-test battery over parse_table_claims,
grammar_validation (left-recursion suite), parse_token_first_empty_
semantics, parse_table_content_key and parse_table_memo_governed_witness
all green through the seed interpreter.

Co-authored-by: briansrls <briansrls@gunb.ai>

* Deref boxed variant fields in enum shared accessors

The storage side boxes a variant record…
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