Skip to content

Retire the gate/witness surface asymmetry with the regen job that was its only inhabitant - #8485

Merged
briansrls merged 29 commits into
mainfrom
session/crisp-wren-479
Aug 19, 2026
Merged

briansrls merged 29 commits into
mainfrom
session/crisp-wren-479

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

Follow-on to #8406, from the same branch. Its author (gentle-dove-530) archived when #8406 merged, so I resolved the conflict with main and am carrying it.

What this does

GithubActionsCiRegenJob was deleted by the regen root cut. It was also the entire content of one wall claim: gates and witnesses needed SEPARATE scheduled-surface predicates because those two row kinds disagreed about exactly one surface — regen executed gates and executed no witnesses, so a witness parked there ran nowhere while still looking enrolled.

Delete the surface and the two predicate bodies become byte-identical. The claim does not become hard to state; it stops being true of anything.

Why this is a retirement and not a re-specimen

The pair carried two claims, and only one died:

  • Survives — a declared row must ride a surface that executes it. Still demonstrable, so the pair is re-pointed: synthetic_enrolled_gate_row rides GithubActionsCiJob and must pass, synthetic_bare_deenrolled_gate_row rides GitPrePushHook alone and must red. GitPrePushHook still counts for neither kind, by the standing ruling.
  • Retired — that the gate and witness predicates DIFFER. No row can demonstrate this any more because one side has no inhabitants. enrollment_surface_asymmetry_retired_note carries the retirement, and states plainly what is lost: if a future surface executes one kind and not the other, the split and its controls must be reintroduced, not merely re-pointed.

Keeping the surface alive so the pair could keep demonstrating itself would be a modeled surface whose only consumer is its own evidence — DESIGN §6, an artifact with no final consumer, guards passing at 0 == 0.

Conflict resolution

One file conflicted: gauntlet_lane_enrollment_witness_test.dag. Merge base 986413ab4f; main side was #8406 itself, branch side is this work. Took the branch side — strictly newer intent, already contains what #8406 landed there. Merge commit, no rebase. Verified after merging that no live (non-prose) reference to the deleted variant survives anywhere in the tree; the remaining mentions are retirement receipts.

Check before merge

Run the gauntlet module and confirm the re-pointed pair still discriminates in both directions — enrolled row passes, bare de-enrolled row reds. If both pass, the wall has gone decorative, and that is the failure a clean textual merge cannot see.

🤖 Generated with Claude Code

gunbc-ci-auto-heal and others added 28 commits August 18, 2026 13:18
Remove the regen driver binary, stage0 emit-plan authorities, regen verify
gates/transports, skip witness, and the regen region in cli_run/v1_interpreter.
Production regen CI was already gone; this deletes zero-consumer machinery per
the regen root cut program.

Co-authored-by: Cursor <cursoragent@cursor.com>
Restore required-regen as one claim_executor fold, remove stale gate and witness references to deleted comparison and emit-plan machinery, and repair the DAG corpus imports that blocked compilation.

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

The required-regen fold now grounds planned population on committed stage0 files, refuses empty emit or missing candidate trees before any digest comparison, and adds admission witnesses so zero equals zero cannot report green.

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

Union the regen root cut with #8409 by dropping regen_stage0, regen_floor_skip_witness, and resolution_divergence_census from the derived pack authority and re-emitting fleet-converge.yml via main_wet.

Co-authored-by: Cursor <cursoragent@cursor.com>
After stage0_emit_plan removal, merge policy rows derive from committed generated artifacts only — pin the witness to v1_interpreter_dispatch_generated.rs instead of plan-derived std_algebra.rs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Move regen_input_sources and regen_source_roots to cli_run using
build_module_path_index and collect_dag_files_result; drop duplicate
walkers, path helpers, and fnv1a64 from required_regen_host (667 lines).

Co-authored-by: Cursor <cursoragent@cursor.com>
Use no_string_paths instead of no_regen_refusals so drift and hand-unverifiable
folds accumulate List<String>, matching collect_* helpers.

Co-authored-by: Cursor <cursoragent@cursor.com>
Restore native_len Str fast path (reverts accidental deletion), derive
generated stage0 paths from generated_artifact registry instead of live
git observation, retire deleted scaffold builtin witness, and drop a
greened roadmap_static_site row from floor_expected_red.

Co-authored-by: Cursor <cursoragent@cursor.com>
Removing witness_site_artifact_model_populated left an extra closing brace
that broke module parse and cascaded into annotation errors during strict
preparation.

Co-authored-by: Cursor <cursoragent@cursor.com>
Registry-based derived_generated_stage0_repo_paths now excludes layout
overlap filenames like the prior git observation filter, restoring disjoint
hand/generated semantics and lifecycle totality witnesses. Remove two
witnesses that passed on the latest floor run.

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

Route BoardArticleRefusal discrimination through board_article_refusal_kind at
the admission authority so cross-module witness matches do not fall through at
runtime. Restore generated_stage0_files supply for lifecycle disjointness after
the regen cut removed the emit-plan carrier. Raise required-floor claim budget
to 1000ms to clear throttle-inflated marginal rows on long cgroup-throttled folds.

Co-authored-by: Cursor <cursoragent@cursor.com>
Interpreter Record-pattern matching now falls back to the bare variant
segment like the Variant arm, so cross-module match arms on coproduct
refusals do not fall through non-exhaustive. Type empty BoardArticleRefusal
list folds at the admission authority so refusal literals carry parent_enum.
Remove 100 witnesses that passed while still enrolled in floor_expected_red.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drop identities main removed with the silent-pick gate retirement (#8409) so the roster matches post-rebase main.

Co-authored-by: Cursor <cursoragent@cursor.com>
The interpreter no longer implements stage0_emission_source_identities_host or regen_verify failure-detail hosts; keep the generated EvalBuiltinArm match exhaustive so claim_executor builds.

Co-authored-by: Cursor <cursoragent@cursor.com>
CI at 826bcde reported witness_authority_serializes_with_structure passing while still enrolled; remove it so the floor fold can green.

Co-authored-by: Cursor <cursoragent@cursor.com>
# Conflicts:
#	dag/product/compute_board/admission.dag
#	dag/test/claim/compute_board_admission_witness_test.dag
#	src/v1/stage0/src/v1_interpreter.rs
#	src/v2/workflow/floor_expected_red.dag
#	src/v2/workflow/required_floor.dag
The merge took main's v1_interpreter.rs wholesale, restoring three builtin
arms this cut deleted (stage0_emission_source_identities_host and the two
regen_verify_gate failure-detail arms). Their dispatch entries are gone, so
the macro no longer matched. Deletions re-applied; main's record-pattern
helper is kept.
…501).

review 53501 flagged RequiredRegenPhaseReceipt.elapsed_ms as a flat-scalar
duration at a substrate seam. The deeper defect is that the carrier never
carried anything: the host's time_phase() ignored both its accumulator and
its name and returned f() unchanged, so `phases` was allocated empty, passed
through the admission fold unread, and stored in every attempt as []. Nothing
in the verdict reads it and no host path populates it.

Re-typing the field on std.types Milliseconds would have grounded a unit that
is never measured. Deleted instead: the type, the field, the parameter, the
no-op time_phase, and the four [] literals in the witness. Elapsed is still
reported by the host's own measured run_started.elapsed().
…ction-source coproduct.

Two residues this cut left standing.

ci_spec.dag still carried regen_floor_skip_witness_bin, its policy note, and
the two script emitters that composed them (ci_regen_floor_skip_shortcut_script,
gunbc_ci_regen_floor_only_script, gunbc_ci_regen_floor_run). They emitted a
shell invocation of a binary this cut deleted, and no surviving workflow reaches
them — .github/workflows carries only witnesses.yml and fleet-converge.yml,
neither of which mentions regen. gunbc_ci_regen_floor_run had no caller outside
its own module. Deleted, with the two imports that served only it. The regen-job
GATE surface (project_ci_regen_job_gates, gunbc_ci_regen_floor_gates) is
deliberately untouched: it is load-bearing to the enrollment-asymmetry wall in
gunbc.commit_workflow and has live witness consumers.

generated_projection_paths.dag carried GeneratedProjectionPathSource as a
two-arm coproduct whose second arm, Stage0EmitPlanRetired, was uninhabited by
construction after the stage0_emit_plan deletion (review 53512, advisory). With
one source the axis carries nothing: the collision refusal named first_source
and duplicate_source, both of which could only ever be CommittedGeneratedArtifact
— a distinction the type promised and the population could not supply. The
coproduct and the row's source field are deleted; the collision refusal keeps
the path, which is the fact it actually establishes, and still refuses two
committed artifacts claiming one path.

Verified by execution on the merged tree: test.claim.gitattributes_emit_witness
witness_holds returns true, and dag/gunbc/ci_spec.dag resolves.
…ro consumers, vacuous verdict.

Neither name had a consumer anywhere in the tree — not production, not a
witness. The host answers the fixed-point question itself: claim_executor's
--required-regen-fixed-point calls cli_run::run_required_regen_fixed_point,
which compares pass-1 and pass-2 digests in Rust and never evaluates this
module.

The success arm was also vacuous. It constructed RequiredRegenAttempt with
generated_outcomes: [] and hand_outcomes: [] — the exact shape its sibling
required_regen_sync_admission refuses as EmptyCommittedPopulation and
EmptyEmitResult. A consumer receiving that verdict and asking how many
surfaces matched would read zero, indistinguishable from a genuinely empty
run. review 53522 read the reuse of RequiredRegenSyncRunnable as a naming
smell; the name was the smaller half.

Verified by execution on the merged tree: all five claims in
required_regen_admission_witness_test return true individually, not only
through the witness_holds conjunction.

The wider finding this came out of — that the whole required_regen fold has
no production consumer — is NOT addressed here and is with the operator.
… either side

#8457 landed while this branch was open. One file conflicts, and one row inside
it — dag/tools/floor_effect_gate_witness.dag, floor_gate_failure_receipt_note —
where both sides are correct about different things in the same string:

  this branch  changes the COUNTS, because the cut deletes the regen gate:
               eight _passes witnesses -> seven, five companions -> four, and
               regen_verify_gate_failure_receipt drops out of the enumeration
  main         changes a PATH inside the same string, because #8457 moved the
               witness to dag/test/claim/long/extdeps_scope_placement_gate_...

Resolving to either side alone loses a real change and loses it silently, because
both produce a plausible sentence. Taking this branch's side reverts the note to a
path whose file no longer exists there — the stale-citation class §3 names, which
rots without anyone touching it. Taking main's side leaves the note asserting eight
witnesses, five companions, and enumerating a companion this PR deletes.

Both halves are kept: seven/four with the regen companion removed, AND the long/
path. Verified by assertion rather than by eye — the resolved row must contain the
new path, must contain the corrected counts, and must not contain
regen_verify_gate_failure_receipt.

The rest of the merge is clean: six other files were touched by both branches and
auto-merged, and the RegenVerifyGate enum removal, the tools.regen_verify_gate
import deletion and the regen_verify_gate_passes/_failure_receipt pair come through
without conflict.

Worth recording: this row ends by confessing its own debt — "Frontier counts are
hand-authored prose debt — dissolve-on: derived projection from this entry's
declarations." This conflict IS that debt coming due. A hand-authored count of the
module's own declarations collided with an unrelated path edit in one string, and
produced a merge no machine can resolve and a human can get wrong two ways. Derived
from the declarations, this side of the conflict would not exist: deleting the gate
would change the number.

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

v1_interpreter.rs carried a hardcoded cross-claim memo keyed on the exact
name "ci_heal_binary_source_skew_guard_script" at two sites, a getter and a
setter. That name resolved on main against the unprefixed declaration in
src/v2/workflow/ci_heal_skew_guard_emit.dag, which this branch deletes; no
unprefixed declaration survives anywhere in the tree, so both branches match
nothing. They are dead because of this cut, which makes this the only PR that
can honestly remove them.

ZERO_ARG_PURE_CROSS_CLAIM_MEMO goes with them. Its only reader and only
writer were those two branches, so leaving the thread_local would keep a map
that is never written and only cleared — the same dead-machinery class one
level down. CROSS_CLAIM_FN_KEEPALIVE stays: the prepare_grammar path still
uses it.

Stated rather than left to be found, because it changes how the remaining
half of that block should be read: deep-moth-771 established today that the
prepare_grammar memo beside it CANNOT FIRE — its key bails on Value::Closure
and every grammar in the corpus carries one (sync_tokens is a Set with a
closure member, including the empty grammar in std/grammar.dag). That is the
grammar lane's to resolve, not this cut's. With this deletion the thread_local
holds one memo that cannot hit and one keepalive serving it.

cargo build --release --bin claim_executor --bin gunbc green.
… stub, two live rosters.

review 53574 finding 1, plus two rosters no review found.

ORPHAN MODULE. src/v2/workflow/ci_regen_rustfmt_path_emit.dag emitted the
rustfmt-PATH shell for the regen job; its own note names regen_stage0's
standalone rustfmt spawn as the whole subject. With regen deleted the module
has no subject, and its only consumers were its own golden test and one
witness file — kept alive by its own test, which is the attractor DESIGN
section 3 says to uproot rather than leave as quarry. Module and test deleted.

EVIDENCE RE-ENROLLED, NOT RETIRED. The review named one consumer in
tool_readiness_witness_test.dag; there are FOUR, including the duplicate-rows
refusal control. Their subject is tool_readiness's UnpinnedFrontier arm, which
survives the cut, so the frontier row is re-declared locally as
witness_unpinned_frontier_row and all four re-pointed. Section 3 step 6: keep
the evidence for surviving claims, delete only the machinery.

HEAL STUB. gunbc_ci_heal_binary_source_skew_guard_script was a hardcoded
echo-and-exit-1 with no caller and no emitting workflow — a dead wrapper
better deleted than stubbed. Deleting it made three notes false in the present
tense ('The guard below refuses...' referring to nothing), so each now opens
with a RETIRED marker and reads as history. They are not deleted: they carry
the 2026-07-29 operator ruling and the #7348 incident receipt, and a prose row
deleted for one reason takes everything in it.

TWO LIVE ROSTERS, found by sweeping for the deleted name rather than by review.
devboot/program.dag offered_programs() still offered regen_stage0 as a
buildable target — its note reasons carefully about the missing-from-here
direction and does not cover this one, a name offered here that exists
nowhere. fallback_arm_census.dag inventoried the deleted
src/v1/stage0/src/bin/regen_stage0.rs; removing that row moved the pinned
count 25 -> 24 across three sites, because the count is encoded in a
DECLARATION NAME (fallback_arm_seed_inventory_count_is_25_holds) as well as in
the literal and the witness import. A count baked into a symbol is the
hand-count-beside-structure class, and it is why deleting one row touched two
files.
…review 53574).

The CI rung-drop bullet read: 'the regen_stage0 self-host fixed point and its
regen_input_sources closure likewise survive, with only the required job that
ran them removed.' That was true when written. This PR deletes regen_stage0.rs
outright along with RegenVerifyGate and SelfHostStalenessGate, so the sentence
would ship FALSE in the canonical authority — README and CLAUDE symlink to
DESIGN.md, and every session plans from it.

It is the exact failure the same paragraph names: a knowingly-false recital in
the canonical authority is premise contamination, because each reader grounds a
decision on something that no longer exists. Landing that class INTO the
paragraph that defines it is the part worth refusing.

The clause is REWRITTEN, not annotated — a second sentence beside the old one
would be two accounts of one fact, the section 3 duplication, in a bullet
already carrying a declared rung drop. It now separates the halves that this
cut separates: the regen_input_sources import closure survives and is read by
v1_compiler.required_regen_host, while the binary that consumed it and the two
gates that invoked it are deleted at the root, leaving
claim_executor --required-regen-fixed-point as the only answer to the
fixed-point question. It also records that the old clause was true when written
and which half this cut falsified, so the change is legible rather than silent.

DESIGN.md is REGENERATED through generated_artifact_gate main_wet, not
hand-edited — it is a projection of gunbc.design_document and a hand edit is
reverted by drift heal. One line changed, matching the one carrier edit.
@briansrls
briansrls marked this pull request as ready for review August 19, 2026 00:45
# Conflicts:
#	src/v2/test/claim/long/gauntlet_lane_enrollment_witness_test.dag
@gunbai-bot gunbai-bot Bot changed the title 8406 ownership Retire the gate/witness surface asymmetry with the regen job that was its only inhabitant Aug 19, 2026
@gunbai-bot

gunbai-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

On the flagged residue — I measured it before sweeping, and the sweep would have been the wrong move.

tools/m1c_bulk0_residual.tsv is a dated census snapshot, not a live index. Its own design doc says so: "A fresh census over dag/ and src/ at the post-#7977 tree", committed as evidence alongside the manifest the M1C-BULK-0 actuator consumed. Last written at #8003; nothing reads it programmatically — the only reference anywhere in the tree is prose in docs/plans/dag-prose-policy-audit.md.

And row 499 is not alone:

256 of 3377 rows point at files that no longer exist
 71 of 1116 distinct paths are gone

Every one of those predates this PR. So the honest reading is that a snapshot taken two days ago has been outrun by two days of deletions, which is what snapshots do — and repairing exactly the one row this PR happens to touch would make the file look current while 255 others stayed stale. That is strictly worse than leaving it whole: a partially-updated snapshot is no longer a record of anything, and the next reader cannot tell which rows are observations and which are patches.

The real defect is one the file shares with every census pinned to a tree: it carries no stamp. No commit, no date, no tree hash — so nothing about it announces that it is a past observation rather than a present fact, which is precisely why a reviewer reads a stale row as a sweep candidate. DESIGN §5 names this class directly: a measurement copied from the current tree is not an oracle. The fix is one header line naming the tree it was taken at, and it belongs to whoever owns the prose-policy audit lane, not to a surface-retirement PR.

Not touching it here. This PR is approved and at 1/2 providers; pushing an unrelated one-line edit would clear that approval to make a stale file marginally less stale.

— sent from tidy-lark-471

@briansrls
briansrls merged commit c7b3031 into main Aug 19, 2026
1 check passed
@briansrls
briansrls deleted the session/crisp-wren-479 branch August 19, 2026 03:09
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