Skip to content

CI floor endgame: every priced lever + the cost wall (D1–D6) - #7128

Merged
briansrls merged 9 commits into
mainfrom
claude/ci-compilation-caching-xn4ynp
Jul 23, 2026
Merged

briansrls merged 9 commits into
mainfrom
claude/ci-compilation-caching-xn4ynp

Conversation

@briansrls

@briansrls briansrls commented Jul 23, 2026 •

Copy link
Copy Markdown
Contributor

CI floor endgame: every priced lever + the cost wall (D1–D6)

Baseline: carries #7123's docs (resolve-regression-journey.md, attribution doc §9–§9.2) as the fresher superset — #7123 closes as superseded after this merges (operator owns the close). Every number below has its receipt in those docs, the lever TSV, or run 30009199696.

Model (each deliverable extends ONE existing authority)

  • D1 — per-batch pooling extends the transport discipline (tools.host_prelude → tools.cheap_gate_pool): batch-0's claim-backed gates shared source roots but each paid its own corpus-denominated MultiEntryIndex child (~88s + ~64s on run 30009199696). The pool = the DERIVED union of the two concern authorities (never a third roster; roster_registry ByDerivation), run as ONE claim_batch child, K sub-pools sized to the slot (cheap_gate_pool_max_claims_per_child, the §9.1 memory-cliff wall) — the pooled child stays a separate process from the executor (wall (a)); per-claim verdicts stay named by claim_batch's PASS/FAIL-per-function loop (wall (b)). A new CheapClaimPoolGate runs the pool; the layering/extdeps gates became non-vacuous enrollment walls asserting chunk-transform totality (the pool is their union by construction, so bare membership would be an inert tautology — the K-chunker between pool and children is the code that could drop a claim, and that drop reds both concern gates; the compile_clean_shard_totality pattern). Ingest's 4 children stay — the mktemp overlay root-sets are the genuine constraint, stated in-row (ingest_pool_separation_note): distinct root-sets are structurally distinct index processes, and merging them re-opens the module-path-collision class the mktemp isolation closes.
  • D2 — teardown fast-exit extends the executor's terminal path only: floor_terminal_fast_exit after receipts flush skips the 2.5–3.1 min Drop walk of the ~16GB retained store (twice-confirmed: Pi swap-growth during Drop; run 30009199696's +3.1 min post-batch-7 tail). It is the common tail of run()'s walk path (every plan walk exits through it). Exit code preserved by construction (walk_exit_code, unit-pinned); receipts complete before the exit by construction (written inside run_walk; their write failures fold into any_failed), and the RED control unwritable_receipt_base_reds_not_vanishes proves a truncated/unwritable receipt reds rather than vanishing. fix governor #7119/Finish 7043 (floor budget refusal): ground witness rows on existing FloorOutcome + plan-roster fact #7072's governor arm (FloorBudgetBelowMinimumFootprint, commit 5cd0155149) touches ARM time — no overlap with this exit-path change; nothing forked (and its arm fired live during local validation on this memory-capped container).
  • D3 — selection-control diagnosed within the §9 class: the 4m51s step (vs 80s local) was THREE cold whole-pool index builds inside one process — the two budget_roster_* cases called bare build_multi_entry_index, then the first corpus case built the thread-shared index (R4 log: first control line at t+2m07s). The warmup case now rides resolve_entry_graph_shared so the suite pays ONE shared build; budget_roster_resolves_cold keeps its bare build as the named cold control (the import-strip Class-B pool-coincidence witness — a resolution-correctness control, not un-finished pooling). The step stays per-PR (the widen-detector for the entry_file_touched class) and now has its redundancy-ledger row.
  • D4 — discovery re-diagnosis, instrumentation first: lever-1 stays RETIRED as priced (Floor time: dissolve the #6848 once-per-entry fixpoint + reconcile-miss qualified-fill (~18min residual) #7030/floor: precompute both-closure edges to dissolve per-entry bare-ref fixpoint #7056 ancestors of the measured run, zero recovery). The pump's phases land as typed rows in the floor resolve receipt (discovery_pump_wall_ms, discovery_roster_walk_ms, discovery_diff_observe_ms, discovery_frontier_attribution_ms, discovery_shared_index_build_ms, discovery_preresolve_calibration_ms, discovery_runner_resolve_ms, plus discovery_corpus_resolve_ms/discovery_corpus_eval_ms serial sums) — not prints. The fresh per-phase profile from this PR's own runs names the next mechanism; if it names the identity authority or the retention lane, the receipt + frontier row is the deliverable (no downhill patching) — the lever-TSV 1-retired row records exactly that discipline.
  • D5 — THE COST WALL extends gunbc.ci_spec (one carrier): gunbc_ci_floor_batch_wall_budget_seconds = [240, 60, 1320, 420, 120, 600, 420] (per-batch, receipt basis per row in the note; sum 53 min under the 55-min cap). claim_executor reads it fail-closed at arm time (the fast-lane-budget pattern; length must cover the schedule exactly — witness-pinned), records every batch's wall as typed receipt rows (target/floor-batch-wall-receipt.txt: wall/budget/verdict per batch), and reds an over-budget batch with the typed, located refusal FLOOR-BATCH-OVER-BUDGET batch=N wall_ms=… budget_ms=… (budget row: …) — never a rerun, never a widen, never a silent cap raise. Denominated per-batch, never per-run (§9.2: plumbing PRs legitimately run 46/55 wet rows; a per-run wall reds them spuriously). Ruling reconciliation stated and operator-SIGNED in the carrier note (briansrls, 2026-07-23): "no wall-clock term in any verdict" governs WITNESS verdicts; batch budgets are admission/scheduling facts at the walk grain — the 5-second-eval-law split — with the signed line as the declared human-signed exemption row the 2026-07-10 ruling requires. Raise discipline as signed: RAISING requires a new dated operator-signed line naming run id + enrollment; TIGHTENING by ordinary receipt note; the on-call remedy for FLOOR-BATCH-OVER-BUDGET is diagnose-or-signed-raise, never rerun. RED control both directions via GUNBC_FLOOR_BATCH_BUDGET_TIGHTEN_MS — a tighten-only injection (min), structurally unable to widen a budget. Named follow-up rows in the carrier: the prelude coverage hole (~5 min pre-batch-1 sits outside every budget), identity-keyed budgets, and the K=16 union-RSS receipt.
  • D6 — short/quick wet discipline extends the bin_witness_wet_entries frontier (gunbc.ci_layer_roots): per-row wall budget bin_witness_wet_per_row_wall_budget_seconds = 60s. Run 30009199696's per-row table: the 54-row pool's 561s eval was 94% three rows — floor_skip_discovery_keystone_holds 289s (ALSO a per-PR duplicate of the selection-control step), cross_shard_seam_preservation_holds_on_live_tree 183s, dag_compile_clean_perturb_receipts_holds 53s (under budget, stays). The two over-budget rows re-home to a new falsifier wet lane (gunbc_falsifier_rehomed_bin_wet_batch, batch 5 — same mechanism as the other falsifier lanes) as typed frontier rows (falsifier_rehomed_bin_wet_rows: reason + dissolve_on each, enrolled in gunbc.roster_registry); the remaining 52 rows are the per-PR smoke subset (plumbing PRs keep a discriminating signal at ~1.6 min eval). The executable wall against silent regrowth is D5's batch-4 budget — a new heavy row blows it with a typed refusal even if review misses the per-row rule. The re-homed rows name their executing consumer through the new FalsifierRehomedBinWet cadence (std.witness_admission), wired through the exclusion-frontier classification, the v2 admission lens (consumer routing + manifest + backing check with its own unbacked-row RED control), and the Rust source-scan classifier (RehomedBinWetRow head, unit-pinned) — the integration: module-identity Phase 0(b)/1 + qualified_name de-fork + emitter Ord unlock (single merge point) #6866 admission invariant untouched.

Hard rules held

  • No timeout raised: floor step stays 55 (gunbc_ci_floor_step_timeout_minutes); the cost-wall landing is APPENDED to the timeout note's bounce history; 55 → 40 is proposed as a data change AFTER post-merge receipts (operator signs; not in this PR).
  • Falsifier cron/cadence untouched: falsifier.yml and the cold-control envs unchanged; the falsifier PLAN gains lane 5 (the D6 re-home destination — the brief's own instruction), enrolled through the same falsifier_batches_append_if_enrolled fold as lanes 2–4.
  • No witness verdict changes: budgets never touch verdicts (admission split, operator-signed in the carrier note); the pool preserves per-claim run_claim semantics and the conjunction (no short-circuit — a v1 language fact, §9.2); the two re-homed rows run identically on the falsifier cadence; gate-grain attribution moves to the pool gate deliberately, with the failing CLAIM still naming itself (the finer grain).
  • Non-goals untouched: ComputationIdentity authority, M2/W3 retention lanes, the 2,652-unlisted-import divergence (flagged, not ours), governor caps/width.

Test plan (proof by execution)

  • cargo test -p v1-compiler --bin claim_executor — 18/18: walk-exit-code pin, unwritable-receipt RED (unwritable_receipt_base_reds_not_vanishes), batch-wall receipt verdicts both directions, existing lane-promotion battery
  • Whole-tree --target dag compile: zero new error identities vs main — pristine main itself exits 1 with 2,647 unlisted-import errors (the flagged two-surface divergence, a named non-goal); the branch-vs-main error-set diff is line-number shifts plus files the merged main added. The two non-exhaustive match: missing variant(s) CheapClaimPoolGate hard diagnostics the first compile caught (floor_materialization, merge_admission) were fixed, and the post-cadence-variant round-3 compile shows zero hard diagnostics — the construction wall doing its job.
  • main_wet regen: falsifier.yml/DESIGN byte-identical; ci.yml healed (converged byte-identical with main's own auto-heal of the stale fleet-converge line) and ROADMAP.md healed on the merge tree (main's committed copy carried a trailing blank line its generator does not emit — the first floor red, reproduced locally and regenerated).
  • Batch-0 pool by execution: ONE claim_batch child evaluated all 4 batch-0 gate fns — cheap_claim_pool_gate_passes PASS (its ONE nested pooled child ran all 12 claims, per-claim PASS lines), both enrollment walls PASS, drift gate PASS after regen; chunk-totality witnesses 4/4 incl. the RED discriminator (cheap_pool_chunk_totality_red_control_holds).
  • Budget-gate RED control BOTH directions by execution on budget_red_control_plan.dag: with GUNBC_FLOOR_BATCH_BUDGET_TIGHTEN_MS=0 → the witness itself PASSes (verdicts untouched — the admission split, live), ✗ FLOOR-BATCH-OVER-BUDGET batch=1 wall_ms=35419 budget_ms=0 (budget row: …) prints, exit 1, receipt row OverBudget counted; without the env → exit 0, WithinBudget. (Local runs needed GUNBC_MEMORY_BUDGET_BYTES above the 12 GiB arm-time floor — this container trips the Finish 7043 (floor budget refusal): ground witness rows on existing FloorOutcome + plan-roster fact #7072 FloorBudgetBelowMinimumFootprint arm otherwise, which is itself that refusal proven live.)
  • Selection-control suite green end-to-end locally (18 controls; one shared index + the named cold control; the orphan-doc red it caught was real — the carried journey doc needed its inbound link — and the doc wall re-proved green)
  • ci_floor_plan_witnesses + ci_floor_optin_roster_witnesses PASS (schedule lens, cheap-membership now 4, falsifier 5-lane structure, budget-coverage witnesses); witness-admission + exclusion-reconciliation witnesses 6/6 incl. the new unbacked-rehomed RED control
  • Acceptance-1 per-batch residuals from this PR's green CI run (headline wall is plumbing-profile — §9.2): batch-0 ≤ ~2 min target (first run: batch-1 wall ~2m05s incl. the pooled child, under its 240s budget), teardown tail gone from the ci_job row, selection-control step wall, discovery phase receipt rows present

Prediction (acceptance 3)

First post-merge ordinary-diff main floor ≤ ~30 min. Basis: 49.5 min (run 30009199696 floor step) − ~3.1 teardown (D2) − ~1 batch-0 pooling (D1) − wet-lane re-homes (D6; plumbing profile −7.9, ordinary diffs less because their wet baseline was already ~1.3 min) − selection-suite share where it appears, against the ordinary-diff discovery/wet profile of §2/§9.2. The actual gets recorded in attribution doc §9.3 post-merge — a miss is a receipt, not a silent pass.

Counted residue (named, not silent)

  • Ingest stays 4 children (~414s) — the mktemp constraint named in-row; dissolves on W3 only.
  • One pool build per batch-0 child and per ingest leg — the in-process irreducible; dissolves on W3.
  • Discovery's 643–1024s resolve wall — instrumented (D4), re-diagnosis gated on the fresh receipt; lever-1 retired as priced.
  • The 1-qualified memory-cliff row — honored via the K-sub-pool cap; full pooling payoff waits on the retention lane (K=16 provisional until the pooled child's union-RSS receipt lands — follow-up row in the carrier note).
  • The prelude coverage hole (~5 min before batch-1 arms) sits outside every batch budget — named follow-up row in the carrier note.

🤖 Generated with Claude Code

https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44

…-control shared index, discovery phase receipts, THE COST WALL, wet-lane re-homes (D1-D6)

D1: batch-0's claim-backed gates share ONE pooled claim_batch child
(tools.cheap_gate_pool — the union of the two concern authorities,
ByDerivation; K sub-pools sized to the slot via
cheap_gate_pool_max_claims_per_child, the section-9.1 cliff wall; child
stays a separate process). New CheapClaimPoolGate runs it; layering/
extdeps gates became non-vacuous enrollment walls asserting
chunk-transform totality (bare pool membership would be a tautology).
Ingest's 4 mktemp overlay children stay — the genuine constraint, named
in-row (ingest_pool_separation_note).

D2: floor_terminal_fast_exit after receipts flush skips the 2.5-3.1min
Drop walk of the ~16GB retained store (twice-confirmed). Exit code
preserved (walk_exit_code, unit-pinned); truncated receipts still red
(unwritable_receipt_base_reds_not_vanishes RED control). Terminal path
only.

D3: the selection-control step's 4m51s was three cold whole-pool index
builds inside floor_skip_discovery_witness; the warmup case now rides
resolve_entry_graph_shared (one shared build + the deliberately-cold
Class-B control build, named). Step stays per-PR; ledger row added.

D4: discovery pump phases land as typed rows in the floor resolve
receipt (discovery_pump_wall_ms / roster_walk / diff_observe /
frontier_attribution / shared_index_build / preresolve_calibration /
runner_resolve + corpus resolve/eval serial sums). Lever-1 stays
retired as priced; the fresh profile names the next mechanism before
any spend.

D5 THE COST WALL: per-batch wall budgets as data
(gunbc.ci_spec.gunbc_ci_floor_batch_wall_budget_seconds, sum 53min
under the 55min cap; per-batch never per-run — the plumbing-PR
profile), read fail-closed at arm time, enforced as typed
FLOOR-BATCH-OVER-BUDGET refusals (never a widen), recorded as typed
receipt rows (target/floor-batch-wall-receipt.txt). Ruling
reconciliation in the carrier note (budgets are admission/scheduling,
never witness verdicts — the 5s-eval-law split; endgame brief operator
is the sign-off). Raise requires an appended receipt note. RED control
both directions proven by execution on the tighten-only injection
fixture (budget_red_control_plan.dag).

D6: bin_witness_wet_per_row_wall_budget_seconds=60; the two rows over
it (floor_skip keystone 289s — also a per-PR duplicate of the
selection-control step — and cross_shard_seam live-tree 183s) re-home
to falsifier wet lane 5 as typed frontier rows
(falsifier_rehomed_bin_wet_rows, reasons + dissolve_on, registry
enrolled); 52 rows remain the per-PR smoke subset.

Also: carries #7123's docs baseline (journey + attribution 9-9.2, now
linked into the doc graph), appends attribution 9.3 with the <=30min
post-merge prediction, retires completed lever rows, appends the
cost-wall landing to the timeout-note bounce history, and heals
ci.yml's stale fleet-converge.sh heal-line (its artifact and
registration were deleted by #7121; the committed yml predated the
regen).

Proven by execution: executor battery 18/18; budget gate RED (witness
PASSes, batch refusal fires, exit 1, OverBudget receipt row) and GREEN
(exit 0, WithinBudget) on the fixture plan; ONE claim_batch child ran
all 4 batch-0 gates with the ONE nested 12-claim pooled child (3 PASS +
drift PASS post-regen); chunk-totality witnesses 4/4 incl. the RED
discriminator; ci_floor_plan_witnesses PASS (membership 4, falsifier
5 lanes, budget coverage); whole-tree compile: zero new error
identities vs main (main itself reds 2,647 pre-existing unlisted-import
rows — the flagged non-goal); doc-reachability wall green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44
@cursor

cursor Bot commented Jul 23, 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.

claude added 3 commits July 23, 2026 17:11
The PR's first floor run failed exactly one gate: generated_artifact_drift
on ROADMAP.md — main's committed copy (post-#7118) carries a trailing
blank line its own generator does not emit, so the merge tree drifted.
Regenerated via main_wet on the merged authorities; ci.yml converged
byte-identical with main's auto-heal of the fleet-converge line this
branch had healed independently. Budget-coverage witness re-proven true
on the merged tree (7 batches, 7 budget rows).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44
…omed rows name their executing consumer (Phase 0(b))

The a9744d3 floor red was WITNESS ADMISSION REFUSAL
cause=UnexecutedDeferredWitness count=2: the D6 re-home removed the two
rows from bin_witness_wet_entries but the admission machinery had no
concept of the new falsifier lane, so the excluded witnesses read as
enrolled-with-zero-consumers — the invariant working as built.

Wired through every reader: std.witness_admission gains the
FalsifierRehomedBinWet cadence variant; ci_layer_roots re-exports it,
flips floor_skip_discovery_witness_test.dag's exclusion row onto it
(with its own reason/dissolve strings; the seam file stays
BinWitnessWet — its algebra row still backs it), and adds the
witness_exclusion_row_is_rehomed_bin_wet predicate (all 7 existing
cadence matches gain the arm); v2.workflow.witness_admission routes
consumer_for_explicit_rosters and the explicit-consumer manifest
through falsifier_rehomed_bin_wet_entries and adds rehomed backing to
witness_exclusion_explicit_roster_rows_consistent (new param);
cli_run's source-scan classifier gains the RehomedBinWetRow head and
the classification roster gains the name; the refusal message names
the lane.

Proven by execution: reconciliation witnesses 5/5 green incl. the NEW
RED control (an unbacked FalsifierRehomedBinWet row reds);
witness_admission_invariant_holds green with the two new rows (the
keystone row classifies FalsifierRehomedBinWet and the manifest covers
it); Rust unit test pins the RehomedBinWetRow head parse.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44

Copy link
Copy Markdown
Contributor Author

Review: Approve (qualitative — CI didn't complete on this head). Design-review verdict from the CI-audit session; run 30027001708's partial actuals are consistent with every prediction the PR makes.

The red on run 30027001708 is not this PR. Since this branch's merge-base, main took exactly one merge (#7110), which changed ROADMAP.md's authority — the merge-ref's textually-merged ROADMAP.md is not the regen fixed point of the merged authority, so generated_artifact_drift_gate correctly returned false. Remedy: merge origin/main, rerun main_wet, push. Note what the failure demonstrated: batch-1 red → the floor stopped before dependent batches and exited at 8m05s with a located ✗ FAIL — the fail-fast shape working, instead of a 40-minute doomed run.

What the partial run already proved by execution:

  • The cost wall ran in CI for the first time: floor batch walls: 1 batch(es), 0 over budget — recording live, batch 1 ~2m05s against its 240s budget.
  • D1 cheap pool: one claim_batch child, 98.5s wall, per-claim PASS lines, both enrollment walls green (was ~152s+ across two children plus per-gate index builds).
  • Zero memory pressure through everything that ran (swap=0, high_events=0, psi=0.00; cgroup peak 10.5GB vs 16.1GB cap) — caveat: the heavy corpus batches never ran, so this narrows the pegging attribution rather than clearing it.
  • Materialization receipt on this tree shows unkeyed≈0.6% (8,985 of 1.48M) vs the historic 47% figure — partial-run, not apples-to-apples, but flagged: if the clean rerun confirms it, the ComputationIdentity pricing in the journey doc needs a correction.

Two flags carried as residue (neither blocking):

  1. Budgets are ordinal-keyed with an arm-time length pin (fails closed, loudly). The discriminating case is the first scoped/docs-only PR post-merge — if its schedule shape refuses spuriously, the fix is identity-keying (already specced in the review thread).
  2. cheap_gate_pool_max_claims_per_child = 16 has thin provenance. A union-RSS ledger row per pooled child would make the cap priced rather than chosen.

Sequencing: this PR should merge before the executor-eviction keystone PR (branch claude/ci-executor-eviction-claims-wzwgbf) — they share cli_run/executor territory, and this one's D6 tames the wet profile the keystone's own branch will pay. Also: this PR and #7109 both append to roster_registry's tail; whichever merges second re-runs the standard both-append resolution.

Merge on the clean rerun's green, with the per-batch receipt (all 7 WithinBudget) recorded against the PR-body predictions.


Generated by Claude Code

…omment scope fix, 9.3 process lesson + on-call notes

- gunbc_ci_floor_batch_wall_budget_note gains the dated operator
  signature (briansrls 2026-07-23) affirming the admission/verdict
  reading — the declared human-signed exemption row the 2026-07-10
  ruling requires — and the amended raise discipline (raising needs a
  dated operator-signed line naming run id + enrollment; tightening by
  ordinary receipt note; remedy is diagnose-or-signed-raise, never
  rerun), plus three named follow-up rows: the prelude coverage hole
  (~5min before batch-1 arms is outside every budget), identity-keyed
  budgets (index coupling rides the ComputationIdentity lane), and the
  K=16 union-RSS receipt (provisional until the pooled child's
  per-shard-peak-rss lands in a CI log; local proxy 1.82GB).
- floor_terminal_fast_exit doc corrected: it is the common tail of
  run()'s walk path (all plan walks), not floor-only.
- Attribution 9.3 gains the process lesson (every piece proven by
  execution except one full floor walk — the lane that redded, twice)
  and the on-call pre-positioning (batches 3/6 at 1.29x/1.45x headroom
  inside slot noise; first organic over-budget expected within days;
  diagnose-or-signed-raise, never pre-widen).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44

Copy link
Copy Markdown
Contributor Author

Blocker ack — landed in 7354a34: ("RehomedBinWetRow {", "") added to the recognized heads in witness_admission_entry_function_keys_from_source, head-coverage unit test extended (rehomed_bin_wet_rows_parse_as_explicit_consumer_keys pins the parse), rebuilt, and the admission/reconciliation witnesses re-proven green. The invariant itself is untouched — agreed it was #6866 working correctly on the two re-homed rows. One necessary addition beyond the scanner: the exclusion-frontier row for floor_skip_discovery_witness_test.dag was classified BinWitnessWet with its backing roster row gone, so witness_exclusion_explicit_roster_rows_consistent_holds would have redded next; the row now carries the new FalsifierRehomedBinWet cadence (std.witness_admission), with backing checked against falsifier_rehomed_bin_wet_entries() and its own unbacked-row RED control — strictly more enforcement, same invariant.

Signature applied verbatim (dated, in gunbc_ci_floor_batch_wall_budget_note) in 9461651, with the three follow-up rows (prelude coverage hole, identity-keyed budgets, K=16 union-RSS receipt), the D2 comment scope fix (common tail of run()), the §9.3 process lesson + on-call pre-positioning (batches 3/6 at 1.29×/1.45× headroom — first organic over-budget expected within days; diagnose-or-signed-raise), and the PR-body baseline flip (#7123 closes as superseded; you own the close).

Head is 9461651, CI running. Merge-on-green acknowledged — #7128 first in the queue.


Generated by Claude Code

claude added 3 commits July 23, 2026 18:51
…longer identifier is not a roster row

Run 30033250697 panicked (exit 101, fail-closed as designed) because the
raw substring scan matched bin_wet( inside the NEW predicate name
witness_exclusion_row_is_rehomed_bin_wet(row: ...) — no entry: literal
in the window, so the scanner stopped the line. The class fix: a head
occurrence preceded by an identifier char is a longer name, skipped
before parsing. Unit-pinned both ways
(head_scan_ignores_longer_identifiers_containing_a_head; the live-file
witness_admission_deferred_rows_have_consumers test now covers the exact
CI path — it sat in the locally OOM-killed battery, which is how this
escaped: the section-9.3 process lesson at unit grain).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44
…cheap_gate_pool_test (864 -> 865)

Run 30035504886's exit-101 was #7127's census refusal working correctly:
the floor's witness_execution_leg_label refuses any discovery entry with
no census TSV row, and this branch's new dag/test/claim/
cheap_gate_pool_test.dag postdated the committed census. Regenerated via
scripts/witness_entry_eligibility_census.sh (the emit transport itself
refused at 865 roster vs 864 declared — fail-closed both ways),
witness_entry_eligibility_census_entry_count bumped 864 -> 865, and the
three .dag sync witnesses proven green by execution through claim_batch
(declared-count exposed, carrier paths, tsv sync). The Rust sync test is
CWD-fragile by construction (relative witness_layer_roots under cargo's
package-dir cwd — the same pre-existing local-suite class as the two
scope-test failures reproduced on pristine main); the .dag witnesses are
the CI-executing consumers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44
…-caching-xn4ynp

# Conflicts:
#	docs/probes/witness_entry_eligibility_census.tsv
#	docs/probes/witness_entry_eligibility_histogram.txt
#	src/v2/compiler/self_host/witness_entry_eligibility_census.dag
briansrls pushed a commit that referenced this pull request Jul 23, 2026
main advanced (force-updated to 608749d, sharing the reconciled lineage) and
its census regens collided with this branch's on the three generated census
artifacts. cli_run.rs auto-merged cleanly (main's changes and the M2
ScheduleRetention / run_claims_in_process additions are in disjoint regions) —
verified by a clean lib build and green RED controls post-merge.

The census is a generated artifact, so the conflict is resolved by its single
authority, not by hand: took main's side on all three files, then regenerated
via witness_entry_eligibility_census_emit against the MERGED working tree. The
merged roster is 880 (main's pinned count 876 was itself stale by ~3 vs main's
real corpus, plus this branch's one new witness executor_schedule_retention);
bumped witness_entry_eligibility_census_entry_count 876 -> 880 and regenerated
TSV + histogram in lockstep. My new witness is present; count consistent.

Note: #7128 is NOT yet in main, so its D1 cheap_gate_pool / D2
floor_terminal_fast_exit cli_run conflicts are still a future resolution — when
#7128 lands, a fresh main merge resolves cli_run against its side (per the
review's sequencing). This merge only brings current main + the census regen.

Post-merge verification (green by execution): lib build clean; 6 schedule_
retention RED controls pass; claim_in_process_matches_spawn_verdict passes;
census witness green via claim_batch; cargo fmt --all --check clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TUqWZP4HTVyUfW4qRqWya1
fbd55eb's floor red was the census_count witness (from main's #7127) —
witness_entry_eligibility_census_count_holds hardcodes the entry count
as a literal (== 876) SEPARATE from the data constant this branch
already bumped to 880, so 880 == 876 was false. The tsv-sync witness
could not catch it (it checks declared == TSV-rows, both statically 880).

Verified the true count is 880, not an emit artifact: tree clean (zero
untracked test files), independent git-tracked find of *_test.dag with
test fn/data = 880, TSV data rows = 880, cheap_gate_pool_test present.
Decomposition: main's committed 876 is STALE — main's live find is 879
(git ls-tree find on origin/main), undetected because affected-set
selection skips this witness on PRs that do not touch its import
closure; this plumbing PR's affected set is the first to run it against
the drifted tree. So 880 = main's true 879 + this PR's cheap_gate_pool
(+1), and updating the literal HEALS main's 3-file latent census drift
in passing.

The count lives in four hand-synced copies (this literal, its note,
witness_entry_eligibility_census_entry_count, the committed TSV) — a §3
parallel-representation main's carrier keeps in sync by hand; restructure
is out of this PR's scope, noted in the witness note. Proven by
execution: all census witnesses across census_test / classification_test
/ tsv_sync_test green through claim_batch (count_holds, the six
classification rows incl. bulk-pending default for the new entry, tsv
sync).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Rc3TWb8FFexdVQDNbb44
@briansrls
briansrls merged commit 7de4ff2 into main Jul 23, 2026
3 checks passed
@briansrls
briansrls deleted the claude/ci-compilation-caching-xn4ynp branch July 23, 2026 20:48
briansrls pushed a commit that referenced this pull request Jul 23, 2026
…red cli_run

#7128 (CI floor endgame D1–D6) landed on main. Merged it in per the review's
sequencing note ("resolve cli_run against #7128's side"). In practice cli_run.rs
AUTO-MERGED cleanly: #7128's D2 floor_terminal_fast_exit / terminal-path work
and the M2 ScheduleRetention + run_discovery_rows eviction + run_claims_in_process
additions live in disjoint regions — no textual conflict, and the two are
complementary (eviction shrinks the retained store; the fast-exit skips the Drop
of whatever remains). host_prelude's cheap_gate_pool likewise didn't collide.

Verified the shared territory is sound, green by execution:
- #7128's claim_executor battery: 18/18 (walk-exit-code pin, unwritable-receipt
  RED, batch-wall receipt both directions, lane-promotion battery)
- M2 schedule_retention RED controls: 6/6
- claim_in_process_matches_spawn_verdict (D2 equivalence): pass
- merged lib build clean; cargo fmt --all --check clean

Only the two generated census artifacts conflicted; resolved via the single
authority (witness_entry_eligibility_census_emit) against the merged tree —
roster 880 -> 881 (#7128 added one net witness), constant bumped and TSV +
histogram regenerated in lockstep, my witness present, count consistent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TUqWZP4HTVyUfW4qRqWya1
briansrls pushed a commit that referenced this pull request Jul 24, 2026
…ections

Verification pass before operator review (2026-07-24): (1) D1 already
LANDED on main — #7122 + #7128 pooled the 26 cold children to 6, verified
by counting readiness probes in run 30052571652's ci log; plan re-framed,
in-process activation split off as deferred D1b with its fail-open
confirmed by direct read of cli_run.rs:9580. (2) D4 audit deletion now
BLOCKED on falsifier health — the cadence is red 5/5 by crawl-timeout
(run 30044928186: cgroup 16.1G pinned, swap saturated, 170m cap), so the
per-PR audit is currently the only working selection control. (3) The 5s
threshold reuses the existing fast-lane law carrier (thread-CPU budget,
typed refusal) — no second authority. §10 checklist: 14 rows, each with
status + how verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg
briansrls added a commit that referenced this pull request Jul 24, 2026
… apart, two operator rulings recorded (#7132)

* Roadmap 2b: interpreter-deletion endgame lane — the three deletions named apart, two operator rulings recorded (zero hand-maintained Rust; effects as emitted per-language providers)

New section group 2b (Track B past strong self-host), reconciled against the
verified state on main rather than memory:

- ts-interp-endgame: the delete-v1 conflation split into its three finish
  lines — compiler (§1 gates, undisturbed), interpreter (2a bulk arc + this
  lane), host-physics (pinned v2-EMITTED kernel per seed census).
- ts-zero-hand: operator ruling 2026-07-23 — hand-MAINTAINED Rust goes to
  exactly zero; the pinned kernel is emitted from cited models; the hand
  roster (25 files + module_path_index, growing) becomes a counted burn-down
  frontier with a new-additions-need-dissolution-triggers review bar; names
  the two doc contradictions to fix (interpreter-kernel-d collapse-vs-pin
  either-or resolves to collapse-then-emit; witness-realization P4's
  claim_executor not-an-emit-target corrected to not-YET per census).
- ts-effects-providers: operator ruling — effects are per-language library
  models (effect providers) emitted like everything else; TargetModel
  runtime_row class carries the interface; 2 of ~9 host-effect families
  landed (#7099), rest are rows not architecture.
- ts-store-econ: the durable BUDGETED artifact-store tier + floor
  consultation is the single gate on the 2a flip (every family retained on
  no_cached_no_evict_carrier); resolved_graph_cache and #7129 eviction
  dissolve INTO it per kernel-D.
- ts-material-ci: materialization kernel in CI (the fold both substrates
  consume); unkeyed-collapse watch-flag (0.6 percent vs historic 47).
- ts-interp-delete: the terminal conditions, with the 2a re-pricing (loud
  in-PR agreement, no drip-feed windows) and cli_run hollowing explicitly
  OFF the interpreter critical path.

Also: ts-native-flip-revert row updated with the landed divergence carrier
receipt (v2.std.native_agreement) — re-flip now gated only on the store.

ROADMAP.md regenerated via main_wet (only ROADMAP.md + authority changed;
all other artifacts byte-identical). roadmap_authority witnesses green
(frame/reset/subgroup/emit-refs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Roadmap 2b rework per review: bind to v1_deletion_plan authority, real dependency edges, corrections + new 2c lens-enforcement group

Every review claim was verified against the tree before accepting; all
load-bearing ones held. Changes:

- 2b is now explicitly a PROJECTION of gunbc.v1_deletion_plan (which
  exists and declares itself the plan authority — the prior block was a
  partial fork); new ts-authority-converge row extends the carrier with
  the execution-track bricks (observation contract, divergence root
  cause, materialization-provider interface, evaluator completeness,
  executor seams, quarantine rehearsal) instead of restating them here.
- Edges now encode the actual dependency graph (RoadmapEdge is
  dependency-gating per roadmap_spawner node_dep_done, not containment):
  store-econ -> material-ci and the 2a flip; observation-contract ->
  flip; evaluator/effects/material/seams -> quarantine -> delete;
  zero-hand after delete as its own terminal milestone.
- ts-native-flip-revert corrected: re-flip is NOT gated only on the
  store — the frontier dissolve_on requires the divergence root-caused
  with member + both values named plus a fresh warm per-host receipt
  (the loudness carrier names failures, it does not resolve them).
- ts-effects-providers: the three conflated populations named apart
  (2 EmittedEffectFamily variants / 9 witness families / ~35 host-fed
  entries); work item is a typed operation-keyed census; boundary
  enforcement (host_run_boundary_admission pending) called out so the
  agency problem does not move into generated providers.
- ts-store-econ: provider-interface-first ordering; artifact store,
  resolved_graph_cache, and #7129 schedule-retention become SIBLING
  provider rows under the materialization kernel, never one merged store.
- ts-material-ci: eval/realize/materialize kept distinct (materialize is
  analysis-side per its own note; realize_pack advisory); the 0.6 percent
  unkeyed receipt bounded properly (run 30027001708 partial-run vs
  committed whole-run ~47.6 — different denominators, record not reprice).
- New rows: ts-observation-contract, ts-evaluator-complete (reject arms +
  missing CPU-deadline/call-depth guards), ts-executor-seams (critical
  slice vs full hollowing), ts-quarantine (deletion dress rehearsal).
- New group 2c (operator request): lens enforcement live in CI —
  per-lens disposition + receipt (zero inert lenses, not 55-blocking;
  complexity is AuditOnly/NoConsumerWitness today), fn-body visibility
  as the real dependency (42 contracts pending reflection; space
  complexity re-homes off src/v1 before terminal deletion), coverage
  re-enrollment priced through the D5 budget wall.

ROADMAP.md regenerated via main_wet (only ROADMAP.md + authority
changed); roadmap_authority witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Roadmap 2b/2c: absorb the #7135 adversarial pass — synthesis of both review sets, with two claims adjudicated against the tree

Integrates every verified correction from the adversarial pass (stacked
as #7135 on the pre-rework commit, now absorbed here):

- 9-of-11 precision on the frontier retention reasons (complement +
  meet_join at agreement_red_on_main; the store gates the other nine
  families' FIRST flip, not the reverted pair's re-flip).
- Cache-root truth: ci.yml pins GUNBC_NATIVE_CACHE_ROOT to the runner
  tool-cache (durable, R2-keyed); what's missing is budget/eviction
  authority + the executor-grain consult, not 'no store at all'.
- Gate-1 gloss corrected to the carrier definition (GateEmitterFixedPoint
  = the emitter re-emits itself) + prereq_drift_ruling_2026_07_23 cited.
- interpreter_surviving_roles named as the roles carrier; the un-rostered
  wet-workflow surfaces (serve/belt, main_wet, gunbc ci, pre-push, probe
  bins) become an enrollment obligation AND a delete condition.
- Third carrier contradiction recorded (^hand_queue_drain: 7-files prose
  vs live 25-file roster; pins-not-drain-targets vs the collapse ruling).
- 2a census staleness: 876 entries not 744, first_error_class still
  CensusPending; totality denominator must be derived (group 5a).
- ts-store-econ SIZED (IntricacyHigh/VolumeMedium) with Accept + RED,
  provider shape as ONE CacheLookupResult contract with N sibling
  provider rows (store tier, resolved_graph_cache, recorded_fixture,
  #7129 schedule-retention, W3).
- 2c upgraded to the five-row v2-door lane (M-L1 door / M-L2 treewide
  store-priced / M-L3 contract truth / M-L4 complexity scope), keeping
  this branch's disposition taxonomy and the space-complexity re-home
  rider; cross-edge ts-lens-treewide -> ts-store-econ.

Two adjudications where the reviews conflicted, settled by direct read:
(1) Filesystem Delete/List EXIST (filesystem_io.dag operation Delete;
artifact_fs_delete/artifact_fs_list in the fs transport) — review 1 was
right; the artifact_store_fs transport NOTE is the stale artifact, and
ts-store-econ now says wiring-counted-eviction, not modeling. (2) the
zero-hand edge direction: full zero-hand stays AFTER the delete (its own
terminal milestone); the narrower ^hand_queue_drain brick precedes
QUARANTINE per the carrier's prereq ruling — both encoded, neither
review's blanket edge taken.

ROADMAP.md regenerated via main_wet; roadmap_authority witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Roadmap 2b/2c: apply the 9bfe09c re-review — safe ordering edges, converge-gated execution track, hardened store REDs, link-grain quarantine, 2c totality wall + terminal

- Edges: flip now child of census + seams + flip-revert (root-cause
  precedes the bulk flip); quarantine child of flip; evaluator-complete /
  executor-seams / effects-providers child of authority-converge (option
  b: the projection claim true by construction until the carrier gains
  its bricks).
- Hand-drain contradiction resolved: the kernel-D/hand_queue_drain
  carrier FIXES are ts-authority-converge's deliverable; material-ci
  re-pointed; terminal zero-hand burn-down stays after the delete.
- Census literals de-literalized: histogram carrier is the denominator
  authority (876->880 in one day proved the point); snapshots dated.
- ts-store-econ RED battery hardened: verdict-equality primary +
  byte-purity on the keyed artifact (sound per C.2 #6576 seed emitter
  map_keys-free by construction), same-key corruption refuses on read
  (content_verified_on_read flips true), concurrent puts atomic; the row
  named as the ForciblySerial bottleneck (2a flip + lens M-L2 + kernel
  converge on it).
- Quarantine at LINK grain: v1_interpreter omitted from the built
  artifact (cfg/feature or crate split) — source-inaccessible proves
  nothing about a linked module.
- 2c: anchor precision (no lens on the compile DOOR; witnesses run
  elsewhere); M-L1 scoped to all THREE seed-path compile sites (PR gate,
  falsifier cold control, regen); M-L2 names W3 typed-module tier as the
  specific provider; M-L3 counts verified (55 ids / 47 contracts / 44
  AuditOnly / 9 uncovered incl. the LIVE Determinism gate) + the
  registry-contract totality wall first; ts-lens-terminal added as the
  fan-in node with edges from treewide + contract-truth +
  complexity-scope.

Verification pushbacks recorded: authored_wi sizes with
acceptance: ManualAcceptance (not empty — the belt cannot dispatch
bar-less); the seed emitter HAS a determinism guarantee by construction
(C.2 #6576), so the byte-purity oracle stands on the keyed artifact.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Roadmap 2b/2c: apply the green-verification review — five fixes, none structural

1. Flip-revert row twice-corrected: the pair's re-flip gate is EXACTLY
   the frontier's own dissolve_on (root-cause + fresh warm receipt, NO
   store clause — the pair rides the cached leg); my earlier correction
   over-gated in the opposite direction from the original under-gate.
   One authority: the carrier's strings, never a roadmap paraphrase.
2. ts-effects-providers: the stale ~35 host-fed literal replaced with
   the classified truth (6 so far, 700 pending, eventual count unknown;
   histogram carrier is the authority).
3. M-L3 counts reconciled: 46 contracts (44 AuditOnly + 2 Blocking),
   consistent with 55 − 9; the 47 was a grep over-count.
4. Wet-surfaces roles-roster enrollment now OWNED: added to
   ts-authority-converge's brick list (it was delete-blocking with no
   owner).
5. Dispatchability: ts-authority-converge sized (IntricacyMedium/
   VolumeMedium — it is the sprint's entry point and concrete carrier
   work); the 2c anchor-grouping edges removed so ts-lens-door is not
   gated behind an umbrella that never completes (edges are for real
   deps only — the 2b block already followed this rule).

Trivia: evaluator module path corrected to v2.extdeps.runtimes.*;
cli_run line-count de-literalized (~28k and growing); 2b label reframed
'decoupled from strong self-host' to match the content.

Regen byte-idempotent; roadmap_authority witnesses green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Roadmap 2d + plan doc: progress & observation — process→outcome discipline, one event model, N renderers

docs/plans/progress-observation-design.md: the five operator-signed laws
(process→outcome no orphans; heartbeat carries identity; recursive dwell
escalation; quiet at arm's length; every response true), the P0 event
model (Refused distinct from Failed; BlockedOn DERIVED from governor
facts; one glyph/material authority incl. the reward-animal rows), and
per-context FORMAT CONTRACTS: CI log (append-only, heartbeat+escalation
first-class — the reference implementation's gap), interactive TTY,
receipt/JSONL (replayable; existing receipts become derived views),
dashboard (schema-only), pipe. Reference implementation gunb-ai/gunb.ai
tools/terminal studied BY EXECUTION (tests green; driven live in
TTY/CI/failure modes): lift contention/nesting/boxes/reward; fix CI
silence, Failed/Refused conflation, hand-mirrored emoji duals.

Roadmap 2d: ts-obs-anchor + sized ts-obs-model (P0) + sized
ts-obs-ci-renderer (P1, flagship = re-render the captured crawl window
of run 30044816605) + ts-obs-tty (P2) + ts-obs-census-wall (P3), edges
encoding P0→P1/P2→P3. Doc-graph bind added; reachability witnesses 4/4
and roadmap witnesses green; ROADMAP.md regenerated via main_wet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Plan: CI two-tier placement redesign — the 5-second rule

Records the 2026-07-24 operator decisions: placement by measured warm cost
(≤5s rides the PR path, wet admissible if fast + hermetic-classified),
DELETE the per-PR selection-control audit step (falsifier cadence is the
surviving control), Rust seed stays tested-by-execution in CI. Dependency
order D0–D5 with the post-merge #7129 P1s folded into D0 and the
run_claims_in_process activation blockers into D1. Doc bound to
gunbc.ci_spec.gunbc_ci_spec; dissolves when D3's placement axis lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Plan: single-PR delivery structure + expectation sheet + sign-off checklist

Operator directive 2026-07-24: no staged drag-out — pre-PR probe does all
measurement, one redesign PR lands D1+D3+D4+D5 atomically (single revert),
D0 close-out routed to the #7129 worker and sequenced first (shared
cli_run.rs). Before/after sheet with falsification bounds per row; §9
decision checklist for reviewer sign-off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Plan: issue-closure checklist worked through by execution; three corrections

Verification pass before operator review (2026-07-24): (1) D1 already
LANDED on main — #7122 + #7128 pooled the 26 cold children to 6, verified
by counting readiness probes in run 30052571652's ci log; plan re-framed,
in-process activation split off as deferred D1b with its fail-open
confirmed by direct read of cli_run.rs:9580. (2) D4 audit deletion now
BLOCKED on falsifier health — the cadence is red 5/5 by crawl-timeout
(run 30044928186: cgroup 16.1G pinned, swap saturated, 170m cap), so the
per-PR audit is currently the only working selection control. (3) The 5s
threshold reuses the existing fast-lane law carrier (thread-CPU budget,
typed refusal) — no second authority. §10 checklist: 14 rows, each with
status + how verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Plan + roadmap: apply the #7132 review round — fourth carrier contradiction, staleness, D5 brief in-tree

All five findings verified against the tree before applying: (1) parity_window
required_consecutive_green_windows=3 + frontier dissolve_on strings contradict
the 2a re-pricing (no first flip writable with the falsifier red) — joins
ts-authority-converge's stale-prose deliverables as the FOURTH contradiction;
(2) ts-store-econ's '#7129 in flight' corrected to merged + PR-0 close-out;
(3) rust-suite disposition miscite fixed at its authorities (design_document,
ci_spec — DESIGN.md reprojects; actual decl commit_gate_rust_suite_removed_disposition);
(4) roster rows corrected to post-pooling reality (6 = 1 union + 4 ingest-overlay
by construction per ingest_pool_separation_note + 1 reads-class; batch-6 414s not
12.15m); zero-hand tag repointed at ts-seed-interim; (5) D4 leaves PR-1 — fast-follow
micro-PR gated on first green cadence (§9.7). Implementer round folded in: D1b
scope refinement (plain resolve_entry_graph — spawns removed, per-entry resolves
not), 5s threshold-vs-mechanism caveat (§9.1), and §11 lands the DiffBaseline
brief in-tree (previously chat-only). ROADMAP.md regenerated via main_wet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

* Split hub-file token fixes out of this PR; record the batch-3 budget finding

Run 30063529282 refused batch 3 at 24m59s vs the 22m budget: the one-token
miscite fixes in ci_spec.dag + design_document.dag are hub files, so
selection legitimately ran the full corpus (2,315 witnesses, ALL PASS,
RSS healthy) — the honest full-corpus wall exceeds the budget. Attribution
clean: same branch without the hub files was green (0d54cdc). Fixes
reverted here to ride PR-1 (which pays full corpus anyway); DESIGN.md
re-projected from its reverted authority. Systemic implication recorded:
PR-1 necessarily touches CiSpec and will face the same wall — §9.8 decision
(receipt-noted raise sized by the D2 probe) + checklist row 15. The budget
wall itself worked as designed; no widen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fdkaGGLUKpLRwwqxp5sLg

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants