Skip to content

PMAT-3715: release-readiness-v1 — the tag is refused unless every release cell has a fresh Pass receipt - #3736

Closed
noahgift wants to merge 5 commits into
mainfrom
PMAT-3715-release-readiness-shape
Closed

noahgift wants to merge 5 commits into
mainfrom
PMAT-3715-release-readiness-shape

Conversation

@noahgift

@noahgift noahgift commented Sep 21, 2026 •

Copy link
Copy Markdown
Member

PMAT-3715: release-readiness-v1. The tag is refused unless every release cell has a fresh Pass receipt

Operator, 2026-09-21, verbatim: "you need to improve our dogfood process and pv SHACL so leaks don't exist pre-release. this is clown town." Every 0.69.0 leak was absence read as conformance. Here every obligation of a release is a graph node derived from what was measured, so a missing receipt is a missing edge that minCount 1 rejects.

What it does

Proof

  • 34 red-turning CLI cases, crates/aprender-contracts-cli/tests/ont_release_readiness.rs, wired as ci/explicit-test-commands.d/450. The green base passes 48/48 cells, each named, and then one thing changes per case:
    • a cell that is missing, skipped, falls back, doesn't say whether it fell back, is stale by sha, stale by version, or duplicated;
    • a think-ON cell that is missing, or has an unclosed block and an empty answer;
    • a declared-length rung that is absent, or unmeasured; two hosts that disagree on a file's length; a prompt short of its rung;
    • a kernel green on sm_121 and red on sm_89 (reported first); a kernel measured on one arch only;
    • one mismatched tokenizer id; zero tokens compared; a broken round trip;
    • a host with no receipt; a v1 receipt standing in for a host; an inherited or absent dogfood;
    • a consumer with no number; a thinking_modes/markers contradiction;
    • the memory rule: a 27B-shaped refusal on lambda plus a pass on gx10 is GREEN; an OOM instead of a refusal, a co-tenant refusal, a refusal with no shortfall, and a rung that fits nowhere are RED;
    • T-4's --receipts-commit; no subject → 2; caller errors → 3; pv extract writes only to --out.
  • Mutants: skip-as-pass (a shape mutant) turns 1 case red; always-fresh (a code mutant) turns 3 red.
  • cargo test -p aprender-contracts --lib: 1695 passed. cargo test -p aprender-contracts-cli: every target green. The ont4b shape ratchet was raised 9 → 18, naming the new shapes. pv lint contracts: PASS, 0 errors, and no new warnings from this contract. make ont-ratchet was restamped. Clippy -D warnings is clean on both crates, lib and tests.
  • evidence/release/proof-0.69.0/ (done_when 5, first half): 0.69.0's own evidence, translated without inventing a measurement (the rules are in translate.py and the README), is RED with 795 findings. They name:
    • qwen3-8b on lambda: verdict=fail;
    • qwen2.5-coder on lambda and qwen3moe on both hosts: never identified by the release (unmeasuredModel), with their failing sweep rows unkeyedRow;
    • 752 of 768 cells absent: every chat, serve and code cell;
    • the dogfood receipt the train "inherited" a GO from, which says NO-GO, for the parent commit, at 0.68.2.

Known remainder (cop ruling, verbatim)

release_evidence.rs VERBS is a hand-coded list; #3745 S2 replaces it with the derived cell set via Inputs.cells. 0.69.1 does not tag while it exists.

Quorum

Round 3 at 84289cb7ba38adf96c0a1c5f836eb84ccb8d0646 is AGREED: gemini-3.1-pro-high PASS, gemini-3.1-pro-low PASS, gpt-oss-120b-medium PASS (author claude-opus-5; receipt-lint: complete). Artifact: docs/audits/quorum-PMAT-3715.json, diff_sha256 9df958d287befbf36a6b50be55984468291262bf8a3cf2cf9507b584e2f5676b. Round 1 judged against the ticket title alone and was superseded by the implementation receipt; round 2 was 2 PASS + 1 NO-VERDICT. After the round-3 head, the only commit adds this artifact and the roadmap-fragment note below, and changes no code.

Merged origin/main

#3706 (PMAT-3704) ties pc_extract to Σ, so release-evidence gets its own control, release_evidence::positive_control(), drawn every gate run. Mutant measured: emitting only cells that have rows gives pv lint --gate shapes exit 2, "positive control pc_extract.release-evidence did not fire".

Not in this PR, so it carries Refs

Receipt formats were agreed on #3712 with aprender-62, -f0, -37 and -eb; tokenizer parity on #3726.

Refs #3715, #3712, #3710, #3726

🤖 Generated with Claude Code

noahgift and others added 2 commits September 21, 2026 18:34
…ease cell has a fresh Pass receipt; absence is a violation by construction

Operator, 2026-09-21: "you need to improve our dogfood process and pv SHACL so leaks don't exist
pre-release. this is clown town." Every 0.69.0 leak was absence read as conformance.

- receipts.rs reads apr-model-ladder-receipt v1 AND v2 (#3712). Before this, the first committed v2
  receipt would have turned `pv lint --gate shapes` exit 3 on every PR (a foreign schema is refused
  by name, and still is for v3).
- extract:release-evidence (Σ entity type release-evidence), built ONLY under a release subject:
  Release, Host, Model, Verb, ContextRung, Cell, CellReceipt, RefusalCell, RungCoverage,
  TokenizerCell, KernelCell nodes. The universe is DERIVED (host inventory ∪ cuda ladder rungs ×
  verbs × thinking_modes × context rungs up to the model's GGUF length; kernels from every host's
  dispatch path; one tokenizer cell per model), so a missing receipt is a missing edge.
- the nine-shape release-readiness-v1 family; `--shape` arms it whatever armed_shapes says and
  reports release → host → context → model → coverage → tokenizer → kernel → refusal → cell.
- `pv lint --gate shapes --shape release-readiness-v1 --release-version V --release-commit MC
  [--receipts-commit S] [--receipts D] [--kernel-receipts D] [--tokenizer-receipts D]
  --dogfood-receipt F`: 0 Pass · 1 Fail naming cells · 2 decline (no subject) · 3 caller error.
  `pv extract --release-* --out F` writes the release graph and never the tracked contracts.nt.
- 34 red-turning CLI cases (a green base with every cell named, then one change each), 10 unit
  tests; skip-as-pass and always-fresh mutants each turn the table red.
- evidence/release/proof-0.69.0: 0.69.0's own evidence, translated without inventing a
  measurement, is RED with 795 findings naming qwen3-8b lambda (verdict fail), qwen2.5-coder lambda
  and qwen3moe on both hosts (never identified), 752 of 768 cells absent, and the NO-GO dogfood
  receipt the train "inherited" a GO from.

Receipt formats agreed on #3712 with aprender-62, -f0, -37, -eb; tokenizer parity on #3726.
No waivers (cop ruling (c); the operator-only surface is #3722).

Refs #3715, #3712, #3710, #3726

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… reproduces; fixture rows one per line

gate-summary.json carries the verdict, the counts, every non-cell finding verbatim and the cell findings
aggregated per host/model; the README's command re-runs the full 795-finding report.

Refs #3715

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

Copy link
Copy Markdown
Member Author

quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false)

{
 "ticket": "PMAT-3715",
 "head": "0e99993dc13eae20f6f49644f29041d2e23b4796",
 "width": 3,
 "executor": "agy",
 "agreed": false,
 "auto_merge": {
  "checked": true,
  "was_armed": false,
  "disarmed": false,
  "note": "auto-merge not armed"
 },
 "lanes": [
  {
   "lane": 1,
   "verdict": "NO-VERDICT",
   "findings": 0
  },
  {
   "lane": 2,
   "verdict": "NO-VERDICT",
   "findings": 0
  },
  {
   "lane": 3,
   "verdict": "PASS",
   "findings": 0
  }
 ]
}

…ith its URL

Round 1 of the quorum judged against the ticket TITLE alone (`pmat work status` prints nothing else): both
gemini lanes carried a scope FAIL for the kernel, thinking, tokenizer and dogfood cells that the issue's author
added on the issue. The receipt is what the brief carries; it quotes each addition and the measurements.

Refs #3715

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

Copy link
Copy Markdown
Member Author

quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false)

{
 "ticket": "PMAT-3715",
 "head": "ba9afe3d1cd8c6a900ade681ce17cc4d3b1cf4ba",
 "width": 3,
 "executor": "agy",
 "agreed": false,
 "auto_merge": {
  "checked": true,
  "was_armed": false,
  "disarmed": false,
  "note": "auto-merge not armed"
 },
 "lanes": [
  {
   "lane": 1,
   "verdict": "NO-VERDICT",
   "findings": 0
  },
  {
   "lane": 2,
   "verdict": "PASS",
   "findings": 0
  },
  {
   "lane": 3,
   "verdict": "PASS",
   "findings": 0
  }
 ]
}

…ease-evidence gets its own control

The one real conflict (the extract import in shapes_gate.rs) is textual; the semantic one is #3706's
every_implemented_entity_type_in_sigma_has_an_extract_control_and_it_fires: release-evidence was implemented in
Σ with no pc_extract control, so the merged tree would have gone RED.

release_evidence::positive_control(), drawn every gate run with no release subject and no file: a sample cell
with one fresh Pass row and a planted cell with none go through the real build(); it fires iff the planted cell
is still a release:Cell node with ZERO rows (absence materialized for minCount 1). extract() is now file reading
plus a pure build(Inputs). Mutant measured: emit only cells that have rows -> pv lint --gate shapes exit 2,
'positive control pc_extract.release-evidence did not fire'. Also moves receipts.rs's strings() helper above
the test module (clippy items_after_test_module).

Refs #3715, #3704

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

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3736 head=c7dfd6427ee9963ba37b4e42a9b81b1f45a7f486 verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

@noahgift

Copy link
Copy Markdown
Member Author

quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false)

{
 "ticket": "PMAT-3715",
 "head": "84289cb7ba38adf96c0a1c5f836eb84ccb8d0646",
 "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": 0
  },
  {
   "lane": 2,
   "verdict": "PASS",
   "findings": 0
  },
  {
   "lane": 3,
   "verdict": "PASS",
   "findings": 0
  }
 ]
}

…emainder in the fragment

The cop's landing conditions (1)-(2): the fragment names the hand-coded VERBS const as the known remainder,
verbatim, so no reader takes it for the finished design; #3745 S2 deletes it. No code changes.

Refs #3715, #3745

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

Copy link
Copy Markdown
Member Author

Superseded — this PR's content is already on main (operator 1-day PR rule triage, 2026-09-24).

Carrying commit: 8c7822f — release(0.69.1): batch 1 (#3772).
Evidence (measured against origin/main @aa7c6ef03): 4438/4447 added lines present on main; 36/38 files byte-identical. The 9 lines not verbatim on main are all in crates/aprender-contracts/src/lint/shapes_gate.rs and were rewritten in the fold (#3772 is main's last touch of that file):

let arming = match (opts.only.as_deref(), armed_shapes_of(contract_dir)) {
    (_, Err(e)) => return ShapesOutcome::Unsupported(e),
    (Some(_), Ok(_)) => ArmedShapes::All,
    (None, Ok(a)) => a,
let shapes = match select_family(declared, opts.only.as_deref()) {
    Ok(s) => s,
    // a named family reports in the order its contract declares it: the release, its hosts, its context,
    // its kernels, THEN its model cells (#3715: a kernel that diverges across arches is named before any
    // model cell it breaks). Stable, so the validator's order holds within a shape.

Branch is NOT deleted: PMAT-3715-release-readiness-shape @ c7dfd6427.

@noahgift noahgift closed this Sep 24, 2026
@noahgift
noahgift deleted the PMAT-3715-release-readiness-shape branch October 9, 2026 08:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind:code Work is a code change (derived rule, #4159)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant