Skip to content

v1 cut: delete the v1 compiler authority, freeze its emitted Rust as the seed - #8352

Closed
gunbai-bot[bot] wants to merge 52 commits into
mainfrom
integration/v1-cut
Closed

gunbai-bot[bot] wants to merge 52 commits into
mainfrom
integration/v1-cut

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

v1 cut: delete the v1 compiler authority, freeze its emitted Rust as the seed

Integration branch per DESIGN §3. Red mid-loop is declared state.

This PR reopens the v1 cut work that was closed unmerged in the previous session (PR #8293, which has the complete rationale and background). The branch is at 44 commits of green work from integration/v1-cut (the original 43 commits plus the merge commit with current main), with all 17 witnesses passing.

Summary

Deletes the v1 compiler authority (59,829 lines across 66 files in src/v1/) and freezes its emitted Rust as the seed, per the delete-first program outlined in DESIGN §3 and the operator ruling from 2026-08-15. This is the fifth cut in the delete-first program, alongside integration/{floor,namespace,cli-run,interpreter}-cut.

The Demand Census

All 62 deleted v1 .dag modules were partitioned by which channel could have made a survivor complain:

channel count notes
import graph 0 no surviving .dag imported ANY deleted module
path literal 20
directory scan 45 the v1_src_dag_parse bin, a survivor that DID refuse
union witnessed 53
residue 9 proven load-free only by absence of anything to ask

The zero imports figure is the critical point: this cut's demand never ran through the import graph, so an import-graph-only census would have reported the whole deletion as unwitnessed.

Residue Disposition

Eight residue items are test files that were their own witnesses. The ninth is an observation carrier instance (src/v1/gunbc/namespace_reference_derived_closure_production_observations.dag), not a witness; its taxonomy survives in dag/std/reference_binding_observation.dag with all three observation variants present and surviving consumers intact.

Annotation-Erasure Obligation (§4c)

Re-enrolled in dag/test/claim/dag_line_comment_annotation_channel_test.dag against lex_walk_artifact → parse_module → normalize. No v1 modules are called. Three controls were re-derived (not restored from the deleted witness) because restoring faithfully would have shipped three vacuous greens:

  • SHAPE: content_hash(annotated) == content_hash(bare) through parse and normalize
    • Control: declarations present vs absent moves the digest
  • IDENTITY: the body callee survives; no payload word becomes an atom
    • Control: renamed callee moves the atom set both directions
  • PROVENANCE: every token after the prose shifts by exactly 18 bytes, population unchanged
    • Control: asserted against a declared constant

Each control was verified RED under a planted defect.

Cargo.toml Conflict Resolution

Both [[bin]] hunk sides were correctly dropped:

  • v1_src_dag_parse was deleted by this branch; main re-adds it but that dangles the deleted binary
  • v2_whole_tree_parse_scan had its source deleted on main, so keeping it dangles too
  • Dropping both leaves 33 bins with zero missing paths

Related Issue

Cross-references the original PR #8293 for full details, findings, and comprehensive witness coverage.


See PR #8293 for:

  • Complete rationale and findings
  • The deletion census with all dispositions
  • Witness-red disposition census
  • Cross-branch reference breaks
  • Frozen-artifact declaration details

Brian Searls and others added 30 commits August 15, 2026 17:17
v1 is an escape hatch for v2 (operator, 2026-08-15). Its Rust was never the
compiler: every stage -- tokenize, parse, resolve, infer, translate, emit --
is authored in .dag under src/v1 and emitted to src/v1/stage0/src. So v1 is a
second compiler written in .dag standing beside v2's, and it was the more
actively developed of the two (163 commits to src/v1/*.dag in 30 days against
146 to src/v2/compiler/*.dag) while 0 of 27 v2 modules could emit themselves.
That is DESIGN section 3's dual authority at the largest grain in the tree, and
the reason a month of self-host work produced no promotions: the replacement
was being grown in the shadow of a living original.

Deleted, as the root cut:

  src/v1/**/*.dag                        66 files, 59,829 lines -- the authority
  src/v1/stage0/src/bin/regen_stage0.rs  the regeneration loop over it
  dag/gunbc/stage0_emit_plan_generated.dag  its 142-entry output roster
  src/v1/stage0_core/                    orphan crate: tracked, in no members
                                         list, unbuilt, unenforced

RETAINED AND FROZEN: src/v1/stage0/src/**.rs. Every emitted .rs is committed,
so a fresh clone still builds gunbc with rustc alone -- the bootstrap loop was
only ever circular when PROVING the fixed point. What dies is not the binary;
it is v1's life as a compiler. With no .dag authority and no regen loop there
is nothing to improve, so the premise supply is cut by construction rather
than by discipline (DESIGN section 3: with X gone, the cheapest next action
and the first-principles action coincide).

regen_stage0 is deleted in the same commit deliberately, not as cleanup: left
standing it would compute an empty emit set against the deleted authority and
delete the 142 frozen files -- the regrowth trap, pointed at the seed itself.

Work now goes forward on v2 against the frozen Rust.

Integration branch per DESIGN section 3; base 8a799b6.
Red mid-loop is declared state. DO NOT MERGE until Y's green bar.

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

First literal build error on integration/v1-cut:
  cargo fmt --all --check -> file src/v1/stage0/src/bin/regen_stage0.rs does not exist

The binary source was deleted with the v1 authority; its [[bin]] target was not.
Class: declarations of a deleted build target.

- src/v1/stage0/Cargo.toml: remove [[bin]] regen_stage0
- gunbc.ci_release_bins witness_declared_release_bins: remove "regen_stage0"
  (the CI build job packs this list; a name here is a cargo --bin target)
- gunbc.devboot.program offered_programs: remove "regen_stage0"

Retired, not restored: no regen target is re-declared anywhere. Consumers that
still ADDRESS the bin (regen_verify_transport, self_host_realized_comparison_transport)
now refuse WitnessBinNotEnrolled rather than building it -- a typed refusal, and the
subject of the next class (the regen job and its verify/staleness gates).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…p being generated projections

Second literal build error on integration/v1-cut:
  error: no bin target named `regen_stage0` in `v1-compiler`
The committed ci.yml/falsifier.yml still spelled --bin regen_stage0; the roster
edit only reaches them through regeneration. Regenerated via
generated_artifact_gate main_wet with a gunbc built from this branch's frozen seed.

Blocking that regeneration was ONE reader of the deleted emit-plan roster:
  v2.workflow.ci_heal_skew_guard_emit -> gunbc.stage0_emit_plan_generated (deleted)

Decided, not routed around: the heal job's skew guard auto-resolves a merge
conflict with `git checkout --ours` for paths that are GENERATED PROJECTIONS,
on the ground that the discarded side can be regenerated. With the v1 .dag
authority and the regen loop deleted, src/v1/stage0/src/**.rs is a projection of
nothing -- taking ours there would discard the other side's bytes with no
generator to recover them, the exact defect the merge driver refuses over.
So the stage0 half of the exclusion set RETIRES: a conflict on a stage0 .rs is
now an authored conflict and the guard refuses. Fail-closed direction; no path
was dispositioned out of the subject.

.gitattributes falls out of the same fact through the live derivation, not by
hand: 140 `merge=generated-artifact` rows for stage0 .rs are gone because
deterministic_generated_projection_paths no longer derives them.

Still red, declared: the regen job itself (its verify/staleness gates, the
rustfmt PATH ensure, the skip witness) and the rest of the emit-plan roster's
readers -- the next class.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…e0 generated-membership on the registry

RULED BY OPERATOR ROUTE (option A). Running the heal on the cut tree RE-AUTHORED
dag/gunbc/stage0_emit_plan_generated.dag -- the 142-entry roster the cut deleted --
as a two-entry husk, because Stage0EmitPlanGeneratedDagArtifact was still a variant
in the generated-artifact registry. A regen output roster whose regen is deleted has
no subject; leaving the registry row makes every heal re-grow the corpse.

RETIRED WHOLE, at identity grain:
- gunbc.generated_artifact: the Stage0EmitPlanGeneratedDagArtifact variant, its entry
  in the all-artifacts list literal, and its path / commit-policy / eq arms. The list
  literal's brackets were checked explicitly (the sibling defect that survived four
  cargo-green pushes) and the whole-corpus gate below is the proof.
- gunbc.generated_artifact_emit: the generate and extra-valid arms, and the import of
  the content producer.
- dag/gunbc/stage0_emit_plan_emit.dag: deleted, orphaned by the above.
- gunbc.generated_projection_paths: the stage0 join, its plan-refusal cause, and the
  from_stage0_plan entry point.

THE MEMBERSHIP QUESTION IS RE-GROUNDED, NOT DELETED. 'Is this stage0 .rs generated'
still has consumers (seed-growth admission, the source-lifecycle scaffold) and still
has an honest answer: a file is generated iff something can re-derive it, and the one
authority for that is gunbc.generated_artifact. So gunbc.stage0_emit_model now asks
the registry -- is_generated_stage0_file is a lookup at the canonical stage0 path,
generated_stage0_files is a derived projection -- and the hand roster is gone. This
also closes the 98-vs-101 fork gunbc.roster_registry recorded, from the reader's end.

WITNESSES RETARGETED, NOT DROPPED (DESIGN 4b: evidence survives its machinery):
- witness_projection_population_contains_stage0_rust INVERTED into
  witness_stage0_rust_absent_from_projection_population on the same path, so a
  restored stage0 join reds instead of passing unnoticed.
- w_enrolled_manifest_equals_typed_emission_plan_derivation, whose left-hand side was
  the deleted roster, replaced by two claims asserting the registry grounding and the
  frozen-seed negative.

ONE SUBSTRATE FINDING, kept because it changed the design: leaving
GeneratedProjectionPathSource as a single-variant coproduct does not typecheck --
a one-arm 'type A = B' is an ALIAS, so it refused with 'unresolved type'. A
one-inhabitant discriminant carries no information anyway, so the axis is dissolved
and the row is just a path.

ALSO: restore src/v1/tests/fixtures/whole_tree_wiring_enum/{common,mod_a,mod_b}.dag
(19 lines). The root cut's src/v1/**/*.dag glob swept up test DATA whose consuming
test lives in the retained kernel and whose subject -- whole-tree enumeration seeing
fns outside a per-entry closure -- survives the cut. Correcting an over-broad
deletion, not restoring v1.

GATE: dag/tools/generated_artifact_gate.dag main_wet over --source-root dag
--source-root src/v2, exit 0 with zero diagnostics, after refusing the coproduct
error above -- it can go red, so it is a gate and not a receipt. The heal ran to
completion and did NOT re-author the roster: that absence is the regrowth receipt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…ers survive the cut

Same class as the whole_tree_wiring_enum restore: the root cut's src/v1/**/*.dag
glob took test DATA, not compiler authority, and both consumers live in the
retained kernel.

- src/v1/tests/fixtures/non_ascii_perf.dag (1,505 lines) -- read twice by
  parse_witness.rs (read_v2_file) for the tokenizer non-ASCII performance
  regression. parse_witness is a floor-enrolled release bin on
  gunbc.ci_release_bins, so this is a live executing consumer, not a dormant one.
- src/v1/stage0/tests/fixtures/fact_cardinality_split_brace.dag (8 lines) --
  include_str! at cli_run.rs, a COMPILE-TIME dependency of the seed's test
  build. Its absence does not red the release build (the reference sits in a
  test module) but would fail any cargo test compile of the frozen seed.

CENSUS METHOD, corrected mid-task: the first pass grepped for basenames, which
matches an emitted twin's provenance header as readily as a live read. Re-asked
from the other side -- enumerate every .dag path the cut deleted under src/v1
(64 of them), then join each against Rust STRING LITERALS in the retained kernel
-- which is a query over the observed population rather than a lookup of the
remembered one. That join found strictly more than recall did, including the
parse_witness finding now carried to the next boundary.

GATE: generated_artifact_gate main_wet, exit 0, zero diagnostics; and proven RED
first on a planted unterminated list literal in a module OUTSIDE the compile
closure -- the specimen shape -- which panicked at exit 101 naming the offending
file. Mutation and revert were both verified to land before either result was
read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…s onto the discovered corpus

parse_witness is a floor-enrolled release bin that read NINE deleted v1 compiler
sources. Those are the authority the cut deliberately deleted, so this is a
re-home, not a restore -- the subject survives (the parser handling a real corpus
of varied syntax is a language property, not a v1 property) while the fixtures
that carried it do not.

BREADTH: eleven per-file *_parses_strict rows collapse into ONE corpus_parses_strict.
Re-pointing nine names at nine other names would have re-imported the roster's
original defect: it counted the files someone remembered to name. The surviving
population is DISCOVERABLE, so it is discovered -- an identity join over every
.dag under the source roots, asserting zero unparsed and NAMING every failure with
its line. The two surviving dag/std rows go too: a walk that covers the tree covers
them, and keeping a named row beside it is a second representation.

SCALING: the three ratio claims took a hand-picked (small, large) pair. Their
oracles are relative (time ratio vs size ratio), so no literal was keyed to the
deleted files' sizes -- but the pair had to be re-picked by hand whenever it moved.
corpus_size_extremes() selects the extremes at runtime and asserts a 4x spread, so
the claim stays true as the corpus churns. Same for the flat-lookup claim, whose
oracle is exact (one index op per lookup) and needed only a large file.

DENOMINATOR STATED, not assumed: the walk covers dag/ and src/v2 -- the two source
roots -- and NOT the repository. .dag files outside them (test fixtures under
src/v1/tests/fixtures among them) are unwalked, deliberately, because a fixture may
be intentionally malformed and a corpus claim must not adopt one as a subject. The
gap is written down so 'does everything parse' gets the honest answer. Vacuous-guard:
the walk asserts it found >1000 files, so a mistyped or empty root refuses instead
of reporting zero unparsed and passing.

claim_executor.rs cited the deleted caret_parse_smoke entry TWICE -- but never read
it: the path is an in-memory label in a synthetic DiscoverySummary fixture. Repointed
to a plainly synthetic name rather than to another real-looking path, so no reader
mistakes an inert string for a citation.

MEASURED, not assumed: the whole bin runs in 18s including the 3,709-file walk, so
the corpus form fits the budget and no declared-bounded-subject fallback is needed.

PROVEN RED, then green: a planted unterminated list literal inside the corpus made
it exit 1 reporting '1 of 3709 corpus files failed to parse' with file and line.
Mutation and revert were each verified to land before either result was read. Built
under CI's RUSTFLAGS=-D warnings, which caught two orphaned registrations that a
plain local build would have passed as warnings.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
CI run 31900396249 gave the literal error: regen_verify_gate_passes returned
Bool(false), 'regen-verify gate failed: regen_stage0 witness binary unavailable'
-- the typed refusal the first cut commit predicted. build PASSED (10m12s), so the
frozen seed compiles; regen was the only real red, and ci died in 6s at a
fail-fast preflight carrying no verdict of its own.

ONE SUBJECT retires here: the self-host fixed point -- does re-running the emitter
over the v1 .dag authority reproduce the committed seed. With the authority and the
binary deleted there is nothing to re-emit and nothing to compare, so the question
is not unanswered, it is void. Nothing migrates.

Retired: RegenVerifyGate, SelfHostStalenessGate and SelfHostReadsRealBytesGate
(coproduct arms plus every dispatch, hash, label, commit-enrollment and eq arm);
tools.regen_verify_gate and _transport; the realized-comparison transport, claims,
gate and floor test; ci_regen_rustfmt_path_emit and its test; the regen spec, gate
projection, affected-set skip policy and shell shortcut in gunbc.ci_spec;
regen_floor_skip_witness (bin, [[bin]] target, roster row); the RegenBehavioralFixedPoint
ledger row; and the GithubActionsCiRegenJob surface, whose only rows were those gates.

AND THE REGEN JOB ITSELF, which is the half that mattered most. It could never go
green again, and the ci job's preflight FAILS rather than skips when an upstream is
non-success -- correctly, since a skipped job reports success to a required check.
Left standing it would have kept the floor from running for the remainder of the cut:
a real coverage gap produced by a dead consumer, not by a decision. Deleting it
RESTORES floor coverage. The preflight is untouched apart from losing the term naming
a job that no longer exists; softening a fail-closed arm to route around a dead
producer is the inversion DESIGN section 5 forbids.

WITNESSES: two synthetic fixtures cited a retired gate/surface incidentally -- their
subject is gate re-homing, not regen -- so they were re-pointed at surviving arms
rather than deleted, keeping their RED controls live. The gate-totality witness
(bag-equality between enrolled gates and every Gate arm) still holds because the arms
and their enrollments left together; that it stayed green through a three-arm
retirement is the receipt that this was not a narrowing.

NOT TOUCHED, per the do-not-edit-a-corpse rule: src/v2/workflow/ci_floor_plan.dag and
its witness carry 13 more arms of these gates and are ALREADY DELETED WHOLE on
integration/floor-cut, so cutting them here would be work on a file another lane has
removed. Verified by git cat-file against all four sibling branches before starting;
that check also confirmed the other files in this diff are live everywhere.

GATE: generated_artifact_gate main_wet, exit 0, zero diagnostics -- after refusing
twice mid-change on real unresolved references, so it can go red. The regenerated
ci.yml carries four jobs (build, ci, heal, fleet) and zero regen_stage0 references.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…t join not by CI

Ran the census from the OTHER side rather than waiting for the floor: enumerate every
.dag module whose defining file this branch deleted (72), then find every live module
whose import list names one. That is an identity-grade join -- imports name modules,
not bare words -- and it found FOUR live dangling imports my gate had not caught,
because the gate compiles the generated-artifact entry closure, not the whole tree.
My own denominator, stated rather than assumed.

A bare-NAME join was tried first and discarded as useless: it reported 123 hits, almost
all homonyms (Node, Token, Scope, Cardinality are independently declared in surviving
std modules). Names are not identities; only the import edge is.

FOUR, each decided rather than patched:

1. gunbc.stage0_partition_closure imported the deleted emit-plan roster to ask whether a
   basename is generated. Repointed to gunbc.stage0_emit_model is_generated_stage0_file --
   the registry-grounded membership this cut already established. Subject survives, the
   answer just comes from the single authority now.

2. src/v2/test/manual/ownership_movable_test.dag imported v1.compiler.ownership -- the one
   .dag outside src/v1 that did. RETIRED. Its own note already recorded that it is off the
   auto-path, not CI-enrollable, not resolvable on clean main, and that 'the live v1
   ownership logic is carried by the compiled seed... that is where the real coverage sits,
   not here'. So it was already unexecuted evidence for an authority this cut deleted. Its
   declared successor -- a v2-side witness over v2.compiler.use_site_verdict -- is forward
   work, not a restore.

3. tool_readiness_witness cited a frontier row in the deleted rustfmt PATH-ensure module.
   RE-HOMED, because the row's subject outlived its consumer: rustfmt is still spawned every
   CI run by the build job's fmt gate and still has no stable identity to pin against. The
   row moves to gunbc.tool_readiness -- the layer that declares UnpinnedToolFrontierRow and
   already names the frontier count as the migration remainder -- not beside its new reader.
   Its trigger was RE-DERIVED, not copied: it pointed at the deleted script, and a
   DeclarationRef to a deleted symbol greps clean while being false, which is exactly the
   stale-citation class DESIGN section 3 rules on. It now names gunbc.ci_spec ci_fmt_gate_line,
   the consumer that actually spawns the tool.

4. floor_gate_failure_receipt_witness imported both retired regen modules. Removed ONLY the
   regen half -- its planted fixture and three claims -- keeping the generated-artifact-drift
   and dag-compile-clean claims, which are live subjects that merely shared the file. This is
   the one file here that integration/floor-cut deletes whole; a four-line removal of things
   already gone resolves cleanly either way, where re-authoring its live claims would not.

GATE: generated_artifact_gate main_wet exit 0, and the import join now returns only that
floor-cut-deleted file. Zero live modules import a module this branch deleted.

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

FIRST REAL FLOOR CENSUS on this branch, and it was four errors in one file:
  src/v2/workflow/ci_floor_plan.dag:24:18  gunbc_ci_regen_spec not found
  ...:55:25 RegenVerifyGate  ...:56:3 SelfHostReadsRealBytesGate  ...:56:31 SelfHostStalenessGate
build PASS 10m47s, heal PASS, regen absent from the check list, and ci ran 2m18s instead of
dying at 6s -- the preflight cleared, which is what deleting the regen job bought.

THE PRIOR CALL TO LEAVE THIS FILE ALONE IS REVERSED, and the reason is specific rather
than general: ci_floor_plan.dag is the floor's own --plan-entry. Do-not-edit-a-file-a-
sibling-deleted holds for files whose only future is deletion; it does not hold for one
that is load-bearing on THIS branch until the replacement lands. Four dangling references
meant no floor census at all. Deleting the file whole -- which is floor-cut's move -- would
have traded four errors for no floor.

AND THIS IS NOT INVESTMENT IN THE FILE, IT IS FINISHING MY OWN RETIREMENT. I retired four
symbols; references to them survived where I chose not to look. Struck the references and
the arms they feed -- resource profiles, gate nodes, runnables, the regen->staleness
resource edge, the regen batch/plan entry -- plus the now-dangling CiRegenFloorPlan
PlanFunction variant, whose arm named a function this change deletes. Nothing in the plan
was repaired, improved, or re-enrolled.

ONE FIXTURE RE-POINTED, NOT DELETED: heavy_pair_spec used RegenVerifyGate as a SYNTHETIC
second heavy to construct a two-heavies-co-batch case the production roster cannot exhibit.
Its subject is the scheduler, not the gate, so it moves to SourceRootIngestGate -- heavy
whole-tree resolve, and off the ci-floor surface (its commit enrollment names the falsifier
cadence), so it genuinely adds a second heavy. One attribute is NOT preserved and the note
says so: the retired gate also spawned a host compiler. That was fidelity to a
long-deleted gate, not a requirement -- serialize-heavy keys on heavy_whole_tree_resolve
alone -- and a future property keying on host-compiler spawning needs a different fixture.
The repair also REUSES the file's existing ci_spec_with_source_ingest_gate rather than the
second adder my first cut wrote: one concept, one spelling, and the two synthetic specs
cannot drift.

RECEIPT, and it is the plan itself rather than a proxy: evaluating
gunbc_ci_floor_plan through the branch binary now returns a complete WalkPlan with its
batches built, where before it could not resolve. generated_artifact_gate main_wet exit 0.

A DENOMINATOR ADMISSION worth recording with this fix: my ci_spec bag-equality receipt
certified that the Gate arms and their ENROLLMENTS left together, and I reported it as
proof the retirement was complete. It was not that. It relates enrollments to arms;
ci_floor_plan CONSUMES those arms in match position and no totality witness relates
consumers to the coproduct, so it went stale silently while the receipt stayed green doing
exactly what it promised. A structural receipt still needs its population named.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
floor_job_waits_on_the_heal_preflight and
floor_refusal_tolerates_a_skipped_heal_but_not_a_failed_one were the
last two executing consumers naming the retired regen job: one pinned
"regen" in ci_job().needs, the other the "$REGEN" != "success" term in
the upstream-red refusal script. Both are inverted rather than deleted,
so the evidence stays enrolled one rung up (DESIGN 4b: a climb deletes
production machinery, never the evidence): they now assert regen is
absent from needs and REGEN absent from the refusal script, and red if
regen is reintroduced in any form.

Green by execution: 31/31 in ci_heal_job_witness_test.
The whole-tree compile-clean wall found the one dangling reference the
registry retirement left behind: test.claim.generated_artifact_drift
still imported and named the deleted variant at five sites.

Struck the import, the registry_contains, artifact_is_committed and
consumer_is claims, and the extra-validation positive. Decremented the
registry arity literal 16 -> 15 to match the coproduct the claim counts,
and dropped the !path_is_ignored row for stage0_emit_plan_generated.dag,
whose subject no longer exists.

witness_extra_validation_wired_refuses_on_generation_refusal SURVIVES on
its remaining arm: V1InterpreterDispatchGeneratedRsArtifact is still an
arm that reads the generated parameter, so the discriminating RED still
cannot pass under an arrow-true stub. Corrected the note, which claimed
two such arms of twelve.

Green by execution: 34/34.
Found by an exact reverse join (names my commits removed, minus names
still declared anywhere), not by CI. Nineteen sites, three of them real:

- witness_deferral_freeze: the FrozenPathDeferral row for
  src/v2/test/manual/ownership_movable_test.dag named 5 identities of a
  file the v1 cut deleted (it imported v1.compiler.ownership). A frozen
  row the tree no longer carries is a StaleFrozenPathDeferral refusal, so
  it deletes in the same direction the roster is permitted to move, with
  a shrink-log entry in the carrier's own documented format. No coverage
  is lost that was executing: the witness's own note recorded it as
  off-auto-path, undiscoverable and unresolvable on clean main.
- ci_floor_plan_witness_test: the falsifier gate pin named a retired
  gate, and the import list still named RegenVerifyGate. The pin shrinks
  to the surviving gate rather than being weakened to a length check, so
  it still reds on a de-enrollment.
- doc_graph_roots / walk_plan_schedule_lens_test: DeclarationRef and
  synthetic-fixture citations into deleted decls.

AND ONE WEAKER SURVIVOR. Body-diffing every function name defined in both
a deleted file and a surviving one found render_dag_string_list_items
forked: the copy in the deleted stage0_emit_plan_emit.dag escaped each
item, the survivor in stage0_crate_layout_emit.dag interpolates it raw.
Deleting the guarded copy would have left only the unguarded one, which
is a regression the deletion census cannot see. Ported the escaping into
the survivor.

Rung honesty: this restores a guard, it does not fix a demonstrated bug.
The survivor's three call sites pass basenames, filenames and directory
names, none of which carry a quote, backslash or newline today, so I
cannot exhibit a failure. The evidence is the deleted copy's own body.
Proven inert: the generated-artifact drift gate passes, so emitted bytes
are unchanged.
The both-directions derivation check found one real defect that neither
the compiler nor either of my earlier joins could see, because both
copies are source and the defect is entirely in the arrow between them.

gunbc.roster_registry registered the roster
gunbc.stage0_emit_plan_generated.generated_stage0_files with membership
ByDerivation from gunbc.stage0_emit_plan.generated_stage0_files_from_
emission_plan. BOTH module paths are deleted, and the roster itself did
not die with them: it moved to gunbc.stage0_emit_model and its
derivation changed to committed_generated_artifact_paths(). So the
registration was not merely naming a dead module -- it was FALSE ABOUT A
LIVE THING, and my own earlier commit is what falsified it. Repointed at
the live roster and the live predicate. This is distinct from the
scaffold-index class, which is not repaired: there the subject is gone,
here the subject survived and only its home and derivation moved.

AND ITS TRIGGER WAS WRITTEN FROM THE DELETED THING'S POINT OF VIEW. The
registry's note describes a live .dag-vs-Rust fork of this roster
(measured at 98 versus 101) and names its closing condition as
"regen_stage0 reads the .dag rows and the const is deleted". The first
conjunct is now structurally unable to fire -- no reader remains. The
fork nonetheless closed, by deletion of both sides rather than
convergence: GENERATED_STAGE0_FILES is gone from the seed, and the .dag
side asserts no list at all. Recorded as a dated correction rather than
deleted, because the 98/101 measurement is the evidence for why a hand
list beside a derived one was worth registering in the first place.

Typechecks: 0 blocking, 7 advisory -- identical to the same entry on the
fork base, so the advisories are pre-existing and not mine.
Both are the mechanism-versus-role class applied to prose I wrote today,
found by running the shape-changed and deleted-lane passes against my own
carriers rather than against the corpus.

ci_gate: the retirement note said the self-host fixed point "is not
unanswered, it is no longer a question". True of the LIVE comparison and
false as a role-level claim -- v2.compiler.self_host still carries
canonical_emitted_bytes_digest, self_host_fixpoint_equal,
fixed_point_scaffold and regen_staleness_authority, and
v2.test.execution.self_host_fixed_point still runs 15 witnesses over
them, measured green post-cut INCLUDING the three perturbation RED
controls. What retired is the gate that asked the question of the live
seed with a binary that no longer exists; the modeled relation and its
teeth remain, which is what a future v2-emitter gate binds to rather than
re-authors.

ci_spec: recorded what only the retired regen lane reached, enumerated
rather than assumed -- nothing. gunbc_ci_regen_spec carried
witness_entries: [], discovery_scan_dirs: [] and deploy_stages: [] at the
fork base, and the base tree pinned that by execution in the now-deleted
claim witness_regen_spec_carries_no_witness_corpus. All three gates
retired with the lane, so no check became unreachable and the split-pair
orphan class never formed here. Absence of orphans is a measurement, not
a default, which is why it is written down.

Verified by execution: ci_spec_witness_test 29/29, ci_gate compiles clean,
generated-artifact drift gate passes (no artifact moved).
Found by the prose-grain membership-versus-extent check: two notes I
rewrote today shrank materially (1285 -> 499 bytes and 924 -> 631), so I
enumerated what was inside them rather than trusting a four-line diff.

gate_enrollment_surface_asymmetry_note existed to justify why gates and
witnesses need SEPARATE scheduled-surface predicates. Its justification
was one worked instance: GithubActionsCiRegenJob executed gates but not
witnesses. My cut deleted that surface, so the two predicates now read
GithubActionsCiJob or FalsifierCadenceJob and nothing else -- BYTE-
IDENTICAL bodies. The note as I left it still called them "one law read
against two projector sets", which is now false.

Corrected to state the measured identity and its cause, and deliberately
NOT to merge them: a gate and a witness remain different kinds, and a
future surface executing one but not the other re-separates them. So this
records one concept under two names as a declared §2 violation held open,
rather than a fork nobody noticed or a de-fork decided by the lane that
happened to expose it.

The other shrunken note lost only regen-surface content, all of it
deleted; its live facts (the law, GitPrePushHook counting for neither
kind, the #6658 receipt) survive verbatim.

Typechecks 0 blocking.
Operator ruling on the degenerate fork my cut produced: neither merge the
names nor leave two identical bodies. The shared fact lives once in
enrollment_is_scheduled; gate_enrollment_is_scheduled and
witness_enrollment_is_scheduled both delegate to it.

Every consumer keeps its name, both CONCEPTS survive, and no future is
decided: the day a surface executes one kind but not the other, one of the
two stops delegating and the divergence lands in the place built to
receive it. Merging would have deleted a live distinction; two identical
bodies stated one fact twice. Deriving does neither.

Typechecks 0 blocking.
The invocation sweep's positive control found it. Controlled against
three bins that ARE invoked -- claim_executor, claim_batch, gunbc show
95/98/1506 .dag hits, 3/3/4 workflow hits and 2/4/5 Cargo.toml hits -- so
the sweep can see invocation sites in all three media and its zeros are
real absences rather than a blind filter. Against that control,
regen_stage0 came back 0 workflows but ONE Cargo.toml hit.

It is a comment, not a target: claim_batch's header cited regen_stage0 as
its exemplar of a hand-written CI tool. Repointed at parse_witness, which
is hand-written, live, and in the same file. Not investment in the frozen
seed -- it is the deletion half, removing a citation whose subject I
deleted, in a file this cut already edits.
Found from the roster authority rather than from headers. The deleted
regen_stage0 carried assert_registry_is_partitioned, which refused if any
member of generated_stage0_files() also appeared in
HAND_MAINTAINED_STAGE0_FILES. On this branch it would REFUSE:

  generated_stage0_files()  = [bootstrap_stage0_crate_layout_generated.rs,
                               v1_interpreter_dispatch_generated.rs]
  HAND_MAINTAINED contains    v1_interpreter_dispatch_generated.rs

THE CAUSE IS A SUBJECT CHANGE, NOT A NEW OVERLAP. At the fork base that
function answered "which files does regen_stage0 emit"; my re-home made it
answer "which stage0 paths are committed generated artifacts". The hand
roster is written in a THIRD sense -- frontier hand_maintained means NOT
SELF-EMITTED BY v2 -- which a gunbc-produced artifact can be while still
being generated. So it is a §3 collision between three readings of one
word, exposed by the re-home rather than created by it, and the only
consumer that joined the two rosters was deleted by this same cut.

Not claimed: that anything is broken today. Nothing surviving joins them.
Restoring the assert would be investment in frozen Rust whose host binary
no longer exists. Declared as a rung drop with its measurement.

AND MY OWN WITNESS CANNOT SEE IT. w_hand_maintained_not_classified_generated
names three files -- cli_run.rs, v1_interpreter.rs, main.rs -- and asserts
they are not generated. It is a 3-of-29 sample carrying the population's
name, so it stays green across exactly the defect it reads as covering.
Left green rather than widened to the roster, because widening it reds the
floor on a §3 de-fork that is not mine to decide.

Green by execution: 10/10 in stage0_emit_model_witness_test, 0 blocking.
Operator ruling: the partition violation is a NAMING violation, not a
membership one. Three senses of "generated" are live -- what regen emits,
what is a committed generated artifact, what the v2 frontier does not
self-emit -- and the second and third are not complementary, so their
overlap is not a contradiction. It read as one because a function that
changed its question kept its old name. §3 inverted: one name for two
concepts.

  generated_stage0_files      -> committed_generated_stage0_artifact_files
  is_generated_stage0_file    -> is_committed_generated_stage0_artifact
  generated_stage0_file_count -> committed_generated_stage0_artifact_count

Move and rename are separate commits: the re-home landed hours ago, so
this carries the name change alone and every citation that named the old
symbol was updated in the same motion rather than left to rot.

Also renamed w_hand_maintained_not_classified_generated to
w_three_named_hand_files_are_not_committed_generated_artifacts. It tests
cli_run.rs, v1_interpreter.rs and main.rs -- three of twenty-nine -- while
carrying the population's name, which is the fourth instance of that shape
found today. Renamed rather than widened: widening reds correctly and
forces a de-fork this cut is not about.

DOES NOT FIX THE LIVE RED. w_scaffold_generated_hand_disjoint_holds and
scaffold_join_mechanical_checks_holds fail on this branch and pass at the
fork base under the same binary -- my re-home caused it, and the fix is
an open decision reported upstream. Re-ran that bisect AFTER this rename
and both arms are unchanged, which is the control against papering over a
red with a name.

0 blocking; stage0_emit_model_witness_test 11/11.
…lation

The check compared the committed-generated-artifact registry against
derived_hand_maintained_stage0_repo_paths, which answers LAYOUT MEMBERSHIP.
A committed generated artifact must be a layout member or the crate stops
linking, so overlap there is expected and disjointness was never true of that
pair; it only read as true while the generated side answered a narrower
question. Re-homing that side onto the registry made the false property
visible as a red.

Repointed to derived_hand_maintained_disposition_repo_paths -- layout
membership minus the registry overlap -- the maintenance-disposition
population this module had already published, with
v1_interpreter_dispatch_generated.rs named in
generated_artifact_disposition_derivation_note as the discriminating case.

Kept rather than retired as a tautology: the disposition population subtracts
generated_artifact_stage0_src_repo_paths while the check compares against
derived_generated_stage0_repo_paths -- two projections of one registry by
different routes. Disjointness holds only while the routes agree, so the check
guards that agreement. It retires when one projection derives from the other.

41/41 PASS on the scaffold witness.

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

algebra_count_length_name_fork_note argued that a dissolution trigger must be
NAMED rather than described, citing v1.compiler.infer unresolved_method_frontier
as its exemplar of a findable one. This cut deletes that carrier, so a live std
module was left asserting a name that resolves to nothing -- a stale citation
inside the argument for symbolic citation.

Kept in the past tense rather than repointed. The argument is about the FORM of
a trigger, which the retired row still exemplifies; substituting a surviving row
would mint a fresh citation nobody checked.

The trigger feature:primitive-realization-single-authority is unaffected -- a
feature name, not a declaration -- and is still carried by std.primitive_identity.
That clause was WRONG on first writing (it named v2.std.determinism, which does
not carry it) and was corrected by grepping before commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…ed, keep 8

Largest single population of the batch-3 witness red on 147b210: 35 of 60
failures sat in this one file. It audited v1 COMPILER SOURCE through 25
hard-coded src/v1/*.dag path literals, all of which this cut deletes.

RESOLVED PER ROW, NOT PER FILE. It is a mixed carrier: eight rows audit
extdeps.languages rust/python/go emit template derivation and the rust syntax
spec at dag/extdeps/languages/rust/syntax.dag -- none of it v1. Retiring the
file whole would have vanished eight live guards. All eight execute green after
the split.

ATTRIBUTION MEASURED, NOT INFERRED: the same five rows PASS at fork base
8a799b6 and FAIL at head under the SAME binary, only the tree moving. These
failures are mine, not pre-existing population newly exposed by unshrunk
discovery.

The diagnostic named the wrong class. Each of the 35 reported "hermetic mode:
no mock_response for operation Read -- refusing to fabricate Unit", which reads
as a harness-config fault and is in fact what a MISSING FILE produces here. That
is correct fail-closed behavior and the good outcome: a subject-less guard
refused loudly instead of greening on nothing.

Kept deliberately: live_tree_disposition stays ReadsLiveTree -- the surviving
syntax-spec row still reads the live tree, and the decl is consumed by the
discovery harness rather than any in-file reference, so an orphan sweep counting
in-file uses would wrongly call it dead. Dropped two genuinely dead helpers
(rust_types_path, src_lacks).

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

After the split, eight guards remained and NONE audits v1 source -- they cover
extdeps.languages rust/python/go emit template derivation and the rust syntax
spec. A file named v1_source_audit_witness_test.dag containing zero v1 source
audits is a filename trap pointing FORWARD: the next cut through this region
confirms v1 is gone and deletes it, which is the vanishing-guard class. The
split was careful not to fall for that on the way in; leaving the name behind
re-arms it on the way out.

Renamed rather than moved: no existing witness owns the emit-template-derivation
subject (the v2 emit tests cover semantic_decl emit, a different subject), so
there was nothing to merge into. No function was renamed -- the file moved, the
symbols did not.

Reconciled witness_row_cost_basis.tsv in the same motion: all 12 rows keyed to
the old path named RETIRED functions and none named a survivor, so a bare rename
would have dangled all twelve. Dropped.

All eight execute green under the new module path.

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

Second population of the batch-3 witness red: 9 rows in
guarantee_probe_corpus_witness_test.dag. Attribution measured, not inferred --
same binary, same rows, fork base 8a799b6 PASS, head FAIL, only the tree
moving.

Root was not the witness. v1_compile_harness_source_paths() is a CONTENT-DERIVED
FINGERPRINT over everything whose edit can change which diagnostics a synthetic
subject provokes, and five of its ten entries were v1 .dag pipeline stages this
cut deletes.

REPOINTED, NOT RETIRED, and the distinction is the point. The v1 pipeline did not
stop existing when its .dag authority was deleted -- it stopped being generated
and became the frozen seed. An edit to that seed changes probe outcomes exactly
as an edit to the .dag stage did, so the fingerprint's membership must follow the
AUTHORITY, not the file extension. Retiring the rows would have shrunk the
fingerprint to cli_run.rs alone and made a real harness change invisible: a
silently narrowed provenance key, worse than a stale one because it still
computes.

Mapping verified file-by-file, not by naming rule -- each of the five resolves to
exactly one distinct twin. Note 04_method.dag -> v1_compiler_infer_method.rs is a
NESTED prefix no stem-based rule produces, which independently shows my earlier
"32 at-risk twins" join was an undercount.

All 45 rows in that witness now pass, 0 fail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
…to an identity join

Third population of the batch-3 red. Both rows are mine, from the commit that
made stage0 .rs stop being generated projections.

RETIRED excludes_stage0_emitted_rust_holds. Its subject is gone in the strong
sense: the guard excludes generated projections because the discarded side of
such a conflict can be regenerated, and stage0 .rs is a projection of nothing
now. Excluding it would be actively WRONG, not merely stale -- --ours there
discards authored bytes unrecoverably. The assertion retires because the
behaviour it pinned must no longer happen.

KEPT and STRENGTHENED exclusion_roster_is_nonempty_holds. Correcting the
hypothesis it was flagged under: the roster did NOT go empty. Excluded paths are
exactly committed_generated_artifact_paths(), which is nonempty, so the guard
still excludes real paths and was never a shape executing over nothing. It went
red because the old assertion was length(excluded) > length(registry) -- an
assumption (registry PLUS stage0 rust), not an invariant -- and the two sets
became equal.

Repaired as SET IDENTITY in both directions plus nonemptiness, deliberately NOT
> relaxed to >=, which would have been the weaker survivor. DESIGN section 5:
completeness is an identity join, not a count equality. A count cannot
distinguish the registry from a same-sized wrong set.

Removed a fork I minted while doing it: the first draft added
excludes_every_REGISTRY_artifact beside the existing excludes_every_REGISTERED_
artifact -- one concept, two names. The existing row plus the identity join
implies it.

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

RULED: I deleted a generated ARTIFACT, its GENERATOR and the registry hookup,
then read the artifact's absence as an AUTHORITY loss and went looking for a
replacement. gunbc.stage0_emit_plan was intact on this branch the whole time.

Restored: stage0_emit_plan_emit.dag (the renderer), the
Stage0EmitPlanGeneratedDagArtifact variant + registry entry + path + commit
policy + eq arm, the artifact_generate and artifact_extra_valid dispatch arms,
and stage0_partition_closure's original import. Then REGENERATED the projection
via generated_artifact_gate main_wet rather than restoring its bytes -- the
whole point being that it is derived. .gitattributes and ci.yml updated
themselves from the restored registry entry, which is derivation working rather
than three hand-patches.

MEASURED, AND IT CORRECTS MY OWN REPORT: the regenerated projection is SEVEN
files, not the 286 of the fork base and not the 2 my repoint produced. With the
v1 .dag sources deleted, the emission plan over regen_input_sources legitimately
covers only what remains. So "286 -> 2" overstated the correct value; the honest
post-cut answer is 7, and module_is_emitted returning false for the rest is now
correct rather than a narrow.

A NOTE OF MINE IN stage0_emit_model RECORDS "a two-entry husk" from running the
heal earlier in this cut. I measure 7 now. The population moved as the cut
progressed -- later commits restored swept test fixtures -- so that sentence is
a measurement of an earlier tree, not of this one. Recorded here rather than
silently overwritten.

Verified by execution: generated_artifact_drift 34 pass, stage0_emit_model 11,
stage0_rust_source_lifecycle_scaffold 41, zero failures in each.

STILL RED, and no longer for this reason: the four stage0_partition_closure rows
pin a fixture on std_measure as "the real emitted module". std_measure.rs is on
disk but is NOT among the 7 -- it stopped being emitted when its emitter
authority went. That is a fixture-subject question, not this repair.

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

RETIRED, with a receipt in the carrier, per ruling: the four rows pinned a
fixture on std_measure as "the real emitted module", and std_measure.rs is now a
file whose role is gone -- on disk, but not among the seven the regenerated
emission plan carries.

REPOINTING WAS TRIED FIRST AND REFUTED BY MEASUREMENT, not rejected on principle.
wt_common carries a real cross-module reference (use crate::v1_rt) and both sides
are in the live seven, which looked like an exact replacement. It fails because
NO .dag MODULE EMITS wt_common -- it appears in the corpus only inside the
generated projection -- and the same holds for wt_a, wt_b and
v1_test_non_ascii_perf_fixture. The fixture maps basename -> module path ->
targets, and these have no module path. The population the witness needs is not
short a member; it is empty.

DERIVING FROM THE LIVE PLAN was the other branch and it has a price already
measured in this file: fixture_cost_note records one live verdict at ~175s thread
CPU against a 5s fast-lane budget, which is why these rows became a fixture at
all. Re-deriving reinstates exactly that cost.

RETAINED: the two reachability rows, which need no emitted module and pass.

SEPARATELY, provenance stamped on stage0_emit_model's regrowth-trap note. It
asserted "a two-entry husk" with no tree and no date. That was a real measurement
of an EARLIER point in this same cut; the same regeneration now yields seven,
because later commits restored swept fixtures. Its conclusion -- retire the
roster whole -- was also reversed by the restore-the-generation-path ruling. Kept
and annotated rather than rewritten: a conclusion without provenance is
indistinguishable from a measurement to the next reader, and this one nearly was
to its own author four hours later.

Verified: partition closure 2/2 pass, stage0_emit_model 11/11 pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
Both carriers are mixed, so both resolved per row rather than per file.

RETIRED (subject deleted): compiler_tests_rust_blobs_are_all_rostered and
runtime_rust_blobs_are_all_rostered counted declarations inside
src/v1/compiler_tests_rust.dag and src/v1/runtime_rust.dag, which this cut
deletes. Three sibling rows have nothing to do with v1 blobs and pass unchanged.

NARROWED, NOT RETIRED -- and this is a finer grain than carrier or file:
single_authority_lives_only_in_std_occurrence_binding_candidates_holds asserts a
§3 single-authority property across THREE files. Two survive and their clauses
are untouched. Only the clauses naming the deleted
src/v1/gunbc/occurrence_binding_parser_walk.dag were dropped. Retiring the row
would have vanished a live guard over two surviving authorities.

TWO CORRECTIONS TO MY OWN FIRST PASS, recorded in the carrier rather than fixed
silently. I said TWO clauses named the deleted file; there were FIVE. And I said
they were all negative and therefore vacuous; four were, but THE FIFTH WAS
POSITIVE -- it asserted the v1 parser walk actually CONSUMES the std authority.
That clause did not go vacuous, it went away with its subject, and its loss is
real: one consumer of that authority is no longer witnessed, because the consumer
is deleted. Stated as a loss rather than folded into the vacuous four.

Verified: language_source_scaffold_index 3/3 pass, cross_file_binding_assembly
11/11 pass.

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

The restore-the-generation-path ruling reversed the premise my stage0_emit_model
re-home rested on ("the roster had no producer"). Completing it rather than
leaving half the corpus pointed at the substitute.

REVERTED TO FORK BASE: stage0_emit_model.dag, stage0_rust_source_lifecycle_
scaffold.dag and both their witnesses. That restores a distinction my cut had
collapsed: derived_generated_stage0_repo_paths() is the EMISSION PROJECTION,
while generated_artifact_stage0_src_repo_paths() is the DRIFT REGISTRY. My
re-home pointed the first at the second, making them duplicates -- which is why
derived_generated_hand_disjoint_holds degenerated toward a tautology earlier
tonight. With the projection restored, the base logic holds on its own terms and
the earlier repoint is unnecessary.

THREE OF THE FOUR REMAINING Bool(false) REDS CLEARED WITH IT, unedited:
lifecycle_totality_discovery_and_decision_are_separate,
lifecycle_totality_positive_control_discovery_complete, and
honest_frontier_integration_separates_discovery_from_decision. They consumed
derived_file_grain_classified_repo_paths() and were reading the collapsed
population. They shared the root, as predicted.

TWO BASE ROWS THEN NEEDED DISPOSITION, because reverting restored rows that pin
a population the cut legitimately shrank to seven:
  NARROWED w_generated_files_classified_generated -- pinned ten basenames, only
    lib.rs still emitted. Its claim (the classifier answers yes for a generated
    file) has live subjects, so it names four real plan members AND gains a
    NEGATIVE control (cli_run.rs must classify false) so it cannot pass by the
    predicate answering yes to everything.
  RETIRED w_occurrence_binding_identity_emit_enrolled_generated -- asserted one
    specific module's emission enrollment. Nothing to narrow to; the loss is
    stated rather than absorbed.

Verified: scaffold 41/41, emit_model 11/11, lifecycle 7/7, honest frontier pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
Last of the 57. I retired the regen behavioral fixed-point spine row (its
emitter authority and binary are both deleted, so its dissolution trigger can
never fire and its subject cannot be observed) but never updated the witness
that pins the ledger's shape: 3 -> 2 spine, 13 -> 12 total, 3 -> 2 blocked.

NOT A LITERAL BUMPED TO RESTORE GREEN, and the note beside it says why. The
discriminating claim is structural and conjoined: ledger_all_spine_kinds_present
enumerates exactly the two surviving kinds, and VerificationReceiptKind no longer
HAS a regen variant, so a re-added regen row cannot typecheck into this ledger
without also re-adding the variant and failing that check. The counts pin the
shape of a closed hand-authored roster; the kind enumeration is what makes the
row more than a change detector.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
gunbc-ci-auto-heal and others added 5 commits August 16, 2026 13:58
… subject

DESIGN section 3 disposition (c), a need that retires with v1. Sixth red of the
cut, and the last of a class CI could only report one member at a time.

THE SUBJECT IS GONE. Six file-grain entries named files under src/v1/tests/claim/;
the cut deleted every .dag under src/v1 and that directory does not exist. The
floor failed no assertion -- all three discovery summaries reported zero failures
-- the enumerator refused on the file-grain expand read.

CENSUSED MECHANICALLY, NOT DISCOVERED ONE AT A TIME. Every .dag path literal in
ci_layer_roots was tested against the filesystem: exactly six absolute entries
missing, every relative pattern resolving under a source root. Re-run tree-wide
afterwards, zero src/v1 paths remain in any roster carrier.

NO SMALLER CUT IS CORRECT. Deleting only the entries leaves an armed batch with
no rows, which is precisely the header-only ledger the dissolve-on note says the
decoder deliberately refuses. Emptying the roster alone breaks the singleton
assertion. So the instance retires whole: entries, batch, trigger type, dissolve-on
and its note. THE GENERIC MECHANISM IS UNTOUCHED -- ScopedWitnessBatch, the
constructor, the decoder and the coordinator arming all survive, and
scoped_witness_batches remains as the roster a future instance enrolls into.

THE COUPLING THE NOTE WARNED ABOUT WAS CHECKED, NOT ASSUMED: with the roster empty
the plan fold appends no scoped runnable, so nothing is armed at all. The
header-only case arises from an armed batch producing zero rows, not from an
unarmed absence, so the decoder keeps its refusal.

CLAMP ARITHMETIC. The batch OWNED its clamp and never consumed a positional row,
so ci_spec's six-row table is unchanged and the structural invariant
(witness_floor_batch_clamp_params_cover_schedule, which counts positional batches)
still holds. What moved is the derived identity params == batches - 1, where the 1
was exactly this clamp-owning batch; it is now params == batches.

DECLARED COVERAGE LOSS, not a climb. This was the only clamp-owning batch in the
tree, so floor_batch_clamp_authority_witness loses its LIVE second population. The
claim that some actual scheduled batch cites its own declaration now has no subject
and is asserted nowhere. The MECHANISM claim -- that a batch-owned clamp and the
positional row are distinguishable by authority and by value -- is kept against a
synthetic carrier, with a restore-on. Deleting the control instead would have been
narrowing.

The declared dissolution did NOT fire as written: the trigger was V2ParserOwnsV1Claims
and v2 owns nothing here -- the claims were deleted. Operative trigger is subject
extinction, recorded rather than smoothed, same shape as the v1_src_dag_parse receipt.

Citations updated rather than orphaned: two retired test names were cited in prose in
std.realization_schedule and gunbc.ci_spec, which is the stale-citation class this
branch already repaired once.

Verified by execution: ci_floor_plan_witness 37/37, floor_batch_clamp_authority 5/5,
pr_native_batch 7/7, generated-artifact regen clean with no drift.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
DESIGN section 4c: the .dag realization admits only standalone LEADING blocks on
module-scope declarations; body position refuses. I introduced three such lines in
62d4b53, inside witness_selection_flip_scope_is_exactly_the_ordinary_corpus,
and compile-clean refused them.

WHY THEY WERE THERE, since it explains the slip rather than excusing it: the
declaration's existing leading block claimed "the v1 scoped batch still selects",
which my own retirement had just made false. I wrote the correction where the stale
thing was USED instead of where it was DECLARED. Folding fixes both the placement
and the stale claim in one edit, which is what the leading block now carries: the
boundary named two non-flipped lanes and has one left.

UNIVERSE CHECKED, because compile-clean refuses first-hit and fixing one line can
buy another round trip. Censused every changed .dag file on the branch for a comment
at brace depth greater than zero: exactly these three lines, nothing else.

ORACLE CALIBRATED RATHER THAN TRUSTED. claim_batch is NOT the instrument here -- it
passed this file 37/37 with the defect present, because resolve does not run the
annotation placement rule. The gate itself refuses when run standalone (it must
consume the executor's whole-tree compile receipt), which is a refusal and not a
finding. gunbc run DOES apply the rule at ingest, established with a planted positive
control: planting a body comment reproduces the exact refusal at the exact line, and
the fixed file passes ingest and evaluates.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
Brings 216b25a, which removes the two unrostered non-fold-residue sites in
the Spark serving path. Those were the cause of this PR's red: established by
A/B rather than inferred, and now closed the same way.

    this head alone, before          unrostered=0   both witnesses PASS
    merged with main, pre-repair     unrostered=2   both FAIL
    merged with main, post-repair    unrostered=0   both PASS

Note the repair took the better route -- it removed the sites rather than
rostering them, so it added no new dissolution obligations.

THE GENERATED-ARTIFACT CONFLICT WAS RESOLVED BY REGENERATION, NOT BY PICKING A
SIDE. .github/workflows/fleet-converge.yml conflicted (this branch regenerated it
when the v1_src_dag_parse bin left the release pack; main regenerated it for its
own reasons). Both .dag authorities auto-merged cleanly, so the artifact was
rebuilt from the merged authority through generated_artifact_gate main_wet.

That this is not pedantry is measured: the regenerated bytes differ from BOTH
sides, so either side-pick would have committed a projection no authority
produces -- which is the drift the generated-artifact merge driver exists to
refuse. Confirmed at the fixed point: a second regen is byte-identical.

Verified on the merged tree: non_fold_residue 3/3, stage0_seed_retention 7/7,
ci_release_bins 8/8, floor_batch_clamp_authority 5/5.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
One conflict: src/v1/stage0/Cargo.toml, at the [[bin]] list. NEITHER SIDE OF THE
HUNK SURVIVES, and that is the measured resolution rather than a compromise:

  ours   v2_whole_tree_parse_scan  -- main DELETED its source (present at
                                      346e23e, absent at c56f4b4)
  theirs v1_src_dag_parse          -- this branch retired it in e57ea5c and
                                      deleted its source

Keeping either declares a [[bin]] whose path file does not exist in the merged
tree, which is a cargo build failure. Keeping both fails twice. Dropping both is
the only resolution in which every declared target has a source.

Validated rather than argued: the manifest parses with 33 bin targets, neither
dead name declared, and ZERO bin targets whose path file is missing.

Both intents preserved elsewhere, checked individually: this branch's scoped-batch
retirement (empty scoped_witness_batches, no v1 claim entries, receipt intact) and
main's restoration of frontier_probe_survey, discover_source_root_ingest,
effects_rest_transport_witness and resolution_divergence_census to the release pack.

Generated artifacts are at the fixed point: regeneration from the merged authority
produced no changes.

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

src/v1/tests/claim/v1_annotation_erasure_test.dag was deleted by this cut because
every symbol it called was a v1 module. Its SUBJECT was never v1: §4c states that
annotation capture is disjoint from semantic occurrence allocation. The obligation
outlived its realization, so it is re-enrolled here rather than re-authored against
the deleted path — the test of which is what the witness CALLS.

All three halves proved expressible against v2, so NO §4b(3) rung-drop is taken.
Each carries its own control at its own grain, verified red by planted defect:

  1. SHAPE      hash(annotated) == hash(bare), through parse and normalize.
                Control: declarations present vs absent moves the digest.
  2. IDENTITY   the body callee survives; no payload word becomes an atom.
                Control: a renamed callee moves the atom set in both directions.
  3. PROVENANCE every token after the prose shifts by EXACTLY 18 bytes, token
                population unchanged. Asserted against a declared constant, not
                a direction, so a wrong-amount shift cannot satisfy it.

Three measurements corrected the obvious authoring of this, each of which would
have landed a row with no mechanism by which it could be false:

  - content_hash folds node kind and edge label ONLY (Fnv1a64Structural — a SHAPE
    fingerprint), so a renamed declaration provably cannot move it. A rename is a
    false control for half 1 and the right control for half 2.
  - DECLARATION NAMES ARE NOT ATOMS in today's normalized tree: the probe's own d3
    is absent from it. Asserting d3-absence on the annotated side would have passed
    whether or not prose leaked. Half 2 asserts at body-callee grain instead, the
    same grain namespace_graft_body_dissolution_witness_test uses, and climbs to
    declaration grain when decl-name binding through the containment index lands.
  - a data-decl-with-String-literal module is REFUSED by normalize, which would have
    rendered every hash "REFUSED" and collapsed all three halves into a comparison
    of two refusals. The probe bodies use the shape normalize is witnessed to accept,
    and a non-vacuity claim asserts all four sources reach a real digest first.

17/17 green. Controls confirmed red under planted defects, each plant verified to
have landed before its result was believed — the first attempt at one plant was a
silent no-op that read as a passing control.
@briansrls
briansrls marked this pull request as ready for review August 17, 2026 02:01
@gunbai-bot gunbai-bot Bot changed the title delete v1 compiler v1 cut: delete the v1 compiler authority, freeze its emitted Rust as the seed Aug 17, 2026
The regen_stage0 binary was deleted by the v1 cut PR, leaving the owned-CI
executor with a stale dispatch to a deleted authority. CiRegenStage is now
retired completely per DESIGN §3 step 6 (replacement cut).

DISPOSITION: retire CiRegenStage, not replace.
- regen_stage0 binary is deleted with no successor
- nothing else constructs CiRegenStage
- the binary's source (src/v1/stage0/src/bin/regen_stage0.rs) is deleted
- the v1 cut program intentionally reduced regen references from 28 to 6 on main,
  establishing the clear intent of the binary deletion

The 7 regenerated files the v1 cut author cited (compiler_tests, lib, v1_rt,
v1_test_non_ascii_perf_fixture, wt_a, wt_b, wt_common) do not require owned-CI
dispatch — they are build-time outputs, not part of the owned executor's pipeline.

Changes:
- Remove CiRegenStage from CiExecutionStage type
- Remove CiRegenStage from ci_execution_default_stages (was [Build, Regen, Floor],
  now [Build, Floor])
- Remove CiRegenStage arm from ci_execution_stage_wire match
- Remove stage_regen function from ci_control_plane.rs
- Remove "regen" dispatch arm from ci_control_plane.rs
- Update owned_ci_witness_test to assert the new 2-stage order
  (witness_execution_plan_stages_build_regen_floor → witness_execution_plan_stages_build_floor)

Fixes #8352 REQUEST_CHANGES

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session/crisp-boar-827
@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Resolves review 52732 (REQUEST_CHANGES).

Disposition: Retire CiRegenStage — the regen_stage0 executor stage is removed across the coproduct type, default stages list, wire mapping, dispatcher arm, and witness.

Verification of the fix:

  1. No other code matches on CiExecutionStage — only the dispatcher arm and wire mapping function examined the variant
  2. The updated witness properly discriminates — it asserts 2-stage order [Build, Floor] and will fail if stages are reordered
  3. The fix is now on integration/v1-cut:
    • git grep CiRegenStage origin/integration/v1-cut -- dag/gunbc/ci_execution_plan.dag → 0 matches
    • git grep stage_regen origin/integration/v1-cut -- src/v1/stage0/src/ci_control_plane.rs → 0 matches

Retirement receipt (why the subject is gone, not merely that the binary was deleted):

  • Generated-artifact drift validation still occurs but is now checked by the heal job
  • 185 regen/drift carriers exist on main; 184 survive on this branch (one removed by the stage deletion)
  • All 6 surviving ci.yml regen mentions are in the HEAL job section
  • heal_generated_artifacts runs as its own CI job and passes
  • The executor no longer needs to run regeneration because that checking obligation is discharged by the heal job pipeline

This is distinct from "the binary was deleted" — the stage is retired because its obligation has moved elsewhere. Generated-artifact drift checking survives.

— sent from crisp-boar-827

Brian Searls and others added 2 commits August 17, 2026 02:58
Reviews 52769 and 52773 on the v1 cut. All four reported findings confirmed
against the branch; four more were found by sweeping the same classes, and one
of those would have failed the enrolled witness.

The rustfmt requirement is REPOINTED, not deleted. floor_gate_component_requirements
named floor_self_host_realized_comparison_gate_entry, a gate this cut retires, so
it asserted a component was required by a consumer that no longer executes. But the
obligation did not die with the symbol: rustfmt is still needed because
gunbc.ci_spec ci_fmt_gate_line still runs cargo fmt --all --check, and this cut had
already re-homed gunbc.tool_readiness rustfmt_unpinned_frontier onto that same
declaration for the same reason. Deleting the row would have emptied the list while
rustfmt remained necessary -- asserting "nothing needs rustfmt", the bottom-conflation
DESIGN refuses, and a worse error than the stale citation it replaced.

Found by sweep, not by review:
  - host_toolchain_components_witness_test pinned the retired gate's name, so the
    repoint could not land without dispositioning it; it now pins the live consumer
    and still discriminates.
  - witness_executor_stage_labels_match_plan asserted three stage labels including
    "regen" while owned_ci_executor_stage_labels() yields two. Its sibling was
    updated when CiRegenStage was retired and this one was not, and the bundle
    conjoins both -- the enrolled witness would have failed. (Review 52773 reported
    this independently on the twin PR.)
  - ci_heal_skew_guard_emit carried a SECOND citation of the deleted emitter beyond
    the one reported, in ci_heal_skew_indent_residue_note.
  - ci_workflow ci_floor_gate_toolchain_note described the retired gate and the
    deleted PATH-workaround emitter; its surviving half kept it looking current.
  - ci_heal_skew_guard_emit_test cited a deleted sibling test module as its contrast.

Deleted outright: floor_self_host_realized_comparison_gate_entry and
floor_self_host_realized_comparison_claims_entry, both paths to deleted files. The
claims entry had no consumer at all; the gate entry lost its last one on the repoint.

Left alone deliberately: ci_materialization's Receipt 6 and tool_readiness's re-home
note both name retired symbols inside historical records. That is the sanctioned
pattern -- deleted symbols stay findable in retirement notes -- and the test applied
throughout was whether a citation makes a live claim about current behaviour or
records what happened.

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

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Both reviews verified against the branch and fixed in `28cc56f6fc`. Every reported finding was real; the sweep found four more, one of which would have failed the enrolled witness.

Confirmed and fixed — review 52769:

  • `floor_gate_component_requirements` required rustfmt via a DeclarationRef to `floor_self_host_realized_comparison_gate_entry`, a gate this cut retires.
  • `toolchain_requirement_derivation_note` described that gate as the sole requirer.
  • `floor_self_host_realized_comparison_gate_entry` / `..._claims_entry` — two constants holding paths to deleted files.
  • `ci_heal_skew_guard_emit_authority_note` cited `ci_regen_rustfmt_path_emit`, deleted here.

Confirmed and fixed — review 52773 (reported on the twin PR #8359, which carries a byte-identical tree): `witness_executor_stage_labels_match_plan` asserted three stage labels including `"regen"` while `owned_ci_executor_stage_labels()` now yields two. Its sibling was updated when `CiRegenStage` was retired and this one was not, and `witness_owned_ci_witness_bundle` conjoins both — so the enrolled witness would have failed.

The disposition is repoint, not delete, and the PR had already set the precedent. rustfmt is still genuinely required: `gunbc.ci_spec` `ci_fmt_gate_line` still runs `cargo fmt --all --check`, and this same cut had already re-homed `gunbc.tool_readiness` `rustfmt_unpinned_frontier` onto that declaration, with a note giving exactly this reasoning. Deleting the requirement row would have left the list empty while rustfmt remained necessary — asserting "nothing needs rustfmt", the ⊥-conflation DESIGN refuses, and a worse error than the stale citation.

Four found by sweeping the same classes, not reported by either review:

  • `host_toolchain_components_witness_test` pinned the retired gate's name, so the repoint could not land without dispositioning it. It now pins the live consumer and still discriminates.
  • `ci_heal_skew_guard_emit` carried a second citation of the deleted emitter, in `ci_heal_skew_indent_residue_note` — same file as the reported one.
  • `ci_workflow` `ci_floor_gate_toolchain_note` described the retired gate and the deleted PATH-workaround emitter; its surviving half (emit_host rust smoke) kept it reading as current.
  • `ci_heal_skew_guard_emit_test` cited a deleted sibling test module as its contrast case.

Left alone deliberately: `ci_materialization`'s Receipt 6 and `tool_readiness`'s re-home note both name retired symbols inside historical records. That is the sanctioned pattern — deleted symbols stay findable in retirement notes. The test applied throughout was whether a citation makes a live claim about current behaviour or records what happened.

Verification after the change: both deleted-module constants are zero branch-wide, the repoint target resolves to a real declaration, the requirement list is non-empty, and the witness assertion matches the function it tests. Note that this push moves the head, so the prior approval no longer joins it.

— sent from tidy-pike-117

…ed tool

Review 52786. Both findings confirmed: the merge driver's repair recipe and the
bootstrap freshness panic both told authors to run regen_stage0, which this cut
deletes. These are worse than the stale prose citations fixed in 28cc56f,
because they sit on repair paths -- a refusal's value is that its remedy works,
and a wrong recipe converts a fail-closed stop into a dead end the author only
discovers after following it. The merge-driver text is also EMITTED to production
in .githooks/generated-artifact-merge.

Steps 2-4 are retired rather than repointed, and nothing replaces them. The
two-pass fixed point existed because regen_stage0 emitted the seed by running a
binary built FROM the seed, so one pass could self-verify at divergence 0 for the
wrong reason. With the emitter deleted the surviving projections come from the
step-1 gate alone, and the 136 artifacts that stopped being generated are declared
frozen in gunbc.stage0_seed_retention. A step that re-derives nothing has no honest
form. Remaining steps renumbered 1, 2 -- the emitted recipe read "1." then "4."
after the removal, which is a real defect in production repair text.

The bootstrap panic likewise gets no invented command. ci_freshness is live
(registered in the dispatch table, bootstrap_witness still a declared bin) and can
still fail, so it now states that the seed is frozen, that no command regenerates
it, and that a divergence is a decision between "the self-compile changed" and
"the frozen seed was edited", pointing at the retention roster.

The hook was REGENERATED through dag/tools/generated_artifact_gate.dag main_wet,
not hand-edited -- hand-editing a generated projection is the exact disagreement
between authority and artifact this driver exists to refuse.

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

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Review 52786 verified and fixed in b3f45b3322. Both findings were real, and this class is more serious than the citation batch in 28cc56f6fc: these sit on repair paths. A refusal's entire value is that its remedy works, so a recipe naming a deleted tool converts a fail-closed stop into a dead end the author discovers only after following it. The merge-driver text is also emitted to production in .githooks/generated-artifact-merge.

Steps 2–4 are retired, and nothing replaces them — that is the answer, not an omission. The two-pass fixed point existed because regen_stage0 emitted the seed by running a binary built from the seed, so one pass could self-verify at divergence 0 for the wrong reason. With the emitter deleted, the surviving projections come from the step-1 gate alone and the 136 artifacts that stopped being generated are declared frozen in gunbc.stage0_seed_retention. A step that re-derives nothing has no honest form.

Renumbered 1, 2. After the removal the emitted recipe read "1." then "4." — a real defect in production repair text, and one I introduced with the first pass.

The bootstrap panic gets no invented command either. ci_freshness is live — registered in the dispatch table, bootstrap_witness still a declared bin — so it can still fire. It now states that the seed is frozen, that no command regenerates it, and that a divergence is a decision between "the self-compile changed" and "the frozen seed was edited," pointing at the retention roster.

The hook was regenerated through dag/tools/generated_artifact_gate.dag main_wet, not hand-edited. Hand-editing a generated projection is the exact authority/artifact disagreement this driver exists to refuse, so repairing its own recipe by hand would have been self-refuting. Verified: regen_stage0 no longer appears in the emitted hook.

One thing worth stating about the sequence. These are instances 9 and 10 of the retired-symbol citation class on this branch. Two reviews reported 4; I swept and reported 8 as the actual; this review found 2 more, and a corpus grep still shows further regen_stage0 mentions I have not dispositioned. My sweep ranged over deleted .dag modules and symbols and did not range over the deleted binary named in remediation strings — so "8" was a sampled lower bound presented as a count, which is the same error I attributed to the earlier reviews. Every number any of us has published for this class is a lower bound. The class is decidable (feature:cited-symbol-resolution), and a symbol-resolution lens is what would earn an actual count; three hand passes over one diff each found a different subset.

— sent from tidy-pike-117

…d lane projection

Review 52800. Both findings confirmed on b3f45b3.

fallback_arm_census inventoried src/v1/stage0/src/bin/regen_stage0.rs as a
LegitimateConstant while this cut deletes that binary. Removed, count claim
retargeted 25 -> 24, and BOTH witness references renamed with it -- the count
function, its call site, and the import in the witness module are one coupled
population, so repairing the row alone would have left an unresolvable name.
Verified after: 24 rows, and every remaining inventoried path exists on disk.

roster_registry's commit_gate_roster reason described three lane projections in
gunbc.ci_spec and named gunbc_ci_regen_floor_gates among them. That projection
retired with the regen job and the self-host fixed point. Corrected to two, with
the third recorded rather than silently dropped -- this reason was the last
citation of that symbol anywhere in the tree, so deleting the words without a
receipt would have erased the only remaining trace that the lane existed.

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

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Review 52800 verified and fixed in 13c98a466a. Both findings were real.

fallback_arm_census inventoried src/v1/stage0/src/bin/regen_stage0.rs as a LegitimateConstant while this cut deletes it. Row removed, count claim retargeted 25 → 24, and both witness references renamed with it — the count function, its call site, and the import in fallback_arm_census_witness_test.dag are one coupled population, so repairing the row alone would have left an unresolvable name. That is the third time on this branch that a reported occurrence was not independently repairable. Verified after: 24 rows, and every remaining inventoried path exists on disk.

roster_registry described three lane projections and named gunbc_ci_regen_floor_gates among them. Corrected to two, with the third recorded rather than silently dropped — that reason was the last citation of the symbol anywhere in the tree, so deleting the words without a receipt would have erased the only remaining trace the lane existed.

One caveat on the witness, stated because it changes what "fixed" means here. fallback_arm_census_witness_test.dag lives under src/v2/test/claim/long/, which DESIGN classifies as the frozen legacy path-deferral population — WitnessExecutionStanding there is LegacyFrozenPathDeferral, which the coverage gate does not admit as covered. So the assertion is now coherent with the inventory; I am not claiming it is proven by execution, and I did not verify that it runs.

Three candidates I found but did not fix, handed over rather than reported as defects because classifying them needs module-purpose judgment I have not done:

dag/gunbc/roadmap_authority.dag:1718              path: "src/v1/05_emit_rust.dag"
dag/gunbc/v1_complexity_decl_classification.dag   data ...: String = "src/v1/complexity.dag"
dag/gunbc/prose_row_frontier.dag:47               "src/v1/annotation_bind.dag"

All three are structured data fields, not prose — the same shape as the floor_self_host_realized_comparison_gate_entry constant review 52769 flagged and I deleted — and all name src/v1/*.dag files this cut removes. Whether each is a live claim or a retained historical record is the same live-vs-history test applied throughout; I have not applied it here.

And a note on how I found them, because the method matters more than the result. I attempted actual class closure by checking every path-shaped string literal in every .dag against the filesystem. It returned 381 missing paths — almost entirely synthetic fixture inputs (dag/a.dag, dag/extdeps/browser/opera.dag) that are supposed not to exist, plus deliberate negative controls (not_a_real_module.dag, phantom_not_in_glob.dag). That checks subject is "path-shaped string literals," not "references to real repository files," and the repository carries no typed distinction between a path it depends on and a path it invented for a test. So grep cannot close this class, and that is a structural fact rather than a limit of effort — which is the argument for a typed repository-target carrier rather than another sweep.

— sent from tidy-pike-117

@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Verified review 52804 and review 52807 against the current head 13c98a466a. Both APPROVE. Disposition of the named leftovers, then one finding of my own that I do not think is leftover cleanup.

review 52804's three leftovers — verified, not fixing, reasons per item

regen_floor_skip_label_for_ci in the frozen seed. Confirmed at head, and narrower than it reads: the consumer bin is gone (src/v1/stage0/src/bin/regen_floor_skip_witness.rs and regen_stage0.rs are both ABSENT at 13c98a466a, and neither is a declared [[bin]]). What survives is the pub fn definition in cli_run.rs plus its two in-file #[cfg(test)] assertions — a public fn with no caller outside its own tests. Not fixing here: cli_run.rs is the subject of the cli_run hollowing plan, which deletes this wholesale, and removing it means touching a 38k-line file to no behavioural end while invalidating both approvals on a merge-ready head. It belongs to that lane.

Sandbox demo fixtures / historical plan rows. I took these at class grain rather than guessing files. Census of deleted-machinery names still referenced under dag/ or src/v2/ at 13c98a466a: regen_stage0 19 files, RegenVerifyGate 6, SelfHostStalenessGate 2, v1_src_dag_parse 3. The bulk are receipt and plan rows recording what was retired — which is the thing DESIGN §3 asks a retirement to carry, not a stale citation. I fixed the live-citation subset across 28cc56f6fc, b3f45b3322, 13c98a466a; I am not sweeping the historical rows, because a receipt naming a deleted tool is the receipt working.

Stated plainly because I got this exact count wrong once already on this PR: that 19/6/2/3 is a name-grain census, not a stale-citation count. I have not classified all 19 individually. My earlier "4, then 8" on this same class was a sampled lower bound published as a total, and review 52786 then found 9 and 10.

The finding: the retention roster's founding population is one producer channel

This is not leftover cleanup and it is not something either review names.

gunbc.stage0_seed_retention derives its 136 as a set difference — pre-cut generated-artifact roster (143) minus post-cut (7) — and its note presents that recovery as what makes the population trustworthy ("RECOVERED, not derived... a roster whose membership is inferred is a roster that invented its own subject").

Measured at merge-base 8a799b61c4d, dag/gunbc/stage0_emit_plan_generated.dag lists 143 paths and zero of them sit under any stage0_*/ partition crate directory. So the 136 inherits that exclusion exactly.

The excluded population is real and generated. The deleted src/v1/stage0_crates.dag emitted, on a second producer channel (stage0_split_crate_boundaries, not write_registered_outputs):

  • concat(spec.crate_dir, "/Cargo.toml") — line 389
  • concat(spec.crate_dir, "/src/lib.rs") — lines 473, 499, 506
  • the //! Generated by regen_stage0 -- do not edit. header itself — lines 61, 73, 84

At head 13c98a466a, all 7 of src/v1/stage0_{emit_core,extdeps_languages,runtime,std_core,std_surface,v1_artifact,v1_infer}/src/lib.rs carry that generated header; all 7 sibling Cargo.toml exist; and the root Cargo.toml carries

# BEGIN generated stage0 crate members -- regen_stage0 writes this region (authority: v1.compiler.workspace_members)

None of the 15 appear in the 136-row roster. None are bound in .gitattributes (80 lines, zero matches). Their generator is deleted. Nothing declares them frozen, nothing regenerates them, nothing drift-checks their bytes.

Why the paths were invisible to a text sweep — and this is the part worth keeping: stage0_std_core/src/lib.rs appears as a literal string nowhere in the tree at 8a799b61c4d. The producer computes it with concat. Any instrument whose subject is "path-shaped string literals" reports these as non-existent. Mine did, which is why I withdrew this finding once before reinstating it.

The carrier cannot hold the fix. SeedRetainedModule { basename } is joined by w_retained_modules_are_still_declared via string_contains(src, "pub mod <basename>;") against exactly one file, src/v1/stage0/src/lib.rs. A crate root, a manifest, and a workspace-members region have no pub mod form. Adding them as rows would red the enforcing witness rather than declare them. So this is not "15 missing rows" — the identity type is itself a projection of one channel.

The tree already knew. gunbc.stage0_partition_closure's header, in this PR, says it verbatim:

a gate reported ZERO DRIFT on a tree whose partition crates would not compile... Its roster simply does not cover the emitted stage0 seed or the partition crate lib.rs files, which belong to regen_stage0. So "clean" meant "the artifacts I am registered for match", and it was read as "the tree is consistent". A SCOPE STATEMENT READ AS A TREE STATEMENT.

That is the same fact, written down before the cut, about the same population, in a file this PR carries.

Scoping it honestly, because the gate is not gone. The partition closure invariant survives and is enrolled — mechanism half per-PR at 1–4ms in stage0_partition_closure_witness_test, live census at 173.6s/177.6s on the cadence lane. The partition crates cannot silently stop resolving. What does not exist is the retention declaration for the partition artifacts. Severity is mitigatable, not silent-wrong: nothing is accepting a false value today.

And a discriminator correction. I earlier proposed self-declaration (the generated header) as the way to find this class. It is incomplete in the unsafe direction: the 7 Cargo.toml files carry no header at all yet were demonstrably emitted. Self-declaration is ArtifactSelfProvenanceClaim — good for candidate discovery, never the denominator. The denominator is the deleted producer's complete output relation, which is still readable in git history.

What I'm asking for

I am not pushing this. Both approvals sit on 13c98a466a and a push drops them, and extending the carrier is a modeling change to a new load-bearing authority — not something to do unreviewed at the end of a cut.

The minimal in-scope fix needs no carrier change: add one bullet to the roster's existing ENFORCED / NOT ENFORCED section naming the crate-partition population, the reason the carrier cannot express it, and the next trigger. That converts a silent gap into a declared one, which is the same move the note already makes for unclassified artifacts. I have it drafted and can land it in minutes if the operator wants it before merge.

Otherwise this stands as a filed obligation against whoever owns the partition artifacts next, and the roster ships stating a completeness its recovery method did not have.

— sent from tidy-pike-117

Brian Searls and others added 3 commits August 17, 2026 05:59
… see

The roster derives its 136 as a set difference over the pre-cut
generated-artifact roster (143 paths). That roster is a projection of one
producer channel, write_registered_outputs. The deleted stage0_crates.dag
emitted on a second channel and its outputs are therefore outside the
founding population by construction: seven crate lib.rs, seven crate
manifests, and the root Cargo.toml members region -- 15 artifacts present
in this tree, generator deleted, declared nowhere, bound in no gitattributes.

No rows are added because none can be: SeedRetainedModule is a module
basename matched as `pub mod NAME;` against one lib.rs, and a crate root,
a manifest and a members region have no such form -- a row would red the
enforcing witness rather than declare the artifact. The identity type is
itself the one-channel projection, so the fix is a modeling change.

Records the limit at both places it is reachable: beside the recovery
paragraph that would otherwise read as complete, and as its own NOT
ENFORCED arm. Also records why the obvious instruments miss it -- seven of
the fifteen carry no generated header, and the paths appear as no literal
anywhere because the producer built them with concat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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>
…ngs to

Merging origin/main brought in gunbc#8345's new v1 witness. This branch
deletes its .dag authority with every other v1 claim .dag, so its emitted
twin became a frozen artifact whose generator no longer exists -- the case
the roster's own NOT ENFORCED arm predicts and says nothing detects.

Retained rows 134 -> 135 (61 authority-deleted, 74 authority-live). The
founding population stays 136: it is a measurement against a prior tree and
does not move when a later artifact is frozen. The two numbers differ by the
two exclusion rows, and a first draft of this note conflated them and said
137.

The shrink-only rule is not dissolved, it is scoped: it governs migrations
OUT, so that a row cannot vanish with its obligation. It never contemplated
freezing by concurrent merge, because the founding cut was assumed to be the
only freezing event. On a long-lived cut branch it is not -- every merge that
deletes the authority of an artifact main added inside the region freezes
another one.

The detection is the part worth keeping: git reported NO conflict, because an
add on one side never is one. What caught it was the regenerated emit plan
listing 8 paths where the cut declares 7 -- a derived artifact disagreeing,
not a gate firing.

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

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Merged origin/main (conflict cleared — MERGEABLE at d3552a072e). Merge commit, not a rebase, per the repo's squash-merge policy. This resets the two approvals on 13c98a466a; the PR was CONFLICTING and unmergeable anyway, so no merge window was lost.

Three commits: the note correction from my previous comment, the merge resolution, and one declaration the merge itself forced.

Resolutions, each checked 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. This loses no behaviour, and that is verified rather than argued: gunbc#8345 and gunbc#8347 both regenerated, and all four emitted files are byte-identical to main after the merge (md5 d37b14f9, 982bffd9, 3f54ad44, b24fe27d for v1_compiler_emit_rust, v1_compiler_infer, v1_compiler_infer_emit_info, v1_compiler_trait_derive_emit). Their fixes live in the frozen seed; only the deleted .dag authority goes.

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 sits directly above the hunk.

.gitattributes, ci.yml, stage0_emit_plan_generated.dag regenerated through dag/tools/generated_artifact_gate.dag, as the merge driver instructed. The driver refusing those three is it working correctly.

The one that had no conflict

src/v1/tests/claim/emitter_ambiguous_variant_owner_witness_test.dag arrived from main with no conflict at all, because an add on one side never is one. Left in place it resurrects a file in a region this cut empties — and the regenerated emit plan then listed 8 paths where the cut declares 7, declaring an artifact generated whose generator this branch deletes. Deleted for consistency with every other v1 claim .dag; re-running the generator returned the plan to 7, which is how the resolution was checked instead of assumed. Its emitted twin stays, still declared at src/v1/stage0/src/lib.rs:143.

That twin is therefore a frozen artifact with a deleted generator — exactly the case stage0_seed_retention's own NOT ENFORCED — unclassified artifacts arm predicts and says nothing detects. It is now declared: retained rows 134 → 135 (61 authority-deleted, 74 authority-live), seed_retention_arms_disjoint green by execution. The founding population stays 136 — it is a measurement against a prior tree and does not move when a later artifact is frozen. The two figures differ by the two exclusion rows; a first draft of that note conflated them and said 137, corrected before push.

What is worth taking from it beyond this PR: nothing detected the entrant. Git was silent by construction. What surfaced it was a derived artifact disagreeing with a declaration — 8 against 7 — not a gate. On a long-lived cut branch the founding cut is not the only freezing event: every merge that deletes the authority of something main added inside the region freezes another artifact. Measured on this branch, origin/main took 50 commits touching src/v1/**/*.dag in the last 14 days.

— sent from tidy-pike-117

@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Closing: PAUSED BY OPERATOR — the v1 cut is not an active program right now

Operator ruling, 2026-08-17: the v1 cut is not happening at this time. Resource is going into the emit program (Root A/B/D/K/T5a). The namespace cut (#8282) and floor cut (#8283) continue. The interpreter cut (#8287) has moved into v2 emission.

This is a pause, not a refutation. The branch integration/v1-cut stays as quarry at d3552a072e and is not deleted. Nothing here says the cut was wrong — it says main is actively developing inside the region this cut deletes, and the two cannot run concurrently.

Do not auto-recreate this PR. Its predecessor #8293 was closed by the operator at 02:01:28Z and an equivalent non-draft PR was opened on the same branch eight seconds later, with #8293's DO NOT MERGE until Y's green bar marker removed. That is how this PR came to exist, accumulate four approvals, and sit one CI run from the merge bar while its authorization was never established. Whatever performed that reopen should not do so again.


Why it could not converge

Measured on origin/main, not inferred: 50 commits touched src/v1/**/*.dag in 14 days. I resolved the src/v1/05_emit_rust.dag conflict at 06:10; #8350, #8351 and #8341 each edited that same region afterward, and #8357 (Root B), #8353 (Root T5a) and #8138 remain open against it. Re-conflict interval under two hours, four observed ticks, no resolution attempted in between.

This is specific to this cut, not to delete-first. At the same moment #8282 was 130 commits ahead of main and MERGEABLE, and #8283 likewise MERGEABLE — because no comparable program targets the regions those cuts delete. The collision here is with one active campaign, in one region.

Per DESIGN §3's frozen-X carve-out, the only version of this that terminates is a freeze effective at an exact main commit: "a freeze that still accepts rows is not a freeze." That freeze would have cost the remaining Root program, and the operator has chosen the Root program.


Findings preserved as quarry

1. The retention roster's founding population is one producer channel. stage0_seed_retention's 136 is a set difference over stage0_emit_plan_generated (143 paths at merge-base 8a799b61c4d), which names zero paths under any stage0_*/ crate directory. The deleted src/v1/stage0_crates.dag emitted on a second channel — concat(spec.crate_dir, "/Cargo.toml") and concat(spec.crate_dir, "/src/lib.rs") — and authored the Generated by regen_stage0 header itself. The undeclared population is 15: 7 crate roots (header-carrying), 7 manifests (no header at all), and the root Cargo.toml members region. None bound in .gitattributes.

Standing, stated honestly: declared quarry, not an enforced blocker. It lives in a String note. DeclaredAndBoundedByCountAndCategory yes; TypedAtExactArtifactIdentity no; MechanicallyBlocksTerminalAcceptance no. I earlier called this "an exact bounded population that blocks terminal acceptance" — that was rung inflation and is withdrawn.

The typed form, if this is ever recut, is a sibling carrier and not a module-shaped one: UnclassifiedCrateRoot | UnclassifiedCrateManifest | UnclassifiedGeneratedRegion. SeedRetainedModule is matched as pub mod NAME; against a single lib.rs, so a crate root, a manifest and a members region cannot be expressed in it — a row for any of the 15 would red the enforcing witness rather than declare anything.

The complete denominator is the deleted producer's output relation, recoverable from git history (stage0_crate_boundary_emit_outcome at the cut base). Not computed — deferred deliberately, because the source is immutable and cannot rot.

2. A cut branch keeps freezing artifacts after its founding measurement, and git cannot see it. Merging main brought in gunbc#8345's new v1 witness; the cut deletes its .dag authority with every other v1 claim .dag, so its emitted twin became frozen with a deleted generator. Retained rows went 134 → 135; founding population stays 136 (the two differ by the two exclusion rows).

Git behaved correctly — a one-sided add doesn't violate git's relation (same path changed incompatibly on both sides relative to base). What git does not represent is the cut's relation: no new member may enter the deleted region after the cut base. No improvement to conflict handling would catch it. It was found only because the regenerated emit plan listed 8 paths where the cut declares 7 — a derived artifact disagreeing with a declaration, which is a lucky oracle and not a wall.

3. CI on d3552a072e (run 32000861748, job 95304822293) — one sample, not green. The correct partition is 5 + 1, not 6:

  • 5 branch-added §4c annotation-erasure witnesses refused by the 5s fast-lane thread-CPU ceiling: annotation_contributes_no_atom_to_the_semantic_graph, annotation_does_not_move_the_structural_fingerprint, atom_identity_responds_to_a_renamed_callee_RED, erasure_probe_sources_reach_a_real_semantic_hash, structural_fingerprint_responds_to_a_real_shape_change_RED. The sixth new witness, annotation_shifts_textual_provenance_by_exactly_its_own_bytes, passes.
  • 1 separate semantic failure: doc_graph_bind_identities_unique returned Bool(false), defined in dag/test/claim/doc_reachability_witness_test.dag, which the cut does not change though it does change a dependency (dag/gunbc/doc_graph_roots.dag). Attribution unresolved — cut-caused, merge-artifact, or inherited are all still open. Recorded rather than chased, because resolving it is work on a paused branch.

The observed values are 5001 / 5002 / 5003 ms, and these are right-censored lower bounds, not measurements. The ceiling fires at 5000ms, so a row costing 5.01s and one costing 50s report identically. Five values clustered in a 3ms band immediately above the threshold is the signature of truncation, not of nearness. An earlier comment of mine read them as marginal overruns that would pass on a faster runner — withdrawn; the run cannot distinguish marginal from wildly over.

Consequently "move them to a cadence lane" was premature and would be a tip-level fix. The source shows all five independently rebuilding lex_walk_artifact → parse_module → normalize over the same short probe sources, one of them normalizing the same annotated source three times, while the non-failing sixth stays at token grain. The root-first question is why five assertions each reconstruct the same semantic observation, and it should be measured under a diagnostic ceiling before any lane decision.

4. The PR body is stale against the tested subject: it claims 44 commits and "all 17 witnesses passing", which is false on d3552a072e for at least the five above.


What is not claimed

That the cut is wrong, that the frozen-seed approach is wrong, or that the 136-row roster is unsound within its channel — it is sound, and its own NOT ENFORCED arm predicted the gap that later fired. That the 15 artifacts are broken today: the partition closure invariant remains enrolled and green in stage0_partition_closure (mechanism per-PR, census on cadence), so the crates cannot silently stop resolving. What is absent is any declaration that those 15 are frozen, and any means to reproduce them.

— sent from tidy-pike-117

@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Closed: PAUSED BY OPERATOR (2026-08-17). The v1 cut is not an active program right now — resource is going to emit. Branch integration/v1-cut retained as quarry at d3552a072e, not deleted. Findings and the do-not-recreate note are in the comment above. — sent from tidy-pike-117

@gunbai-bot gunbai-bot Bot closed this Aug 17, 2026
@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Correction to the closing record: the doc_graph attribution is now resolved, and it was not this branch's.

I closed this PR recording doc_graph_bind_identities_unique returned Bool(false) with attribution unresolved — cut-caused, merge-artifact, or inherited all still open. It was inherited from main, transiently, and main has already fixed it:

06:07:19Z  #8362 merged   'Doc graph: bind the Root B probe ...'   -> added a bind row
06:10      this branch merged origin/main                          -> inherited it
           run 32000861748: doc_graph_bind_identities_unique = false
06:54:44Z  #8364 merged   'Doc graph: one bind per document —
                            drop the DUPLICATE Root B probe row'   -> fixed on main

Both PRs change exactly dag/gunbc/doc_graph_roots.dag, which is the file that witness folds, and a duplicate row is precisely what makes a bind identities unique assertion return false.

So the corrected partition of run 32000861748 is: 5 branch-owned censored budget refusals in the §4c annotation re-enrollment, and 0 branch-owned semantic failures. The sixth was a ~47-minute window of main's own, independently repaired.

This changes nothing about the pause — it removes a finding from the quarry rather than adding one, and the five censored budget rows still stand as the branch-owned observation with their root-first question open (why five assertions each rebuild lex_walk_artifact -> parse_module -> normalize over the same probe sources).

Recording it because a quarry note left saying attribution unresolved would send a future recut chasing a defect that no longer exists.

— sent from tidy-pike-117

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