Skip to content

#8352 REQUEST_CHANGES: owned-CI executor still dispatches a regen stage that spawns the deleted regen_stage0 binary - #8359

Closed
briansrls wants to merge 45 commits into
mainfrom
fix/owned-ci-regen-retirement
Closed

briansrls wants to merge 45 commits into
mainfrom
fix/owned-ci-regen-retirement

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session crisp-boar-827.
Pushing to fix/owned-ci-regen-retirement advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

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 15 commits August 16, 2026 03:47
The regen ledger receipt described its subject only in prose, naming none
of ^regen_behavioral_fixed_point, RegenBehavioralFixedPoint, or
RegenVerifyGate -- so a reader grepping any of the three found nothing.
The unreachable_patterns residue note cited src/v1/stage0_crates.dag,
deleted by the v1 cut; the note it cites survives verbatim in the frozen
generated twin v1_compiler_stage0_crates.rs, which is the surface the
note already directs re-verification against.

Both are citation repairs, not defect restatements.
Verified: roadmap_authority_test 46/0, proactive_verification_ledger 1/0.
The compile-clean gate refused this file: "source annotation names no
subject: no module item follows it." Two annotation blocks sat at end of
file describing rows the v1 cut retired, and DESIGN 4c admits only leading
blocks attached to a module-scope declaration.

The retirement was correct and carries a full receipt. What it left behind
was the prose describing the retired rows, plus their helpers:

  defect_targets       0 callers (declaration only, this file, nowhere else)
  authority_is_roster  0 callers (declaration only, this file, nowhere else)

Both existed solely for the four retired REDs, so they go with their
subjects (DESIGN 3 step 6: machinery whose only purpose was the retired
claim is deleted; the evidence for surviving claims stays).

The RED 1 / RED 2 blocks were the worse half and were silent rather than
loud: after the retirement they sat above authority_is_roster, a helper
they do not describe, so they parsed while stating something false. The
parse error was only the visible end of the same drift.

Nothing is lost. stage0_partition_closure_fixture_retirement_receipt
already records what all four proved, why the subject is gone, why
repointing was tried and failed, and why re-deriving from live facts is
refused on measured cost. fixture_cost_note is retained because that
receipt cites it.

Left deliberately for the lane owner: witness_subject_note and
fixture_cost_note both still refer to "the RED below" / "these REDs",
which now name nothing. That is authored rationale, not mechanical
residue, and reconciling it is the author's call.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
tidy-pike-117 removed the retired rows' machinery and left the authored
rationale to me. Three corrections:

witness_subject_note claimed 'the RED below' and a live-corpus positive
control; neither is in this file. It now names the two reachability
controls that are, says the refusal half is asserted nowhere here, and
points at the census file for the live half.

fixture_cost_note described a population that no longer exists. It is
kept because the retirement receipt cites it as the authority for why
re-deriving from the live plan is refused, so it now says so outright
and moves its claims to past tense. Its 'what it gave up' clause turns
out to be why the rows died: std_measure is no longer emitted, so the
one property the fixture refused to fake became the one it could not
supply.

Third, unflagged and found by checking rather than reading: that note
recorded w_live_corpus_partition_closure_holds as 'the row that must
find a cadence home'. It fired -- the row is enrolled in
gunbc.ci_layer_roots by file pattern and by entry-and-function on the
falsifier long lane -- so the note was reporting discharged work as
pending. Same misattribution class as prose rebinding to a neighbour:
nothing in the sentence changes when the obligation it names is met.

Prose only. Zero annotation lines and zero declarations added or
removed, so nothing can rebind. Verified 2/0.
DESIGN section 7 requires each module to be self-emitted or SEED-RETAINED,
and a seed-retained module to be a declared row with a reason and a
migration trigger, never a silent escape hatch. The cut deleted the v1
authority and the emitter together, so 136 previously generated stage0
artifacts stopped being generated in one action. Undeclared they are
indistinguishable from an accidental orphan, and at 136 in one naming
family the 'one family means a matcher artifact' tell inverts: the real
risk is not a false alarm, it is that number 137 becomes invisible.

The population is RECOVERED, not inferred: pre-cut roster 143 minus
post-cut 7. An earlier pass used declared pub mod minus current roster
and got 154, silently inventing an obligation for ~18 modules that were
never generated.

Three arms, because what was lost is the GENERATOR, not the authority:
  60 AuthorityDeleted  the .rs is the sole representation
  74 AuthorityLive     .dag alive, artifact disconnected -- editing those
                       .dag files no longer changes the built compiler,
                       which is section 3 dual representation, live
   2 excluded          ownership (superseded, operator ruling) and
                       compiler_tests_rust (undecided, blocks)
The split is an identity join against 3702 live module declarations, not
a prefix guess.

The migration trigger is NOT restated: it is v2 self-emission, already
owned and execution-measured by v2.compiler.self_host.frontier. Two
carriers answering that question would be the dual authority arriving
through the trigger.

Rung drops are a separate arm, not a field on every row -- most rows lost
no fixable defect and an empty required field invites fabricating one.
One row: v1_compiler_emit_rust, mechanically-preventable to mitigatable,
numbers from fierce-raven-463, with its scope stated (mechanism measured
in isolation; real phase share UNMEASURED) and the missing section 4b
carrier named as the reason this is an interim home.

Witness oracle is lib.rs, one 7KB read for all 136 rather than 136 reads
of large emitted sources, anchored on 'pub mod NAME;' so a longer name
cannot satisfy a deleted one, with a RED control proving it can fail.

Also reconciles stage0_partition_closure prose with its surviving rows and
stamps provenance on its SEVEN-file count. Verified 7/0 and 2/0.
… correct my own completeness overclaim

MAGNITUDE WITHDRAWN. The 638x was measured against std::collections::
HashMap; the subject uses im::HashMap, a HAMT with O(1) clone. Verified
against this row's own subject rather than argued: v1_compiler_emit_rust.rs
imports im::HashMap and contains zero occurrences of the std one, and
corpus-wide 143 emitted files import im::HashMap against exactly two for
std, neither of them this file. Corrected figure is ~9x, FLAT across a 16x
span -- a constant factor, not a complexity class. The mechanism is
unaffected and separately witnessed (strong_count=2, allocation_moved=true
on the clone arm; 1 and false on the moved arm), so the defect is still
real and still one emitter fix rather than 113 edits. Only its size changed,
which is exactly why the row must not keep the larger number.

Why it survived: two INDEPENDENT benchmarks agreed at 638x and 816.9x and
that read as corroboration. Agreement across instruments sharing an
assumption measures the assumption -- both had copied the same wrong use
line. Recorded in the row, because three instances of that confusion
surfaced in one night and the trap is structural: copying a function
carries its body and not its imports, and the imports are the universe.

THIRD DISPOSITION. v1_compiler_compiler_tests_rust moves from Undecided to
DeletedWithObligationsOpen, answered by the lane removing it. Neither
frozen (it generates Rust test source calling the deleted interpreter, so
freezing declares an authority in front of unbuildable output) nor
superseded (nothing takes its boundary). Retention and obligation are
different populations with different owners; the 49 open obligations
belong to the cutting lane's carrier, not this roster. This is DESIGN
section 3's surviving-obligation / existing-reliance / obsolete-behavior
three-way, which a two-way retain-or-delete test collapses -- toward
retain, the dangerous arm.

COMPLETENESS OVERCLAIM CORRECTED. The authority note claimed an identity
join in BOTH directions; only the stale-row direction has a witness. The
other cannot have one live -- the founding population is the pre-cut
roster, a fact about a prior tree. Stated plainly: freeze a 137th artifact
without a row and nothing notices. Mitigatable, not prevented, trigger
named.

Verified 7/0.
Census: all 60 AuthorityDeleted rows resolve to their deleted .dag
authority at base. A proxy grep for guarantee-shaped machinery with corpus
reach returned 9 candidates led by 04_infer at 21 -- a worthless number,
because it counts MECHANISMS and the question is whether freezing LOWERED
anything.

Settled by execution instead. A sole_constructor violation authored in a
file that did not exist when the authority was deleted was REFUSED by the
frozen checker, typed and located: the frozen realization is data-driven
over the parsed tree, not a roster fixed at emit time, so the wall still
covers corpus that postdates its own authority. Existing classes hold at
their rung. What the cut removed is the ability to ADD or STRENGTHEN a
wall -- section 4b's ceiling on future climbing, explicitly not a descent.

So the arm had no occupant and is deleted rather than kept warm implying a
safety claim nobody made. Its content moves to seed_retention_frozen_
properties, deliberately weaker vocabulary: what a freeze makes unfixable,
with no implication that a guarantee moved, split into what_freezes /
verified / measured / not_established / dissolves_on so a correction
touches one field instead of rewriting the row.

Scope of the zero, stated so it is not read as 'freezes never lower
guarantees': it holds for this population under this mechanism. If a later
change freezes a wall whose enforcement scope was fixed at emit time, that
IS a lowered guarantee and the arm returns.

Verified 7/0; no dangling symbols after the arm removal.
Two reds, two different DESIGN section 3 dispositions.

(c) A NEED THAT RETIRES WITH v1 — v1_dag_parse_witnesses.
The bin scans src/v1/*.dag, which the cut emptied, so it took its own
fail-closed empty-corpus arm and exited 1. The red was the gate working.
Not repointed: the five surviving .dag under src/v1 are per-test fixture
inputs in subdirectories the non-recursive scan never reaches, one of them
a bare fragment with no module declaration; reaching them would require
editing a frozen seed .rs (new investment) and would silently change the
subject. dag_compile_clean_gate covers the live corpus more strongly.
Retired: witness, transport, release-bin enrollment, both ci_layer_roots
registrations, the Cargo [[bin]], and the seed binary.
Receipt: proactive_verification_ledger v1_src_dag_parse_retirement_receipt,
which records that the Cargo comment's declared dissolve-on did NOT fire as
written while the binary's own "seed shrinks to zero" arm did.

(b) A FORM THE TERMINAL MODEL REJECTS — the gauntlet RED control.
Self-inflicted by this branch. Retiring the GithubActionsCiRegenJob surface,
I substituted GithubActionsCiJob at every site, including inside the synthetic
NEGATIVE control whose whole subject was riding a surface that executes
nothing. The row's shape was preserved while its semantic role inverted, so it
type-checked and read as a rename: the failure resembled the success. The
predicate never broke; the specimen stopped being a specimen. Restored to
[GitPrePushHook], matching the gate half whose identical list the cut left
alone — which is exactly why the gate half kept discriminating.

Consequential, not a separate class: removing the bin changed the derived
release pack, so the three generated workflows were regenerated through the
modeled actuator (generated_artifact_gate main_wet), never hand-edited.
Proven that every one of the 36 changed yml lines differs ONLY by removal of
the v1_src_dag_parse token. Author regeneration is required rather than
optional here — witness_heal_policy_workflow_artifacts_require_author_commit
holds that heal may not touch workflow paths. The pack count floor moved
19 -> 18 by declared removal with the receipt cited, annotated with what that
literal actually is under section 5 and what retires it.

Verified by execution: gauntlet 6/6 (both controls answering oppositely on
one predicate), ci_release_bins 8/8, generated_artifact_drift 34/34,
ci_spec 29/29, gunbc_invoke 7/7, proactive_verification_ledger 1/1.
Cargo manifest parses with 34 bins and no dangling target path.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
Ran the unifying test -- is there a mechanism by which this row could have
been false -- over every control this branch touched. Three findings, two of
them in my own work, plus one pre-existing defect I am reporting rather than
fixing.

MINE, VARIANT 5 (subsumed sibling). w_frozen_property_modules_are_still_declared
asserted the frozen-property modules are declared in lib.rs. Its two siblings
already assert frozen basenames are a SUBSET of the retained roster, and that
EVERY retained basename is declared -- so it could not have been false while
they held. It was mutation-sensitive and still carried nothing of its own.
Nothing in its history made it suspicious: authored in one sitting, never
edited. Replaced with a claim no sibling names -- which ARM the frozen module
sits in. A frozen property claims no author-editable file reaches the built
compiler, which is only coherent when the .dag authority is DELETED, since the
authority is exactly the file an author would edit. Both directions asserted:
present-in-neither and present-in-both are different failures. Deliberately NOT
asserting the prose fields are non-empty -- they are typed NonEmptyStr, so that
check could never be false, which would be vacuity wearing the costume of
strengthening. Proven by execution: planting the inverse arm reds the row,
reverting greens it.

MINE, VARIANT 2 (vacuity). Four rows folded all over a roster with no
population guard, and all over an empty list is true -- they would have passed
having checked nothing if the roster were ever emptied. The tell was that I had
applied the guard INCONSISTENTLY: the two small arms carried length > 0 while
the retained roster, the largest population and the one the file is named for,
did not. Guard added to all four, asserting BOTH arms are live rather than the
union, because an all-deleted and an all-live roster are different failures.
Exact counts deliberately not pinned -- sibling cuts legitimately move rows
between arms, so a pinned total would red on correct work.

REPAIRED CONTROL HARDENED (converged fix). The four gauntlet controls asserted
booleans: a negation satisfied by ANY nonzero count. Now they assert exact
counts, 0 against 1, on the same function. Two rows asserting different
constants can both pass only if the field genuinely varies with the roster, so
they validate each other every run rather than once under mutation. Counts
measured from the rows, not read off the implementation.

REPORTED, NOT FIXED: three controls in ci_floor_plan_witness_test.dag
(scoped_witness_execution_receipt_decoder_refuses_empty_ledger /
_refuses_sha1_digest_family / _refuses_sha256_digest_family) all assert
detail != "" -- satisfied by any refusal for any reason, so all three would
pass against a decoder that refused everything. Pre-existing; this branch
touched the file for unrelated reasons and changed none of the three. Not
fixed here: it lives in the floor being deleted, where the standing ruling is
that such defects get no fix.

Verified by execution: seed retention 7/7, gauntlet 6/6.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mb2NaZbGpZrVrhcikp14w5
… 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.
The owned-CI executor was dispatching to CiRegenStage which spawned the
deleted regen_stage0 binary. This stage is retired entirely.

DISPOSITION: retire CiRegenStage (not replace).

The obligation to check regeneration still exists and is discharged elsewhere:
- 184 regen/drift carriers survive in the stage-0 outputs
- The heal job (heal pushes, 'chore: regenerate drifted artifacts') still runs
  as its own CI job and passes, checking drift independently
- regen_stage0 as a required pipeline stage has become unnecessary

This differs from the deletion of the binary being the reason for retirement.
The stage is retired because its checking obligation has moved to the heal job;
generated-artifact drift validation is still enforced, just not by the executor.

Changes:
- Remove CiRegenStage from CiExecutionStage type
- Remove from ci_execution_default_stages ([Build, Regen, Floor] → [Build, Floor])
- Remove CiRegenStage arm from ci_execution_stage_wire match
- Delete stage_regen() from ci_control_plane.rs
- Remove "regen" dispatch arm from ci_control_plane.rs
- Update owned_ci_witness_test (stages_build_regen_floor → stages_build_floor)
  and verify new 2-stage order

Addresses REQUEST_CHANGES feedback from review 52732 on PR #8352.

Per DESIGN §3 step 6: the disposition receipt names what is retired and why
the subject is gone, not merely that an implementation detail was deleted.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session/crisp-boar-827
@briansrls
briansrls marked this pull request as ready for review August 17, 2026 04:13
@cursor

cursor Bot commented Aug 17, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Review 52773 is confirmed and fixed — but not on this branch, and that needs stating plainly because this PR and #8352 are not two changes.

These two PRs carry byte-identical trees.

#8352  integration/v1-cut             46 commits
#8359  fix/owned-ci-regen-retirement  45 commits

both, before the fix:  140 files, +1,152 / -63,151 against main
files differing between the two heads:  0
neither head is an ancestor of the other

This branch is a narrow fix branch that was based on the integration branch, so it carries the entire v1 cut. The finding in review 52773 was therefore never specific to it.

I fixed it on integration/v1-cut in 28cc56f6fc, together with review 52769 (three findings, all confirmed) and four more found by sweeping the same classes. witness_executor_stage_labels_match_plan now asserts two labels, build then floor, matching owned_ci_executor_stage_labels(). Details are on #8352.

One thing worth flagging about the approval on this PR. The APPROVE (review 52758) says "The head commit is a narrow, coherent retirement of CiRegenStage" — which is accurate about the head commit and is not what this PR would merge. Its diff against main is 140 files and 63,151 deletions. The reviewer scoped themselves honestly; the mismatch is between that scope and the PR's base-to-head diff, not in their work. I would not count it toward this PR's merge bar. #8352's approval on the same tree was scoped to the whole cut — it discusses the deleted gate symbols surviving in retirement notes, the frozen seed, the symmetric ci_floor_plan strip.

That contrast is the useful part: identical content, two reviews, different subjects. A review's subject is the diff examined, not the head sha it lands on, and nothing currently records which one a verdict covers.

Suggested disposition: close this in favour of #8352 with a SupersededBy receipt, keeping the branch. Two open mergeable PRs with identical 63k-deletion trees is a state where merging either silently makes the other stale while it still reads mergeable. I have not closed it — it is yours, and this is a recommendation rather than an action.

— sent from tidy-pike-117

@briansrls briansrls closed this Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant