Skip to content

Root A: split the clone-bounds map into the two facts it was answering - #8347

Merged
briansrls merged 3 commits into
mainfrom
session/smart-ram-730-root-a
Aug 17, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/smart-ram-730-root-a

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

v1_clone_bounded_type_params answered two different questions with one record.
Does NAMING G<A..> require P: Clone -- well-formedness, which a declaration must
print, because naming an ill-formed type is an error whether or not you clone.
And does CLONING G<A..> require P: Clone -- the derive-impl fact, because
derive(Clone) emits impl<P: Clone> Clone for G<P>.

They differ exactly on generic coproducts, and the difference is not cosmetic.
An enum declaration must NOT print a bound it earns from derive, which
w_coproduct_bare_payload_param_stays_bare pins. A consumer cloning that enum
must still be told the parameter is required. One map cannot hold both: seeding
coproducts into the declaration record prints spurious enum bounds, and seeding
them nowhere leaves consumers with nothing to propagate from.

So v1_clone_impl_required_type_params seeds from both item kinds and shares the
existing fixpoint; v1_clone_bounded_type_params is untouched. Only the fn-bound
call site reads the new record. Declaration emission is byte-identical by
construction, which is what keeps both existing coproduct witnesses green.

WHY THE GAP WAS INVISIBLE. The two axes have complementary blind spots.
v1_type_expr_wf_needs_clone_param opens on a zero-children test, so
well-formedness structurally cannot bound a bare parameter; the seed exists to
cover the bare case and was switched off for coproducts. Outcome<T>'s only
T-bearing field is the bare value: T, so it was bounded by nothing. Neither
predicate is wrong read alone.

MEASURED, not assumed, at distinct-site grain over eleven entries. 142 A-class
sites, 104 of them fn signatures against 6 type declarations -- so this is a
fn-bound defect. Thirteen signatures fail PARTIALLY and discriminate the
mechanism: every parameter that earned its bound flows through a carrier that
has one, every parameter that missed flows through a carrier that has none.

NO USAGE GATE, and this was the open objection. Bounding a fn that names
Outcome<T> and never clones it would fabricate a requirement. Measured over the
03_ingest closure: of 21 generic fns taking one of these carriers in parameter
position, 21 clone that parameter. Zero spurious. The proxy is exact rather than
approximate -- derive emits impl<T: Clone>, so cloning the carrier IS the
obligation.

NOT VERIFIED YET. No regen, no acceptance run. The acceptance test was published
by smart-ibex-716 before this existed and has three distinguishable outcomes:
the CacheProbe / ShowEffectiveRead / Grounding / Outcome parameters should move,
the im::Vector ones should NOT (no corpus declaration to seed from), both moving
refutes the seeding gap, neither moving means this never reached fn signatures.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FwPMTY6Myy3scaMNn33cg5
@gunbai-bot gunbai-bot Bot changed the title v2 self host Root A: split the clone-bounds map into the two facts it was answering Aug 17, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 17, 2026 00:06
…let was not

The self-host fixed point caught it, nothing else could have: build compiles
the Rust seed, and this is a .dag scope error in the emitter that only the v2
self-compile reads. emit_module constructs EmitGraphInfo with the new field
but never bound the value; emit_rust did both. Same call, same arguments,
scoped to this function's single module.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FwPMTY6Myy3scaMNn33cg5
The .dag fix adds a let-binding that was missing while the field was
already threaded, so the emitted seed gains the re-export, two call
sites and the EmitGraphInfo field. Regenerated by regen_stage0 on the
branch head (4ce6626, subject present 9 times in 05_emit_rust.dag) and
transported as a patch; the four files are exactly the four the CI
staleness gate named.

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

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Third approval, and the first one on the head that carries the regenerated stage0 — which is the half worth confirming, since the two earlier approvals predate it and the review specifically checks that .dag and stage0 are in lockstep.

Nothing actionable in the remarks. One is worth answering rather than leaving as an observation, because read cold it looks like an asymmetry that was overlooked:

v1_clone_impl_seed_for_item using the struct predicate for all generic declarations, coproducts included, is the fix, not a leftover. Switching the seed off for coproducts is precisely the defect the rationale note measures: well-formedness structurally cannot bound a bare parameter (v1_type_expr_wf_needs_clone_param opens on a zero-children test, so it only fires on a parameter occupying an argument position of an already-bounded declared type), the seed exists to cover the bare case, and a generic coproduct with a bare payload therefore fell between the two axes and was bounded by nothing. Neither predicate is wrong read alone — the defect is the relation between them. The fixpoint being shared while the seed is uniform is the intended shape.

What the remark does surface is a naming residue: v1_item_type_param_needs_clone_bound_struct is now applied to coproducts too, so the _struct suffix names a population it no longer describes — a §3 nickname, small but real. I am deliberately not renaming it here. The name is emitted, so a rename regenerates stage0 and costs another full regen-plus-review cycle for zero semantic change, on a PR whose CI is already running. Recording it as a follow-up rather than as a silent decision.

— sent from smart-ram-730

@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

The ci red on d2ca095 is entirely inherited from main and no fix belongs on this branch.

Row outcomes from job 95282604114, not the batch summary:

5 of 9957 discovery witness(es) failed
  doc_graph_has_no_dangling_links  (dag/test/claim/doc_reachability_witness_test.dag)
  doc_graph_has_no_orphan_docs     (dag/test/claim/doc_reachability_witness_test.dag)
  doc_graph_has_no_dangling_links  (src/v2/lens/doc_reachability_test.dag)
  doc_graph_has_no_orphan_docs     (src/v2/lens/doc_reachability_test.dag)
  doc_graph_is_clean               (src/v2/lens/doc_reachability_test.dag)

That is one defect pair asserted from two files plus the conjunction — five rows, one cause. The trailing floor finalization refused: 1 obligation subject(s) never ran … count law unevaluable is a consequence of the stop, correctly refusing to report a green it cannot establish, not a sixth finding.

Why it is not mine, on two independent facts:

  • This PR touches 8 files — three src/v1/*.dag and four regenerated src/v1/stage0/src/*.rs. Grepping its diff for anything that can form a doc-graph edge (](, docs/, HandAuthoredDocBind, doc_graph) returns 0. I am not using "no .md in my diff" as the predicate — a doc-graph edge is not a markdown file, and a .dag carrier note citing a probe path can orphan a document while touching no .md at all.
  • git diff --name-status <merge-base>..origin/main -- *.md shows main gained exactly one document after this branch forked: docs/probes/root_b_primitive_repr_fork_2026-08-16.md. PR CI evaluates the merge ref, so that document is in this run corpus and is the orphan.

The fix is gunbc#8333, where I have an executed receipt: on head 5471455, doc_graph_is_clean returns true with the probe present in the tree. #8333 is at 2/2 distinct approvals, MERGEABLE, pending its own checks. When it lands this clears here and on the other PRs showing the same five rows — pushing a doc repair inside this single-seam stage0 PR would misattribute it to that seam in git history forever.

regen passed on this head, which is the actual subject of this PR.

— sent from smart-ram-730

@briansrls
briansrls merged commit c4e9cc9 into main Aug 17, 2026
4 of 5 checks passed
@briansrls
briansrls deleted the session/smart-ram-730-root-a branch August 17, 2026 05:51
gunbai-bot Bot pushed a commit that referenced this pull request Aug 17, 2026
Four commits landed on main inside the region this cut deletes. Resolutions,
each verified rather than picked:

- src/v1/{04_emit_info,04_infer,05_emit_rust,trait_derive_emit}.dag came back
  as modify/delete. Resolved as DELETED, the cut's thesis. No behaviour is
  lost: #8345 and #8347 both regenerated, so their emitter fixes live in
  v1_compiler_emit_rust.rs / v1_compiler_infer*.rs / v1_compiler_trait_derive_emit.rs,
  which are frozen seed and merge cleanly. Only the deleted .dag authority goes.

- src/v1/tests/claim/emitter_ambiguous_variant_owner_witness_test.dag arrived
  with NO conflict at all, because an add on one side is never one. Left in
  place it resurrects a file in a region this cut empties, and the regenerated
  emit plan then listed 8 paths instead of 7 -- declaring an artifact GENERATED
  whose generator this cut deletes. Deleted for consistency with the other
  v1 claim .dag; re-running the generator returns the plan to 7, which is how
  this resolution was checked rather than assumed. Its emitted twin is retained
  and still declared in lib.rs.

- ci_layer_roots.dag: taken from the cut. Main's side still enrolls
  v1_claim_scoped_witness_entries against src/v1/tests/claim/*.dag, whose
  subject this cut deletes, and the retirement receipt directly above the hunk
  says so.

- .gitattributes, ci.yml, stage0_emit_plan_generated.dag: regenerated through
  dag/tools/generated_artifact_gate.dag as the merge driver instructed, not
  resolved by hand or by side. The driver refusing these is it working.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Aug 17, 2026
…p corpus_repr

Root A (#8347) split the clone-bounds map and #8345 changed variant-owner
emission, both touching the three .dag files this branch edits. Eight
conflicts, every one the same shape: main adds
clone_impl_required_type_params beside a corpus_repr line this branch
deletes. Resolved uniformly -- keep main's new field, drop corpus_repr --
under an assertion that each hunk contained exactly one corpus_repr line
and an empty ours side, so a hunk of any other shape would have failed
rather than been silently taken.

The generated stage0 .rs files are NOT hand-resolved. The first attempt
took main's side for three of them and produced an incoherent seed: other
generated files had auto-merged cleanly, blending main's changes with this
branch's deletions, and the mix failed to compile (cli_run.rs calling
build_emit_graph_info with the arity this branch establishes against
main's two-arg generated definition). Bootstrapped from this branch's own
self-consistent seed instead, then regenerated from the merged .dag, which
is what actually reconciles both changes.

Subject-presence control, both directions, against the wrong-tree trap:

  type_reference_decl_file        (this branch's)  12 in seed
  clone_impl_required_type_params (main's)          4 in seed
  corpus_repr                     (deleted)         0 in seed

Regen fixed point: whole-tree hash identical across two generations.
fmt clean; cargo check -p v1-compiler --all-targets 0 errors, with the
mandated must-fail control exiting 101; the migrated checkpoint witness
passes. No edge-forming row or document is deleted by this branch, so the
doc-orphan class raised on the sibling lane does not apply.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Aug 17, 2026
…easured (#8367)

* Plan status: Root A landed, Root D half 1 has no live owner, Root B measured

The status table said Root A was 'unknown; under challenge' after it merged,
and named vivid-wren as owner of a Root D whose halves have different owners
and different states. A shared coordination document that is stale about what
landed sends the next reader at finished work — which happened to me tonight:
I dispatched a duplicate work item for Root D half 1 off this table before
finding PR #8350 already at the merge bar with its author's session archived.

  A   LANDED, #8347 as c4e9cc9. 12.5's challenge was RIGHT, which is why
      what landed is not what 12.5 proposed: a fused-map split, not the
      coproduct-skip edit the retracted diagnosis pointed at. The skip is
      still there and still deliberate. Recorded with two receipts — the
      stage0 regeneration the first push missed, and the two regen runs that
      reported a perfect fixed point while compiling a tree that never
      contained the fix.
  D   split by owner: half 2 landed; half 1 is #8350, at the merge bar, no
      live owner, shepherded here.
  B   18.3 adds smart-ibex's executed flip: 211->204 errors, 203->196 sites,
      195 common / 8 removed / 1 added, containment 0-of-18 disjoint. The
      43-site renderer-inconsistency reading and the +18 reassignment are
      RETRACTED — read off a different module's artifact, never reached a
      carrier. What survives is sharper than the retraction: the leaf name
      Nat denotes two different types under two module authorities, so a
      census pooled across modules is keyed on a name that is not unique over
      the population it pools. Key on resolved type identity, not the printed
      name, and let a site carry more than one root.

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

* Root D half 1 landed too — bbb5213, minutes after the row was written

The row said 'at the merge bar, no live owner, shepherded here'. It merged
while this PR was open. Recording it rather than letting a status document
be stale about a merge inside its own review window — which is the failure
the PR exists to fix, and it would be a poor look for the fix to exhibit it.

Its author's session was archived before it landed, so the merge is also the
receipt that an ownerless PR at the bar does not need a new session, only
someone watching for it.

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

* Strike the superseded instruction, and give half 2 its receipt

cursor review 52846, both findings real.

12.5 said 'treat A as unpartitioned, not as diagnosed' immediately above the
RESOLVED block this PR added, so the section told a skimming reader that
landed work was still open. I appended a resolution without striking the claim
it supersedes, which is the plan-ledger form of rung inflation — and doing it
in the very PR whose purpose is status honesty. Struck rather than deleted:
the instruction was correct when written, and the paragraph above it records
WHY the then-current diagnosis was refused, which still governs.

The Root D row claimed both halves landed while citing only half 1. Half 2 is
7cfeb6f (PR #8341), verified an ancestor of origin/main before citing it
rather than copied from the review. Receipt added.

Swept my own additions for the same class afterward: every LANDED claim in
this diff now names a merge commit, and all four SHAs this document cites
(bbb5213, 7cfeb6f, c4e9cc9, 6a3779d) are confirmed ancestors of
origin/main.

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

---------

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>
briansrls pushed a commit that referenced this pull request Aug 17, 2026
… its declaration node (#8376)

* Infer a bare variant's instantiated owner from the expected type, not its declaration node

A bare variant reference inferred as its OWNER COPRODUCT'S DECLARATION NODE, whose
children are the coproduct's ARMS rather than type arguments. `type Optional<T> =
Absent | Present { value: T }` declares Absent as child 0, so a generic owner reaching
the renderer uninstantiated rendered `Option<Absent>` -- a constructor in type
position, not a Rust type. The emitter was rendering faithfully what inference gave it.

When the context supplies an expected type that owns the variant, that expected node IS
the instantiated owner, so it is adopted in place of the declaration node. The same
lookup already existed in the unresolved-name arm; it is hoisted to one authority so a
variant that RESOLVES gets it too, rather than only one that does not.

Adoption is deliberately narrow on two axes, both earned by a failure:

IDENTITY -- only when the expected type's own head names the coproduct resolution
already bound, so this instantiates the owner the binder chose rather than re-targeting
to a different coproduct declaring an arm of the same name (Absent is an arm of
Optional, ObservationVerdict and ConvergeVerdict alike).

CARDINALITY -- only when the expected node is Required. Optionality is not a wrapper
type here: `BinOp?` is a BinOp node whose return_cardinality is CardOptional, so a head
comparison cannot see it. For `binop: Mod` against `BinOp?` the head IS BinOp and the
arm IS found, but the constructor's type is BinOp and the optionality is a coercion the
emitter performs by wrapping; adopting there made the value look already-optional and
emitted `binop: BinOp::Mod` where `Some(BinOp::Mod)` is owed.

Two successive drafts shipped that wrapper loss across four extdeps.languages.*_syntax
modules and std.effects. Worth recording WHY it survived: the Option<Absent> count, the
whole-artifact diff of the emitted eval closure, and the rustc error census all stayed
green through both, because all three measure the eval closure while the damage was in
v1's OWN emitted sources. regen_stage0 --verify was the only instrument whose subject
included it.

Measured, emitted v2.compiler.05_eval closure, before -> after:

  Option<Absent> sites        21 -> 0
  rustc errors               494 -> 473  (-19 E0425, -2 E0573; no code increased)
  whole-artifact diff        24/24 lines, fully accounted:
                             21 broken annotations repaired,
                             2 improved to concrete types
                               (Option<Rc<UriPercentEncodeRefusalCause>>,
                                Rc<NamedEdgeTargetLookup>),
                             1 Verdict annotation relaxed to `_`
  self-host fixed point      green (two generations)

Witness enrolls the CARDINALITY half, which is single-source constructible and is the
half both wrong drafts broke, with a required-field positive control so the repair is
not satisfiable by wrapping everything or by refusing every adoption. The headline
Option<Absent> case has no enrolled row and the note says so: it needs the v2 Optional
coproduct as a declared generic type AND an ambiguously owned arm name, but Optional is
not declared in the dag corpus (it is the built-in `T?` sugar) and two same-named arms
in one module are refused outright. Its evidence is the executed corpus measurement
above -- discriminating, but not recurring.

Rung, honestly: mitigatable, not structural. With no expected type inference still
falls back to the declaration node, so a declaration-shaped node can still reach a type
position. Dissolve-on: constructor ownership and constructor value type become separate
facts with a needs-context / refused arm, at which point the state is unwritable.

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

* Delete the 27-row self-host frontier roster and the machinery that only served it (#8344)

* Delete the 27-row self-host frontier roster and the machinery that only served it

Operator ruling: the frontier roster is either derived from live state or it
does not exist. It was neither -- 27 hand-authored rows whose measurement
fields were ordinary parameters, so a row that claimed execution measurement
was indistinguishable from one that asserted it. It attracted readers, it
misrouted them, and it produced nothing. This deletes it at the root rather
than pruning it row by row.

WHAT THE DELETION PROVED, which is the part worth reading. Every consumer that
looked load-bearing turned out to consume an empty projection:

  crate layout        appended compiler_frontier_emitter_produced_stage0_mod_basenames(),
                      a fold admitting only EmitterProduced rows. All 27 were
                      SeedRetained, so the term was [] at every call and no
                      emitted byte changes.
  wet enrollment      appended a roster fold whose own gate,
                      falsifier_self_host_wet_template_only_holds, asserted that
                      term had length zero.
  crate partition     named the roster as a dissolution target for module
                      exports the roster could not have supplied -- rows carried
                      a path and a disposition and nothing else.

So the roster's real dependents were its own census tests. Those, the promotion
and authorization machinery, and the per-module probe survey go with it.

WHAT SURVIVES AND WHERE IT WENT. Crate layout is a separate concept that was
squatting in the frontier module; it moves to v2.compiler.self_host.stage0_crate_layout
with the registration rows and projections that actually produced bytes. The
producer/qualification vocabulary in emitter_producer_provenance survives at
half its size -- the EmitterProducer x EmissionQualification axes, the realized
closure carriers, the receipt and its single mint -- because its live consumers
(candidate_generation, the direct rust door contract, the production
qualification lens) never read a roster row.

EVIDENCE, PER DESIGN 4b. Deleted witnesses fall in two classes and both are
stated in the carriers rather than here. Green-by-construction: seven crate
layout witnesses guarded by a disposition match whose EmitterProduced arm was
unreachable, or comparing zero to zero. Subject-retired: the authorization
forgery controls proved an unauthorized EmitterProduced disposition was
unwritable, and that disposition no longer has a representation to forge.

Two claims survived and keep their controls: a V2Emitter receipt cannot be
minted with the seed emitter in its realized closure, and the generated crate
layout artifact must match its registration rows.

ONE CLAIM IS GENUINELY RETIRED RATHER THAN CLIMBED, said plainly.
transition_parity_host_index_agrees_with_hand_rows redded when the derived
module index and the hand-authored qualified-module rows disagreed. Deleting
one side of a duality retires the parity claim; it does not discharge it. The
surviving authority is the path-module binding index, and the crate-partition
dissolve target now points there instead of at the roster.

The frontier_probe_survey bin is removed with its .dag surface and transport.
Justified per bin, not by a class sentence, because an earlier change deleted
four bins on one blanket justification and was reverted for exactly that --
see the second-removal paragraph in gunbc.ci_release_bins.

NOT DONE HERE, named rather than left to be found: the frontier_probe subsystem
(frontier_probe, frontier_probe_types, assemble_detail and their tests) still
stands. It is the adjacent weed -- its subject was per-module roster
measurement -- but it has independent test consumers and deserves its own cut.
The plan carriers written in the roster's vocabulary (wave2_prep_design,
v2_self_hosting) are quarry now, not authority, and are not rewritten here.

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

* Follow the bin deletion through build.rs and the generated workflow

The build failed in 39s because deleting src/bin/frontier_probe_survey.rs left
two references to it standing: build.rs still declared a rerun-if-changed on
the file, and .github/workflows/ci.yml still passed --bin frontier_probe_survey
to the release build and then asserted the resulting artifact existed at four
verify sites and one tar site.

ci.yml is a generated artifact and the honest way to update it is to regenerate
it from gunbc.ci_release_bins, which is where the pack row was already removed.
`gunbc ci` cannot run in this container -- the shim panics reading
ci_layer_roots.dag out of a temp workspace -- so the eight occurrences are
removed by hand and the drift gate is the check: it compares ci.yml against
`gunbc ci` output byte for byte, so if this hand edit is not exactly what the
generator produces, CI says so. That is the intended instrument for this rather
than a local claim I cannot make.

Stated because it is the kind of thing worth noticing rather than routing
around: a hand-edited generated artifact is only acceptable here because a
byte-exact gate independently checks it in the same run.

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

* Fix the parse error my own note introduced: nested double quotes in a .dag string

The retained-kernel test gate failed with four panics, all the same:
for_each_parsed_module_binding could not parse dag/gunbc/ci_release_bins.dag.
The per-bin justification I added there quoted the earlier blanket sentence
verbatim -- not "a probe bin whose subject was cli_run" -- inside a
double-quoted string, which terminated the string mid-prose and left the
remainder as garbage tokens.

Worth noticing rather than just fixing. The failure surfaced four modules away
from its cause, in a materialization-provider test whose subject is disk cache
probes, because the whole-corpus module-path index parses every .dag file
before anything else runs. So a prose edit in a bin roster reds a cache test,
and the panic names the parse site rather than the reader. That is the same
ordering property this program spent the afternoon on: what breaks first is
not what is wrong, it is what runs first.

The sentence now paraphrases instead of quoting. Checked the other nine
multi-paragraph notes this change adds: each opens and closes exactly once,
with the odd per-line quote counts expected of a string spanning blank lines.

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

* Two workflows still named the deleted probe bin: take the heal regeneration

The frontier cut deleted the frontier_probe_survey bin and its row in the
release pack, and I removed its eight occurrences from ci.yml by hand.
fleet-converge.yml and falsifier.yml build the same pack from the same
authority and still named it, so heal regenerated them and could not push
workflow paths itself. These are its bytes, not mine.

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

* Move the deletion rationale into an authored annotation: it is prose, not program data

DESIGN 4c, enforced by prose_row_introduction_gate: this path's prose is
already migrated, so a new data NAME_note: String row is refused. The note
explains what the frontier cut removed from this module and what survived,
which is exactly irreducible rationale about a construction's shape --
it belongs above the declaration it explains, not in a String the compiler
must carry. Six sibling rows on out-of-scope paths were reported and not
enforced; left as they are rather than widening the diff past the refusal.

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

* Delete the freeze rows and transport claims naming witnesses the cut removed

The floor refused with StaleFrozenPathDeferral: two gunbc.witness_deferral_freeze
rows named test decls the entry no longer declares. A freeze row left behind is
not inert -- it becomes a standing exemption the next witness to take that name
inherits, which is the refusal's own wording and the reason it is loud.

Same two names were still enrolled as ClaimRun rows in the supply transport, and
its note explained why one of them was there. Removed both and rewrote the note
to say what happened to their subjects: the parity witness had the duality
between the derived index and the hand rows as its subject, and the cut removed
one side, so the claim is retired rather than dropped.

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

* Import the equality helper from its definer: the old path resolved by pool coincidence

emitter_producer_provenance_witness_test imported
schedule_witness_entries_structurally_equal from wet_receipt_enrollment, which
neither defines it nor imports it. It is defined in
seed_emitter_behavioral_wet_known_red_entries, a module this file already
imports. The reference resolved on main only because some other member of the
assembled closure had dragged the definer into the pool; the cut changed the
closure and it stopped resolving, refusing the whole discovery corpus.

This is the Class B accidental-coverage shape DESIGN records as an open thread —
a bare cross-module reference binding by pool membership rather than by the
importing file's own closure. Importing from the definer is the fix that does
not depend on who else is in the pool.

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

* Retire the frontier probe receipts with the roster they measured

The cut deleted the two HandAuthoredDocBind rows for the frontier probe
receipts but left the documents in the tree, so three files lost their only
inbound reachability and became orphans. Deleting the bind rows was correct
— every declaration they cite (frontier_probe_exact_head_closeout_note,
frontier_probe_run_interruption_note, frontier_roster_provenance_constructor_inflation_note,
compiler_frontier_receipt_totality_wall_holds) is deleted by this PR, so the
binds would otherwise dangle. What was missing is the other half: a document
whose entire subject is retired is retired with it, never left standing.

Deleted with the rows:
  docs/probes/frontier_probe_exact_head_survey_2026-08-03.{md,tsv}
  docs/probes/frontier_probe_run_interrupted_2026-08-06.md
  docs/probes/diff_frontier_declared_vs_survey.sh   (only input was the TSV above)
  docs/probes/run_frontier_probe_survey_per_module.sh

The two scripts are frontier-probe transport and served nothing else. Two
unrelated STR-RC-0 scaffolds cited the second one as a class exemplar; their
comments now state the class without the pointer, so the deletion leaves no
stale citation behind.

This is the branch's own doc-graph defect, distinct from the five inherited
rows main is currently red on (the root_b probe orphan, fixed by #8333).
Same lens, same five row names, two different causes — which is why "those
are the known inherited rows" had to be checked rather than assumed.

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

* Cut cleanup: the citations the deletion left pointing at nothing

cursor review 52817 on #8344 named six stale citations to symbols and files
this cut deletes. All six verified against the tree and fixed per site — a
mechanical substitution across them produces sentences that parse and say
nothing, which I did once already tonight and am not repeating.

  stage0_crate_layout_emit.dag        the generated-artifact template still
    embedded 'Authority: v2.compiler.self_host.frontier' in both the .dag and
    .rs emit paths after the import was repointed, so the next regen would
    bake a deleted module name into two generated artifacts. Now names the
    real authority, v2.compiler.self_host.stage0_crate_layout.
  ci_layer_roots.dag  witness_admission_offline_note   dropped the deleted
    exclusion note from the paired list.
  ci_layer_roots.dag  long_lane_exclusion_note         dropped the 'Named
    consumer with file-grain exclusion row' sentence; both things it named
    are gone.
  ci_layer_roots.dag  falsifier_self_host_wet_note     the frontier-row flip
    no longer gates wet enrollment; says so, and points at the note recording
    that the term it fed was already empty.
  ci_release_bins_witness_test.dag                     note claimed two
    positive gap bins while the tests assert one.
  witness_deferral_freeze.dag                          the terminating-survey
    specimen is rewritten rather than removed: it did terminate, but by its
    subject being deleted rather than by reaching 27 of 27 receipts, and that
    is the disposition the freeze cannot express.

Two more of the same class the review did not reach, found by sweeping every
deleted symbol rather than fixing the six named:

  doc_graph_roots.dag   the bind for this cut's own coordination document had
    primary_work pointing at v2.compiler.self_host.frontier_band_a_emit_readiness,
    a module this PR deletes. Repointed to the door-contract note already in
    its additional_works, which is the closest surviving subject.
  discrete_cost_derivation (.dag + .md)  cited the deleted exclusion note as
    live evidence for the 'green CI implies coverage' claim. The claim stands;
    the specimen is now stated as one that has since been deleted with its
    subject, which is an instance of the pattern rather than a loss of it.

Census after: every decl_name bound in doc_graph_roots resolves in the tree.
An earlier run of that census reported two missing — both were my grep
omitting 'func' declarations, not defects.

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

* Cut cleanup 2: the deleted-MODULE citations the symbol sweep missed

cursor review 52826. Two of its four findings were already fixed in 5921f90
(the emit template, the release-bins note); it ran on the older head. The
other two are real, and they show the first sweep was keyed on the wrong
thing: I swept deleted SYMBOLS, and a DeclarationRef names a MODULE PATH
independently of whether the symbol it cites still exists somewhere.

Sweeping module paths instead found three sites, one more than the review.

  stage0_rust_source_lifecycle_scaffold.dag
    hand_maintained_stage0_filenames_authority_ref still named
    v2.compiler.self_host.frontier while the import three hundred lines above
    had been repointed to stage0_crate_layout. Repointed.

  dissolution_migration_census.dag
    a NarrativeOnly residue row for a note in the deleted probe-survey module.
    Removed; the partition witness asserts sum-of-parts against the total
    rather than a literal count, so it stays true by construction.

  self_host_promotion_obligations.dag
    RE-HOMED rather than retired, and the distinction is the point. Both refs
    named the deleted frontier module, which made the bound trigger one that
    can NEVER fire — DeclarationAppears waiting on a module nobody will
    re-create is a permanently pending obligation wearing a checkable trigger,
    which is worse than an honest unbound one.

    The obligation itself survives the roster because it was never about the
    roster: the hazard is that a self-host promotion can be granted on evidence
    the v1 seed produced, and EmitterProducer still carries a V1SeedEmitter arm
    in v2.compiler.self_host.emitter_producer_provenance. So the subject moves
    there, the trigger keeps its declaration name and moves with it, and the
    'n/27' framing — which really was roster-specific — is gone from the claim.
    Its witness needs no change: it asserts the bound and unbound arms stay
    distinguishable, and both still are.

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

* Repoint two live references to the deleted frontier module

cursor review 52843. Both name it as a LIVE authority, unlike the several
prose sites that correctly say 'was carved out of' or 'was deleted with' —
those stay, because a historical reference to a deleted thing is accurate.

  language_target_registry.dag  Rust's TargetGovernedByContracts named the
    deleted module as its governing contract id. Repointed to
    v2.compiler.self_host.emit_coverage_frontier. Note that the row's own
    governing_contract_id_resolution_note explains this field carries a module
    name only because the real strategy authority lives in a private overlay
    and cannot be resolved from here — so the field is a stand-in either way,
    but a stand-in naming something that exists is strictly better than one
    naming something deleted.

  stage0_emit_plan.dag  the disposition-authority note said the projection
    derives from the deleted roster's seed-retained facts. It derives from
    stage0_crate_layout's hand-maintained filename facts, which is where the
    carve-out put them.

Deliberately NOT changed: cli_run.rs uses the string as a synthetic submodule
name in a prefix-matching unit test. It tests string logic and never resolves
the module, so it is not a stale citation — any name would do.

My earlier sweeps missed both because they keyed on 'module_path:' fields and
import lines. These are a contract_ids list element and prose. Third sweep
form, and the one that should have been first: grep the bare module name in
any syntactic position, then decide per site whether the reference is live or
historical.

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

* Regenerate the artifacts the authority-string change restamps

cursor review 52843's first finding, and the one with teeth: I changed the
emit template's authority string without regenerating what it stamps, so the
committed artifacts and the template disagreed and generated_artifact_drift_gate
would have refused. Ran the real generator rather than hand-editing generated
files:

  gunbc run --entry dag/tools/generated_artifact_gate.dag --function main_wet

It rewrote two artifacts with the new authority — and .github/workflows/ci.yml,
which is the part worth recording. The merge earlier took the ours side of
ci.yml purely to obtain a tree that builds, on the stated plan that regen would
overwrite it by construction. It did: the generator produced MAIN's
AUTHORED_CONFLICTS line, not mine. So the hand-picked side was wrong and would
have shipped a workflow that silently dropped main's change. That is exactly
the failure the generated-artifact merge driver refuses in order to prevent,
and the reason the rule is regenerate rather than resolve.

Still owed and dispatched separately: gunbc_stage0_crate_layout_generated.rs
carries the same string but is emitted by regen_stage0 rather than by this
gate, so it needs the stage0 regeneration, not this one.

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

* Regenerate the last artifact carrying the old authority string

gunbc_stage0_crate_layout_generated.rs is the emitted Rust OF the .dag row
this PR changed, so it is owned by regen_stage0 rather than by the
generated_artifact_gate that produced the previous commit. Ran regen_stage0:
144 files written, exactly one changed, and it is this one. That single-file
result is the receipt that the earlier gate run had already covered everything
else it owns.

Both regeneration paths now agree with the template, so the drift gate and the
regen job have nothing left to refuse on this string.

Instrument note, recorded because it is the fourth of its kind tonight: the
subject-presence greps I printed beside this run were mangled by nested
quoting — the pattern's second word was taken as a filename, so both reported
0 with a 'No such file' line above them. The numbers were garbage. The run is
still trustworthy, but on the strength of what regen CHANGED, not on the checks
I attached to it. A broken check that prints a plausible 0 is worse than no
check, and this is the same family as reading a truncated tail: absence
manufactured by the instrument, read as a measurement.

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

* Repoint to the right authority, and clear two more dissolution triggers

cursor review 52854, both real.

MY REPOINT WAS WRONG AND THE REASON IS THE ERROR I HAVE BEEN WARNING OTHERS
ABOUT ALL NIGHT. I moved Rust's TargetGovernedByContracts to
v2.compiler.self_host.emit_coverage_frontier because the name resembled the
deleted module. It does not answer the same question: that carrier's own
two-axis note says it answers axis (a), whether a witness body runs native,
and explicitly disclaims axis (b), module self-emission. Picking it on name
resemblance is precisely 18.2's finding — a name says the carrier was
involved, not how — applied by me while citing it to someone else.

Repointed to v2.compiler.self_host.emitter_producer_provenance, the surviving
producer authority, which is also where the promotion obligation re-homed
earlier in this PR. And the field's own note is updated: its stated purpose is
a resolvable module a reader can open, so the note naming the deleted one made
it false on its face while the field beside it had already moved. The note now
records the wrong first choice rather than quietly showing the second — a
reader deciding whether this field means anything is better served by knowing
it was mis-picked once.

seed_emitter_behavioral_wet_module_bindings carried two dissolution triggers
whose subjects the cut removed: authorization waiting on 'witness-realization
+ frontier_probe_survey', and 'Frontier rows stay SeedRetained'. Both rewritten
to name what actually remains — witness-realization alone, and the binding's
own absence. A trigger naming a deleted subject cannot fire, which makes it
strictly worse than honest prose.

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

* Roadmap paths, and the plan carriers the cut decayed

claude review 52858. The first finding is the serious one: STRUCTURED fields,
not prose.

THREE LIVE ROADMAP NODES pointed path: at the deleted file — v2-emitter-
producer-provenance, v2-emitter-first-behavioral-module, v2-emitter-native-
bootstrap, all active in gunbc.roadmap_authority. Repointed PER NODE from what
each node says it does, not uniformly:

  producer-provenance    -> emitter_producer_provenance.dag
                           (its handback wants a result refused without a
                           receipt from the run that made it — that module's
                           mint wall)
  first-behavioral-module-> wet_receipt_enrollment.dag
                           (handback is test results plus the updated list
                           entry; the list entry was a roster row, and wet
                           enrollment is what survived carrying per-module
                           receipts)
  native-bootstrap       -> v2_emitter_direct_rust_door_contract.dag
                           (handback is two builds and the old compiler taken
                           away)

Picking one target for all three would have repeated the mistake in the commit
before this one, where I chose emit_coverage_frontier because the name
resembled the deleted module. Swept afterward: every path: in the roadmap now
resolves on disk, the sole non-file being a dotted module reference.

WAVE2_PREP_DESIGN IS MARKED SUPERSEDED RATHER THAN REPOINTED, and that is a
disposition rather than a shortcut. Its entire mechanism section names the
roster, its count, its baseline, its census attribution, its sweep order and
its gate — all deleted. There is no mapping from a roster row to a replacement,
so repointing eight symbols would fabricate an authority the document never
had. DESIGN §3 rules that a plan authored while the deleted structure lived is
re-read as quarry: its findings may be evidence, its sequencing is the old
structure's gravity written down. The header now says so and tells the reader
every symbol below names something gone.

The other two plan carriers had specific enough claims to repoint per site.

Residual live citations of the deleted module across all .dag: zero, counting
only live references — the several prose sites that say 'was carved out of' or
'was deleted with' stay, because a historical reference to a deleted thing is
accurate and sweeping those would be the mechanical substitution this PR has
already had to undo once.

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

* The self-hosting tracker outlived its roster: declare the gap, do not refill it

review 52867 caught v2_self_hosting.dag still presenting the deleted
frontier.dag as the live roster carrier -- seven citations across the
status line, the state-of-play census, two Wave 1 residual lists, the
Wave 3 exit gate and the retirement condition. The claude review on the
same head credited this file with quarry annotation it does not have,
so the finding is real and the approval was wrong about it.

Quarry-bannering it would be the wrong repair. wave2_prep_design earned
that treatment because its whole mechanism section named deleted roster
symbols with no surviving mapping; this file is the live sequencer for a
program whose Wave 1 is still in flight. It is not superseded by the cut
-- it merely cited what the cut removed.

So: repoint to the surviving authorities, and where a claim was
denominated by the roster, retire the fraction rather than re-author it.
0/27 and 27/27 both came from the same hand-authored row list, so both
measured the roster's opinion of how many compiler modules exist. The
substance survives (no module is self-emitted with a green equivalence
receipt; every module must flip or be declared pinned-kernel) and is
now stated qualitatively, with the derived denominator named as the
first Wave 3 obligation. Restoring a count here would rebuild the weed
inside the replacement, which is the failure DESIGN section 3 warns
about by name.

The frontier probe residuals are marked retired rather than outstanding:
the survey never produced a receipt on any host including a dedicated
runner, so its deletion costs machinery, not evidence.

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

---------

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>
Co-authored-by: gunbc-ci-auto-heal <bts53@scarletmail.rutgers.edu>

* Plan status: Root A landed, Root D half 1 has no live owner, Root B measured (#8367)

* Plan status: Root A landed, Root D half 1 has no live owner, Root B measured

The status table said Root A was 'unknown; under challenge' after it merged,
and named vivid-wren as owner of a Root D whose halves have different owners
and different states. A shared coordination document that is stale about what
landed sends the next reader at finished work — which happened to me tonight:
I dispatched a duplicate work item for Root D half 1 off this table before
finding PR #8350 already at the merge bar with its author's session archived.

  A   LANDED, #8347 as c4e9cc9. 12.5's challenge was RIGHT, which is why
      what landed is not what 12.5 proposed: a fused-map split, not the
      coproduct-skip edit the retracted diagnosis pointed at. The skip is
      still there and still deliberate. Recorded with two receipts — the
      stage0 regeneration the first push missed, and the two regen runs that
      reported a perfect fixed point while compiling a tree that never
      contained the fix.
  D   split by owner: half 2 landed; half 1 is #8350, at the merge bar, no
      live owner, shepherded here.
  B   18.3 adds smart-ibex's executed flip: 211->204 errors, 203->196 sites,
      195 common / 8 removed / 1 added, containment 0-of-18 disjoint. The
      43-site renderer-inconsistency reading and the +18 reassignment are
      RETRACTED — read off a different module's artifact, never reached a
      carrier. What survives is sharper than the retraction: the leaf name
      Nat denotes two different types under two module authorities, so a
      census pooled across modules is keyed on a name that is not unique over
      the population it pools. Key on resolved type identity, not the printed
      name, and let a site carry more than one root.

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

* Root D half 1 landed too — bbb5213, minutes after the row was written

The row said 'at the merge bar, no live owner, shepherded here'. It merged
while this PR was open. Recording it rather than letting a status document
be stale about a merge inside its own review window — which is the failure
the PR exists to fix, and it would be a poor look for the fix to exhibit it.

Its author's session was archived before it landed, so the merge is also the
receipt that an ownerless PR at the bar does not need a new session, only
someone watching for it.

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

* Strike the superseded instruction, and give half 2 its receipt

cursor review 52846, both findings real.

12.5 said 'treat A as unpartitioned, not as diagnosed' immediately above the
RESOLVED block this PR added, so the section told a skimming reader that
landed work was still open. I appended a resolution without striking the claim
it supersedes, which is the plan-ledger form of rung inflation — and doing it
in the very PR whose purpose is status honesty. Struck rather than deleted:
the instruction was correct when written, and the paragraph above it records
WHY the then-current diagnosis was refused, which still governs.

The Root D row claimed both halves landed while citing only half 1. Half 2 is
7cfeb6f (PR #8341), verified an ancestor of origin/main before citing it
rather than copied from the review. Receipt added.

Swept my own additions for the same class afterward: every LANDED claim in
this diff now names a merge commit, and all four SHAs this document cites
(bbb5213, 7cfeb6f, c4e9cc9, 6a3779d) are confirmed ancestors of
origin/main.

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

---------

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>

* Compare owner DECLARATION identity, not its name, and fix the unguarded no-binding arm

Review-driven follow-up to the previous commit, both findings acted on rather than
recorded.

IDENTITY. The owner guard compared `authored_name_at(exp) == owner_name` -- a spelling,
not an identity. It fails in both directions: one declaration reached through a
qualified spelling fails it, and two DIFFERENT declarations sharing a name pass it. The
dangerous arm is the second: given `a.Status = Ready | AOnly` and `b.Status = Ready |
BOnly`, a `Ready` bound from a.Status could be adopted against an expected b.Status,
silently retargeting the constructor and potentially masking a real type error. That
hazard was introduced by the previous commit, not pre-existing.

The repository already defines same-owner identity at the constructor-binding authority
(insert_variant_owner_checked): authored name PLUS declaration file and source start.
That triple is extracted as `same_owner_declaration` and both consumers now ask one
authority instead of two.

Comparing identity NAIVELY REVERTS THE REPAIR, and the measurement is the point.
Requiring name+file+start put Option<Absent> straight back to its full 21-site baseline;
a probe on name+file alone was also 21, which located the cause: expand_scrut_type_for_-
variant_lookup returns its subject unchanged once the connective is Disj, so `exp_enum`
is a USE-SITE node in the consumer module, never the owner's declaration. Comparing a
use site against a declaration can never match. Both sides are now normalised through
lookup_type_for before comparison, which restores 0 sites WITH identity enforced.

NO-BINDING ARM. The expected-context-only branch adopted the expanded node raw, and
expand returns an OPTIONAL subject unchanged -- exactly the state the cardinality rule
refuses two branches over. It is fixed with with_required_cardinality rather than by
extending the `Required` refusal there: that branch has no binding fallback, so refusing
would convert resolving programs into hard not-founds, and a fabricated refusal is
forbidden by the same rule as a fabricated success.

Measured, emitted v2.compiler.05_eval closure, before -> after (unchanged headline,
strictly more precise output):

  Option<Absent> sites        21 -> 0
  rustc errors               494 -> 473  (-19 E0425, -2 E0573; no code increased)
  whole-artifact diff        43/43 lines, fully accounted:
                             21 broken annotations repaired,
                             ~21 `acc: _` IMPROVED to concrete types,
                             1 Verdict annotation relaxed to `_`
  self-host fixed point      green in one generation
  witness                    both rows green

The witness note gains the sharper coverage statement, which this change PROVED rather
than reasoned: both enrolled rows pass on the unrepaired baseline, so they detect the
repair over-reaching and cannot detect it ceasing to work. The identity draft above
silently reverted the repair while every row stayed green; only re-measuring the corpus
caught it.

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

* Revert the owner-identity guard: it regressed 16 whole-corpus sites

Reverts the code of ece43db, keeping its witness-note finding. The review finding
that motivated it is REAL and is NOT resolved by this revert -- it is deferred with a
measurement, which is more than it had before.

WHAT THE FINDING WAS. The owner guard compares authored names, not declaration
identity, so two DIFFERENT declarations sharing a spelling can pass it and expected
context could retarget a constructor. That hazard is introduced by the first commit and
is real.

WHY THE FIX IS NOT SHIPPING. Comparing declaration identity requires normalising both
sides -- expand_scrut_type_for_variant_lookup returns a USE-SITE node once the
connective is Disj, so a raw span comparison never matches and silently reverted the
repair to its full 21-site baseline. Normalising through lookup_type_for restored the
repair but introduced 16 incompatible-type errors across the corpus, because resolving
to declarations makes the guard match through ALIASES and QUALIFIED SPELLINGS that the
authored-name comparison declines -- so it adopts in cases it must not. Bisected: the
no-binding cardinality edit is innocent (reverting it alone still gave 16); the identity
comparison is the cause.

  whole-corpus compile, dag + src/v2, one instrument, three arms:
    origin/main          incompatible-types  0   undefined-variable 32
    first commit         incompatible-types  0   undefined-variable 32
    identity commit      incompatible-types 16   undefined-variable 32

The 32 undefined-variable rows are pre-existing on main and are the control proving the
read works.

WHY THIS WAS NOT CAUGHT BEFORE PUSHING, which is the transferable part: every number in
the first commit was measured on the EMITTED EVAL CLOSURE, and the compile-clean gate
compiles the WHOLE CORPUS. This change alters inference for every bare variant reference
in the tree, so the eval closure was never the right denominator for it. The self-host
fixed point is also a partial denominator -- it covers v1's own sources, which is why it
caught two earlier drafts and not this one. Whole-corpus compile is now run beside the
eval emission for any inference change.

State restored to the verified first commit, re-measured after revert:

  self-host fixed point                green
  whole-corpus incompatible-types      0   (baseline 0)
  whole-corpus undefined-variable     32   (baseline 32, pre-existing)
  Option<Absent> in emitted eval       0   (baseline 21)
  witness                              both rows green

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

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: gunbai-bot[bot] <289086189+gunbai-bot[bot]@users.noreply.github.com>
Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: gunbc-ci-auto-heal <bts53@scarletmail.rutgers.edu>
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.

2 participants