Repository navigation
fix(#3715 B1): release-readiness ENFORCES at T-1/T-4; report arm deleted (R10) - #4603
Merged
Merged
Conversation
…s, size prompts per mode (PMAT-3715, PMAT-3712) Quorum 2 on 0d/3715-cells-at-t1 was not agreed: 2 FAIL (sonnet-5 x2), 1 PASS (haiku). Every concrete finding is fixed: - an --only that names no inventory model wrote 0 cells at rc 0; now it refuses, rc 2 (case only-rung, mutant only-vacuity) - load_rungs failures were discarded; now a named refusal, rc 1 (case rungs-empty, mutant rungs-silent) - an off-mode prompt was sized by the thinking budget; now it is sized per mode (case offmode, mutant offmode-budget) - the receipt cited evidence from another diff; section 7 now cites this branch's own check_ladder_cells_producer.sh: 12 cases, 9/9 mutants killed. bashrs head vs base: errors and warnings equal. Round-1 artifact committed as evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 0265c13)
) `apr serve` holds the GPU lock for its whole life. The producer kept one serve up across rungs, so the next rung's locked `apr run` waited --lock-wait and was refused (rc 75), and so was every cell after it (09-28 gx10 pilot). Serve cells now run LAST per model: still one serve per model, never a wait on ourselves. check_ladder_cells_producer.sh: new case `selflock` (--lock, --lock-wait 3, all 16 owed rows measured, no rc 75) and mutant `serve-inline` (the old inline serve) that it kills. Run on intel: 13 cases + 10 mutants as expected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 2ed3599)
…e the owed set (#4590, #3715) Operator ruling 2026-09-28: Qwen3 on GB10 is correct but 27-34x slower than Qwen3.5 (8k think-on, sm_121, serial prefill: Qwen3-1.7B 967 s, Qwen3-8B 2163 s vs Qwen3.5-9B 63-80 s). DE-CLAIM it for 0.70; fix in 0.70.1 (#4590). - contracts/model-capability-ladder-v1.yaml: new `cells.declaimed` entry {arch: qwen3, host: gx10, issue: 4590, until: 0.70.1, why}. lambda still owes every Qwen3 cell, and the qwen3 long-rung representative is unchanged. - judge (model_ladder_cells.py): `declaimed()` validates each entry (arch, a declared host, issue > 0, until, why) and FAILs a bare one; a matching arch x host prints DECLAIMED on every run and is skipped there only. - producer: `--host`; a de-claimed arch is not measured on its host. model_ladder.sh passes --host. - cases: green-cells-declaimed, red-cells-declaimed-bare (+ mutants declaim-skip, declaim-bare); producer case `declaim` (+ mutant). intel: check_ladder_cells_producer.sh rc 0 (all cases + mutants). Judge self-test: head 149 cases 1 bad, base 147 cases 1 bad -- the same bad at both, tomllib missing on intel's python 3.10 (ladder_equiv.py), not this change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 885b5b8)
…te the 0.70 de-claim (#3715) Operator 12:17: DE-CLAIM Qwen3 on GB10 for 0.70, apr WARNS, release note. known_issue_warning(arch, cc) is pure and table-tested (9 cases); the two mutants (prefix match, no cc bound) are killed by qwen35/121 and qwen3/89. generate_2 prints it once per process beside the prefill-path line. CHANGELOG Known issues names #4590 and the 0.70.1 fix plan. clippy -D warnings on aprender-serve --features cuda is red at base in cuda/executor/residual.rs:314,343 (untouched here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 474e0cb)
… fixture (#3715) Rebased onto PR-2 head e9556d9, whose green-cells carries llama.cpp fit verdicts (#4016); the de-claim fixture predated that rule and went red. It is now green-cells with the qwen2/gx10 de-claim and gx10's c.gguf cells removed. Judge self-test on intel: head 151 cases 1 bad = base 149 cases 1 bad (tomllib, py3.10); declaim-skip and declaim-bare mutants killed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 6f0818d)
…by default (#3715) done_when 4. scripts/release/release_readiness.sh wraps `pv lint --gate shapes --shape release-readiness-v1`: it earns --receipts-commit only when the receipts name one 40-hex apr_sha whose tree equals the release commit outside evidence/, and it maps pv's 0/1/2/3 onto the gate. DEFAULT_MODE=report until #3712's cells[] producer lands: a Fail is a WARN row, while a decline, caller error or missing pv stops. RELEASE_READINESS_MODE may only strengthen it to enforce. - autopilot: a new `readiness` step between models and tag grades the T-1 receipts plus the newest .dogfood receipt. A non-zero exit STOPs before the tag. - preflight R8: the same wrapper at T-4 over the committed receipts. - check_release_models_t1: 5 readiness rows and 2 mutants (37 rows). The rows caught the autopilot's R8 regex missing the wrapper's `ok R8` pass line. Measured on 0.69.1: pv rc=1, 1101 violations, of which cell=1008. Selftests: wrapper 17/17, preflight 54/54, models_t1 37/37, with every mutant killed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 8a16b9a)
) Cop ruling 2026-09-25 09:15Z: "record the rc and receipt, don't stop". Under `report`, a pv decline, a missing pv, an exit outside pv's contract, or a "Fail" with no Fail verdict now prints its FAIL row plus `WARN R8 REPORT-ONLY could not judge (rc 2)` and exits 0. Under `enforce` each is still exit 2. A caller error (3) stops in both modes, because it means the wrapper itself was called wrong. Selftest 20/20. Two mutants killed: downgrade under enforce too (16/20), and downgrade removed (17/20). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 5a425da)
Quorum follow-up (sonnet nit, agy finding). The rc-1-with-no-verdict and rc-101 branches now have report-mode rows, and the missing-pv report row greps the REPORT-ONLY WARN line itself. Selftest 23/23; with the downgrade removed, the mutant fails 5 rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 5b8eba4)
The gate runs released pv, so a release_evidence.rs fix would never be used. The de-claim is therefore in what pv reads: - ladder rungs qwen3-1.7b-q4km and qwen3-8b-q4km: hosts [lambda] until 0.70.1 - model_ladder.sh moves the gx10 Qwen3 files out of inventory[] into declaimed_inventory[] (only for a (host, arch) listed in cells.declaimed) - check_model_ladder.sh hosts floor: a host lost to cells.declaimed prints DECLAIMED, any other lost host still FAILs; case declaimed-host-on-rung + mutant declaim-host (killed) - model_ladder_cells.py still judges declaimed_inventory (fail closed) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit ca2daad)
… --cells - release_readiness.sh DEFAULT_MODE=enforce (operator B1, 2026-09-28); env may strengthen, never weaken; selftest 23/23 - models_t1.sh runs model_ladder.sh --cells on both hosts, so release receipts carry cells[] (the 1008 missing-cell violations) - check_release_models_t1.sh anchors + no-cells mutants, 39 rows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit d925422)
Operator 2026-09-28: "missing or skipped step -> release refused". - release_readiness.sh prints, for an ENFORCED Pass only: ok R8 #3715 ENFORCE PASS version=V commit=C pv=<pv --version> out_sha256=<pv output> - autopilot cut_tag() requires that line in $AP/readiness-t1.log FIRST, ahead of the carry and git tag: a run started past readiness, a report-mode pass, a Fail, another commit or no log -> no tag - check_tag_step_gated.sh: rows absent/report/stale -> no tag, mutant 6 killed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 79a81e0)
… derived and every release is RED release-readiness-v1 requires release:surface (minCount 1, #3745): no surface, no cells, no pass. The wrapper never passed --surface, so an enforced R8 could never be green. - autopilot readiness: re-proves the release-built apr is $MC, writes apr surface --json to $AP/surface-t1.json and passes it - release_readiness.sh --surface; default evidence/release/surface/<V>.json (T-4, committed), kept out of the receipts dir because pv reads every *.json there as a host receipt; 27/27 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 997a343)
#3715) pv reads every entry of evidence/crux/<V>/ as crux-inference-receipt/v1 and refused the whole grade (rc 3) on prompt-certification-inventory.json, which is committed beside the receipts on 0.69.1. The wrapper now grades a symlink view without prompt-certification*, the same names model_ladder_cells.py skips. Selftest rows certification_beside_crux_runs and certification_is_not_a_crux_receipt; a filter-removed mutant turns them RED. On 0.69.1 with the current surface, pv now judges: Fail, 29854 violations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit a0ca667)
…3715) Quorum lanes 1 and 3 (sonnet, haiku) measured 4 of 39 rows RED: 997a343 made the T-1 readiness step re-prove $REPO_ROOT/target/release/apr against MC and take its surface, and the harness never put an apr there. ready() now plants a stub apr at the path autopilot pins; r_goes also requires the wrapper to receive --surface $AP/surface-t1.json from that binary. New row readiness-stale-apr-stops (an apr from another commit stops the step before the wrapper runs) and mutant readiness-any-apr (the check removed -> RED). 41/41 rows; floor 41. Lane 2's minor: the R8 fixture comment still called report the committed mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d (cherry picked from commit 57a9497)
…e, and a WARN row stops T-1 and T-4 Operator R10 (2026-09-28): "report-only is not an option". L19: a silent report-only check = hard stop. - release_readiness.sh: resolve_mode prints enforce or fails; `report` as the env value OR as a committed DEFAULT_MODE is a caller error (3). Both WARN R8 REPORT-ONLY arms (the "not a stop until #3712" line) are gone. Selftest row mode_has_no_report_arm. - autopilot.sh T-1: a WARN R8 row from the wrapper is a die, even at rc 0. - check_publish_preflight.sh T-4 R8: rc 0 is not a pass without "#3715 ENFORCE PASS" for this version and HEAD; a WARN R8 row refuses. - Rows flipped: readiness-warn-continues -> readiness-warn-stops; r8_report_mode_warn_passes -> r8_report_mode_warn_refuses; new r8_rc0_without_enforce_pass_refuses. Each killed by its mutant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d
… de-claimed with qwen3 Operator ruling 2026-09-28 16:15Z widens R1 (Qwen3 only) to every dense model on GB10: serial prefill is the sm_12x default for every non-hybrid arch (select_prefill_path). - cells.declaimed: + qwen2 @ gx10 (issue 4590, until 0.70.1); rung qwen2-1.5b-q4km hosts: [lambda] - README + CHANGELOG: "GB10 dense models: prompt processing unbatched (11.4 tok/s); fixed in 0.70.1 (#4590)" - enforce-gate proof (ont_release_readiness.rs): withdrawn on gx10 owes nothing; a planted gx10 claim of the dense model is RED; lambda dropping one dense row is RED (withdrawn != waived) Agent: aprender-e6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…D — planted RED, qwen3moe@gx10 (#3715) STAGED, branch-only (cop 20:00Z/20:26Z; operator rules 07:30Z). Not for merge. cells.declaimed withdrew a (host, arch) from the owed cells, but nothing failed when a rung's host set (what released pv reads) or a long-rung representative still claimed it. declaim_still_claimed() in the judge (enforce: judge rc 1 -> check exits 1): - a rung whose hosts (or, absent, every required host) name a de-claimed (host, its arch) -> FAIL - a long_rungs_for representative for an arch de-claimed on every required host -> FAIL Case table: red-cells-declaimed-still-claimed (new), green-cells-declaimed narrowed to hosts: [lambda] (it claimed the de-claimed pair); cmutant declaim-claimed killed. Self-test 153/153. Data: cells.declaimed + (gx10, qwen3moe), issue 3715, until 0.70.1 (0d H4 19:54Z: arch-level DATA is clean for qwen3moe only). Real-contract proof in evidence/3715-declaim-planted-red/: real = 0, planted qwen3moe rung = 1, narrowed = 0, orphan representative = 1. Agent: aprender-e6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…or 0.70 Operator D1 (relayed by the cop, 2026-09-28 20:10Z): the qwen3moe-gx10 de-claim lands with the planted RED and a release-note warning. CHANGELOG Known issues + README known-issue note, same shape as the #4590 entries. Agent: aprender-e6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t holds both files lambda holds Qwen3-30B-A3B-Instruct-2507 and Qwen3-Coder-30B-A3B (~/models, lambda H4 queue), so the entry now says what withdrawn-not-waived means there: lambda still owes every qwen3moe cell. Data text only; the judge keys on (host, arch) and is unchanged. Falsifier re-run on the real contract: entry -> withdrawn rc 0, drop -> owed again, bare -> rc 1. Refs #3715 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d
…both files and still owes them Same false claim 0d fixed in the contract (e59329f); the release note carried it too. Agent: aprender-e6 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Sep 28, 2026
Closed
Closed
…ranch The base carries rebased copies of this branch's older #3715 commits (every base subject touching the 9 conflicted files has a same-subject commit here). This branch adds R10, G2 and D1 on top, so the conflicted files are taken from this branch: for 7 files ours-vs-base equals exactly those newer commits; check_publish_preflight.sh differs from the base in one reworded comment and check_release_models_t1.sh in the R10 warn-stops row, both superseded here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent: aprender-0d
noahgift
added a commit
that referenced
this pull request
Sep 29, 2026
…ompts with 400 before the model lock (PMAT-4616) Quorum @0c2928642d (gemini, haiku) found two remaining 500 paths: - try_cuda_generate / try_cuda_batch_generate had no pre-flight, so an over-context prompt reached the engine. They now call preflight_serving_context, the same check chat and completions run through fit_serving_context: a 400 "context exceeds N" before the lock. - gpu_batch_completions_handler's batch_generate_gpu Err arm hard-coded 500; it now maps through generation_error_status (ContextLimitExceeded -> 400). Two tests: no cap -> Ok; cap 3 -> 2 Ok, 3 refused with 400. Roadmap entry: title and criterion 3 name every covered route; criterion 1 states that the --context-length 32768 -> 200 case is #4603, not this ticket. Complexity vs main: cyclomatic and cognitive unchanged on all touched fns. intel: clippy default rc0; cuda only pre-existing residual.rs; d5_/cap_context 13 passed. Agent: aprender-2e-serve Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Sep 29, 2026
#4603) A cuda-only aprender-serve lib test, so yoga's cuda-unit job runs it with no model file. An 8192-context llama-shaped model (above serve's old fixed 4096) is sized by `for_serving` and served through the real router and the continuous-batching scheduler: - the device KV is 8192, the model's context; - /v1/completions with 8188 prompt tokens + max_tokens 4 answers 200 with all 4 tokens (usage 8188/4, finish "length"); - 8192 and 8193 prompt tokens answer 400 "context exceeds 8192 ... refused whole, not truncated", not a 500 and not a truncated 200. The weights are centred Q4_K with an FFN norm and separate Q/K/V. The shared fixture's all-positive d=1.0 pattern (cosine 0.00) and its missing FFN norm (cosine 0.54) both fail the CPU/GPU parity gate, correctly. Without a device it prints "CUDA model init failed", which cuda-unit counts as a failure, not a pass. Agent: aprender-00 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Sep 29, 2026
…with a 400 (K1 #4603, D5 #4614) KV-only vehicle for #4630, folded (moved, not copied) from the ec stack onto main. Three rows: - #4603 K1: `apr serve` builds the CUDA model with `for_serving`, which sizes the device KV to the model's context capped by free VRAM (two batched slots budgeted, never below the old 4096). Before, serve fixed it at 4096 whatever the model declared, so a longer prompt overflowed the cache and answered 500. - #4614 / PMAT-4616 D5: a prompt at or past the serving context is refused whole with 400 "context exceeds N", on chat, completions and stream. - The KV budget core it needs (session_kv.rs, resident.rs). C25 test: api/tests/serve_kv_limit_k1.rs builds a synthetic 8192-context model, serves it through the real router and batch scheduler on the device and asserts KV == 8192, 8188+4 -> 200 with all 4 tokens, 8192 and 8193 -> 400 "refused whole". A return to Fixed(4096) fails the KV assertion. gx10 (cc 121): aprender-serve --features cuda lib filter serve_kv_limit_k1|serve_context_d5|session_kv|resident 28/28, apr-cli serve 429/429. Refs #4603 #4614 #4630 Agent: aprender-00 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Sep 29, 2026
…op 11:03Z) The tree is exactly devont/k1-kv-only (origin/main + K1 #4603, D5 #4614 and the KV budget core). The other stack rows (#3715 serial prefill / for_session, #3413 message, #4620, #4623, #4624) stay on their ec parents for a later PR; nothing is deleted there. A merge, not a rebase or force-push. Agent: aprender-00 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…4 + PMAT-4633) Agent: apr-0d-b1 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Member
Author
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3715",
"head": "616fd1461e3383ffd9ad94f4998d38fcf555cf18",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 8
},
{
"lane": 2,
"verdict": "FAIL",
"findings": 2
},
{
"lane": 3,
"verdict": "NO-VERDICT",
"findings": 0
}
]
} |
…; carries main) Agent: apr-0d-b1 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> # Conflicts: # docs/roadmaps/roadmap.yaml
Member
Author
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3715",
"head": "9efceaa0248ab90213ccc1cb1868653eba33aa03",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 4
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "NO-VERDICT",
"findings": 0
}
]
} |
…'planned for 0.70.1', not 'fixed' (quorum round 2) Agent: apr-0d-b1 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Member
Author
|
quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3715",
"head": "33b032506af6cb0300815e499ba9109dbda76a2c",
"width": 3,
"executor": "agy",
"agreed": true,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 2
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 0
}
]
} |
… gemini-3.1-pro-high; base split/ont10-rest-0.70) Agent: apr-0d-b1 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
noahgift
marked this pull request as ready for review
September 29, 2026 20:02
noahgift
added a commit
that referenced
this pull request
Sep 29, 2026
Pmat-Ticket: PMAT-4502 Agent: aprender-07 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Oct 4, 2026
… beside chat's session KV Merges the #4630 branch (devont/k1-serve-kv @ da4f4f9) into this one by merge, so its commits and its review receipt keep their history. The two branches share a merge base that already holds this PR's session-KV work, and #4630 later dropped that work to stand alone on main. A plain merge reads that drop as a revert: it was clean, and it silently took gpu_profile.rs and chat_load_tokenizers.rs back to main and removed for_session from gguf/cuda/mod.rs. This merge keeps both PRs' changes against main instead: - gpu_profile.rs, chat_load_tokenizers.rs: this PR's version (#4630 leaves them as on main). - gguf/cuda/session_kv.rs: #4630's version, which holds every line of this PR's. - gguf/cuda/mod.rs: both KV modes side by side -- FitContext with for_session and session_kv_len (#4621), FitServing with for_serving and serving_kv_len (K1), both match arms, and the QK-norm prefill fit check (#3715). Against either branch, the result drops no line that branch changed from main. Refs #4603 #4614 #4616 #4621 Agent: aprender-wprodmodels Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #3715 (B1, the release-readiness gate). Stacked on #4588 (#4502 PR-2), which carries the cells producer. The base retargets to
mainwhen #4588 lands.What it does
release_readiness.shrunspv lint --gate shapes --shape release-readiness-v1in enforce mode.DEFAULT_MODE=enforceis at line 45, and it is the only mode.reportis refused both as an env value and as a committed default (caller error 3). Selftest row:mode_has_no_report_arm.cut_tag()refuses the tag unless the log carriesok R8 #3715 ENFORCE PASS version=V commit=MC pv=.... AWARN R8row stops T-1 even when rc is 0.WARN R8row, and refuses rc 0 without the ENFORCE PASS line for this version and HEAD.--surface, filters the crux dir and uses the release apr formodels_t1.R9 proof
(a) Planted failing check leads to RED, and (b) a clean pass leads to GREEN.
falsify.shruns the real wrapper and the realcut_tagover pv's green fixture:This run used pv built at dev 8d021f6. With released pv 0.69.2 the gate cannot pass (see BLOCKED above). The receipt will be re-run on whichever pv the operator picks.
Selftests on this head:
release_readiness.sh --selftest30/30,check_publish_preflight.sh --selftest57/57, andcheck_release_models_t1.sh --selftestgreen. Each new refusal row is killed by its mutant:r8_report_mode_warn_refusesandr8_rc0_without_enforce_pass_refuses;readiness-warn-stops.(c) The gate runs only on the release path (L21).
ci/sections.yml:2256runscheck_publish_preflight.sh --selftest, and the pv unit testont_release_readinessruns too.scripts/release/autopilot.sh(T-1) andscripts/check_publish_preflight.shR8 (T-4).Final proof is still owed: the rc.1 and FINAL release-decision run IDs showing the #3715 step ran in ENFORCE and passed.
🤖 Generated with Claude Code