From 77ba7d2fd14ad6d9c33d8f97ce5c5fc8041373ad Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Tue, 8 Sep 2026 09:49:14 +0200 Subject: [PATCH 01/10] =?UTF-8?q?perf(ci):=20pr-review-receipt=20is=20disp?= =?UTF-8?q?atch-only=20=E2=80=94=2096=20h=20of=20fleet=20runner-time=20for?= =?UTF-8?q?=20a=20job=20that=20gates=20nothing=20(PMAT-1078)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BSE-15 measured this job as the fleet's single largest consumer of runner-hours: 96 h of aprender PR time in the 30 days to 2026-09-07, inside a fleet that threw away 42.1 % of everything it spent. It is 150 minutes of two mutation sweeps on a clean-room runner, on every push to every open PR. It gates nothing. It is not a required context (`ci / gate` and `workspace-test` are), no job `needs:` it, and `gate` deliberately stopped reading it (PP-066 C0-5, PRQ-013, #2982) because a head-defined receipt job is a check the PR under review can edit. What does gate the receipt is pr-review-quorum.yml, which runs from the BASE on pull_request_target + merge_group and invokes check_pr_review_arm4.sh itself — it consumes no artifact from this job, so this job stopping changes no verdict anywhere. The job stays fully wired and runnable on demand: gh workflow run ci.yml --ref On a dispatch there is no pull_request context, so PR_HEAD_SHA falls back to github.sha; every sha-consuming step is already fail-closed and sweeps rather than skips, so the fallback cannot turn a dispatch into a silent no-op. check_pr_review_wiring.sh R4 moves WITH the policy rather than being routed around: EVENTS_TRUE/EVENTS_FALSE swap, both failure messages say why, and a new self-test row carries the old `if: github.event_name == 'pull_request'` verbatim and asserts FAIL — so putting the job back on every PR is a red check, not a quiet reversion. Self-test 26/26; discrimination confirmed by restoring the old `if:` on the real ci.yml (guard exits 1, both polarities) and restoring the new one (exit 0). Refs PMAT-1078, BSE-15, BSE-001 §4 wave 5 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01B2EenRiCc3FbvW5GJe2xFh --- .github/workflows/ci.yml | 36 +- docs/roadmaps/roadmap.yaml | 2581 ++++++++++------------------- scripts/check_pr_review_wiring.sh | 47 +- 3 files changed, 987 insertions(+), 1677 deletions(-) mode change 100755 => 100644 scripts/check_pr_review_wiring.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 126877c7b0..cdf4ec163f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1830,13 +1830,39 @@ jobs: # out the first time the runner is busy, and a cancelled job reads as a failure # nobody can distinguish from a real one). timeout-minutes: 150 - if: github.event_name == 'pull_request' + # NOT ON PULL REQUESTS, since 2026-09-08 (BSE-15, BSE-001 §4 wave 5). This job + # was the single largest consumer of fleet runner-hours: 96 h of aprender PR + # time over the 30 days ending 2026-09-07, third of a fleet total that threw + # away 42.1 % of everything it spent. It is 150 minutes of two mutation sweeps + # on a `clean-room` runner, on EVERY push to EVERY open PR, and it gates + # nothing: it is not a required context (`ci / gate` and `workspace-test` are), + # no job `needs:` it, and the `gate` job deliberately stopped reading it + # (PP-066 C0-5, PRQ-013, #2982 — a head-defined receipt job is a check the PR + # under review can edit, and `scripts/check_receipt_gate_base_owned.sh` now + # refuses any such `needs:`). What DOES gate the receipt is + # `.github/workflows/pr-review-quorum.yml`, which runs from the BASE on + # `pull_request_target` + `merge_group` and invokes + # `scripts/check_pr_review_arm4.sh` itself — it consumes no artifact from this + # job, so this job stopping changes no verdict anywhere. + # + # It stays FULLY WIRED and runnable on demand, which is the point of moving it + # to dispatch rather than deleting it: + # gh workflow run ci.yml --ref + # On a dispatch there is no `pull_request` context, so PR_HEAD_SHA falls back + # to `github.sha` and the sweep runs against the dispatched ref; every trigger + # step below is already fail-closed on an unusable sha (it sweeps rather than + # skips), so the fallback cannot turn a dispatch into a silent no-op. + if: github.event_name == 'workflow_dispatch' env: # The `runner` context is NOT available in a job-level `env:` block — # GitHub rejects the workflow with `Unrecognized named-value: runner` # (#2791). $RUNNER_TEMP is read inside the run blocks instead. PR_NUMBER: ${{ github.event.pull_request.number }} - PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + # On workflow_dispatch there is no pull_request context; the dispatched ref + # is the thing to sweep. Empty would make every sha-consuming step take its + # fail-closed branch and sweep anyway, so this fallback is about naming the + # right commit in the log, not about reachability. + PR_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} steps: - name: Checkout uses: actions/checkout@v7 @@ -2157,7 +2183,11 @@ jobs: pull-requests: write env: PR_NUMBER: ${{ github.event.pull_request.number }} - PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + # On workflow_dispatch there is no pull_request context; the dispatched ref + # is the thing to sweep. Empty would make every sha-consuming step take its + # fail-closed branch and sweep anyway, so this fallback is about naming the + # right commit in the log, not about reachability. + PR_HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Checkout diff --git a/docs/roadmaps/roadmap.yaml b/docs/roadmaps/roadmap.yaml index e2e64da1a4..af35cdc995 100644 --- a/docs/roadmaps/roadmap.yaml +++ b/docs/roadmaps/roadmap.yaml @@ -23,17 +23,12 @@ roadmap: - inference - api - streaming - notes: 'Resolved 2026-01-20: - + notes: | + Resolved 2026-01-20: - PAR-301: SafeTensors server now has /v1/chat/completions and /generate endpoints - - PAR-302: APR server (CPU and GPU) now has /v1/chat/completions endpoint - - Both support OpenAI-compatible API with SSE streaming - - ChatML prompt template formatting implemented - - ' - id: PMAT-082 github_issue: null item_type: task @@ -56,11 +51,9 @@ roadmap: labels: - release - crates-io - notes: 'Released 2026-01-20: apr-cli v0.2.10 published to crates.io - + notes: | + Released 2026-01-20: apr-cli v0.2.10 published to crates.io Verified: cargo install apr-cli installs and runs correctly - - ' - id: PMAT-083 github_issue: null item_type: task @@ -141,27 +134,19 @@ roadmap: - serving - tracing - feature - notes: 'Discovered 2026-01-21: X-Trace-Level header documented in examples/serve_with_tracing.rs - + notes: | + Discovered 2026-01-21: X-Trace-Level header documented in examples/serve_with_tracing.rs but not implemented in commands/serve.rs. QA script fails F-TRACE-001/002/003. - COMPLETED 2026-01-26: All tracing features implemented and working: - - X-Trace-Level header parsing in serve.rs - - --trace, --trace-level, --profile CLI flags - - --trace-output JSON file writing - - QA tests all pass (qa_serve 35/35, qa_chat 20/20, qa_verify 20/20) - - ' - id: APR-ANTIGRAVITY-PARITY-001 github_issue: null item_type: epic - title: 'Pillar-5 either-harness parity: apr code drivable by Claude Code OR Google Antigravity with - prompt parity' + title: 'Pillar-5 either-harness parity: apr code drivable by Claude Code OR Google Antigravity with prompt parity' status: planned priority: high assigned_to: null @@ -169,15 +154,11 @@ roadmap: updated: 2026-07-04 00:00:00+00:00 spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - - apr code's CODE model is drivable by EITHER Claude Code (Anthropic Messages wire) OR Google Antigravity - (Gemini generateContent wire) — one agent loop, two wire formats. - - A fixed prompt corpus produces the SAME canonical tool-call trace through both surfaces (FALSIFY-AGY-PARITY-002), - at temperature 0. + - apr code's CODE model is drivable by EITHER Claude Code (Anthropic Messages wire) OR Google Antigravity (Gemini generateContent wire) — one agent loop, two wire formats. + - A fixed prompt corpus produces the SAME canonical tool-call trace through both surfaces (FALSIFY-AGY-PARITY-002), at temperature 0. - Anthropic input_schema <-> Gemini functionDeclarations.parameters is a lossless map (FALSIFY-AGY-PARITY-003). - - Both HTTP handlers dispatch into the identical apr-code-v1 agent loop (FALSIFY-AGY-PARITY-004) — no - forked per-wire agent. - - contracts/apr-antigravity-parity-v1.yaml promotes DRAFT -> ENFORCED when the two wire surfaces ship - and all four gates pass. + - Both HTTP handlers dispatch into the identical apr-code-v1 agent loop (FALSIFY-AGY-PARITY-004) — no forked per-wire agent. + - contracts/apr-antigravity-parity-v1.yaml promotes DRAFT -> ENFORCED when the two wire surfaces ship and all four gates pass. phases: [] subtasks: [] estimated_effort: null @@ -186,13 +167,7 @@ roadmap: - apr-code - antigravity - parity - notes: 'Extends the apr-code pillar from Claude-Code-only to EITHER Claude Code OR Google Antigravity, - with prompt parity. Antigravity (Google''''s agent-first IDE) is Gemini-native (generateContent -> - Vertex Model Garden) and also Anthropic-key capable; apr''''s existing apr-claude-proxy-v1 covers - the Anthropic path, and the new apr-gemini-proxy-v1 covers the Gemini path. The invariant that makes - a prompt portable across both is apr-antigravity-parity-v1 (kind: pattern, 4 gates, DRAFT). NOT a - "beat Antigravity" benchmark — Antigravity is a harness apr plugs INTO, not a fourth-pillar incumbent - (the beat framing stays Claude-Code-only in beat-claude-code-parity-v1). Authored 2026-07-04.' + notes: 'Extends the apr-code pillar from Claude-Code-only to EITHER Claude Code OR Google Antigravity, with prompt parity. Antigravity (Google''''s agent-first IDE) is Gemini-native (generateContent -> Vertex Model Garden) and also Anthropic-key capable; apr''''s existing apr-claude-proxy-v1 covers the Anthropic path, and the new apr-gemini-proxy-v1 covers the Gemini path. The invariant that makes a prompt portable across both is apr-antigravity-parity-v1 (kind: pattern, 4 gates, DRAFT). NOT a "beat Antigravity" benchmark — Antigravity is a harness apr plugs INTO, not a fourth-pillar incumbent (the beat framing stays Claude-Code-only in beat-claude-code-parity-v1). Authored 2026-07-04.' - id: APR-GEMINI-PROXY-001 github_issue: null item_type: task @@ -204,10 +179,8 @@ roadmap: updated: 2026-07-04 00:00:00+00:00 spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - - crates/aprender-serve/src/gemini/ translation layer consumes contracts/apr-gemini-proxy-v1.yaml (YAML - authoritative; hand-edited wire shapes rejected). - - POST /v1beta/models/{model}:generateContent + :streamGenerateContent (SSE) implemented; contents/parts/systemInstruction/functionDeclarations/generationConfig - parsed. + - crates/aprender-serve/src/gemini/ translation layer consumes contracts/apr-gemini-proxy-v1.yaml (YAML authoritative; hand-edited wire shapes rejected). + - POST /v1beta/models/{model}:generateContent + :streamGenerateContent (SSE) implemented; contents/parts/systemInstruction/functionDeclarations/generationConfig parsed. - functionCall/functionResponse round-trip to the SAME agent loop as apr serve anthropic (FALSIFY-GEMINI-PROXY-003). - 'Sovereignty: no egress to *.googleapis.com (FALSIFY-GEMINI-PROXY-006).' - All six FALSIFY-GEMINI-PROXY-00x gates green -> contract DRAFT -> ENFORCED. @@ -219,16 +192,11 @@ roadmap: - apr-code - antigravity - serve - notes: 'Sibling to apr-claude-proxy-v1 (Anthropic). Same default CODE model (Qwen3-Coder-30B-A3B-Instruct - Q4_K_M), same agent loop; only the wire format differs. Key translation asymmetry: Gemini signals - tool use via a functionCall PART + finishReason=STOP, whereas Anthropic uses stop_reason=tool_use - — both must decode to canonical stop_signal=tool_use. Contract: contracts/apr-gemini-proxy-v1.yaml - (validated 2026-07-04).' + notes: 'Sibling to apr-claude-proxy-v1 (Anthropic). Same default CODE model (Qwen3-Coder-30B-A3B-Instruct Q4_K_M), same agent loop; only the wire format differs. Key translation asymmetry: Gemini signals tool use via a functionCall PART + finishReason=STOP, whereas Anthropic uses stop_reason=tool_use — both must decode to canonical stop_signal=tool_use. Contract: contracts/apr-gemini-proxy-v1.yaml (validated 2026-07-04).' - id: APR-ANTIGRAVITY-INTEGRATION-001 github_issue: null item_type: task - title: Track & document Antigravity integration paths (Anthropic-key base URL, Gemini endpoint, community - gateways) + title: Track & document Antigravity integration paths (Anthropic-key base URL, Gemini endpoint, community gateways) status: planned priority: medium assigned_to: null @@ -236,10 +204,8 @@ roadmap: updated: 2026-07-04 00:00:00+00:00 spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - - Document, per Antigravity release, whether it accepts a custom base URL on the Anthropic-key path - (apr serve anthropic drop-in) and/or a custom Gemini endpoint. - - 'A runbook: point Antigravity at a local apr instance via whichever path its current version allows - (incl. community gateway if that is the only route).' + - Document, per Antigravity release, whether it accepts a custom base URL on the Anthropic-key path (apr serve anthropic drop-in) and/or a custom Gemini endpoint. + - 'A runbook: point Antigravity at a local apr instance via whichever path its current version allows (incl. community gateway if that is the only route).' - The wire contracts stay a drop-in so apr is ready the instant an official endpoint override lands. phases: [] subtasks: [] @@ -249,10 +215,7 @@ roadmap: - antigravity - integration - tracking - notes: HONEST tracking task. As of 2026-Q1 Antigravity has no official "add a custom endpoint" button; - the Gemini path targets Vertex Model Garden and the Claude path uses a user Anthropic key. apr targets - WIRE PARITY (be a drop-in) rather than claiming shipped Antigravity support. This task follows Antigravity''s - evolving BYOK/endpoint story and keeps a working integration runbook. Pairs with APR-GEMINI-PROXY-001. + notes: HONEST tracking task. As of 2026-Q1 Antigravity has no official "add a custom endpoint" button; the Gemini path targets Vertex Model Garden and the Claude path uses a user Anthropic key. apr targets WIRE PARITY (be a drop-in) rather than claiming shipped Antigravity support. This task follows Antigravity''s evolving BYOK/endpoint story and keeps a working integration runbook. Pairs with APR-GEMINI-PROXY-001. - id: ROADMAP-RECONCILE-2026-07-04 github_issue: null item_type: documentation @@ -266,21 +229,13 @@ roadmap: acceptance_criteria: - Stale pre-pivot inprogress epics reclassified to planned (deferred, not actively worked). - Session-completed items PMAT-730/733/735 marked completed. - - The 2026-06-12 beats-as-CI-artifacts pivot is recorded as the reason APR-BOOK-* and CRUX-L*/CRUX-M* - are deferred. + - The 2026-06-12 beats-as-CI-artifacts pivot is recorded as the reason APR-BOOK-* and CRUX-L*/CRUX-M* are deferred. phases: [] subtasks: [] estimated_effort: null labels: - housekeeping - notes: 'The GitHub-synced backlog had drifted: 43 items were labelled `inprogress` but none had been - touched since 2026-05-17 — they are the PRE-PIVOT epics (APR-BOOK-* book-completeness, PMAT-497..514; - CRUX-L*/CRUX-M* kernel+gate parity, PMAT-655..678; and the KD/distillation items PMAT-679/680/687/691). - The 2026-06-12 pivot to BEATS-as-CI-artifacts (PMAT-741+) superseded those lanes. To stop the backlog - implying 43 phantom active tasks WITHOUT fabricating completion, all 43 are reclassified `inprogress` - -> `planned` (deferred backlog). Items genuinely finished this session (PMAT-730 roc/pr curves, PMAT-733 - encoder Pipeline gate, PMAT-735 poly+multiclass SVC) are marked `completed`. The live queue is the - June-11 PMAT-72x/73x/74x beat backlog. See SVC-SMO-WSS-001 for a solver follow-up surfaced this session.' + notes: 'The GitHub-synced backlog had drifted: 43 items were labelled `inprogress` but none had been touched since 2026-05-17 — they are the PRE-PIVOT epics (APR-BOOK-* book-completeness, PMAT-497..514; CRUX-L*/CRUX-M* kernel+gate parity, PMAT-655..678; and the KD/distillation items PMAT-679/680/687/691). The 2026-06-12 pivot to BEATS-as-CI-artifacts (PMAT-741+) superseded those lanes. To stop the backlog implying 43 phantom active tasks WITHOUT fabricating completion, all 43 are reclassified `inprogress` -> `planned` (deferred backlog). Items genuinely finished this session (PMAT-730 roc/pr curves, PMAT-733 encoder Pipeline gate, PMAT-735 poly+multiclass SVC) are marked `completed`. The live queue is the June-11 PMAT-72x/73x/74x beat backlog. See SVC-SMO-WSS-001 for a solver follow-up surfaced this session.' - id: BEAT-OLLAMA-DECODE-CI-001 github_issue: null item_type: task @@ -292,10 +247,8 @@ roadmap: updated: 2026-07-04 00:00:00+00:00 spec: null acceptance_criteria: - - beat_ollama_decode_throughput_speed (Pillar-4 decode 1.2-1.37x vs ollama) runs on a scheduled GPU - workflow, not just developer-side. - - The runner has (or gets) the required GGUF (qwen2.5-coder-1.5b-instruct-q4_k_m.gguf) + an apr binary - built --features cuda. + - beat_ollama_decode_throughput_speed (Pillar-4 decode 1.2-1.37x vs ollama) runs on a scheduled GPU workflow, not just developer-side. + - The runner has (or gets) the required GGUF (qwen2.5-coder-1.5b-instruct-q4_k_m.gguf) + an apr binary built --features cuda. phases: [] subtasks: [] estimated_effort: null @@ -303,13 +256,7 @@ roadmap: - pillar-4 - ci - gates-or-theater - notes: 'Surfaced by the 2026-07-04 beat-wiring audit (see feedback_workspace_test_lib_only_beats_ungated). - beat_ollama_decode_throughput_speed is #[ignore]-gated and its docstring says "ENFORCED manual/GPU - gate", but it is in NO scheduled workflow (not ci/gate, not beat-speed-nightly, not cuda-nightly) - — so it is developer-verified only, a softer version of the closed QLoRA doctrine gap. The natural - home is the cuda-nightly lane (has GPU runners), but that needs the q4_k_m GGUF present on the runner - (the QLoRA lane uses a .apr, not a GGUF). Deferred from v0.59 to keep the release free of runner-infra - dependencies.' + notes: 'Surfaced by the 2026-07-04 beat-wiring audit (see feedback_workspace_test_lib_only_beats_ungated). beat_ollama_decode_throughput_speed is #[ignore]-gated and its docstring says "ENFORCED manual/GPU gate", but it is in NO scheduled workflow (not ci/gate, not beat-speed-nightly, not cuda-nightly) — so it is developer-verified only, a softer version of the closed QLoRA doctrine gap. The natural home is the cuda-nightly lane (has GPU runners), but that needs the q4_k_m GGUF present on the runner (the QLoRA lane uses a .apr, not a GGUF). Deferred from v0.59 to keep the release free of runner-infra dependencies.' - id: SVC-SMO-WSS-001 github_issue: null item_type: task @@ -321,8 +268,7 @@ roadmap: updated: 2026-07-04 00:00:00+00:00 spec: null acceptance_criteria: - - MultiClassSVC(rbf) reaches sklearn-parity accuracy on the i%3 Iris split at the DEFAULT C=1 (currently - needs C=10 to reach 0.98; at C=1 the pair 1v2 under-converges to train 0.806). + - MultiClassSVC(rbf) reaches sklearn-parity accuracy on the i%3 Iris split at the DEFAULT C=1 (currently needs C=10 to reach 0.98; at C=1 the pair 1v2 under-converges to train 0.806). - The existing svc-rbf-v1 sklearn-parity falsifiers stay green. phases: [] subtasks: [] @@ -331,12 +277,7 @@ roadmap: - pillar-1 - svm - follow-up - notes: Surfaced by beat_sklearn_svc_accuracy (PMAT-735). apr's SVCRbf uses a simplified Platt/CS229 - SMO whose working-set selection maximises |E_i - E_j| (first-order). On the overlapping versicolor/virginica - Iris pair at C=1 it stalls short of the max-margin solution (train 0.806 vs sklearn 1.0); a larger - box constraint C=10 lets it reach 0.98 (ties sklearn). Upgrading to the libsvm 2nd-order WSS heuristic - (+ shrinking) should close the gap at the default C=1. Purely a convergence-quality improvement; the - RBF kernel math and existing parity contract are unchanged. + notes: Surfaced by beat_sklearn_svc_accuracy (PMAT-735). apr's SVCRbf uses a simplified Platt/CS229 SMO whose working-set selection maximises |E_i - E_j| (first-order). On the overlapping versicolor/virginica Iris pair at C=1 it stalls short of the max-margin solution (train 0.806 vs sklearn 1.0); a larger box constraint C=10 lets it reach 0.98 (ties sklearn). Upgrading to the libsvm 2nd-order WSS heuristic (+ shrinking) should close the gap at the default C=1. Purely a convergence-quality improvement; the RBF kernel math and existing parity contract are unchanged. - id: CUDA-CI-NIGHTLY-001 github_issue: null item_type: task @@ -349,13 +290,9 @@ roadmap: spec: null acceptance_criteria: - A cuda-labeled self-hosted runner is registered on lambda-vector (RTX 4090, sm_89, CUDA 12.8). - - 'A scheduled workflow runs the #[ignore]-gated GPU falsifier suite with APR_PARITY_MODEL set: FALSIFY-CUDA-FUSED-RMSNORM-DEADLOCK-001, - FALSIFY-CUDA-NF4-FORWARD-NAN-001, FALSIFY-CUDA-NF4-TRAIN-LOSS-PARITY-001, FALSIFY-CUDA-EVAL-ADAPTER-SYNC-001, - FALSIFY-CUDA-EVAL-GPU-FORWARD-001, plus the loss-window suite.' - - The lane is GREEN on main and its result is surfaced (nightly first; promote to a blocking gate on - training-path PRs once stable). - - Each formerly developer-verified GPU win is re-annotated as CI-enforced in ROADMAP.md P3 + the relevant - contract qa_gate. + - 'A scheduled workflow runs the #[ignore]-gated GPU falsifier suite with APR_PARITY_MODEL set: FALSIFY-CUDA-FUSED-RMSNORM-DEADLOCK-001, FALSIFY-CUDA-NF4-FORWARD-NAN-001, FALSIFY-CUDA-NF4-TRAIN-LOSS-PARITY-001, FALSIFY-CUDA-EVAL-ADAPTER-SYNC-001, FALSIFY-CUDA-EVAL-GPU-FORWARD-001, plus the loss-window suite.' + - The lane is GREEN on main and its result is surfaced (nightly first; promote to a blocking gate on training-path PRs once stable). + - Each formerly developer-verified GPU win is re-annotated as CI-enforced in ROADMAP.md P3 + the relevant contract qa_gate. phases: [] subtasks: [] estimated_effort: null @@ -364,9 +301,7 @@ roadmap: - ci - pillar-3 - doctrine-gap - notes: 'Closes the biggest "gates or theater" hole surfaced 2026-07-03: the entire v0.55-v0.57 QLoRA - training-correctness wave is falsified only developer-side because the CI fleet has no CUDA runner. - Prereq is purely operational (register the runner); the falsifiers already exist and pass on the 4090.' + notes: 'Closes the biggest "gates or theater" hole surfaced 2026-07-03: the entire v0.55-v0.57 QLoRA training-correctness wave is falsified only developer-side because the CI fleet has no CUDA runner. Prereq is purely operational (register the runner); the falsifiers already exist and pass on the 4090.' - id: GH-9 github_issue: 9 item_type: task @@ -486,12 +421,10 @@ roadmap: estimated_effort: null labels: [] notes: null -- id: Sovereign AI Integration Specification v1.1 - Complete architecture document with 10 peer-reviewed - references, Toyota Way principles, and Rust safety improvements +- id: Sovereign AI Integration Specification v1.1 - Complete architecture document with 10 peer-reviewed references, Toyota Way principles, and Rust safety improvements github_issue: null item_type: task - title: 'New task: Sovereign AI Integration Specification v1.1 - Complete architecture document with - 10 peer-reviewed references, Toyota Way principles, and Rust safety improvements' + title: 'New task: Sovereign AI Integration Specification v1.1 - Complete architecture document with 10 peer-reviewed references, Toyota Way principles, and Rust safety improvements' status: completed priority: medium assigned_to: null @@ -507,8 +440,7 @@ roadmap: - id: 'Apply code review safety fixes: Add AprenderError enum and bounds checking to SIMD intrinsics' github_issue: null item_type: task - title: 'New task: Apply code review safety fixes: Add AprenderError enum and bounds checking to SIMD - intrinsics' + title: 'New task: Apply code review safety fixes: Add AprenderError enum and bounds checking to SIMD intrinsics' status: completed priority: medium assigned_to: null @@ -1244,8 +1176,7 @@ roadmap: - id: 'Phase 1: Classical Bayesian Inference - Conjugate Priors (Gamma-Poisson, Normal-InverseGamma, Dirichlet-Multinomial)' github_issue: null item_type: task - title: 'New task: Phase 1: Classical Bayesian Inference - Conjugate Priors (Gamma-Poisson, Normal-InverseGamma, - Dirichlet-Multinomial)' + title: 'New task: Phase 1: Classical Bayesian Inference - Conjugate Priors (Gamma-Poisson, Normal-InverseGamma, Dirichlet-Multinomial)' status: completed priority: medium assigned_to: null @@ -1258,12 +1189,10 @@ roadmap: estimated_effort: null labels: [] notes: null -- id: 'Phase 2: Bayesian Examples & Documentation - Create cargo examples and book chapters for Gamma-Poisson, - Normal-InverseGamma, and Dirichlet-Multinomial conjugate priors' +- id: 'Phase 2: Bayesian Examples & Documentation - Create cargo examples and book chapters for Gamma-Poisson, Normal-InverseGamma, and Dirichlet-Multinomial conjugate priors' github_issue: null item_type: task - title: 'New task: Phase 2: Bayesian Examples & Documentation - Create cargo examples and book chapters - for Gamma-Poisson, Normal-InverseGamma, and Dirichlet-Multinomial conjugate priors' + title: 'New task: Phase 2: Bayesian Examples & Documentation - Create cargo examples and book chapters for Gamma-Poisson, Normal-InverseGamma, and Dirichlet-Multinomial conjugate priors' status: completed priority: medium assigned_to: null @@ -1744,17 +1673,12 @@ roadmap: - cross-platform - intel-mac - depends-on-trueno - notes: 'Depends on TRUENO-METAL-001 completion. - + notes: | + Depends on TRUENO-METAL-001 completion. Uses lambda-lab-rust-development Intel Mac integration: - - Host: mac (Intel Mac Pro with AMD Radeon Pro W5700X, 16GB VRAM) - - Metal 3 support, 60 Compute Units - - Run health check: make mac-health (from lambda-lab-rust-development) - - ' - id: PMAT-PERF-009-CUDA github_issue: null item_type: task @@ -1869,11 +1793,9 @@ roadmap: subtasks: [] estimated_effort: null labels: [] - notes: 'Resolved 2026-01-20: Verified through GGUF-SERVE-001 validation. - + notes: | + Resolved 2026-01-20: Verified through GGUF-SERVE-001 validation. All 95 QA tests pass with coherent output across 0.5B, 1B, 1.5B, 7B, 32B models. - - ' - id: PMAT-087 github_issue: null item_type: task @@ -1885,21 +1807,14 @@ roadmap: updated: 2026-01-21 20:00:00+00:00 spec: null acceptance_criteria: - - '**Root Cause**: CPU streaming in realizar''s api.rs is ''fake streaming'' - it generates ALL tokens - first via generate_with_cache (blocking), THEN streams them one-by-one. True streaming only exists - in CUDA path (generate_gpu_resident_streaming). - - - **Fix Required**: Add streaming callback support to CPU OwnedQuantizedModel.generate_with_cache() - similar to the CUDA path, or implement generate_streaming() method that yields tokens as they''re - generated. + - |- + **Root Cause**: CPU streaming in realizar's api.rs is 'fake streaming' - it generates ALL tokens first via generate_with_cache (blocking), THEN streams them one-by-one. True streaming only exists in CUDA path (generate_gpu_resident_streaming). + **Fix Required**: Add streaming callback support to CPU OwnedQuantizedModel.generate_with_cache() similar to the CUDA path, or implement generate_streaming() method that yields tokens as they're generated. **Files**: - - /home/noah/src/realizar/src/api.rs:3622-3679 (CPU quantized streaming) - - - /home/noah/src/realizar/src/gguf/mod.rs (add generate_streaming)' + - /home/noah/src/realizar/src/gguf/mod.rs (add generate_streaming) phases: [] subtasks: [] estimated_effort: null @@ -1934,15 +1849,11 @@ roadmap: - gguf - serving - validation - notes: 'Validated 2026-01-20: All 5 GGUF model sizes pass QA (95/95 tests total). - + notes: | + Validated 2026-01-20: All 5 GGUF model sizes pass QA (95/95 tests total). PAR-303 (0.5B coherency) resolved - all model sizes now produce coherent output. - Showcase spec updated to v7.6.0 (100% GGUF, 71% Overall). - Remaining gaps: PAR-301 (SafeTensors), PAR-302 (APR format). - - ' - id: PMAT-088 github_issue: null item_type: task @@ -1954,36 +1865,24 @@ roadmap: updated: 2026-01-21 20:00:00+00:00 spec: null acceptance_criteria: - - '**Root Cause**: Model generates ''Human:''/''Assistant:'' turns because: - + - |- + **Root Cause**: Model generates 'Human:'/'Assistant:' turns because: 1. Empty stop_tokens (Vec::new()) passed to QuantizedGenerateConfig - should include EOS token - - 2. Model may not match ChatML template - some models use ''Human:''/''Assistant:'' format - + 2. Model may not match ChatML template - some models use 'Human:'/'Assistant:' format 3. Output not cleaned of extra turns after generation - **Evidence**: - - api.rs:3619 has stop_tokens: Vec::new() - - - User typed ''hey'', got ''Human: Hi there...'' in response - + - User typed 'hey', got 'Human: Hi there...' in response **Fix Required**: - 1. Pass proper stop tokens (EOS token ID 151645 for ChatML) - 2. Clean output text after <|im_end|> or stop sequence - 3. Consider auto-detecting model format from GGUF metadata - **Files**: - - /home/noah/src/realizar/src/api.rs:3615-3620 (QuantizedGenerateConfig) - - - /home/noah/src/realizar/src/chat_template.rs (template detection)' + - /home/noah/src/realizar/src/chat_template.rs (template detection) phases: [] subtasks: [] estimated_effort: null @@ -2004,13 +1903,10 @@ roadmap: subtasks: [] estimated_effort: null labels: [] - notes: 'Resolution: NOT A REGRESSION - stale binary issue. - + notes: | + Resolution: NOT A REGRESSION - stale binary issue. Fresh build: `apr check --help` works, 10/10 stages pass. - QA artifact was from outdated binary. - - ' - id: PMAT-090 github_issue: null item_type: task @@ -2026,17 +1922,12 @@ roadmap: subtasks: [] estimated_effort: null labels: [] - notes: 'Resolution: MODEL CAPACITY ISSUE, NOT CODE BUG. - + notes: | + Resolution: MODEL CAPACITY ISSUE, NOT CODE BUG. Root cause: 0.5B model lacks sufficient parameters for coherent generation. - Control test: 1B model produces perfect output on same code path. - - Evidence: 1B output "The answer to 2+2 is 4. Let''s break it down..." - + Evidence: 1B output "The answer to 2+2 is 4. Let's break it down..." Action: 0.5B marked as stress-test/latency benchmark only. - - ' - id: PMAT-091 github_issue: null item_type: task @@ -2056,34 +1947,22 @@ roadmap: labels: - realizar - tracing - notes: 'RESOLVED: Trace functionality was already implemented correctly in realizar api.rs - + notes: | + RESOLVED: Trace functionality was already implemented correctly in realizar api.rs lines 3797-3897. Original failures were due to: - 1. Server startup issues (stale binary, wrong port) - 2. Testing before server fully initialized - Verification: 2026-01-22 - - `apr serve model.gguf --port 8082`: All F-TRACE-001/002/003 PASS - - brick_trace, step_trace, layer_trace fields correctly populated - - All 21 QA tests pass including trace tests - - Root cause likely in realizar''s API - the trace data may require specific - - AppState configuration that apr serve''s delegation doesn''t set up correctly. - + Root cause likely in realizar's API - the trace data may require specific + AppState configuration that apr serve's delegation doesn't set up correctly. Note: This is a REALIZAR issue, not APRENDER. apr serve correctly delegates - - to realizar::api::create_router() but traces don''t appear in responses. - - ' + to realizar::api::create_router() but traces don't appear in responses. - id: PMAT-092 github_issue: null item_type: task @@ -2103,15 +1982,11 @@ roadmap: labels: - realizar - bug - notes: 'Fixed in realizar commit 95bff6d. - + notes: | + Fixed in realizar commit 95bff6d. Root cause: GPU path had `stop_tokens: Vec::new()` causing model to generate - beyond EOS, creating fake "Human:" and "Assistant:" turns. - Fix: Added EOS token lookup (<|im_end|> or <|endoftext|>, fallback 151645). - - ' - id: PMAT-093 github_issue: null item_type: task @@ -2208,8 +2083,7 @@ roadmap: updated: 2026-02-04 12:47:42+00:00 spec: null acceptance_criteria: - - Implement 27-test modality × format × tracing matrix with ModelFixture, timeouts, and output verification. - See spec §7. + - Implement 27-test modality × format × tracing matrix with ModelFixture, timeouts, and output verification. See spec §7. phases: [] subtasks: [] estimated_effort: null @@ -2229,22 +2103,16 @@ roadmap: updated: 2026-02-20 11:07:30+00:00 spec: null acceptance_criteria: - - 'Root cause: realizar''s AprV2ModelCuda::forward_single_cuda has NO KV cache - it just calls forward_cuda(&[token]) - with no context. This makes generation impossible (logits all -inf). - + - |- + Root cause: realizar's AprV2ModelCuda::forward_single_cuda has NO KV cache - it just calls forward_cuda(&[token]) with no context. This makes generation impossible (logits all -inf). Fix: Implement proper KV cache in realizar similar to GGUF CUDA path (OwnedQuantizedKVCache). - Acceptance criteria: - - [ ] APR CUDA generates correct output (not empty/garbage) - - [ ] Temperature sampling works - - [ ] Performance: >50 tok/s on RTX 4090 - - - [ ] Test: apr chat with APR model uses GPU' + - [ ] Test: apr chat with APR model uses GPU phases: [] subtasks: [] estimated_effort: null @@ -2297,16 +2165,7 @@ roadmap: updated: 2026-02-20 11:05:32+00:00 spec: null acceptance_criteria: - - "Root cause: realizar's AprV2ModelCuda::forward_single_cuda has NO KV cache - it just calls forward_cuda(&[token])\ - \ with no context. This makes generation impossible (logits all -inf).\n\nFix: Implement proper KV\ - \ cache in realizar similar to GGUF CUDA path (OwnedQuantizedKVCache).\n\nSCOPE: Both APR AND SafeTensors\ - \ formats must work with GPU for:\n- apr chat (interactive)\n- apr serve (REST API)\n- apr run (single\ - \ prompt)\n\nAcceptance criteria:\n- [ ] APR CUDA generates correct output (not empty/garbage)\n-\ - \ [ ] SafeTensors CUDA generates correct output\n- [ ] Temperature sampling works for both formats\n\ - - [ ] Performance: >50 tok/s on RTX 4090 for both\n- [ ] Test: apr chat with APR model uses GPU\n\ - - [ ] Test: apr chat with SafeTensors model uses GPU\n- [ ] Test: apr serve works with APR format\n\ - - [ ] Test: apr serve works with SafeTensors format\n- [ ] Test: apr run works with APR format \n\ - - [ ] Test: apr run works with SafeTensors format" + - "Root cause: realizar's AprV2ModelCuda::forward_single_cuda has NO KV cache - it just calls forward_cuda(&[token]) with no context. This makes generation impossible (logits all -inf).\n\nFix: Implement proper KV cache in realizar similar to GGUF CUDA path (OwnedQuantizedKVCache).\n\nSCOPE: Both APR AND SafeTensors formats must work with GPU for:\n- apr chat (interactive)\n- apr serve (REST API)\n- apr run (single prompt)\n\nAcceptance criteria:\n- [ ] APR CUDA generates correct output (not empty/garbage)\n- [ ] SafeTensors CUDA generates correct output\n- [ ] Temperature sampling works for both formats\n- [ ] Performance: >50 tok/s on RTX 4090 for both\n- [ ] Test: apr chat with APR model uses GPU\n- [ ] Test: apr chat with SafeTensors model uses GPU\n- [ ] Test: apr serve works with APR format\n- [ ] Test: apr serve works with SafeTensors format\n- [ ] Test: apr run works with APR format \n- [ ] Test: apr run works with SafeTensors format" phases: [] subtasks: [] estimated_effort: null @@ -2323,8 +2182,7 @@ roadmap: updated: 2026-01-27 18:33:52.975501+00:00 spec: null acceptance_criteria: - - 'Fix fused QKV bias loading in APR transformer. Root cause: APR converter fuses Q/K/V biases into - qkv_proj.bias but loader only looked for separate biases.' + - 'Fix fused QKV bias loading in APR transformer. Root cause: APR converter fuses Q/K/V biases into qkv_proj.bias but loader only looked for separate biases.' phases: [] subtasks: [] estimated_effort: null @@ -2344,8 +2202,7 @@ roadmap: updated: 2026-01-27 20:24:47+00:00 spec: null acceptance_criteria: - - Execute docs/qa/popperian_falsification_checklist.md against Qwen2.5 showcase. Track pass/fail for - all 100 tests. + - Execute docs/qa/popperian_falsification_checklist.md against Qwen2.5 showcase. Track pass/fail for all 100 tests. phases: [] subtasks: [] estimated_effort: null @@ -2521,8 +2378,7 @@ roadmap: updated: 2026-02-04 12:48:53+00:00 spec: null acceptance_criteria: - - Implement automated verification that GPU inference achieves >2x CPU throughput. Add to CI quality - gates. + - Implement automated verification that GPU inference achieves >2x CPU throughput. Add to CI quality gates. phases: [] subtasks: [] estimated_effort: null @@ -2539,9 +2395,7 @@ roadmap: updated: 2026-02-04 12:48:37+00:00 spec: null acceptance_criteria: - - 'Implement QA gate to verify argmax parity between GGUF and SafeTensors formats for the same model. - The invariant is: argmax(forward_gguf(M, tokens)) == argmax(forward_safetensors(M, tokens)). This - prevents drift where one format produces subtle errors.' + - 'Implement QA gate to verify argmax parity between GGUF and SafeTensors formats for the same model. The invariant is: argmax(forward_gguf(M, tokens)) == argmax(forward_safetensors(M, tokens)). This prevents drift where one format produces subtle errors.' phases: [] subtasks: [] estimated_effort: null @@ -2558,9 +2412,7 @@ roadmap: updated: 2026-02-04 12:48:37+00:00 spec: null acceptance_criteria: - - 'Observed: SafeTensors GPU chat produces garbage output despite spec claiming CORROBORATED. This is - a STOP THE LINE defect requiring five-whys analysis. Evidence: ''apr chat model.safetensors --gpu'' - produced garbage Chinese characters instead of ''2+2=4''.' + - 'Observed: SafeTensors GPU chat produces garbage output despite spec claiming CORROBORATED. This is a STOP THE LINE defect requiring five-whys analysis. Evidence: ''apr chat model.safetensors --gpu'' produced garbage Chinese characters instead of ''2+2=4''.' phases: [] subtasks: [] estimated_effort: null @@ -2635,17 +2487,12 @@ roadmap: labels: - bugfix - p0-resolved - notes: 'Root Cause: DType byte mapping mismatch between aprender and realizar. - + notes: | + Root Cause: DType byte mapping mismatch between aprender and realizar. - APR format uses dtype 12 for Q4K, 14 for Q6K (per aprender/src/format/v2.rs) - - realizar read dtype 12 as fallback "F32" causing NaN logits - Fix: Updated realizar/src/apr/mod.rs from_binary() dtype mapping. - Commits: aaa0f9a3, 734a076f - - ' - id: 'PMAT-129: Fix F-SAFETENSORS-GPU - apr run should support SafeTensors GPU' github_issue: null item_type: task @@ -2705,9 +2552,7 @@ roadmap: updated: 2026-01-31 09:42:05+00:00 spec: null acceptance_criteria: - - 'Remove panic-inducing unwrap()/expect() from inference hot paths (nn/dropout.rs, nn/transformer.rs, - nn/generation.rs). Ref: Popperian Audit Round 12, Test 1. Root cause: Missing CI enforcement of panic-free - policy.' + - 'Remove panic-inducing unwrap()/expect() from inference hot paths (nn/dropout.rs, nn/transformer.rs, nn/generation.rs). Ref: Popperian Audit Round 12, Test 1. Root cause: Missing CI enforcement of panic-free policy.' phases: [] subtasks: [] estimated_effort: null @@ -2727,8 +2572,7 @@ roadmap: updated: 2026-01-31 09:42:07+00:00 spec: null acceptance_criteria: - - 'Replace ''Unknown Error'' output with structured error message. Ref: Popperian Audit Round 12, Test - 20. Root cause: Stringly-typed error codes without exhaustive match.' + - 'Replace ''Unknown Error'' output with structured error message. Ref: Popperian Audit Round 12, Test 20. Root cause: Stringly-typed error codes without exhaustive match.' phases: [] subtasks: [] estimated_effort: null @@ -2748,8 +2592,7 @@ roadmap: updated: 2026-02-04 12:44:28+00:00 spec: null acceptance_criteria: - - 'Add cross-machine determinism tests for zero-temperature inference. Ref: Popperian Audit Round 12, - Test 4. Root cause: Incorrect FMA reproducibility assumption.' + - 'Add cross-machine determinism tests for zero-temperature inference. Ref: Popperian Audit Round 12, Test 4. Root cause: Incorrect FMA reproducibility assumption.' phases: [] subtasks: [] estimated_effort: null @@ -2769,8 +2612,7 @@ roadmap: updated: 2026-02-04 12:46:02+00:00 spec: null acceptance_criteria: - - 'Add sanitization for control tokens in user input. Ref: Popperian Audit Round 12, Test 17. Root cause: - Missing security threat model.' + - 'Add sanitization for control tokens in user input. Ref: Popperian Audit Round 12, Test 17. Root cause: Missing security threat model.' phases: [] subtasks: [] estimated_effort: null @@ -2790,8 +2632,7 @@ roadmap: updated: 2026-02-04 12:47:13+00:00 spec: null acceptance_criteria: - - 'Add 50-concurrent request tests and disconnect cleanup tests. Ref: Popperian Audit Round 12, Tests - 9-10. Root cause: Spec evolution from CLI to server.' + - 'Add 50-concurrent request tests and disconnect cleanup tests. Ref: Popperian Audit Round 12, Tests 9-10. Root cause: Spec evolution from CLI to server.' phases: [] subtasks: [] estimated_effort: null @@ -2811,8 +2652,7 @@ roadmap: updated: 2026-02-04 12:42:26+00:00 spec: null acceptance_criteria: - - apr pull for SafeTensors only downloads weight file, missing tokenizer.json and config.json. Causes - apr run to fail with PMAT-172. + - apr pull for SafeTensors only downloads weight file, missing tokenizer.json and config.json. Causes apr run to fail with PMAT-172. phases: [] subtasks: [] estimated_effort: null @@ -2865,9 +2705,7 @@ roadmap: updated: 2026-02-03 17:59:00+00:00 spec: null acceptance_criteria: - - 'GGUF export from SafeTensors crashes with zero metadata and wrong tensor names. SafeTensors → GGUF - conversion path completely broken. Falsification: apr export model.apr --format gguf produces valid - GGUF with correct metadata and tensor names.' + - 'GGUF export from SafeTensors crashes with zero metadata and wrong tensor names. SafeTensors → GGUF conversion path completely broken. Falsification: apr export model.apr --format gguf produces valid GGUF with correct metadata and tensor names.' phases: [] subtasks: [] estimated_effort: null @@ -2888,9 +2726,7 @@ roadmap: updated: 2026-02-03 18:01:01+00:00 spec: null acceptance_criteria: - - 'Implement apr rosetta fingerprint command with JSON output, fingerprint comparison (--diff), and - CI integration. Falsification: apr rosetta fingerprint model.gguf --output fp.json produces valid - JSON with mean, std, min, max, nan_count, checksum for each tensor.' + - 'Implement apr rosetta fingerprint command with JSON output, fingerprint comparison (--diff), and CI integration. Falsification: apr rosetta fingerprint model.gguf --output fp.json produces valid JSON with mean, std, min, max, nan_count, checksum for each tensor.' phases: [] subtasks: [] estimated_effort: null @@ -2911,8 +2747,7 @@ roadmap: updated: 2026-02-03 18:04:24+00:00 spec: null acceptance_criteria: - - 'Implement apr rosetta validate-stats with role-specific thresholds (LayerNorm, Attention, MLP). Falsification: - apr rosetta validate-stats model.apr --reference model.gguf returns E020 error for corrupted tensors.' + - 'Implement apr rosetta validate-stats with role-specific thresholds (LayerNorm, Attention, MLP). Falsification: apr rosetta validate-stats model.apr --reference model.gguf returns E020 error for corrupted tensors.' phases: [] subtasks: [] estimated_effort: null @@ -2933,8 +2768,7 @@ roadmap: updated: 2026-02-03 18:01:01+00:00 spec: null acceptance_criteria: - - 'Embed golden test cases in APR metadata. Implement apr validate --golden for self-validating artifacts. - Falsification: Model metadata contains golden_tests array and inference matches expected within tolerance.' + - 'Embed golden test cases in APR metadata. Implement apr validate --golden for self-validating artifacts. Falsification: Model metadata contains golden_tests array and inference matches expected within tolerance.' phases: [] subtasks: [] estimated_effort: null @@ -2971,8 +2805,7 @@ roadmap: updated: 2026-02-04 12:46:50+00:00 spec: null acceptance_criteria: - - 'Tag tensors with semantic role (Embedding, LayerNorm, etc.) for role-specific validation and quantization - guidance. Falsification: TensorRole enum with from_name() method correctly identifies all tensor types.' + - 'Tag tensors with semantic role (Embedding, LayerNorm, etc.) for role-specific validation and quantization guidance. Falsification: TensorRole enum with from_name() method correctly identifies all tensor types.' phases: [] subtasks: [] estimated_effort: null @@ -2992,10 +2825,7 @@ roadmap: updated: 2026-02-20 11:42:51+00:00 spec: null acceptance_criteria: - - 'Sharding-aware placement (JAX-inspired PartitionSpec) is aspirational multi-GPU work requiring 4-6 - weeks. Foundation exists (repartir crate, sharded_index.rs, PartitionSpec types) but no runtime implementation. - Single-GPU inference is the priority; multi-GPU sharding is a Phase 3+ concern. Cancelled: premature - — single-GPU perf targets not yet met.' + - 'Sharding-aware placement (JAX-inspired PartitionSpec) is aspirational multi-GPU work requiring 4-6 weeks. Foundation exists (repartir crate, sharded_index.rs, PartitionSpec types) but no runtime implementation. Single-GPU inference is the priority; multi-GPU sharding is a Phase 3+ concern. Cancelled: premature — single-GPU perf targets not yet met.' phases: [] subtasks: [] estimated_effort: null @@ -3015,19 +2845,15 @@ roadmap: updated: 2026-02-04 14:12:16+00:00 spec: null acceptance_criteria: - - 'The apr run --benchmark command shows inconsistent token counts: - - - Header shows actual count from inference engine: ''Generated 10 tokens in 5920.0ms (1.7 tok/s)'' - - - Benchmark section shows word approximation: ''tok/s: 0.3, tokens: 5'' - + - |- + The apr run --benchmark command shows inconsistent token counts: + - Header shows actual count from inference engine: 'Generated 10 tokens in 5920.0ms (1.7 tok/s)' + - Benchmark section shows word approximation: 'tok/s: 0.3, tokens: 5' Root cause: execute_inference() returns only text, discarding result.generated_token_count. - run_model() then approximates with text.split_whitespace().count(). - - Fix: Return actual token count from execute_inference() and use it in benchmark output.' + Fix: Return actual token count from execute_inference() and use it in benchmark output. phases: [] subtasks: [] estimated_effort: null @@ -3044,8 +2870,7 @@ roadmap: updated: 2026-02-20 11:07:30+00:00 spec: null acceptance_criteria: - - 'Stack drift detected by batuta bug-hunter. Crates needing update: aprender-shell, aprender-tsp, realizar, - whisper-apr, pmat. Run ''batuta stack drift --fix'' after publish.' + - 'Stack drift detected by batuta bug-hunter. Crates needing update: aprender-shell, aprender-tsp, realizar, whisper-apr, pmat. Run ''batuta stack drift --fix'' after publish.' phases: [] subtasks: [] estimated_effort: null @@ -3064,8 +2889,7 @@ roadmap: updated: 2026-02-04 14:25:14+00:00 spec: null acceptance_criteria: - - Add debug logging to realizar AprTransformer::from_apr_v2() to compare tensor shapes and first N values - between GGUF and APR inference paths. Root cause is in realizar, not aprender. + - Add debug logging to realizar AprTransformer::from_apr_v2() to compare tensor shapes and first N values between GGUF and APR inference paths. Root cause is in realizar, not aprender. phases: [] subtasks: [] estimated_effort: null @@ -3262,8 +3086,7 @@ roadmap: updated: 2026-02-20 11:05:32+00:00 spec: null acceptance_criteria: - - Embedding correlation fixed (1.0), but APR inference still produces garbage. Need to investigate layer - weights and GPU kernels. + - Embedding correlation fixed (1.0), but APR inference still produces garbage. Need to investigate layer weights and GPU kernels. phases: [] subtasks: [] estimated_effort: null @@ -3296,8 +3119,7 @@ roadmap: updated: 2026-02-05 14:35:21.316402+00:00 spec: null acceptance_criteria: - - Fixed F16 SafeTensors→APR 95% diff caused by F16→F32→F16 precision loss. Implemented F16 passthrough - that preserves raw bytes. Also fixed F16→F32 conversion arithmetic overflow. + - Fixed F16 SafeTensors→APR 95% diff caused by F16→F32→F16 precision loss. Implemented F16 passthrough that preserves raw bytes. Also fixed F16→F32 conversion arithmetic overflow. phases: [] subtasks: [] estimated_effort: null @@ -3317,9 +3139,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - Write contracts/model-families/qwen2.yaml, llama.yaml, whisper.yaml, bert.yaml following the schema - in Section 4.2 of the model oracle spec. Each YAML declares size variants, constraints, tensor templates, - shape templates, and chat template configurations. + - Write contracts/model-families/qwen2.yaml, llama.yaml, whisper.yaml, bert.yaml following the schema in Section 4.2 of the model oracle spec. Each YAML declares size variants, constraints, tensor templates, shape templates, and chat template configurations. phases: [] subtasks: [] estimated_effort: null @@ -3338,9 +3158,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - Create src/format/model_family.rs with ModelFamily trait, ModelFamilyConfig, ModelSizeConfig, ModelConstraints, - and associated enums (AttentionType, Activation, NormType, PositionalEncoding, MlpType). Include detect_family() - function that takes tensor names and returns matching ModelFamily impl. + - Create src/format/model_family.rs with ModelFamily trait, ModelFamilyConfig, ModelSizeConfig, ModelConstraints, and associated enums (AttentionType, Activation, NormType, PositionalEncoding, MlpType). Include detect_family() function that takes tensor names and returns matching ModelFamily impl. phases: [] subtasks: [] estimated_effort: null @@ -3359,9 +3177,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - Create src/format/model_family_loader.rs that parses model family YAML files at runtime. Uses minimal - YAML parsing (no serde_yaml dependency). Returns ModelFamilyConfig structs. Runtime fallback for build.rs - codegen. + - Create src/format/model_family_loader.rs that parses model family YAML files at runtime. Uses minimal YAML parsing (no serde_yaml dependency). Returns ModelFamilyConfig structs. Runtime fallback for build.rs codegen. phases: [] subtasks: [] estimated_effort: null @@ -3428,8 +3244,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - Add disallowed-methods entries to .clippy.toml for all column-major matmul kernel functions. Verify - cargo clippy -- -D warnings catches column-major imports. + - Add disallowed-methods entries to .clippy.toml for all column-major matmul kernel functions. Verify cargo clippy -- -D warnings catches column-major imports. phases: [] subtasks: [] estimated_effort: null @@ -3448,9 +3263,7 @@ roadmap: updated: 2026-02-20 11:12:22+00:00 spec: null acceptance_criteria: - - Add Commands::Oracle to crates/apr-cli/src/lib.rs. Implement local file analysis via RosettaStone::inspect(), - match tensor names against family contracts, detect size variant, output ModelOracleReport in text - and JSON. Include --compliance and --tensors flags. + - Add Commands::Oracle to crates/apr-cli/src/lib.rs. Implement local file analysis via RosettaStone::inspect(), match tensor names against family contracts, detect size variant, output ModelOracleReport in text and JSON. Include --compliance and --tensors flags. phases: [] subtasks: [] estimated_effort: null @@ -3469,8 +3282,7 @@ roadmap: updated: 2026-02-20 11:12:22+00:00 spec: null acceptance_criteria: - - Implement HF API query for config.json. Parse model_type, hidden_size, num_hidden_layers from config. - Match against family contracts. Handle gated models (401), rate limits (429), offline mode. + - Implement HF API query for config.json. Parse model_type, hidden_size, num_hidden_layers from config. Match against family contracts. Handle gated models (401), rate limits (429), offline mode. phases: [] subtasks: [] estimated_effort: null @@ -3489,8 +3301,7 @@ roadmap: updated: 2026-02-20 11:12:22+00:00 spec: null acceptance_criteria: - - Implement contract description rendering. Load YAML, display all size variants or filter with --size. - Show constraints, tensor templates with evaluated shapes, chat template. Text and JSON output. + - Implement contract description rendering. Load YAML, display all size variants or filter with --size. Show constraints, tensor templates with evaluated shapes, chat template. Text and JSON output. phases: [] subtasks: [] estimated_effort: null @@ -3509,9 +3320,7 @@ roadmap: updated: 2026-02-20 11:12:22+00:00 spec: null acceptance_criteria: - - Parse ../apr-model-qa-playbook/docs/certifications/models.csv. Map detected model to certification - entry using csv_family_key and size variant. Populate CertificationInfo in ModelOracleReport. Handle - missing playbook repo. + - Parse ../apr-model-qa-playbook/docs/certifications/models.csv. Map detected model to certification entry using csv_family_key and size variant. Populate CertificationInfo in ModelOracleReport. Handle missing playbook repo. phases: [] subtasks: [] estimated_effort: null @@ -3530,8 +3339,7 @@ roadmap: updated: 2026-02-20 11:17:14+00:00 spec: null acceptance_criteria: - - 'Add RowMajor marker type. Make ValidatedWeight generic: ValidatedWeight. Existing code - uses default and compiles unchanged. Add PhantomData field. Update ValidatedEmbedding similarly.' + - 'Add RowMajor marker type. Make ValidatedWeight generic: ValidatedWeight. Existing code uses default and compiles unchanged. Add PhantomData field. Update ValidatedEmbedding similarly.' phases: [] subtasks: [] estimated_effort: null @@ -3550,11 +3358,7 @@ roadmap: updated: 2026-02-20 11:42:38+00:00 spec: null acceptance_criteria: - - 'Covered by GH-279: ValidatedLayerWeights (cuda/types.rs) seals GPU weights with architecture-validated - constructor. ValidatedAprTransformer (safetensors/validation_embedding.rs) seals CPU weights. Both - enforce architecture requirements at construction time via required_roles(). Import/export completeness - gates in aprender refuse incomplete models. The original intent — preventing unvalidated weights from - reaching inference — is fully implemented.' + - 'Covered by GH-279: ValidatedLayerWeights (cuda/types.rs) seals GPU weights with architecture-validated constructor. ValidatedAprTransformer (safetensors/validation_embedding.rs) seals CPU weights. Both enforce architecture requirements at construction time via required_roles(). Import/export completeness gates in aprender refuse incomplete models. The original intent — preventing unvalidated weights from reaching inference — is fully implemented.' phases: [] subtasks: [] estimated_effort: null @@ -3573,8 +3377,7 @@ roadmap: updated: 2026-02-20 11:26:35+00:00 spec: null acceptance_criteria: - - Write build.rs that reads contracts/model-families/*.yaml, generates ModelFamily trait implementations, - writes to OUT_DIR/model_families_generated.rs. Include cargo:rerun-if-changed directives. + - Write build.rs that reads contracts/model-families/*.yaml, generates ModelFamily trait implementations, writes to OUT_DIR/model_families_generated.rs. Include cargo:rerun-if-changed directives. phases: [] subtasks: [] estimated_effort: null @@ -3593,12 +3396,7 @@ roadmap: updated: 2026-02-20 11:42:44+00:00 spec: null acceptance_criteria: - - 'Depended on PMAT-227 (now completed via GH-279). Generic AprTransformer would parameterize - by model family — but the actual problem (compile-time architecture enforcement) is solved by ValidatedLayerWeights - and ValidatedAprTransformer. Parameterizing by ModelFamily (different struct fields per arch) is aspirational - and conflicts with the existing approach of using ArchConstraints + runtime validation at construction. - The current sealed-constructor pattern is more practical: one struct, validated at construction. Cancelled: - superseded by GH-279 design.' + - 'Depended on PMAT-227 (now completed via GH-279). Generic AprTransformer would parameterize by model family — but the actual problem (compile-time architecture enforcement) is solved by ValidatedLayerWeights and ValidatedAprTransformer. Parameterizing by ModelFamily (different struct fields per arch) is aspirational and conflicts with the existing approach of using ArchConstraints + runtime validation at construction. The current sealed-constructor pattern is more practical: one struct, validated at construction. Cancelled: superseded by GH-279 design.' phases: [] subtasks: [] estimated_effort: null @@ -3617,8 +3415,7 @@ roadmap: updated: 2026-02-20 11:21:04+00:00 spec: null acceptance_criteria: - - Create contracts/model-families/mistral.yaml, phi.yaml, gemma.yaml, deepseek.yaml. Follow schema established - in PMAT-240. Source config values from HuggingFace model cards and config.json files. + - Create contracts/model-families/mistral.yaml, phi.yaml, gemma.yaml, deepseek.yaml. Follow schema established in PMAT-240. Source config values from HuggingFace model cards and config.json files. phases: [] subtasks: [] estimated_effort: null @@ -3637,8 +3434,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - 'BOS fix pushed to realizar (3670abb). Need to: 1) Verify GPU actually accelerates (>100 tok/s vs - 33), 2) Update FALSIFIED gates in showcase spec, 3) Re-measure 1.5B and 7B GPU performance' + - 'BOS fix pushed to realizar (3670abb). Need to: 1) Verify GPU actually accelerates (>100 tok/s vs 33), 2) Update FALSIFIED gates in showcase spec, 3) Re-measure 1.5B and 7B GPU performance' phases: [] subtasks: [] estimated_effort: null @@ -3658,9 +3454,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - '7B GPU: garbage (''2? son the -"'') vs CPU correct (''2+2 is 4''). 1.5B works on both. apr qa golden - test uses CPU only — QA gap. Root cause: likely CUDA kernel dimension issue (7B: hidden=3584 vs 1.5B: - hidden=1536). Five Whys needed.' + - '7B GPU: garbage (''2? son the -"'') vs CPU correct (''2+2 is 4''). 1.5B works on both. apr qa golden test uses CPU only — QA gap. Root cause: likely CUDA kernel dimension issue (7B: hidden=3584 vs 1.5B: hidden=1536). Five Whys needed.' phases: [] subtasks: [] estimated_effort: null @@ -3680,8 +3474,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - 'Falsified: F-PERF GPU/CPU memory <6 GB shows 23.7 GB. 4 GB Q4K model using 6x memory suggests unnecessary - copies or leaks. Similar pattern to GH-199 where model was cloned twice.' + - 'Falsified: F-PERF GPU/CPU memory <6 GB shows 23.7 GB. 4 GB Q4K model using 6x memory suggests unnecessary copies or leaks. Similar pattern to GH-199 where model was cloned twice.' phases: [] subtasks: [] estimated_effort: null @@ -3804,8 +3597,7 @@ roadmap: updated: 2026-02-15 08:36:11+00:00 spec: null acceptance_criteria: - - apr flow only works with APR format, fails on GGUF with 'Invalid magic'. Should use Rosetta Stone - dispatch like tree/hex/debug. + - apr flow only works with APR format, fails on GGUF with 'Invalid magic'. Should use Rosetta Stone dispatch like tree/hex/debug. phases: [] subtasks: [] estimated_effort: null @@ -3838,8 +3630,7 @@ roadmap: updated: 2026-02-15 08:36:12+00:00 spec: null acceptance_criteria: - - 'apr diff GGUF vs APR fails with ''Invalid tensor index: invalid dtype''. Rosetta Stone diff should - handle cross-format comparison.' + - 'apr diff GGUF vs APR fails with ''Invalid tensor index: invalid dtype''. Rosetta Stone diff should handle cross-format comparison.' phases: [] subtasks: [] estimated_effort: null @@ -3864,8 +3655,7 @@ roadmap: - id: 'GH-234/235/236: lm_head quantization skip, GPT-2 hidden_dim metadata, GGUF export architecture' github_issue: null item_type: task - title: 'New task: GH-234/235/236: lm_head quantization skip, GPT-2 hidden_dim metadata, GGUF export - architecture' + title: 'New task: GH-234/235/236: lm_head quantization skip, GPT-2 hidden_dim metadata, GGUF export architecture' status: completed priority: medium assigned_to: null @@ -3953,10 +3743,7 @@ roadmap: updated: 2026-02-20 11:07:30+00:00 spec: null acceptance_criteria: - - 'apr hex --tensor --stats on a BF16 safetensors file (e.g. Qwen2-0.5B) shows the tensor header - but skips the Statistics: line entirely. No error, no warning — just silent omission. F32 tensors - work fine. Discovered via tiny-model-ground-truth safetensors parity tests comparing apr hex against - Python safetensors + torch stats.' + - 'apr hex --tensor --stats on a BF16 safetensors file (e.g. Qwen2-0.5B) shows the tensor header but skips the Statistics: line entirely. No error, no warning — just silent omission. F32 tensors work fine. Discovered via tiny-model-ground-truth safetensors parity tests comparing apr hex against Python safetensors + torch stats.' phases: [] subtasks: [] estimated_effort: null @@ -3969,8 +3756,7 @@ roadmap: - id: PMAT-260 github_issue: null item_type: task - title: 'GH-279/280/281: Entrenar delegation API gaps (Loss Send+Sync, cross_entropy_loss, per-class - metrics)' + title: 'GH-279/280/281: Entrenar delegation API gaps (Loss Send+Sync, cross_entropy_loss, per-class metrics)' status: completed priority: medium assigned_to: null @@ -3994,9 +3780,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - 'GH-280 complete: PerHeadRmsNormKernel in trueno-gpu v0.4.18, capability gate flipped, 20/21 falsification - checks pass. Remaining: throughput optimization (3.9 tok/s → 40+ target), GPU golden output verification - (unblocked), format parity.' + - 'GH-280 complete: PerHeadRmsNormKernel in trueno-gpu v0.4.18, capability gate flipped, 20/21 falsification checks pass. Remaining: throughput optimization (3.9 tok/s → 40+ target), GPU golden output verification (unblocked), format parity.' phases: [] subtasks: [] estimated_effort: null @@ -4188,8 +3972,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - Make OwnedQuantizedModel fields pub(crate) with accessor methods. Currently all fields are pub — anyone - can construct garbage bypassing contract_gate. 18+ consumer files need updating. + - Make OwnedQuantizedModel fields pub(crate) with accessor methods. Currently all fields are pub — anyone can construct garbage bypassing contract_gate. 18+ consumer files need updating. phases: [] subtasks: [] estimated_effort: null @@ -4206,8 +3989,7 @@ roadmap: updated: 2026-02-20 11:12:35+00:00 spec: null acceptance_criteria: - - from_apr_weights takes raw Vec. Add a ValidatedAprWeights wrapper that proves dimensions were - checked. Prevents callers from passing wrong-sized vectors. + - from_apr_weights takes raw Vec. Add a ValidatedAprWeights wrapper that proves dimensions were checked. Prevents callers from passing wrong-sized vectors. phases: [] subtasks: [] estimated_effort: null @@ -4302,10 +4084,7 @@ roadmap: - cuda - qwen3 - qa-gates - notes: Wired per-head RMSNorm (QkNorm) into GPU forward path for Qwen3 models. Added attn_q/k_norm_ptr/len - fields to IndexedLayerWeights + BoundLayerWeights. Used existing per_head_rmsnorm_into CUDA kernel - and cache_rmsnorm_gamma upload. Fixed format_parity gate to detect sharded models via model.safetensors.index.json. - Extensive complexity refactoring to pass pre-commit quality gates. + notes: Wired per-head RMSNorm (QkNorm) into GPU forward path for Qwen3 models. Added attn_q/k_norm_ptr/len fields to IndexedLayerWeights + BoundLayerWeights. Used existing per_head_rmsnorm_into CUDA kernel and cache_rmsnorm_gamma upload. Fixed format_parity gate to detect sharded models via model.safetensors.index.json. Extensive complexity refactoring to pass pre-commit quality gates. - id: PMAT-285 github_issue: null item_type: task @@ -4317,8 +4096,7 @@ roadmap: updated: 2026-02-20 11:12:35+00:00 spec: null acceptance_criteria: - - Both aprender format/converter/mod.rs and realizar have transpose logic. trueno-quant already has - transpose_q4k/q5k/q6k_for_matmul. Remove duplicates, ensure single source of truth. + - Both aprender format/converter/mod.rs and realizar have transpose logic. trueno-quant already has transpose_q4k/q5k/q6k_for_matmul. Remove duplicates, ensure single source of truth. phases: [] subtasks: [] estimated_effort: null @@ -4369,9 +4147,7 @@ roadmap: updated: 2026-02-20 11:05:16+00:00 spec: null acceptance_criteria: - - 'REVISED: Aprender GGUF reader is NOT dead code — it''s the conversion pipeline reader for ''apr import''. - Only realizar''s inference loading replaces aprender''s inference loading. Updated to: consolidate - dequant functions to use trueno''s implementations where possible.' + - 'REVISED: Aprender GGUF reader is NOT dead code — it''s the conversion pipeline reader for ''apr import''. Only realizar''s inference loading replaces aprender''s inference loading. Updated to: consolidate dequant functions to use trueno''s implementations where possible.' phases: [] subtasks: [] estimated_effort: null @@ -4388,8 +4164,7 @@ roadmap: updated: 2026-02-18 11:51:41+00:00 spec: null acceptance_criteria: - - PerHeadRmsNormKernel added to trueno-gpu v0.4.18. Capability gate flipped in realizar. Qwen3 GPU inference - unblocked. 9 new kernel tests, 10 capability tests pass. + - PerHeadRmsNormKernel added to trueno-gpu v0.4.18. Capability gate flipped in realizar. Qwen3 GPU inference unblocked. 9 new kernel tests, 10 capability tests pass. phases: [] subtasks: [] estimated_effort: null @@ -4433,11 +4208,7 @@ roadmap: - cuda - apr-serve - bug-fix - notes: 'Root cause: AprV2ModelCuda never called make_current() before CUDA ops. GGUF path had make_current() - in 4+ places. When tokio worker threads (apr serve) called forward_cuda, the CUDA context was not - current, causing cuModuleLoadData to fail with error 201 (CUDA_ERROR_INVALID_CONTEXT). Also fixed - i32→u32 type mismatch in GEMM parameter passing and added 5 missing CUDA error codes to trueno-gpu - mapping. GH-284 (HTTP perf regression) is a cascade from this — GPU falls back to CPU.' + notes: 'Root cause: AprV2ModelCuda never called make_current() before CUDA ops. GGUF path had make_current() in 4+ places. When tokio worker threads (apr serve) called forward_cuda, the CUDA context was not current, causing cuModuleLoadData to fail with error 201 (CUDA_ERROR_INVALID_CONTEXT). Also fixed i32→u32 type mismatch in GEMM parameter passing and added 5 missing CUDA error codes to trueno-gpu mapping. GH-284 (HTTP perf regression) is a cascade from this — GPU falls back to CPU.' - id: PMAT-289 github_issue: null item_type: task @@ -4466,8 +4237,7 @@ roadmap: updated: 2026-02-20 11:05:32+00:00 spec: null acceptance_criteria: - - 'REVISED: apr/helpers.rs functions are not true duplicates — different APIs (no bias, transposed matmul). - Requires API unification, not simple deletion. Deprioritized.' + - 'REVISED: apr/helpers.rs functions are not true duplicates — different APIs (no bias, transposed matmul). Requires API unification, not simple deletion. Deprioritized.' phases: [] subtasks: [] estimated_effort: null @@ -4484,10 +4254,7 @@ roadmap: updated: 2026-02-20 11:42:32+00:00 spec: null acceptance_criteria: - - 'Weight loading already uses canonical stack (aprender GgufReader for GGUF, safetensors for ST). Teacher - inference needs realizar logits-level forward API which doesn''t exist yet — run_inference() returns - text not logits. TeacherModel trait requires forward()->logits, hidden_states(), attention_weights() - — none exposed by realizar. Cancelled: needs API design in realizar first.' + - 'Weight loading already uses canonical stack (aprender GgufReader for GGUF, safetensors for ST). Teacher inference needs realizar logits-level forward API which doesn''t exist yet — run_inference() returns text not logits. TeacherModel trait requires forward()->logits, hidden_states(), attention_weights() — none exposed by realizar. Cancelled: needs API design in realizar first.' phases: [] subtasks: [] estimated_effort: null @@ -4553,9 +4320,7 @@ roadmap: updated: 2026-02-20 10:47:50+00:00 spec: null acceptance_criteria: - - 'src/format/converter/import.rs:107 — if let Some(config) guard means SafeTensors without model_config - silently skips the architecture completeness gate. Fix: make the gate unconditional, derive arch from - tensor names when config is missing.' + - 'src/format/converter/import.rs:107 — if let Some(config) guard means SafeTensors without model_config silently skips the architecture completeness gate. Fix: make the gate unconditional, derive arch from tensor names when config is missing.' phases: [] subtasks: [] estimated_effort: null @@ -4572,9 +4337,7 @@ roadmap: updated: 2026-02-20 10:47:50+00:00 spec: null acceptance_criteria: - - 'src/format/converter/export.rs — enforce_architecture_completeness is never called. A Qwen3 model - missing QK norm weights can be exported to GGUF without error. Fix: add enforce_architecture_completeness - call before writing output file.' + - 'src/format/converter/export.rs — enforce_architecture_completeness is never called. A Qwen3 model missing QK norm weights can be exported to GGUF without error. Fix: add enforce_architecture_completeness call before writing output file.' phases: [] subtasks: [] estimated_effort: null @@ -4591,9 +4354,7 @@ roadmap: updated: 2026-02-20 10:47:50+00:00 spec: null acceptance_criteria: - - 'realizar/src/contract_gate.rs:186 — passes present_roles: Vec::new() which skips completeness. Called - from 9 loader paths. GPU paths are saved by ValidatedLayerWeights::validate() at build_indexed_weights - time, but CPU paths never hit that gate. Fix: have loaders enumerate present roles and call full validate_model_load.' + - 'realizar/src/contract_gate.rs:186 — passes present_roles: Vec::new() which skips completeness. Called from 9 loader paths. GPU paths are saved by ValidatedLayerWeights::validate() at build_indexed_weights time, but CPU paths never hit that gate. Fix: have loaders enumerate present roles and call full validate_model_load.' phases: [] subtasks: [] estimated_effort: null @@ -4610,9 +4371,7 @@ roadmap: updated: 2026-02-20 10:47:50+00:00 spec: null acceptance_criteria: - - 'ValidatedAprTransformer::validate() checks tensor shapes but NOT architecture-level role requirements. - A Qwen3 APR file missing QK norm passes CPU validation. Fix: add architecture completeness check to - ValidatedAprTransformer::validate() using metadata arch field.' + - 'ValidatedAprTransformer::validate() checks tensor shapes but NOT architecture-level role requirements. A Qwen3 APR file missing QK norm passes CPU validation. Fix: add architecture completeness check to ValidatedAprTransformer::validate() using metadata arch field.' phases: [] subtasks: [] estimated_effort: null @@ -4629,11 +4388,7 @@ roadmap: updated: 2026-03-31 16:19:47+00:00 spec: null acceptance_criteria: - - 'GPU/GGUF load path (gpu/scheduler/loading.rs) only validates embedding shape (len == vocab*hidden), - but SKIPS density check (<50% zeros), NaN/Inf check, L2 norm, and spot-check gates that the SafeTensors/APR - path enforces via ValidatedEmbedding::new(). A GGUF file with correct shape but 94.5% zeros (PMAT-234 - scenario) would pass GPU loading silently. Five-Whys root: F-DATA-QUALITY-001 enforcement only wired - for APR path, not GGUF.' + - 'GPU/GGUF load path (gpu/scheduler/loading.rs) only validates embedding shape (len == vocab*hidden), but SKIPS density check (<50% zeros), NaN/Inf check, L2 norm, and spot-check gates that the SafeTensors/APR path enforces via ValidatedEmbedding::new(). A GGUF file with correct shape but 94.5% zeros (PMAT-234 scenario) would pass GPU loading silently. Five-Whys root: F-DATA-QUALITY-001 enforcement only wired for APR path, not GGUF.' phases: [] subtasks: [] estimated_effort: null @@ -4650,11 +4405,7 @@ roadmap: updated: 2026-03-31 16:19:47+00:00 spec: null acceptance_criteria: - - 'entrenar::transformer::Embedding uses raw Tensor (not ValidatedEmbedding). No NaN/Inf check during - training, no density check on save (merge_export.rs:29-63), no statistical validation on load (weights/mod.rs:130-182). - If training diverges and embedding becomes NaN-poisoned or degenerate, the model is saved to disk - without any gate catching it. Five-Whys root: entrenar predates the ValidatedEmbedding contract and - was never retrofitted.' + - 'entrenar::transformer::Embedding uses raw Tensor (not ValidatedEmbedding). No NaN/Inf check during training, no density check on save (merge_export.rs:29-63), no statistical validation on load (weights/mod.rs:130-182). If training diverges and embedding becomes NaN-poisoned or degenerate, the model is saved to disk without any gate catching it. Five-Whys root: entrenar predates the ValidatedEmbedding contract and was never retrofitted.' phases: [] subtasks: [] estimated_effort: null @@ -4671,10 +4422,7 @@ roadmap: updated: 2026-03-31 16:19:47+00:00 spec: null acceptance_criteria: - - GPU forward paths (gpu_forward_pass.rs, batch.rs, kv.rs) check token_id >= vocab_size but do NOT check - offset+hidden_dim <= embedding_weights.len(). If embedding_weights is truncated (corrupt GGUF) but - vocab_size in config is stale, Rust panics with slice OOB instead of returning an error. 8+ call sites - affected across gpu/scheduler/. + - GPU forward paths (gpu_forward_pass.rs, batch.rs, kv.rs) check token_id >= vocab_size but do NOT check offset+hidden_dim <= embedding_weights.len(). If embedding_weights is truncated (corrupt GGUF) but vocab_size in config is stale, Rust panics with slice OOB instead of returning an error. 8+ call sites affected across gpu/scheduler/. phases: [] subtasks: [] estimated_effort: null @@ -4691,10 +4439,7 @@ roadmap: updated: 2026-03-31 16:19:41+00:00 spec: null acceptance_criteria: - - 'enforce_matmul_contract exists but is only called at import boundary. If config.vocab_size or config.hidden_dim - is corrupted after load (e.g., by a malformed merge), lm_head matmul at GPU forward sites (matmul.rs:304,366) - would silently compute wrong dimensions. Five-Whys: GH-202 was dimension swap; protection at boundary - but not at use site.' + - 'enforce_matmul_contract exists but is only called at import boundary. If config.vocab_size or config.hidden_dim is corrupted after load (e.g., by a malformed merge), lm_head matmul at GPU forward sites (matmul.rs:304,366) would silently compute wrong dimensions. Five-Whys: GH-202 was dimension swap; protection at boundary but not at use site.' phases: [] subtasks: [] estimated_effort: null @@ -4711,9 +4456,7 @@ roadmap: updated: 2026-03-31 16:19:47+00:00 spec: null acceptance_criteria: - - entrenar writes lm_head.weight as raw tensor during merge_export (merge_export.rs:29-63). No validation - that shape matches [vocab_size, hidden_dim]. No NaN/Inf check on lm_head before save. Parallels PMAT-326 - for embeddings. + - entrenar writes lm_head.weight as raw tensor during merge_export (merge_export.rs:29-63). No validation that shape matches [vocab_size, hidden_dim]. No NaN/Inf check on lm_head before save. Parallels PMAT-326 for embeddings. phases: [] subtasks: [] estimated_effort: null @@ -4722,9 +4465,7 @@ roadmap: - id: PMAT-330 github_issue: null item_type: task - title: 'PMAT-332: ValidatedVector accepts zero-length norm vectors — no minimum length gate. Zero-length - norm weight produces NaN in LayerNorm division. Gate 1 only checks data.len()==expected_len, needs - data.len()>0 guard.' + title: 'PMAT-332: ValidatedVector accepts zero-length norm vectors — no minimum length gate. Zero-length norm weight produces NaN in LayerNorm division. Gate 1 only checks data.len()==expected_len, needs data.len()>0 guard.' status: completed priority: medium assigned_to: null @@ -4788,8 +4529,7 @@ roadmap: - id: PMAT-331 github_issue: null item_type: task - title: 'PMAT-333: FFN gate_proj/up_proj shape symmetry not enforced — ValidatedWeight accepts any [out,in] - without verifying gate==up shape or down==[hidden,intermediate] reversal. SwiGLU requires gate_proj.shape==up_proj.shape.' + title: 'PMAT-333: FFN gate_proj/up_proj shape symmetry not enforced — ValidatedWeight accepts any [out,in] without verifying gate==up shape or down==[hidden,intermediate] reversal. SwiGLU requires gate_proj.shape==up_proj.shape.' status: completed priority: medium assigned_to: null @@ -4805,9 +4545,7 @@ roadmap: - id: PMAT-332 github_issue: null item_type: task - title: 'PMAT-334: FALSIFY-007 dispatch exhaustiveness test only scans 2 of 6 dispatch sites listed in - tensor-layout-v1.yaml. Missing: brick/dispatch.rs, quantize/dispatch.rs, layers/attention.rs, gpu/scheduler.rs. - A catch-all in any unscanned file would go undetected.' + title: 'PMAT-334: FALSIFY-007 dispatch exhaustiveness test only scans 2 of 6 dispatch sites listed in tensor-layout-v1.yaml. Missing: brick/dispatch.rs, quantize/dispatch.rs, layers/attention.rs, gpu/scheduler.rs. A catch-all in any unscanned file would go undetected.' status: completed priority: medium assigned_to: null @@ -4823,9 +4561,7 @@ roadmap: - id: PMAT-333 github_issue: null item_type: task - title: 'PMAT-335: Q4_1 and Q5_0 formats in GPU dispatch (gemv_dispatch.rs) but missing from ALL_FORMAT_IDS - registry and FALSIFY-QDOT contract tests. Orphaned formats could silently dispatch to wrong kernel - without contract coverage.' + title: 'PMAT-335: Q4_1 and Q5_0 formats in GPU dispatch (gemv_dispatch.rs) but missing from ALL_FORMAT_IDS registry and FALSIFY-QDOT contract tests. Orphaned formats could silently dispatch to wrong kernel without contract coverage.' status: completed priority: medium assigned_to: null @@ -4841,8 +4577,7 @@ roadmap: - id: PMAT-334 github_issue: null item_type: task - title: 'PMAT-336: FALSIFY-QDOT-006 missing — gap in numbering between QDOT-005 and QDOT-007. No test - verifies row-major-only constraint from quantized-dot-product-v1.yaml enforcement.row_major_only.' + title: 'PMAT-336: FALSIFY-QDOT-006 missing — gap in numbering between QDOT-005 and QDOT-007. No test verifies row-major-only constraint from quantized-dot-product-v1.yaml enforcement.row_major_only.' status: completed priority: medium assigned_to: null @@ -4898,8 +4633,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - 'Implement docs/specifications/fine-tune-provable-design-by-contract.md: Kani harnesses for classification - types, PTX kernels for CE and AdamW, binding.yaml updates, apr qa fine-tuning gate' + - 'Implement docs/specifications/fine-tune-provable-design-by-contract.md: Kani harnesses for classification types, PTX kernels for CE and AdamW, binding.yaml updates, apr qa fine-tuning gate' phases: [] subtasks: [] estimated_effort: null @@ -4952,8 +4686,7 @@ roadmap: updated: 2026-03-04 17:50:33.356431+00:00 spec: null acceptance_criteria: - - 'Five-whys: dim-smoke scenarios look in workspace dir but config.json lives in HF cache. Fix: resolve - config.json from HF cache path.' + - 'Five-whys: dim-smoke scenarios look in workspace dir but config.json lives in HF cache. Fix: resolve config.json from HF cache path.' phases: [] subtasks: [] estimated_effort: null @@ -5004,8 +4737,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - Nightly workflow fails because Cargo.toml has path dependency on ../alimentar which doesn't exist - in CI. Add sed/pwsh step to patch path deps before build. + - Nightly workflow fails because Cargo.toml has path dependency on ../alimentar which doesn't exist in CI. Add sed/pwsh step to patch path deps before build. phases: [] subtasks: [] estimated_effort: null @@ -5124,9 +4856,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - 'Wire renacer layer tracing (8-step state machine) and trueno BrickProfiler as global flags on all - runtime commands. When --trace: emit TensorStats per layer. When --profile: emit per-brick µs timing. - Ref: aprender-spec.md §4, components/tracing.md' + - 'Wire renacer layer tracing (8-step state machine) and trueno BrickProfiler as global flags on all runtime commands. When --trace: emit TensorStats per layer. When --profile: emit per-brick µs timing. Ref: aprender-spec.md §4, components/tracing.md' phases: [] subtasks: [] estimated_effort: null @@ -5162,9 +4892,7 @@ roadmap: updated: 2026-03-31 16:19:41+00:00 spec: null acceptance_criteria: - - 'Add apr probar command for visual regression testing of model activations. Flags: --golden DIR, --assert, - --format json|png, --layer PATTERN, --tolerance FLOAT. Compare per-layer activation stats against - golden reference. Exit non-zero on divergence. Ref: aprender-spec.md §13, components/testing.md' + - 'Add apr probar command for visual regression testing of model activations. Flags: --golden DIR, --assert, --format json|png, --layer PATTERN, --tolerance FLOAT. Compare per-layer activation stats against golden reference. Exit non-zero on divergence. Ref: aprender-spec.md §13, components/testing.md' phases: [] subtasks: [] estimated_effort: null @@ -5184,9 +4912,7 @@ roadmap: updated: 2026-03-31 16:19:41+00:00 spec: null acceptance_criteria: - - 'Wire BrickTracer from renacer into apr cbtop command. Auto-escalate from measurement to full syscall - tracing when CV>15% or efficiency<25%. Emit SyscallBreakdown (mmap_us, futex_us, ioctl_us, compute_us). - Rate limit 100 traces/sec. Ref: components/tracing.md §3' + - 'Wire BrickTracer from renacer into apr cbtop command. Auto-escalate from measurement to full syscall tracing when CV>15% or efficiency<25%. Emit SyscallBreakdown (mmap_us, futex_us, ioctl_us, compute_us). Rate limit 100 traces/sec. Ref: components/tracing.md §3' phases: [] subtasks: [] estimated_effort: null @@ -5207,9 +4933,7 @@ roadmap: updated: 2026-03-31 16:19:41+00:00 spec: null acceptance_criteria: - - 'Write YAML contracts with equivalence proof obligations for each kernel across SIMD/wgpu/CUDA PTX/cuBLAS/WASM - backends. Required: RMSNorm, Q4K GEMV, RoPE, SwiGLU, Attention, LM Head. Each contract: scalar reference - + cosine>=0.98 for GPU backends + max_ulp<=2 for SIMD. Ref: components/provable-contracts.md §6, components/compute-backends.md' + - 'Write YAML contracts with equivalence proof obligations for each kernel across SIMD/wgpu/CUDA PTX/cuBLAS/WASM backends. Required: RMSNorm, Q4K GEMV, RoPE, SwiGLU, Attention, LM Head. Each contract: scalar reference + cosine>=0.98 for GPU backends + max_ulp<=2 for SIMD. Ref: components/provable-contracts.md §6, components/compute-backends.md' phases: [] subtasks: [] estimated_effort: null @@ -5229,9 +4953,7 @@ roadmap: updated: 2026-03-31 16:19:41+00:00 spec: null acceptance_criteria: - - 'Add probar golden regression to Makefile tier2 gate (fast: --assert only) and tier3 gate (full: --profile - --assert). Golden snapshots stored in tests/golden/. Any weight-modifying PR (merge/finetune/prune/quantize) - must pass probar. Ref: components/testing.md §6.2' + - 'Add probar golden regression to Makefile tier2 gate (fast: --assert only) and tier3 gate (full: --profile --assert). Golden snapshots stored in tests/golden/. Any weight-modifying PR (merge/finetune/prune/quantize) must pass probar. Ref: components/testing.md §6.2' phases: [] subtasks: [] estimated_effort: null @@ -5251,9 +4973,7 @@ roadmap: updated: 2026-03-31 16:19:42+00:00 spec: null acceptance_criteria: - - 'Add --otlp-endpoint flag to apr serve. Export W3C Trace Context spans (renacer-core SpanRecord) to - Jaeger/Tempo. Each inference request = parent span, each layer = child span with TensorStats. Ref: - components/tracing.md §3.5' + - 'Add --otlp-endpoint flag to apr serve. Export W3C Trace Context spans (renacer-core SpanRecord) to Jaeger/Tempo. Each inference request = parent span, each layer = child span with TensorStats. Ref: components/tracing.md §3.5' phases: [] subtasks: [] estimated_effort: null @@ -5290,10 +5010,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - 'The tracing spec (§8 gaps table) identifies that apr train and apr finetune have NO --profile or - --trace flags. Users must edit YAML config to enable StepProfiler. Add CLI flags: --profile (enable - StepProfiler), --profile-interval N (report every N steps), --trace (enable layer tracing for forward - pass). Wire to entrenar config.profile_interval.' + - 'The tracing spec (§8 gaps table) identifies that apr train and apr finetune have NO --profile or --trace flags. Users must edit YAML config to enable StepProfiler. Add CLI flags: --profile (enable StepProfiler), --profile-interval N (report every N steps), --trace (enable layer tracing for forward pass). Wire to entrenar config.profile_interval.' phases: [] subtasks: [] estimated_effort: null @@ -5313,9 +5030,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - '11 pre-existing dirty files in working tree: distill.rs, finetune.rs, probar.rs, handlers.rs, train.rs, - error.rs, ssm/mod.rs, contract_traits.rs, build.rs, Cargo.lock, roadmap.yaml. Review each, fix any - issues, commit.' + - '11 pre-existing dirty files in working tree: distill.rs, finetune.rs, probar.rs, handlers.rs, train.rs, error.rs, ssm/mod.rs, contract_traits.rs, build.rs, Cargo.lock, roadmap.yaml. Review each, fix any issues, commit.' phases: [] subtasks: [] estimated_effort: null @@ -5333,9 +5048,7 @@ roadmap: updated: 2026-03-31 16:59:03+00:00 spec: null acceptance_criteria: - - 'The compute-backends spec describes Layer 2 GPU dispatch (PTX vs cuBLAS vs cuBLASLt vs wgpu) but - there''s no CLI command to inspect or override which GPU path is active. Add: apr gpu info (show detected - backend, SM version, cuBLAS availability), wire existing --backend flag on serve to also work on run/chat.' + - 'The compute-backends spec describes Layer 2 GPU dispatch (PTX vs cuBLAS vs cuBLASLt vs wgpu) but there''s no CLI command to inspect or override which GPU path is active. Add: apr gpu info (show detected backend, SM version, cuBLAS availability), wire existing --backend flag on serve to also work on run/chat.' phases: [] subtasks: [] estimated_effort: null @@ -5355,8 +5068,7 @@ roadmap: updated: 2026-03-31 17:06:04+00:00 spec: null acceptance_criteria: - - '7 book chapters exist but are not listed in SUMMARY.md: logic-family-tree, mem-test-full, mem-test, - phi-hf-import, qwen-apr-native, qwen-chat, whisper-transcribe' + - '7 book chapters exist but are not listed in SUMMARY.md: logic-family-tree, mem-test-full, mem-test, phi-hf-import, qwen-apr-native, qwen-chat, whisper-transcribe' phases: [] subtasks: [] estimated_effort: null @@ -5375,9 +5087,7 @@ roadmap: updated: 2026-03-31 17:13:02+00:00 spec: null acceptance_criteria: - - '5 tests ignored because they use thread::sleep: test_time_budget, test_time_budget_elapsed_remaining, - test_cache_entry_is_valid_expired, test_cache_metadata_age, test_cache_metadata_expiration. Replace - thread::sleep with deterministic time injection.' + - '5 tests ignored because they use thread::sleep: test_time_budget, test_time_budget_elapsed_remaining, test_cache_entry_is_valid_expired, test_cache_metadata_age, test_cache_metadata_expiration. Replace thread::sleep with deterministic time injection.' phases: [] subtasks: [] estimated_effort: null @@ -5396,8 +5106,7 @@ roadmap: updated: 2026-03-31 17:18:48+00:00 spec: null acceptance_criteria: - - test_admm_box_constraints_via_consensus is ignored with note 'Consensus form for box constraints needs - algorithm refinement'. Investigate and fix the algorithm or remove the test. + - test_admm_box_constraints_via_consensus is ignored with note 'Consensus form for box constraints needs algorithm refinement'. Investigate and fix the algorithm or remove the test. phases: [] subtasks: [] estimated_effort: null @@ -5416,8 +5125,7 @@ roadmap: updated: 2026-03-31 17:37:05+00:00 spec: null acceptance_criteria: - - 'entrenar wgpu_pipeline.rs:655 referenced undefined variable xa_t in debug logging. Plus forward_hidden_gpu_then_cpu_lmhead - needed #[cfg(feature=cuda)]. Both blocked cargo install --path crates/apr-cli with training-gpu feature.' + - 'entrenar wgpu_pipeline.rs:655 referenced undefined variable xa_t in debug logging. Plus forward_hidden_gpu_then_cpu_lmhead needed #[cfg(feature=cuda)]. Both blocked cargo install --path crates/apr-cli with training-gpu feature.' phases: [] subtasks: [] estimated_effort: null @@ -5437,9 +5145,7 @@ roadmap: updated: 2026-03-31 18:01:23+00:00 spec: null acceptance_criteria: - - '23 of 25 #[contract] annotations reference non-existent YAML files. Top 5 by impact: softmax-kernel-v1 - (EXISTS), rope-kernel-v1 (EXISTS), rmsnorm-kernel-v1, matmul-kernel-v1, cross-entropy-kernel-v1. Create - YAML contracts with equations, proof obligations, and falsification tests.' + - '23 of 25 #[contract] annotations reference non-existent YAML files. Top 5 by impact: softmax-kernel-v1 (EXISTS), rope-kernel-v1 (EXISTS), rmsnorm-kernel-v1, matmul-kernel-v1, cross-entropy-kernel-v1. Create YAML contracts with equations, proof obligations, and falsification tests.' phases: [] subtasks: [] estimated_effort: null @@ -5458,9 +5164,7 @@ roadmap: updated: 2026-03-31 18:01:23+00:00 spec: null acceptance_criteria: - - compute-backend-equivalence-v1.yaml defines 6 falsification tests (FALSIFY-BE-001..006) but zero are - implemented in Rust. Implement at least BE-001 (SIMD RMSNorm), BE-002 (wgpu forward), BE-003 (PTX - forward pre-Blackwell) as proptest-based tests. + - compute-backend-equivalence-v1.yaml defines 6 falsification tests (FALSIFY-BE-001..006) but zero are implemented in Rust. Implement at least BE-001 (SIMD RMSNorm), BE-002 (wgpu forward), BE-003 (PTX forward pre-Blackwell) as proptest-based tests. phases: [] subtasks: [] estimated_effort: null @@ -5479,8 +5183,7 @@ roadmap: updated: 2026-03-31 20:33:16+00:00 spec: null acceptance_criteria: - - normalization-kernel-v1.yaml has 6 FALSIFY-NORM tests defined but zero implemented. Implement NORM-001 - (RMSNorm invariant sum), NORM-002 (LayerNorm zero-mean), NORM-003 (NaN propagation). + - normalization-kernel-v1.yaml has 6 FALSIFY-NORM tests defined but zero implemented. Implement NORM-001 (RMSNorm invariant sum), NORM-002 (LayerNorm zero-mean), NORM-003 (NaN propagation). phases: [] subtasks: [] estimated_effort: null @@ -5515,8 +5218,7 @@ roadmap: updated: 2026-04-08 08:04:25.947172+00:00 spec: null acceptance_criteria: - - Create examples/ch01_hello_apr.rs through examples/ch20_rag.rs. Each must compile, contain assert!(), - use only aprender-* namespace. + - Create examples/ch01_hello_apr.rs through examples/ch20_rag.rs. Each must compile, contain assert!(), use only aprender-* namespace. phases: [] subtasks: [] estimated_effort: null @@ -5535,8 +5237,7 @@ roadmap: updated: 2026-04-08 08:22:21.049932+00:00 spec: null acceptance_criteria: - - Create contracts/apr-book-ch01-v1.yaml through contracts/apr-book-ch20-v1.yaml. Each with 5 falsification - conditions, P0 severity. + - Create contracts/apr-book-ch01-v1.yaml through contracts/apr-book-ch20-v1.yaml. Each with 5 falsification conditions, P0 severity. phases: [] subtasks: [] estimated_effort: null @@ -5555,8 +5256,7 @@ roadmap: updated: 2026-04-08 08:04:21+00:00 spec: null acceptance_criteria: - - 'Create tests/book_contracts.rs: verifies all 20 examples exist, all 20 contracts exist, namespace - discipline (zero legacy names).' + - 'Create tests/book_contracts.rs: verifies all 20 examples exist, all 20 contracts exist, namespace discipline (zero legacy names).' phases: [] subtasks: [] estimated_effort: null @@ -5575,8 +5275,7 @@ roadmap: updated: 2026-04-08 08:24:24.512282+00:00 spec: null acceptance_criteria: - - Run cargo run --example for all 20 chapters, validate all contracts, run namespace grep gate, verify - oracle consultation. + - Run cargo run --example for all 20 chapters, validate all contracts, run namespace grep gate, verify oracle consultation. phases: [] subtasks: [] estimated_effort: null @@ -5595,8 +5294,7 @@ roadmap: updated: 2026-04-08 08:43:36.972348+00:00 spec: null acceptance_criteria: - - Archive alimentar, batuta-common, trueno-viz, trueno-zram, renacer, pacha with MOVED redirect descriptions - pointing to aprender monorepo crates. + - Archive alimentar, batuta-common, trueno-viz, trueno-zram, renacer, pacha with MOVED redirect descriptions pointing to aprender monorepo crates. phases: [] subtasks: [] estimated_effort: null @@ -5615,10 +5313,7 @@ roadmap: updated: 2026-04-08 08:43:31+00:00 spec: null acceptance_criteria: - - Archive ds500-subscription-deleted, hello, hello-github, discord-bot, model-serving-survey, socialpower, - software-language-popularity-2025, osx-perf-tune, ubuntu-config-scripts, cost-optimize-aws, eu-currency, - dom-intelligence, labs-code, data, ropub, archived-emlop-book-material, Flask-Elastic-Beanstalk, awsbigdata, - pbjbi, apr-leaderboard, engman, faro, rurl, minimal-pyqt. + - Archive ds500-subscription-deleted, hello, hello-github, discord-bot, model-serving-survey, socialpower, software-language-popularity-2025, osx-perf-tune, ubuntu-config-scripts, cost-optimize-aws, eu-currency, dom-intelligence, labs-code, data, ropub, archived-emlop-book-material, Flask-Elastic-Beanstalk, awsbigdata, pbjbi, apr-leaderboard, engman, faro, rurl, minimal-pyqt. phases: [] subtasks: [] estimated_effort: null @@ -5637,9 +5332,7 @@ roadmap: updated: 2026-04-08 08:45:03.468719+00:00 spec: null acceptance_criteria: - - 'Add GitHub topics to all 205 paiml repos matching their category: monorepo, merged, active-tool, - model-training, poc-benchmark, course-demo, legacy-book, legacy-library, ground-truth, transpiler, - lang-ruchy, infra, platform, pmat, stale.' + - 'Add GitHub topics to all 205 paiml repos matching their category: monorepo, merged, active-tool, model-training, poc-benchmark, course-demo, legacy-book, legacy-library, ground-truth, transpiler, lang-ruchy, infra, platform, pmat, stale.' phases: [] subtasks: [] estimated_effort: null @@ -5658,9 +5351,7 @@ roadmap: updated: 2026-04-08 08:53:28.767394+00:00 spec: null acceptance_criteria: - - Archive batuta-cookbook, batuta-ground-truth-mlops-corpus, forjar-cookbook, apr-cookbook, ald-cookbook, - prs-cookbook, apr-model-qa-playbook, reaper, rustysquid, mp4convertor, rclean, universal-bot, discord-intelligence, - ov, assetgen, assetsearch, pacha-run, wos. + - Archive batuta-cookbook, batuta-ground-truth-mlops-corpus, forjar-cookbook, apr-cookbook, ald-cookbook, prs-cookbook, apr-model-qa-playbook, reaper, rustysquid, mp4convertor, rclean, universal-bot, discord-intelligence, ov, assetgen, assetsearch, pacha-run, wos. phases: [] subtasks: [] estimated_effort: null @@ -5679,8 +5370,7 @@ roadmap: updated: 2026-04-08 08:54:18.361385+00:00 spec: null acceptance_criteria: - - 'Create contracts/apr-tool-{name}-v1.yaml for each ACTIVE-TOOL repo. Each contract defines: purpose, - inputs, outputs, 5 falsification conditions. Provable-contracts-first documentation.' + - 'Create contracts/apr-tool-{name}-v1.yaml for each ACTIVE-TOOL repo. Each contract defines: purpose, inputs, outputs, 5 falsification conditions. Provable-contracts-first documentation.' phases: [] subtasks: [] estimated_effort: null @@ -5699,8 +5389,7 @@ roadmap: updated: 2026-04-08 08:54:59.641361+00:00 spec: null acceptance_criteria: - - 'Create contracts/apr-corpus-{name}-v1.yaml for each ground-truth corpus. Defines: domain, language, - file count, coverage target, freshness gate.' + - 'Create contracts/apr-corpus-{name}-v1.yaml for each ground-truth corpus. Defines: domain, language, file count, coverage target, freshness gate.' phases: [] subtasks: [] estimated_effort: null @@ -5720,9 +5409,7 @@ roadmap: updated: 2026-04-08 09:04:24.245970+00:00 spec: null acceptance_criteria: - - 'Provable-contract FIRST: update contract YAML with API-level falsification, THEN rewrite example - to use real aprender APIs. Order: ch16 (ARIMA), ch17 (Bayesian), ch18 (Graph), ch19 (Text), ch07 (ModelSelection), - ch10 (Training/Autograd), ch03 (Format). Each example must call fit/predict/transform — not just println.' + - 'Provable-contract FIRST: update contract YAML with API-level falsification, THEN rewrite example to use real aprender APIs. Order: ch16 (ARIMA), ch17 (Bayesian), ch18 (Graph), ch19 (Text), ch07 (ModelSelection), ch10 (Training/Autograd), ch03 (Format). Each example must call fit/predict/transform — not just println.' phases: [] subtasks: [] estimated_effort: null @@ -5742,8 +5429,7 @@ roadmap: updated: 2026-04-08 10:58:11.421672+00:00 spec: null acceptance_criteria: - - 'Create docs/book/ch01.md, ch02.md, ch03.md. Each embeds example code, explains arXiv citations, shows - cargo run output. Provable-contract-first: contract defines what prose MUST cover.' + - 'Create docs/book/ch01.md, ch02.md, ch03.md. Each embeds example code, explains arXiv citations, shows cargo run output. Provable-contract-first: contract defines what prose MUST cover.' phases: [] subtasks: [] estimated_effort: null @@ -5763,9 +5449,7 @@ roadmap: updated: 2026-04-08 11:01:23.745921+00:00 spec: null acceptance_criteria: - - Redesign book so ZERO content exists without a contract. Every page = contract YAML + example + prose. - Pages without contracts are deleted. SUMMARY.md only lists contracted pages. Update spec with new - schema. + - Redesign book so ZERO content exists without a contract. Every page = contract YAML + example + prose. Pages without contracts are deleted. SUMMARY.md only lists contracted pages. Update spec with new schema. phases: [] subtasks: [] estimated_effort: null @@ -5786,8 +5470,7 @@ roadmap: updated: 2026-04-08 11:08:18.946654+00:00 spec: null acceptance_criteria: - - 'For each page: 1) create contract YAML, 2) add PCU frontmatter, 3) run book-gate.sh, 4) update spec. - Start with examples/ (highest value), then ml-fundamentals/, then reference sections.' + - 'For each page: 1) create contract YAML, 2) add PCU frontmatter, 3) run book-gate.sh, 4) update spec. Start with examples/ (highest value), then ml-fundamentals/, then reference sections.' phases: [] subtasks: [] estimated_effort: null @@ -5808,8 +5491,7 @@ roadmap: updated: 2026-04-08 11:50:18.376661+00:00 spec: null acceptance_criteria: - - 'Part VI: Benchmarks. Ch21 vs Candle (candle-vs-apr repo data), Ch22 vs llama.cpp, Ch23 Training: - pytorch/unsloth/cuBLAS (qwen-train-canary data). Contract YAML first, then examples, then book pages.' + - 'Part VI: Benchmarks. Ch21 vs Candle (candle-vs-apr repo data), Ch22 vs llama.cpp, Ch23 Training: pytorch/unsloth/cuBLAS (qwen-train-canary data). Contract YAML first, then examples, then book pages.' phases: [] subtasks: [] estimated_effort: null @@ -5830,8 +5512,7 @@ roadmap: updated: 2026-04-08 11:50:13+00:00 spec: null acceptance_criteria: - - 'Part VII: Switch From. Ch24 PyTorch, Ch25 Ollama, Ch26 ndarray/nalgebra/linfa, Ch27 unsloth. Each - with contract, cargo run --example, API equivalence tables.' + - 'Part VII: Switch From. Ch24 PyTorch, Ch25 Ollama, Ch26 ndarray/nalgebra/linfa, Ch27 unsloth. Each with contract, cargo run --example, API equivalence tables.' phases: [] subtasks: [] estimated_effort: null @@ -5852,9 +5533,7 @@ roadmap: updated: 2026-04-08 12:45:08.841175+00:00 spec: null acceptance_criteria: - - 1) Upgrade book-gate.sh with G8-G12 for section cross-check, prose minimum, executable falsification, - arXiv validation. 2) Create .github/workflows/book-contracts.yml CI. 3) Update spec with leak findings. - 4) Falsify. + - 1) Upgrade book-gate.sh with G8-G12 for section cross-check, prose minimum, executable falsification, arXiv validation. 2) Create .github/workflows/book-contracts.yml CI. 3) Update spec with leak findings. 4) Falsify. phases: [] subtasks: [] estimated_effort: null @@ -5875,17 +5554,9 @@ roadmap: updated: 2026-04-18 13:33:05.351120+00:00 spec: null acceptance_criteria: - - Ongoing kaizen sweeps on docs/specifications/apr-mcp-server-spec.md + crates/aprender-mcp + book/src/tools/mcp-server.md - + contracts/apr-mcp-tool-schemas-v1.yaml. Each sweep fixes stale counts, stale roadmap tense (Mx→shipped), - stale tool descriptions, and cross-spec inconsistencies. - - 'DISCHARGED 2026-04-18: FALSIFY-MCP-008 extended to cover tool-level `description` at both the live-wiring - layer (`tool_descriptions_match_yaml_contract`) and the codegen-constant layer (`codegen_description_constants_match_yaml`); - build.rs now emits `APR__DESCRIPTION` alongside `APR__SCHEMA`. Neither field can be hand-edited - in Rust source.' - - 'DISCHARGED 2026-04-18: Spec §"Relationship to `apr code`" added — bidirectional MCP scope (consumer - + producer + future apr.code tool) + feature-flag caveat + 9-of-58 coverage table + Phase-2 priority - batch. Closes the gap where the spec treated Claude Code as an external-client-only concern and never - referenced the sibling `apr code` agent (PMAT-182).' + - Ongoing kaizen sweeps on docs/specifications/apr-mcp-server-spec.md + crates/aprender-mcp + book/src/tools/mcp-server.md + contracts/apr-mcp-tool-schemas-v1.yaml. Each sweep fixes stale counts, stale roadmap tense (Mx→shipped), stale tool descriptions, and cross-spec inconsistencies. + - 'DISCHARGED 2026-04-18: FALSIFY-MCP-008 extended to cover tool-level `description` at both the live-wiring layer (`tool_descriptions_match_yaml_contract`) and the codegen-constant layer (`codegen_description_constants_match_yaml`); build.rs now emits `APR__DESCRIPTION` alongside `APR__SCHEMA`. Neither field can be hand-edited in Rust source.' + - 'DISCHARGED 2026-04-18: Spec §"Relationship to `apr code`" added — bidirectional MCP scope (consumer + producer + future apr.code tool) + feature-flag caveat + 9-of-58 coverage table + Phase-2 priority batch. Closes the gap where the spec treated Claude Code as an external-client-only concern and never referenced the sibling `apr code` agent (PMAT-182).' phases: [] subtasks: [] estimated_effort: null @@ -6034,21 +5705,13 @@ roadmap: updated: 2026-04-18 15:00:00+00:00 spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - - 'Wave 1 (JSON-clean, model-triage analogues): add apr.inspect, apr.lint, apr.diff — all have existing - --json output and complement the M1-M3 apr.validate/apr.qa/apr.trace workflow-triage surface.' - - 'Wave 2 (format pipeline): apr.convert, apr.export, apr.import, apr.quantize — already JSON-clean; - needed for external agents doing model-format work remotely.' - - 'Wave 3 (model-management + analysis): apr.pull (download), apr.profile (roofline), apr.explain (nat-lang - description), apr.tokenize (debug tokenization).' + - 'Wave 1 (JSON-clean, model-triage analogues): add apr.inspect, apr.lint, apr.diff — all have existing --json output and complement the M1-M3 apr.validate/apr.qa/apr.trace workflow-triage surface.' + - 'Wave 2 (format pipeline): apr.convert, apr.export, apr.import, apr.quantize — already JSON-clean; needed for external agents doing model-format work remotely.' + - 'Wave 3 (model-management + analysis): apr.pull (download), apr.profile (roofline), apr.explain (nat-lang description), apr.tokenize (debug tokenization).' - 'Wave 4 (evaluation): apr.eval, apr.probar (behaviour-test pipeline).' - - 'Each wave: extend contracts/apr-mcp-tool-schemas-v1.yaml, update build.rs codegen coverage tests, - extend FALSIFY-MCP-008 CODEGEN_CONSTANTS + CODEGEN_DESCRIPTIONS arrays, add integration tests mirroring - each tool.' - - Interactive-only commands (apr chat, apr tui, apr cbtop, apr monitor) and meta-commands (apr mcp itself) - are EXPLICITLY out of scope — MCP tools must be one-shot request/response. - - 'Falsification gate FALSIFY-MCP-COVERAGE-001: `apr-cli-commands-v1.yaml` commands with `side_effects: - none` OR `category: readonly`/`analysis` MUST appear in the MCP tool set or be explicitly listed as - deferred — enforced by a new test that diffs the two contracts.' + - 'Each wave: extend contracts/apr-mcp-tool-schemas-v1.yaml, update build.rs codegen coverage tests, extend FALSIFY-MCP-008 CODEGEN_CONSTANTS + CODEGEN_DESCRIPTIONS arrays, add integration tests mirroring each tool.' + - Interactive-only commands (apr chat, apr tui, apr cbtop, apr monitor) and meta-commands (apr mcp itself) are EXPLICITLY out of scope — MCP tools must be one-shot request/response. + - 'Falsification gate FALSIFY-MCP-COVERAGE-001: `apr-cli-commands-v1.yaml` commands with `side_effects: none` OR `category: readonly`/`analysis` MUST appear in the MCP tool set or be explicitly listed as deferred — enforced by a new test that diffs the two contracts.' phases: [] subtasks: [] estimated_effort: null @@ -6068,20 +5731,11 @@ roadmap: updated: 2026-04-18 15:00:00+00:00 spec: docs/specifications/aprender-orchestrate/components/apr-code.md acceptance_criteria: - - Add .mcp.json loader at `$CWD/.mcp.json` and `~/.config/apr/mcp.json` — mirrors Claude Code / Cursor - / Cline precedence. Existing TOML AgentManifest.mcp_servers path remains supported. - - Wire `register_mcp_tools` (today in crates/aprender-orchestrate/src/cli/agent_helpers.rs:219, feature-gated - behind `agents-mcp`) into `build_code_tools` at crates/aprender-orchestrate/src/agent/code.rs:360. - Today the call site is missing — external MCP servers declared in manifest are silently ignored by - `apr code`. - - 'Falsification: spawn a stdio MCP server (e.g. the aprender-mcp binary itself), declare it in `.mcp.json`, - launch `apr code --print`, prompt it to call one of the exposed tools (e.g. apr.version), assert the - tool appears in agent logs and the returned content is in the final transcript.' - - 'Privacy-tier guard: Sovereign tier must allow only stdio transport (McpTransport::Stdio); SSE/HTTP - rejected with user-visible error. Existing PrivacyTier logic in mcp_client.rs already expresses this - — verify at wire-up.' - - 'Feature flag: keep behind `agents-mcp`. No changes to default install story (apr code only appears - with `--features code`).' + - Add .mcp.json loader at `$CWD/.mcp.json` and `~/.config/apr/mcp.json` — mirrors Claude Code / Cursor / Cline precedence. Existing TOML AgentManifest.mcp_servers path remains supported. + - Wire `register_mcp_tools` (today in crates/aprender-orchestrate/src/cli/agent_helpers.rs:219, feature-gated behind `agents-mcp`) into `build_code_tools` at crates/aprender-orchestrate/src/agent/code.rs:360. Today the call site is missing — external MCP servers declared in manifest are silently ignored by `apr code`. + - 'Falsification: spawn a stdio MCP server (e.g. the aprender-mcp binary itself), declare it in `.mcp.json`, launch `apr code --print`, prompt it to call one of the exposed tools (e.g. apr.version), assert the tool appears in agent logs and the returned content is in the final transcript.' + - 'Privacy-tier guard: Sovereign tier must allow only stdio transport (McpTransport::Stdio); SSE/HTTP rejected with user-visible error. Existing PrivacyTier logic in mcp_client.rs already expresses this — verify at wire-up.' + - 'Feature flag: keep behind `agents-mcp`. No changes to default install story (apr code only appears with `--features code`).' phases: [] subtasks: [] estimated_effort: null @@ -6094,8 +5748,7 @@ roadmap: - id: PMAT-CLAUDE-PROXY-001 github_issue: null item_type: feature - title: 'APR-CLAUDE-PROXY: `apr serve anthropic` — sovereign Messages-API drop-in backed by apr code - + Qwen3-MoE' + title: 'APR-CLAUDE-PROXY: `apr serve anthropic` — sovereign Messages-API drop-in backed by apr code + Qwen3-MoE' status: planned priority: high assigned_to: null @@ -6104,21 +5757,13 @@ roadmap: spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - 'Contract committed: contracts/apr-claude-proxy-v1.yaml (DRAFT → ENFORCED when all 6 gates PASS).' - - 'Spec section committed: docs/specifications/apr-mcp-server-spec.md § "Claude Messages-API Provable-Contract - Proxy (PLANNED M6)".' - - 'Default-model resolver implements the fallback chain: unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M - → Qwen/Qwen3-30B-A3B-GGUF:Q4_K_M → APR_CODE_MODEL env → manifest.default_model.' - - 'HTTP surface lives in `crates/aprender-serve/src/anthropic/` (new module). CLI entry: `apr serve - anthropic` — new `ServeCommands::Anthropic` variant in `crates/apr-cli/src/serve_commands.rs` alongside - existing `Plan` and `Run`.' - - FALSIFY-CLAUDE-PROXY-001..006 all ENFORCED before promotion from PLANNED → ACTIVE (see contract for - details). - - 'Sovereignty gate (FALSIFY-CLAUDE-PROXY-006): zero outbound sockets to api.anthropic.com under any - combination of headers/env/config. Asserted by network-sandboxed CI container.' - - Translation semantics are a pure function of (request_body, resolved_model, server_config) — no client-identity - leakage, property-tested round-trip via `apr serve anthropic --dump-translation`. - - 'Streaming (SSE) event sequence validates against Anthropic v2026-02-01 schedule: message_start → - (content_block_start → N × content_block_delta → content_block_stop)⁺ → message_delta → message_stop.' + - 'Spec section committed: docs/specifications/apr-mcp-server-spec.md § "Claude Messages-API Provable-Contract Proxy (PLANNED M6)".' + - 'Default-model resolver implements the fallback chain: unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Q4_K_M → Qwen/Qwen3-30B-A3B-GGUF:Q4_K_M → APR_CODE_MODEL env → manifest.default_model.' + - 'HTTP surface lives in `crates/aprender-serve/src/anthropic/` (new module). CLI entry: `apr serve anthropic` — new `ServeCommands::Anthropic` variant in `crates/apr-cli/src/serve_commands.rs` alongside existing `Plan` and `Run`.' + - FALSIFY-CLAUDE-PROXY-001..006 all ENFORCED before promotion from PLANNED → ACTIVE (see contract for details). + - 'Sovereignty gate (FALSIFY-CLAUDE-PROXY-006): zero outbound sockets to api.anthropic.com under any combination of headers/env/config. Asserted by network-sandboxed CI container.' + - Translation semantics are a pure function of (request_body, resolved_model, server_config) — no client-identity leakage, property-tested round-trip via `apr serve anthropic --dump-translation`. + - 'Streaming (SSE) event sequence validates against Anthropic v2026-02-01 schedule: message_start → (content_block_start → N × content_block_delta → content_block_stop)⁺ → message_delta → message_stop.' phases: - name: Request-shape parser status: planned @@ -6145,13 +5790,8 @@ roadmap: - apr-code - anthropic - sovereign - notes: 'Sibling to PMAT-MCP-PARITY-001 (MCP server surface) and PMAT-CODE-MCP- CLIENT-001 (apr code - MCP-client wiring). The three together close the triangle of Claude-Code parity: (1) apr mcp exposes - apr as MCP tools; (2) apr code consumes external MCP servers; (3) apr serve --compat anthropic exposes - the full agent loop via Anthropic''s Messages API. PMAT-CLAUDE-PROXY-001 unlocks the largest category - of IDE integrations (everything speaking `anthropic-sdk-*`) without any MCP dependency. - - ' + notes: | + Sibling to PMAT-MCP-PARITY-001 (MCP server surface) and PMAT-CODE-MCP- CLIENT-001 (apr code MCP-client wiring). The three together close the triangle of Claude-Code parity: (1) apr mcp exposes apr as MCP tools; (2) apr code consumes external MCP servers; (3) apr serve --compat anthropic exposes the full agent loop via Anthropic's Messages API. PMAT-CLAUDE-PROXY-001 unlocks the largest category of IDE integrations (everything speaking `anthropic-sdk-*`) without any MCP dependency. - id: PMAT-CODE-PARITY-MATRIX-001 github_issue: null item_type: epic @@ -6163,10 +5803,8 @@ roadmap: updated: 2026-04-18 17:00:00+00:00 spec: docs/specifications/apr-mcp-server-spec.md acceptance_criteria: - - P0 tickets (PMAT-CODE-{MCP-CLIENT,SLASH-PARITY,HOOKS,SPAWN-PARITY}-001) each promote from planned - to in-progress with first acceptance criterion landed. - - Audit re-runs after P0 completion (via the six pmat query / grep cross-checks listed in the spec matrix) - and each of the four P0 rows flips from PARTIAL/NONE to SHIPPED with updated evidence path. + - P0 tickets (PMAT-CODE-{MCP-CLIENT,SLASH-PARITY,HOOKS,SPAWN-PARITY}-001) each promote from planned to in-progress with first acceptance criterion landed. + - Audit re-runs after P0 completion (via the six pmat query / grep cross-checks listed in the spec matrix) and each of the four P0 rows flips from PARTIAL/NONE to SHIPPED with updated evidence path. - Headline count rebalances from 5/7/8 to at minimum 9/7/4 before this epic closes. phases: [] subtasks: [] @@ -6176,12 +5814,8 @@ roadmap: - parity - claude-code - epic - notes: 'The matrix is falsifiable, not aspirational — every row cites a specific file path or a specific - zero-hit grep, and can be re-run to verify the gap has closed. This is the key advantage of the audit - approach: parity progress is mechanically checkable, not "does it feel like Claude Code". Re-run the - six falsification cross-checks listed at the bottom of the spec matrix section after each ticket closes. - - ' + notes: | + The matrix is falsifiable, not aspirational — every row cites a specific file path or a specific zero-hit grep, and can be re-run to verify the gap has closed. This is the key advantage of the audit approach: parity progress is mechanically checkable, not "does it feel like Claude Code". Re-run the six falsification cross-checks listed at the bottom of the spec matrix section after each ticket closes. - id: PMAT-521 github_issue: null item_type: task @@ -9141,8 +8775,7 @@ roadmap: updated: 2026-04-21 17:33:02.612716+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-01-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-01-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9164,8 +8797,7 @@ roadmap: updated: 2026-04-21 17:33:06.129257+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-02-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-02-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9187,8 +8819,7 @@ roadmap: updated: 2026-04-21 17:33:08.064157+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-03-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-03-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9210,8 +8841,7 @@ roadmap: updated: 2026-04-21 17:40:24.866055+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-04-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-04-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9233,8 +8863,7 @@ roadmap: updated: 2026-04-21 17:40:30.201327+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-05-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-05-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9256,8 +8885,7 @@ roadmap: updated: 2026-04-21 17:33:09.987621+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-06-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-06-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9279,8 +8907,7 @@ roadmap: updated: 2026-04-21 17:40:32.230207+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-07-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-07-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9302,8 +8929,7 @@ roadmap: updated: 2026-04-21 17:40:34.193033+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-08-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-08-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9325,8 +8951,7 @@ roadmap: updated: 2026-04-21 17:40:36.166173+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-09-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-09-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9348,8 +8973,7 @@ roadmap: updated: 2026-04-21 17:33:11.883491+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-10-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-10-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9371,8 +8995,7 @@ roadmap: updated: 2026-04-21 17:40:38.151284+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-11-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-11-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9394,8 +9017,7 @@ roadmap: updated: 2026-04-21 17:40:40.127745+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-12-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-12-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9417,8 +9039,7 @@ roadmap: updated: 2026-04-21 17:40:42.178009+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-13-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-13-v1.yaml | Competitor: hf-kernels | Demand: 3/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9440,8 +9061,7 @@ roadmap: updated: 2026-04-21 17:50:35.218351+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-14-v1.yaml | Competitor: hf-kernels | Demand: 2/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-14-v1.yaml | Competitor: hf-kernels | Demand: 2/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9463,8 +9083,7 @@ roadmap: updated: 2026-04-21 17:33:13.764545+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-l-15-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.l + §13' + - 'Contract: contracts/crux-l-15-v1.yaml | Competitor: hf-kernels | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.l + §13' phases: [] subtasks: [] estimated_effort: null @@ -9486,8 +9105,7 @@ roadmap: updated: 2026-04-21 17:15:28.724749+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-01-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-01-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9509,8 +9127,7 @@ roadmap: updated: 2026-04-21 17:17:55.283180+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-02-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-02-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9532,8 +9149,7 @@ roadmap: updated: 2026-04-21 17:17:57.869191+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-04-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-04-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9555,8 +9171,7 @@ roadmap: updated: 2026-04-21 17:26:37.956162+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-05-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-05-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9578,8 +9193,7 @@ roadmap: updated: 2026-04-21 17:26:42.477286+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-06-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-06-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9601,8 +9215,7 @@ roadmap: updated: 2026-04-21 17:17:59.816988+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-07-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-07-v1.yaml | Competitor: apr-qa-playbook | Demand: 5/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9624,8 +9237,7 @@ roadmap: updated: 2026-04-21 17:26:44.416035+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-08-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-08-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9647,8 +9259,7 @@ roadmap: updated: 2026-04-21 17:26:46.354228+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-09-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-09-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9670,8 +9281,7 @@ roadmap: updated: 2026-04-21 17:26:48.292544+00:00 spec: null acceptance_criteria: - - 'Contract: contracts/crux-m-10-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md - §5.m + §13' + - 'Contract: contracts/crux-m-10-v1.yaml | Competitor: apr-qa-playbook | Demand: 4/5 | Subspec: docs/specifications/crux-competitive-research-ux-workflows.md §5.m + §13' phases: [] subtasks: [] estimated_effort: null @@ -9693,12 +9303,7 @@ roadmap: updated: 2026-05-16 07:23:25+00:00 spec: null acceptance_criteria: - - 'PARTIAL discharge (2026-05-16): P0-G verified LIVE via pad-on-export message [P0-G] Padding APR-fallback - tokenizer.ggml.tokens: 151643 + 293 placeholders = 151936; GGUF metadata + tensor shapes all align - at 151936. P0-H NOT verified on epoch-020 checkpoint (it was trained BEFORE P0-H landed; arch metadata - still LlamaForCausalLM → Qwen2 biases leak with passthrough names → llama-cli expected 291 got 219). - P0-H verification deferred to PMAT-681 (P2-C) since exercising it requires a freshly-emitted checkpoint. - Build was blocked by memory pressure (3GB free / 127GB swap exhausted). See evidence/p0-i-2026-05-16/findings.md.' + - 'PARTIAL discharge (2026-05-16): P0-G verified LIVE via pad-on-export message [P0-G] Padding APR-fallback tokenizer.ggml.tokens: 151643 + 293 placeholders = 151936; GGUF metadata + tensor shapes all align at 151936. P0-H NOT verified on epoch-020 checkpoint (it was trained BEFORE P0-H landed; arch metadata still LlamaForCausalLM → Qwen2 biases leak with passthrough names → llama-cli expected 291 got 219). P0-H verification deferred to PMAT-681 (P2-C) since exercising it requires a freshly-emitted checkpoint. Build was blocked by memory pressure (3GB free / 127GB swap exhausted). See evidence/p0-i-2026-05-16/findings.md.' phases: [] subtasks: [] estimated_effort: null @@ -9719,9 +9324,7 @@ roadmap: updated: 2026-05-16 13:22:20.550551+00:00 spec: null acceptance_criteria: - - 'Convert PR #1708 stderr warning to fail-fast error when D/N < 10× in apr pretrain; add --force-under-provisioned - bypass flag. Author contracts/chinchilla-gate-v1.yaml with FALSIFY tests. Audit Rec #2 (audits/albor-370.md). - Effort: 1-2h. Δship +1 (prevention). P=95%. See §83.2.' + - 'Convert PR #1708 stderr warning to fail-fast error when D/N < 10× in apr pretrain; add --force-under-provisioned bypass flag. Author contracts/chinchilla-gate-v1.yaml with FALSIFY tests. Audit Rec #2 (audits/albor-370.md). Effort: 1-2h. Δship +1 (prevention). P=95%. See §83.2.' phases: [] subtasks: [] estimated_effort: null @@ -9743,15 +9346,7 @@ roadmap: updated: 2026-05-17 08:16:22+00:00 spec: null acceptance_criteria: - - 'P2-C 50K-step training COMPLETED via lambda-vector dispatch 2026-05-17. Multi-source corpus assembly - succeeded (49.6B tokens, 18.3M docs, 17 min tokenize at 22.5K docs/s). Training EARLY_STOP at 27 epochs - / 2700 steps with val_loss=4.91 best. AUDIT HYPOTHESIS FALSIFIED: corpus diversity was NOT the binding - constraint — identical termination shape to §82 (which had 1.24B-token single-source corpus). Root - cause discovered (NEW P0-K): apr convert import-from-HF doesn''t stamp hf_architecture / embedded - tokenizer / merges, so all downstream P0-D/E/F/G/H/J machinery has nothing to propagate. Ship % stays - at 79. See evidence/p2c-2026-05-17/findings.md for full Five-Whys + methodology lesson #33 (upstream - metadata defects masquerade as downstream packaging defects). Next: PMAT-690 NEW P0-K apr convert - metadata stamping.' + - 'P2-C 50K-step training COMPLETED via lambda-vector dispatch 2026-05-17. Multi-source corpus assembly succeeded (49.6B tokens, 18.3M docs, 17 min tokenize at 22.5K docs/s). Training EARLY_STOP at 27 epochs / 2700 steps with val_loss=4.91 best. AUDIT HYPOTHESIS FALSIFIED: corpus diversity was NOT the binding constraint — identical termination shape to §82 (which had 1.24B-token single-source corpus). Root cause discovered (NEW P0-K): apr convert import-from-HF doesn''t stamp hf_architecture / embedded tokenizer / merges, so all downstream P0-D/E/F/G/H/J machinery has nothing to propagate. Ship % stays at 79. See evidence/p2c-2026-05-17/findings.md for full Five-Whys + methodology lesson #33 (upstream metadata defects masquerade as downstream packaging defects). Next: PMAT-690 NEW P0-K apr convert metadata stamping.' phases: [] subtasks: [] estimated_effort: null @@ -9774,10 +9369,7 @@ roadmap: updated: 2026-05-16 07:15:09+00:00 spec: null acceptance_criteria: - - 'FALLBACK ONLY if P2-C is blocked on infrastructure. Pre-falsified by audit via Chinchilla math (D/N - = 0.04×). Running more steps on a 22M-token consumed / 1.24B available corpus cannot break the val_loss - plateau (binding constraint is data, not compute). If dispatched: --num-steps 20000 --init qwen-0.5b - --dataset qwen-v2. Effort: 3-8h GPU. Δship +1 best case. P=15%. See §83.' + - 'FALLBACK ONLY if P2-C is blocked on infrastructure. Pre-falsified by audit via Chinchilla math (D/N = 0.04×). Running more steps on a 22M-token consumed / 1.24B available corpus cannot break the val_loss plateau (binding constraint is data, not compute). If dispatched: --num-steps 20000 --init qwen-0.5b --dataset qwen-v2. Effort: 3-8h GPU. Δship +1 best case. P=15%. See §83.' phases: [] subtasks: [] estimated_effort: null @@ -9800,8 +9392,7 @@ roadmap: updated: 2026-05-16 07:15:09+00:00 spec: null acceptance_criteria: - - 'Ship apr distill per §35 (currently STUB). Architectural change; defer until P2-C exhausted. Multi-week - scope. Effort: 16-40h. Δship +10. P=25%.' + - 'Ship apr distill per §35 (currently STUB). Architectural change; defer until P2-C exhausted. Multi-week scope. Effort: 16-40h. Δship +10. P=25%.' phases: [] subtasks: [] estimated_effort: null @@ -9824,9 +9415,7 @@ roadmap: updated: 2026-05-16 07:15:26+00:00 spec: null acceptance_criteria: - - 'BLOCKED on val_loss < 3.0 per audit Rec #3 (was < 4.0). At current val_loss=4.71 (perplexity ~111) - zero-shot reasoning is mathematically impossible. apr eval humaneval. Effort: 5-8h gx10. Δship +3 - if pass>5%. P=3%. Run AFTER P2-C lands a better checkpoint.' + - 'BLOCKED on val_loss < 3.0 per audit Rec #3 (was < 4.0). At current val_loss=4.71 (perplexity ~111) zero-shot reasoning is mathematically impossible. apr eval humaneval. Effort: 5-8h gx10. Δship +3 if pass>5%. P=3%. Run AFTER P2-C lands a better checkpoint.' phases: [] subtasks: [] estimated_effort: null @@ -9849,8 +9438,7 @@ roadmap: updated: 2026-05-16 07:15:26+00:00 spec: null acceptance_criteria: - - 'BLOCKED on val_loss < 3.0 per audit Rec #3. Generate from 100 prompts, parse with ast.parse, count - zero-error. Effort: 2h. Δship +3 if pass>30%. P=5% at current val_loss. Run AFTER P2-C.' + - 'BLOCKED on val_loss < 3.0 per audit Rec #3. Generate from 100 prompts, parse with ast.parse, count zero-error. Effort: 2h. Δship +3 if pass>30%. P=5% at current val_loss. Run AFTER P2-C.' phases: [] subtasks: [] estimated_effort: null @@ -9873,8 +9461,7 @@ roadmap: updated: 2026-05-16 07:15:26+00:00 spec: null acceptance_criteria: - - 'Discharges AC-SHIP2-007. Run apr inspect --quality against best ckpt. Effort: 1h. Δship +1. P=80%. - DEFERRED until val_loss < 3.0 (audit Rec #3).' + - 'Discharges AC-SHIP2-007. Run apr inspect --quality against best ckpt. Effort: 1h. Δship +1. P=80%. DEFERRED until val_loss < 3.0 (audit Rec #3).' phases: [] subtasks: [] estimated_effort: null @@ -9896,11 +9483,7 @@ roadmap: updated: 2026-05-16 07:24:18+00:00 spec: null acceptance_criteria: - - 'PARTIAL discharge (2026-05-16): apr lint on epoch-020.apr returns 0 errors / 3 warnings / 1 info - → meets ''zero High severity'' criterion (AC-SHIP2-008 component). Warnings: missing license + model_card - + provenance metadata fields. Info: 122 uncompressed tensors >1MB. Fixing the warnings requires a - model-card author step and metadata stamping in the pretrain pipeline (related to AC-SHIP2-022 provenance). - See evidence/p3-b-2026-05-16-lint.txt.' + - 'PARTIAL discharge (2026-05-16): apr lint on epoch-020.apr returns 0 errors / 3 warnings / 1 info → meets ''zero High severity'' criterion (AC-SHIP2-008 component). Warnings: missing license + model_card + provenance metadata fields. Info: 122 uncompressed tensors >1MB. Fixing the warnings requires a model-card author step and metadata stamping in the pretrain pipeline (related to AC-SHIP2-022 provenance). See evidence/p3-b-2026-05-16-lint.txt.' phases: [] subtasks: [] estimated_effort: null @@ -9921,8 +9504,7 @@ roadmap: updated: 2026-05-16 07:15:26+00:00 spec: null acceptance_criteria: - - 'Once val_loss < 3 + smoke OK: apr publish paiml/albor-370m-v1 --formats apr,safetensors,gguf. Final - ship gate. Effort: 1-2h. Δship +5. P=95%. BLOCKED on P2-C + P1-B + P3-A/B.' + - 'Once val_loss < 3 + smoke OK: apr publish paiml/albor-370m-v1 --formats apr,safetensors,gguf. Final ship gate. Effort: 1-2h. Δship +5. P=95%. BLOCKED on P2-C + P1-B + P3-A/B.' phases: [] subtasks: [] estimated_effort: null @@ -9945,8 +9527,7 @@ roadmap: updated: 2026-05-16 07:15:26+00:00 spec: null acceptance_criteria: - - 'Per feedback_post_publish_qa_required.md — mandatory after every publish. cargo install + /dogfood - GO. Effort: 1h. Gating (Δship 0). P=99%.' + - 'Per feedback_post_publish_qa_required.md — mandatory after every publish. cargo install + /dogfood GO. Effort: 1h. Gating (Δship 0). P=99%.' phases: [] subtasks: [] estimated_effort: null @@ -9969,13 +9550,7 @@ roadmap: updated: 2026-05-17 08:16:22+00:00 spec: null acceptance_criteria: - - 'P2-C live falsification (2026-05-17) revealed that PMAT-679..683''s Class 3 packaging cascade (P0-D/E/F/G/H/J) - was treating symptoms of a single upstream defect. apr convert from-HF-safetensors doesn''t stamp - hf_architecture, tokenizer.vocabulary, or tokenizer.merges into the imported APR. apr pretrain --init - then reads None for those fields and downstream P0-* machinery has nothing to propagate. Fix: apr - convert reads source config.json architectures[0] + tokenizer.json + writes them into apr_metadata.hf_architecture - + custom.tokenizer.{vocabulary,merges}. Scope ~100 LOC. Unblocks PMAT-679 P0-H half + AC-SHIP2-010 - llama-cli interop. See evidence/p2c-2026-05-17/findings.md.' + - 'P2-C live falsification (2026-05-17) revealed that PMAT-679..683''s Class 3 packaging cascade (P0-D/E/F/G/H/J) was treating symptoms of a single upstream defect. apr convert from-HF-safetensors doesn''t stamp hf_architecture, tokenizer.vocabulary, or tokenizer.merges into the imported APR. apr pretrain --init then reads None for those fields and downstream P0-* machinery has nothing to propagate. Fix: apr convert reads source config.json architectures[0] + tokenizer.json + writes them into apr_metadata.hf_architecture + custom.tokenizer.{vocabulary,merges}. Scope ~100 LOC. Unblocks PMAT-679 P0-H half + AC-SHIP2-010 llama-cli interop. See evidence/p2c-2026-05-17/findings.md.' phases: [] subtasks: [] estimated_effort: null @@ -9997,9 +9572,7 @@ roadmap: updated: 2026-05-18 10:58:47.974418+00:00 spec: null acceptance_criteria: - - SPEC-DISTILL-001 Phase 2. Wire CudaTransformerTrainer's KD-loss backward into pipeline.rs::train(). - Add forward_backward_kd_batch(batch, teacher_logits) on the trainer. Replace remaining build_synthetic_logits - stub for student path. Falsifier F-DISTILL-KD-001 — loss monotone over 100 steps. + - SPEC-DISTILL-001 Phase 2. Wire CudaTransformerTrainer's KD-loss backward into pipeline.rs::train(). Add forward_backward_kd_batch(batch, teacher_logits) on the trainer. Replace remaining build_synthetic_logits stub for student path. Falsifier F-DISTILL-KD-001 — loss monotone over 100 steps. phases: [] subtasks: [] estimated_effort: null @@ -10016,8 +9589,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.36.0 (PR #1915). Contract: contracts/distill-per-position-kd-v1.yaml. Additive/opt-in - (APR_DISTILL_PER_POSITION); CUDA path unchanged via trait defaults. Falsifiers FT-PERPOS-001..005.' + - 'Shipped v0.36.0 (PR #1915). Contract: contracts/distill-per-position-kd-v1.yaml. Additive/opt-in (APR_DISTILL_PER_POSITION); CUDA path unchanged via trait defaults. Falsifiers FT-PERPOS-001..005.' phases: [] subtasks: [] estimated_effort: null @@ -10036,8 +9608,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.37.0 (pull, #1917, contract sharded-gguf-pull-v1) + v0.38.0 (auto-merge, #1918, contract - sharded-gguf-merge-v1). Type-agnostic, lossless-metadata, bounded-memory merge. Advances CRUX-A acquisition.' + - 'Shipped v0.37.0 (pull, #1917, contract sharded-gguf-pull-v1) + v0.38.0 (auto-merge, #1918, contract sharded-gguf-merge-v1). Type-agnostic, lossless-metadata, bounded-memory merge. Advances CRUX-A acquisition.' phases: [] subtasks: [] estimated_effort: null @@ -10057,8 +9628,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.39.0 (PR #1919). Contract: contracts/bf16-dequant-v1.yaml. get_tensor_f32 + tensor_byte_size - BF16 arms; FT-BF16-001/002.' + - 'Shipped v0.39.0 (PR #1919). Contract: contracts/bf16-dequant-v1.yaml. get_tensor_f32 + tensor_byte_size BF16 arms; FT-BF16-001/002.' phases: [] subtasks: [] estimated_effort: null @@ -10078,8 +9648,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.40.0 (PR #1922). Contract: contracts/apr-gguf-export-symmetry-v1.yaml. Silent-corruption - fix; FT-APRQ8-001/002. Gated a-priori by CRUX-M-04 (PMAT-672).' + - 'Shipped v0.40.0 (PR #1922). Contract: contracts/apr-gguf-export-symmetry-v1.yaml. Silent-corruption fix; FT-APRQ8-001/002. Gated a-priori by CRUX-M-04 (PMAT-672).' phases: [] subtasks: [] estimated_effort: null @@ -10099,9 +9668,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.41.0 (PR #1924). Contract: contracts/q2k-dequant-parity-v1.yaml. Both aprender-core + - aprender-serve dequant matched to ggml dequantize_row_q2_K; FT-Q2K-001/002. Directly motivates the - PMAT-671 standing gate.' + - 'Shipped v0.41.0 (PR #1924). Contract: contracts/q2k-dequant-parity-v1.yaml. Both aprender-core + aprender-serve dequant matched to ggml dequantize_row_q2_K; FT-Q2K-001/002. Directly motivates the PMAT-671 standing gate.' phases: [] subtasks: [] estimated_effort: null @@ -10109,8 +9676,7 @@ roadmap: - crux-m - quant-integrity - shipped - notes: Roadmap-traceability backfill 2026-06-11. Strategic discharge = PMAT-671 (CRUX-M-02 stat-parity - gate would have caught this a priori). + notes: Roadmap-traceability backfill 2026-06-11. Strategic discharge = PMAT-671 (CRUX-M-02 stat-parity gate would have caught this a priori). - id: PMAT-697 github_issue: 1925 item_type: task @@ -10122,8 +9688,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'Shipped v0.41.1 (PR #1925). ggml_dtype_name table reordered to ggml.h (I32=26..BF16=30); exhaustive - test pinned. Advances CRUX-F inspect correctness.' + - 'Shipped v0.41.1 (PR #1925). ggml_dtype_name table reordered to ggml.h (I32=26..BF16=30); exhaustive test pinned. Advances CRUX-F inspect correctness.' phases: [] subtasks: [] estimated_effort: null @@ -10143,10 +9708,7 @@ roadmap: updated: 2026-06-11 06:00:06+00:00 spec: null acceptance_criteria: - - 'normalize_architecture (tensor_names_fallback.rs:73, tensor_names.rs:282) silently maps unknown arch->llama - and FALSIFY-TNAME-005 PINS that garbage-producing behavior; Gemma/Phi3/Falcon run the wrong forward - path. Make it return Result/Option + actionable error; INVERT the falsifier to assert clean refusal. - Autonomous + CPU-verifiable. Roadmap-aligned target #2.' + - 'normalize_architecture (tensor_names_fallback.rs:73, tensor_names.rs:282) silently maps unknown arch->llama and FALSIFY-TNAME-005 PINS that garbage-producing behavior; Gemma/Phi3/Falcon run the wrong forward path. Make it return Result/Option + actionable error; INVERT the falsifier to assert clean refusal. Autonomous + CPU-verifiable. Roadmap-aligned target #2.' phases: [] subtasks: [] estimated_effort: null @@ -10158,8 +9720,7 @@ roadmap: - id: PMAT-710 github_issue: null item_type: epic - title: 'Unsloth parity: compete with Unsloth on small-model LoRA/QLoRA fine-tune + distillation (pure - Rust)' + title: 'Unsloth parity: compete with Unsloth on small-model LoRA/QLoRA fine-tune + distillation (pure Rust)' status: planned priority: high assigned_to: null @@ -10167,11 +9728,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'STRATEGIC (user directive 2026-06-11): the PEFT/QLoRA fine-tune + distillation lane is an EXPLICIT - competitor target vs Unsloth. Parity = end-to-end load -> QLoRA(4-bit) -> train -> merge adapter -> - export GGUF/safetensors -> publish HF, in pure safe-Rust, CPU-or-single-GPU (lambda-vector). Unsloth - already a benchmark in-tree (score.rs TRAINING_TOK_S=6000 unsloth-level; ch23_training_bench). Children: - PMAT-711..715. Advances CRUX-D.' + - 'STRATEGIC (user directive 2026-06-11): the PEFT/QLoRA fine-tune + distillation lane is an EXPLICIT competitor target vs Unsloth. Parity = end-to-end load -> QLoRA(4-bit) -> train -> merge adapter -> export GGUF/safetensors -> publish HF, in pure safe-Rust, CPU-or-single-GPU (lambda-vector). Unsloth already a benchmark in-tree (score.rs TRAINING_TOK_S=6000 unsloth-level; ch23_training_bench). Children: PMAT-711..715. Advances CRUX-D.' phases: [] subtasks: [] estimated_effort: null @@ -10180,8 +9737,7 @@ roadmap: - unsloth - finetune - roadmap-aligned - notes: New competitive epic 2026-06-11. Corrects earlier "not an Unsloth replacement" framing — this - is the ONE training lane winnable in pure Rust. + notes: New competitive epic 2026-06-11. Corrects earlier "not an Unsloth replacement" framing — this is the ONE training lane winnable in pure Rust. - id: PMAT-711 github_issue: null item_type: task @@ -10193,9 +9749,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'Core Unsloth feature. qlora/qlora_default exist in aprender-train; wire the 4-bit NF4 base + LoRA - adapter path into apr finetune. Falsifier: loss-monotone over N steps on a tiny fixture; 4-bit base - footprint vs f16. CPU-falsifiable math + single-GPU run (lambda-vector).' + - 'Core Unsloth feature. qlora/qlora_default exist in aprender-train; wire the 4-bit NF4 base + LoRA adapter path into apr finetune. Falsifier: loss-monotone over N steps on a tiny fixture; 4-bit base footprint vs f16. CPU-falsifiable math + single-GPU run (lambda-vector).' phases: [] subtasks: [] estimated_effort: null @@ -10215,9 +9769,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'aprender-train/src/lora/adapter/merge_export.rs + hf_pipeline/export/exporter.rs exist (partial). - Complete: merge LoRA into base, export merged GGUF + safetensors. Falsifier: merged GGUF loads AND - forward matches the LoRA-applied base within tol (golden). Fully CPU-verifiable.' + - 'aprender-train/src/lora/adapter/merge_export.rs + hf_pipeline/export/exporter.rs exist (partial). Complete: merge LoRA into base, export merged GGUF + safetensors. Falsifier: merged GGUF loads AND forward matches the LoRA-applied base within tol (golden). Fully CPU-verifiable.' phases: [] subtasks: [] estimated_effort: null @@ -10229,8 +9781,7 @@ roadmap: - id: PMAT-713 github_issue: null item_type: task - title: End-to-end apr finetune Unsloth-parity single-command UX (load -> QLoRA -> train -> merge -> - export -> publish) + title: End-to-end apr finetune Unsloth-parity single-command UX (load -> QLoRA -> train -> merge -> export -> publish) status: planned priority: high assigned_to: null @@ -10238,10 +9789,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'The headline competitive story: one command from base model + dataset to a merged, exported, HF-published - fine-tuned model. apr finetune (commands/finetune.rs) exists; wire QLoRA + merge + export + apr publish. - Falsifier: e2e on a tiny fixture model produces a loadable merged artifact + the HF-commit dry-run - succeeds.' + - 'The headline competitive story: one command from base model + dataset to a merged, exported, HF-published fine-tuned model. apr finetune (commands/finetune.rs) exists; wire QLoRA + merge + export + apr publish. Falsifier: e2e on a tiny fixture model produces a loadable merged artifact + the HF-commit dry-run succeeds.' phases: [] subtasks: [] estimated_effort: null @@ -10261,9 +9809,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'Activation/gradient checkpointing to trade compute for memory, enabling larger context/batch on a - single GPU. Falsifier: identical loss with vs without checkpointing on a fixture (numerical equivalence) - + reduced peak activation memory.' + - 'Activation/gradient checkpointing to trade compute for memory, enabling larger context/batch on a single GPU. Falsifier: identical loss with vs without checkpointing on a fixture (numerical equivalence) + reduced peak activation memory.' phases: [] subtasks: [] estimated_effort: null @@ -10275,8 +9821,7 @@ roadmap: - id: PMAT-715 github_issue: null item_type: task - title: Adapter fusion (combine N LoRAs) + promote Unsloth to tracked training-throughput competitor - (>=6000 tok/s bar) + title: Adapter fusion (combine N LoRAs) + promote Unsloth to tracked training-throughput competitor (>=6000 tok/s bar) status: planned priority: medium assigned_to: null @@ -10284,10 +9829,7 @@ roadmap: updated: 2026-06-11 06:10:08+00:00 spec: null acceptance_criteria: - - 'CRUX-D adapter-fusion (missing): merge N LoRA adapters with weights. AND formalize Unsloth as a tracked - competitor in the training benchmark (aprender-test-lib/src/llm/score.rs + ch23_training_bench) with - the >=6000 tok/s (yoga-RTX) / >=13000 (A100) bar. Falsifier: fused adapter forward == weighted sum - of individual; bench reports the unsloth-relative ratio.' + - 'CRUX-D adapter-fusion (missing): merge N LoRA adapters with weights. AND formalize Unsloth as a tracked competitor in the training benchmark (aprender-test-lib/src/llm/score.rs + ch23_training_bench) with the >=6000 tok/s (yoga-RTX) / >=13000 (A100) bar. Falsifier: fused adapter forward == weighted sum of individual; bench reports the unsloth-relative ratio.' phases: [] subtasks: [] estimated_effort: null @@ -10299,8 +9841,7 @@ roadmap: - id: PMAT-716 github_issue: null item_type: epic - title: 'MISSION: one pure-Rust binary that REPLACES + BEATS sklearn + PyTorch + Unsloth + Ollama/llama.cpp - at what each does best' + title: 'MISSION: one pure-Rust binary that REPLACES + BEATS sklearn + PyTorch + Unsloth + Ollama/llama.cpp at what each does best' status: planned priority: critical assigned_to: null @@ -10308,12 +9849,7 @@ roadmap: updated: 2026-06-11 06:18:26+00:00 spec: null acceptance_criteria: - - 'North-star (user directive 2026-06-11). Whole ML lifecycle (classical -> DL -> fine-tune -> quantize - -> serve) in one safe-Rust binary, each stage beating the Python/C++ incumbent at its signature strength. - BEAT = a FALSIFIABLE benchmark (apr >= incumbent on its canonical task), not parity. Cross-cutting - differentiator: provable contract-gated correctness (none of the 4 have it). Pillars: PMAT-717 (sklearn), - PMAT-718 (PyTorch), PMAT-710 (Unsloth), PMAT-719 (Ollama/llama.cpp). Each pillar ships FALSIFY-BEAT-* - gates.' + - 'North-star (user directive 2026-06-11). Whole ML lifecycle (classical -> DL -> fine-tune -> quantize -> serve) in one safe-Rust binary, each stage beating the Python/C++ incumbent at its signature strength. BEAT = a FALSIFIABLE benchmark (apr >= incumbent on its canonical task), not parity. Cross-cutting differentiator: provable contract-gated correctness (none of the 4 have it). Pillars: PMAT-717 (sklearn), PMAT-718 (PyTorch), PMAT-710 (Unsloth), PMAT-719 (Ollama/llama.cpp). Each pillar ships FALSIFY-BEAT-* gates.' phases: [] subtasks: [] estimated_effort: null @@ -10321,13 +9857,11 @@ roadmap: - mission - four-pillars - beat - notes: See memory project_mission_four_pillars. Detailed beat-targets land from the four-pillar beat-analysis - (in flight). + notes: See memory project_mission_four_pillars. Detailed beat-targets land from the four-pillar beat-analysis (in flight). - id: PMAT-717 github_issue: null item_type: epic - title: 'Pillar 1: BEAT scikit-learn at classical ML (pure Rust) — fit/predict faster, same accuracy, - provably correct' + title: 'Pillar 1: BEAT scikit-learn at classical ML (pure Rust) — fit/predict faster, same accuracy, provably correct' status: planned priority: high assigned_to: null @@ -10335,11 +9869,7 @@ roadmap: updated: 2026-06-11 06:18:26+00:00 spec: null acceptance_criteria: - - 'aprender-core already has the TOP-10 classical-ML surface (Estimator/Transformer; LinearRegression/LogisticRegression/DecisionTree/RandomForest/GBM/NaiveBayes/KNN/SVM/KMeans/PCA - + model_selection + metrics). MOST-BUILT + MOST-WINNABLE pillar. Beat-benchmark FALSIFY-BEAT-SKLEARN: - fit+predict wall-clock <= sklearn AND accuracy within tol on standard datasets (iris/digits/california). - ROADMAP GAP: sklearn is NOT a tracked CRUX competitor — this pillar likely needs a new classical-ML - category. Mostly CPU-autonomous. Sub-targets from the beat-analysis.' + - 'aprender-core already has the TOP-10 classical-ML surface (Estimator/Transformer; LinearRegression/LogisticRegression/DecisionTree/RandomForest/GBM/NaiveBayes/KNN/SVM/KMeans/PCA + model_selection + metrics). MOST-BUILT + MOST-WINNABLE pillar. Beat-benchmark FALSIFY-BEAT-SKLEARN: fit+predict wall-clock <= sklearn AND accuracy within tol on standard datasets (iris/digits/california). ROADMAP GAP: sklearn is NOT a tracked CRUX competitor — this pillar likely needs a new classical-ML category. Mostly CPU-autonomous. Sub-targets from the beat-analysis.' phases: [] subtasks: [] estimated_effort: null @@ -10351,8 +9881,7 @@ roadmap: - id: PMAT-718 github_issue: null item_type: epic - title: 'Pillar 2: BEAT PyTorch at tensors + autograd + training (bounded task: train-to-loss faster - / less memory)' + title: 'Pillar 2: BEAT PyTorch at tensors + autograd + training (bounded task: train-to-loss faster / less memory)' status: planned priority: high assigned_to: null @@ -10360,11 +9889,7 @@ roadmap: updated: 2026-06-11 06:18:26+00:00 spec: null acceptance_criteria: - - 'HARDEST pillar (PyTorch moat = flexibility + ecosystem). Compute substrate = aprender-compute (trueno - SIMD/GPU) + aprender-train. Beat on the BOUNDED canonical task, not research flexibility: FALSIFY-BEAT-PYTORCH - = train a fixed small model to a target loss with apr <= time and/or <= peak memory. CPU-side pieces - (autograd correctness, op coverage, a CPU training benchmark) are loop-buildable; the perf run is - GPU (lambda-vector). Sub-targets from the beat-analysis.' + - 'HARDEST pillar (PyTorch moat = flexibility + ecosystem). Compute substrate = aprender-compute (trueno SIMD/GPU) + aprender-train. Beat on the BOUNDED canonical task, not research flexibility: FALSIFY-BEAT-PYTORCH = train a fixed small model to a target loss with apr <= time and/or <= peak memory. CPU-side pieces (autograd correctness, op coverage, a CPU training benchmark) are loop-buildable; the perf run is GPU (lambda-vector). Sub-targets from the beat-analysis.' phases: [] subtasks: [] estimated_effort: null @@ -10376,8 +9901,7 @@ roadmap: - id: PMAT-719 github_issue: null item_type: epic - title: 'Pillar 4: BEAT Ollama/llama.cpp at local quantized inference — 1.5x decode tok/s AND provable - output-correctness' + title: 'Pillar 4: BEAT Ollama/llama.cpp at local quantized inference — 1.5x decode tok/s AND provable output-correctness' status: planned priority: high assigned_to: null @@ -10385,11 +9909,7 @@ roadmap: updated: 2026-06-11 06:18:26+00:00 spec: null acceptance_criteria: - - 'Their best: fast GGUF decode + simple pull/run UX. aprender perf-path already 440 tok/s vs ollama - 307 on 1.5B Q4_K_M (~1.43x; 1.5x = 460 tok/s target). TWO beat-benchmarks: (a) FALSIFY-BEAT-OLLAMA-PERF - = decode tok/s >= ollama at fixed quant (target 1.5x); (b) FALSIFY-BEAT-OLLAMA-CORRECT = provable - output/dequant correctness (the CRUX-M verify wall / Q2_K-class) that ollama+llama.cpp LACK. CRUX-M-02 - (PMAT-671, active) is the correctness leg. Sub-targets from the beat-analysis.' + - 'Their best: fast GGUF decode + simple pull/run UX. aprender perf-path already 440 tok/s vs ollama 307 on 1.5B Q4_K_M (~1.43x; 1.5x = 460 tok/s target). TWO beat-benchmarks: (a) FALSIFY-BEAT-OLLAMA-PERF = decode tok/s >= ollama at fixed quant (target 1.5x); (b) FALSIFY-BEAT-OLLAMA-CORRECT = provable output/dequant correctness (the CRUX-M verify wall / Q2_K-class) that ollama+llama.cpp LACK. CRUX-M-02 (PMAT-671, active) is the correctness leg. Sub-targets from the beat-analysis.' phases: [] subtasks: [] estimated_effort: null @@ -10401,8 +9921,7 @@ roadmap: - id: PMAT-720 github_issue: null item_type: task - title: Add aprender::datasets module (load_iris, load_digits, load_california_housing via include_str! - + make_classification/make_blobs/make_regression/make… + title: Add aprender::datasets module (load_iris, load_digits, load_california_housing via include_str! + make_classification/make_blobs/make_regression/make… status: planned priority: critical assigned_to: null @@ -10410,8 +9929,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: datasets::load_digits() returns (1797,64) Matrix + 1797 labels in {0..9}; - load_iris() returns (150,4)+3 classes; checksums/shapes asserted in unit tests.' + - 'Parent PMAT-717. Falsifier: datasets::load_digits() returns (1797,64) Matrix + 1797 labels in {0..9}; load_iris() returns (150,4)+3 classes; checksums/shapes asserted in unit tests.' phases: [] subtasks: [] estimated_effort: null @@ -10423,8 +9941,7 @@ roadmap: - id: PMAT-721 github_issue: null item_type: task - title: 'Falsify the LogisticRegression train_acc=0.505 observation: contract-gated test that LogReg - reaches >=0.95 train-acc on a margin-separable 2-class se…' + title: 'Falsify the LogisticRegression train_acc=0.505 observation: contract-gated test that LogReg reaches >=0.95 train-acc on a margin-separable 2-class se…' status: planned priority: critical assigned_to: null @@ -10432,9 +9949,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: LogisticRegression on margin-separable synthetic reaches train_acc >= - 0.95 within 200 iters; currently observed 0.505 on overlapping data — confirm separable case passes - or fix converges.' + - 'Parent PMAT-717. Falsifier: LogisticRegression on margin-separable synthetic reaches train_acc >= 0.95 within 200 iters; currently observed 0.505 on overlapping data — confirm separable case passes or fix converges.' phases: [] subtasks: [] estimated_effort: null @@ -10446,8 +9961,7 @@ roadmap: - id: PMAT-722 github_issue: null item_type: task - title: Commit the head-to-head sklearn-beat bench harness (apr vs sklearn) on digits classification - + california regression, CSV/JSON out, CI-failing if apr… + title: Commit the head-to-head sklearn-beat bench harness (apr vs sklearn) on digits classification + california regression, CSV/JSON out, CI-failing if apr… status: planned priority: critical assigned_to: null @@ -10455,8 +9969,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: apr RandomForestClassifier test_acc >= 0.96 on digits AND apr_walltime_ms - <= sklearn_walltime_ms; RandomForestRegressor R2 >= 0.78 on california. Fails CI otherwise.' + - 'Parent PMAT-717. Falsifier: apr RandomForestClassifier test_acc >= 0.96 on digits AND apr_walltime_ms <= sklearn_walltime_ms; RandomForestRegressor R2 >= 0.78 on california. Fails CI otherwise.' phases: [] subtasks: [] estimated_effort: null @@ -10468,8 +9981,7 @@ roadmap: - id: PMAT-723 github_issue: null item_type: task - title: 'Ship `apr qa --falsify` adversarial-corpus mode: bundle N>=5 deliberately-broken GGUF/APR artifacts - (corrupt quant block, NaN weights, transposed lm_…' + title: 'Ship `apr qa --falsify` adversarial-corpus mode: bundle N>=5 deliberately-broken GGUF/APR artifacts (corrupt quant block, NaN weights, transposed lm_…' status: planned priority: high assigned_to: null @@ -10477,9 +9989,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-719. Falsifier: On the 5-artifact corpus `apr qa --json` flags >=1 gate / exits - non-zero on 5/5; llama-cli/ollama exit 0 with garbage on 5/5. Differentiator FALSIFIED if apr false-passes - any OR an incumbent catches one.' + - 'Parent PMAT-719. Falsifier: On the 5-artifact corpus `apr qa --json` flags >=1 gate / exits non-zero on 5/5; llama-cli/ollama exit 0 with garbage on 5/5. Differentiator FALSIFIED if apr false-passes any OR an incumbent catches one.' phases: [] subtasks: [] estimated_effort: null @@ -10491,8 +10001,7 @@ roadmap: - id: PMAT-724 github_issue: null item_type: task - title: Add finite-difference gradient-correctness gate to core autograd as a proptest (perturb eps=1e-5, - assert max|analytic-numeric|<1e-3 over matmul/relu/… + title: Add finite-difference gradient-correctness gate to core autograd as a proptest (perturb eps=1e-5, assert max|analytic-numeric|<1e-3 over matmul/relu/… status: planned priority: high assigned_to: null @@ -10500,8 +10009,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-718. Falsifier: Any op whose analytic gradient deviates from numeric by >1e-3 fails the - gate; passing gate is the machine-checked correctness claim on the training benchmark.' + - 'Parent PMAT-718. Falsifier: Any op whose analytic gradient deviates from numeric by >1e-3 fails the gate; passing gate is the machine-checked correctness claim on the training benchmark.' phases: [] subtasks: [] estimated_effort: null @@ -10513,8 +10021,7 @@ roadmap: - id: PMAT-725 github_issue: null item_type: task - title: 'Build the CPU training-time beat-benchmark harness: fixed 2-layer MLP + fixed N=1024 synthetic - regression, single-thread CPU, measure wall-clock-to-t…' + title: 'Build the CPU training-time beat-benchmark harness: fixed 2-layer MLP + fixed N=1024 synthetic regression, single-thread CPU, measure wall-clock-to-t…' status: planned priority: high assigned_to: null @@ -10522,8 +10029,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-718. Falsifier: apr reaches MSE<=0.05 on the fixed dataset within the fixed step budget - single-thread CPU; if it cannot converge the beat-claim is dead on arrival.' + - 'Parent PMAT-718. Falsifier: apr reaches MSE<=0.05 on the fixed dataset within the fixed step budget single-thread CPU; if it cannot converge the beat-claim is dead on arrival.' phases: [] subtasks: [] estimated_effort: null @@ -10535,8 +10041,7 @@ roadmap: - id: PMAT-726 github_issue: null item_type: task - title: 'PMAT-711: wire QLoRALayer (4-bit NF4 base) into the InstructPipeline CPU train loop (currently - Vec f32 base, mod.rs:176); reuse the EXISTI…' + title: 'PMAT-711: wire QLoRALayer (4-bit NF4 base) into the InstructPipeline CPU train loop (currently Vec f32 base, mod.rs:176); reuse the EXISTI…' status: planned priority: high assigned_to: null @@ -10544,9 +10049,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-710. Falsifier: Qwen2-0.5B q_proj block: NF4 round-trip mean-abs-error <= 1e-3 vs bitsandbytes - per 64-block; QLoRALayer 4-bit footprint <= 0.30x f16; loss monotone-decreasing over 20 CPU steps - on 16-sample fixture; cargo test -p aprender-train --lib lora:…' + - 'Parent PMAT-710. Falsifier: Qwen2-0.5B q_proj block: NF4 round-trip mean-abs-error <= 1e-3 vs bitsandbytes per 64-block; QLoRALayer 4-bit footprint <= 0.30x f16; loss monotone-decreasing over 20 CPU steps on 16-sample fixture; cargo test -p aprender-train --lib lora:…' phases: [] subtasks: [] estimated_effort: null @@ -10558,8 +10061,7 @@ roadmap: - id: PMAT-727 github_issue: null item_type: task - title: 'PMAT-712: merge->GGUF as a contract-gated golden test — extend run_merge to optionally emit - GGUF, add #[contract] obligation that merged-GGUF forward…' + title: 'PMAT-712: merge->GGUF as a contract-gated golden test — extend run_merge to optionally emit GGUF, add #[contract] obligation that merged-GGUF forward…' status: planned priority: high assigned_to: null @@ -10567,9 +10069,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-710. Falsifier: Load merged GGUF in realizar, forward on 8 fixed inputs; max abs diff - vs in-memory base+scale*B@A < 1e-2; pv validate the new merge-export contract; fails if any tensor - diverges.' + - 'Parent PMAT-710. Falsifier: Load merged GGUF in realizar, forward on 8 fixed inputs; max abs diff vs in-memory base+scale*B@A < 1e-2; pv validate the new merge-export contract; fails if any tensor diverges.' phases: [] subtasks: [] estimated_effort: null @@ -10581,8 +10081,7 @@ roadmap: - id: PMAT-728 github_issue: null item_type: task - title: Run pinned PyTorch-CPU baseline (single OMP thread) on the IDENTICAL fixed MLP task; record wall-clock-to-target-loss - + peak RSS via /usr/bin/time -v… + title: Run pinned PyTorch-CPU baseline (single OMP thread) on the IDENTICAL fixed MLP task; record wall-clock-to-target-loss + peak RSS via /usr/bin/time -v… status: planned priority: high assigned_to: null @@ -10590,8 +10089,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-718. Falsifier: If apr wall-clock > PyTorch-CPU OR apr peak-RSS > PyTorch peak-RSS, the - beat is FALSIFIED and reported as such — no vibes.' + - 'Parent PMAT-718. Falsifier: If apr wall-clock > PyTorch-CPU OR apr peak-RSS > PyTorch peak-RSS, the beat is FALSIFIED and reported as such — no vibes.' phases: [] subtasks: [] estimated_effort: null @@ -10603,8 +10101,7 @@ roadmap: - id: PMAT-729 github_issue: null item_type: task - title: Unify classifier API onto Estimator (or add a Classifier trait with y:&[usize]) so cross_validate/grid_search - work generically over LogReg/RF/GBM/SVM… + title: Unify classifier API onto Estimator (or add a Classifier trait with y:&[usize]) so cross_validate/grid_search work generically over LogReg/RF/GBM/SVM… status: planned priority: medium assigned_to: null @@ -10612,8 +10109,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: cross_validate::(...) compiles and returns 5-fold - CV accuracy on digits matching a manual KFold loop within 1e-4.' + - 'Parent PMAT-717. Falsifier: cross_validate::(...) compiles and returns 5-fold CV accuracy on digits matching a manual KFold loop within 1e-4.' phases: [] subtasks: [] estimated_effort: null @@ -10625,8 +10121,7 @@ roadmap: - id: PMAT-730 github_issue: null item_type: task - title: Add missing metrics roc_auc_score, log_loss, roc_curve, precision_recall_curve (VERIFIED ABSENT - everywhere) + GradientBoostingRegressor to complete t… + title: Add missing metrics roc_auc_score, log_loss, roc_curve, precision_recall_curve (VERIFIED ABSENT everywhere) + GradientBoostingRegressor to complete t… status: completed priority: medium assigned_to: null @@ -10634,8 +10129,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: roc_auc_score on a known scored set matches sklearn within 1e-4; GradientBoostingRegressor - R2 on california >= 0.80.' + - 'Parent PMAT-717. Falsifier: roc_auc_score on a known scored set matches sklearn within 1e-4; GradientBoostingRegressor R2 on california >= 0.80.' phases: [] subtasks: [] estimated_effort: null @@ -10647,8 +10141,7 @@ roadmap: - id: PMAT-731 github_issue: null item_type: task - title: 'PMAT-713: one-command `apr finetune --qlora --bits 4 --export gguf -o out.gguf` doing load->NF4-QLoRA->CPU-train->merge->export - on a tiny fixture (no…' + title: 'PMAT-713: one-command `apr finetune --qlora --bits 4 --export gguf -o out.gguf` doing load->NF4-QLoRA->CPU-train->merge->export on a tiny fixture (no…' status: planned priority: medium assigned_to: null @@ -10656,8 +10149,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-710. Falsifier: Single CLI call on 2-layer fixture .apr + 16-line JSONL produces a loadable - merged GGUF; apr qa out.gguf passes; final_loss < initial_loss; e2e integration test in apr-cli.' + - 'Parent PMAT-710. Falsifier: Single CLI call on 2-layer fixture .apr + 16-line JSONL produces a loadable merged GGUF; apr qa out.gguf passes; final_loss < initial_loss; e2e integration test in apr-cli.' phases: [] subtasks: [] estimated_effort: null @@ -10669,8 +10161,7 @@ roadmap: - id: PMAT-732 github_issue: null item_type: task - title: 'Wire apr-qa-differential-v1 ollama_parity into a real harness: `apr qa --differential --reference - llama.cpp` reporting top-1 agreement >=95% + ppl-ga…' + title: 'Wire apr-qa-differential-v1 ollama_parity into a real harness: `apr qa --differential --reference llama.cpp` reporting top-1 agreement >=95% + ppl-ga…' status: planned priority: medium assigned_to: null @@ -10678,9 +10169,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-719. Falsifier: `apr qa model.apr --differential` reports top1-agreement + ppl-gap vs - llama.cpp on identical prompts, reproducible across 3 runs (CV<5%); falsified if agreement<95% (apr - decode wrong) or harness needs GPU.' + - 'Parent PMAT-719. Falsifier: `apr qa model.apr --differential` reports top1-agreement + ppl-gap vs llama.cpp on identical prompts, reproducible across 3 runs (CV<5%); falsified if agreement<95% (apr decode wrong) or harness needs GPU.' phases: [] subtasks: [] estimated_effort: null @@ -10692,8 +10181,7 @@ roadmap: - id: PMAT-733 github_issue: null item_type: task - title: 'Add preprocessing encoders + sklearn-style Pipeline: OneHotEncoder, LabelEncoder, OrdinalEncoder, - PolynomialFeatures, SimpleImputer, Normalizer + Pip…' + title: 'Add preprocessing encoders + sklearn-style Pipeline: OneHotEncoder, LabelEncoder, OrdinalEncoder, PolynomialFeatures, SimpleImputer, Normalizer + Pip…' status: completed priority: medium assigned_to: null @@ -10701,8 +10189,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: Pipeline::new([StandardScaler, PCA(10)], LogisticRegression).fit(digits).score() - >= 0.92; OneHotEncoder on a 3-category column yields a 3-col one-hot matrix asserted element-wise.' + - 'Parent PMAT-717. Falsifier: Pipeline::new([StandardScaler, PCA(10)], LogisticRegression).fit(digits).score() >= 0.92; OneHotEncoder on a 3-category column yields a 3-col one-hot matrix asserted element-wise.' phases: [] subtasks: [] estimated_effort: null @@ -10714,8 +10201,7 @@ roadmap: - id: PMAT-734 github_issue: null item_type: task - title: 'PMAT-715: promote Unsloth from static const (score.rs:777) to a tracked competitor ROW in compute_training_step_scorecard - reporting apr/unsloth tok/s…' + title: 'PMAT-715: promote Unsloth from static const (score.rs:777) to a tracked competitor ROW in compute_training_step_scorecard reporting apr/unsloth tok/s…' status: planned priority: low assigned_to: null @@ -10723,8 +10209,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-710. Falsifier: Fused-adapter forward == sum_i w_i*(scale_i*B_i@A_i@x) within 1e-5 (CPU); - scorecard JSON emits unsloth row + ratio (honest concession that ratio <1.0 on throughput).' + - 'Parent PMAT-710. Falsifier: Fused-adapter forward == sum_i w_i*(scale_i*B_i@A_i@x) within 1e-5 (CPU); scorecard JSON emits unsloth row + ratio (honest concession that ratio <1.0 on throughput).' phases: [] subtasks: [] estimated_effort: null @@ -10736,8 +10221,7 @@ roadmap: - id: PMAT-735 github_issue: null item_type: task - title: Add non-linear SVM (RBF/poly kernel SVC) — sklearn SVC's signature strength; current LinearSVM - cannot separate non-linear data. VERIFIED ABSENT (no … + title: Add non-linear SVM (RBF/poly kernel SVC) — sklearn SVC's signature strength; current LinearSVM cannot separate non-linear data. VERIFIED ABSENT (no … status: completed priority: low assigned_to: null @@ -10745,8 +10229,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-717. Falsifier: RBF-SVC on make_circles (non-linearly-separable) test_acc >= 0.95 where - LinearSVM scores ~0.50.' + - 'Parent PMAT-717. Falsifier: RBF-SVC on make_circles (non-linearly-separable) test_acc >= 0.95 where LinearSVM scores ~0.50.' phases: [] subtasks: [] estimated_effort: null @@ -10758,8 +10241,7 @@ roadmap: - id: PMAT-736 github_issue: null item_type: task - title: Publish a curated `apr registry` short-name catalog (`apr run qwen2.5-coder-1.5b` no URL) with - each entry carrying its `apr qa` verdict as a trust ba… + title: Publish a curated `apr registry` short-name catalog (`apr run qwen2.5-coder-1.5b` no URL) with each entry carrying its `apr qa` verdict as a trust ba… status: planned priority: low assigned_to: null @@ -10767,9 +10249,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-719. Falsifier: `apr run qwen2.5-coder-1.5b` (bare short name, cold cache) downloads+runs+emits - coherent output AND `apr list` shows each entry''s qa-gate verdict; falsified if a short name doesn''t - resolve or catalog has no per-model correctness badge.' + - 'Parent PMAT-719. Falsifier: `apr run qwen2.5-coder-1.5b` (bare short name, cold cache) downloads+runs+emits coherent output AND `apr list` shows each entry''s qa-gate verdict; falsified if a short name doesn''t resolve or catalog has no per-model correctness badge.' phases: [] subtasks: [] estimated_effort: null @@ -10781,8 +10261,7 @@ roadmap: - id: PMAT-737 github_issue: null item_type: task - title: '[GPU-GATED — flag] CPU Q4_K decode parity: implement ggml-style pre-interleaved Q4_K weight - layout at APR import (documented root cause, five-whys-16…' + title: '[GPU-GATED — flag] CPU Q4_K decode parity: implement ggml-style pre-interleaved Q4_K weight layout at APR import (documented root cause, five-whys-16…' status: completed priority: low assigned_to: null @@ -10790,9 +10269,7 @@ roadmap: updated: 2026-07-05 10:43:56.195384+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-719. Falsifier: `apr bench model.apr --device cpu` 5-iter median >= `llama-cli -n 128 - -t ` on SAME host, 1.5B Q4_K_M. Currently 9.9 vs 81 = 8.2x slower; clearing it is parity, - not superiority.' + - 'Parent PMAT-719. Falsifier: `apr bench model.apr --device cpu` 5-iter median >= `llama-cli -n 128 -t ` on SAME host, 1.5B Q4_K_M. Currently 9.9 vs 81 = 8.2x slower; clearing it is parity, not superiority.' phases: [] subtasks: [] estimated_effort: null @@ -10804,8 +10281,7 @@ roadmap: - id: PMAT-738 github_issue: null item_type: task - title: '[GPU-GATED — NOT loop-buildable] Single-GPU QLoRA throughput run on lambda-vector to populate - apr-vs-unsloth tok/s bar (6715.7/13659.7) — measurement…' + title: '[GPU-GATED — NOT loop-buildable] Single-GPU QLoRA throughput run on lambda-vector to populate apr-vs-unsloth tok/s bar (6715.7/13659.7) — measurement…' status: planned priority: low assigned_to: null @@ -10813,9 +10289,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - 'Parent PMAT-710. Falsifier: apr finetune --qlora --gpu-backend cuda reports tok/s + peak VRAM into - scorecard; expectation apr --json` 5-run median 128-tok decode >= 460.7 tok/s - (1.5x Ollama) vs current flat ~396; requires RTX-4090-class GPU.' + - 'Parent PMAT-719. Falsifier: `apr qa <1.5B-q4km> --json` 5-run median 128-tok decode >= 460.7 tok/s (1.5x Ollama) vs current flat ~396; requires RTX-4090-class GPU.' phases: [] subtasks: [] estimated_effort: null @@ -10857,9 +10329,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - sklearn is NOT in the CRUX competitor set (Ollama/llama.cpp/PyTorch/HF/vLLM/OpenCLAW). Add a CRUX-S - classical-ML story class so datasets/encoders/RBF-SVM/roc_auc/Pipeline gaps are tracked. Unblocks - Pillar 1 (PMAT-717). + - sklearn is NOT in the CRUX competitor set (Ollama/llama.cpp/PyTorch/HF/vLLM/OpenCLAW). Add a CRUX-S classical-ML story class so datasets/encoders/RBF-SVM/roc_auc/Pipeline gaps are tracked. Unblocks Pillar 1 (PMAT-717). phases: [] subtasks: [] estimated_effort: null @@ -10870,8 +10340,7 @@ roadmap: - id: PMAT-741 github_issue: null item_type: task - title: 'ROADMAP GAP: add a beat-benchmark contract kind (committed head-to-head, CI-failing, baseline - pinned)' + title: 'ROADMAP GAP: add a beat-benchmark contract kind (committed head-to-head, CI-failing, baseline pinned)' status: planned priority: high assigned_to: null @@ -10879,9 +10348,7 @@ roadmap: updated: 2026-06-11 06:26:41+00:00 spec: null acceptance_criteria: - - No contract schema for FALSIFY-BEAT-* (apr >= incumbent on canonical task, fails CI on regression, - incumbent baseline committed). Add the kind so every pillar beat-claim is a machine-checked artifact. - Core mission infra. + - No contract schema for FALSIFY-BEAT-* (apr >= incumbent on canonical task, fails CI on regression, incumbent baseline committed). Add the kind so every pillar beat-claim is a machine-checked artifact. Core mission infra. phases: [] subtasks: [] estimated_effort: null @@ -10893,8 +10360,7 @@ roadmap: - id: PMAT-742 github_issue: 2851 item_type: task - title: 'PP-LLAMA-001 v3.1: land #2851 and cut 0.65.0 under the spec (batch fixes, #2849, publish - gate, dogfood GO, receipt)' + title: 'PP-LLAMA-001 v3.1: land #2851 and cut 0.65.0 under the spec (batch fixes, #2849, publish gate, dogfood GO, receipt)' status: inprogress priority: high assigned_to: null @@ -10903,30 +10369,34 @@ roadmap: spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - '#2851 merged green on ci / gate + workspace-test; release batch merged; #2849 merged' - - 'v0.65.0 tagged and released with the parity guide attached; crates.io cascade drained; post-publish - verification via the crates.io API' - - 'docs/audits/impl-PMAT-742-receipt.md written; transcript-gate PASS' - notes: 'paiml-implement run; jidoka entries in .pmat/jidoka.jsonl' + - v0.65.0 tagged and released with the parity guide attached; crates.io cascade drained; post-publish verification via the crates.io API + - docs/audits/impl-PMAT-742-receipt.md written; transcript-gate PASS + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: paiml-implement run; jidoka entries in .pmat/jidoka.jsonl - id: PMAT-743 github_issue: 2851 item_type: bug - title: 'PMAT-742 jidoka: contract corpus integrity ratchet rose 444->445 on #2851 (pp-llama-001-spec-conformance-v1 - test id 007A)' - status: done + title: 'PMAT-742 jidoka: contract corpus integrity ratchet rose 444->445 on #2851 (pp-llama-001-spec-conformance-v1 test id 007A)' + status: completed priority: high assigned_to: null created: 2026-09-02 17:05:00+00:00 updated: 2026-09-02 17:20:00+00:00 spec: null acceptance_criteria: - - 'cargo test -p aprender-contracts --test validate_contracts green (integrity 444); ids 001..008 contiguous - and unique (653f277d6)' - notes: 'five-whys in .pmat/jidoka.jsonl; proof:PR#2851 (653f277d6 renumbered the ids; the corpus-integrity test is green on main)' + - cargo test -p aprender-contracts --test validate_contracts green (integrity 444); ids 001..008 contiguous and unique (653f277d6) + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: five-whys in .pmat/jidoka.jsonl; proof:PR#2851 (653f277d6 renumbered the ids; the corpus-integrity test is green on main) - id: PMAT-744 github_issue: null item_type: bug - title: 'perf_gate.sh --phase release cannot PASS while the reference cell is UNMEASURED: ArmC-sig and ArmD - fail the pre-v3 lambda receipt that the matrix already marks SPENT' + title: 'perf_gate.sh --phase release cannot PASS while the reference cell is UNMEASURED: ArmC-sig and ArmD fail the pre-v3 lambda receipt that the matrix already marks SPENT' status: inprogress priority: high assigned_to: null @@ -10934,16 +10404,17 @@ roadmap: updated: 2026-09-03 04:50:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'perf_gate.sh --host lambda --phase release --workload W1 --receipt evidence/perf-gate-001-w1-lambda/receipt.r1.json - --commit
is VERDICT PASS with ArmC-sig and ArmD as REPORT lines naming the UNMEASURED cell' - - 'four --selftest rows, both polarities; each condition of historical_for_unmeasured has a row that goes RED - without it; FALSIFY-PP-LLAMA-001-PERF-GATE-011; spec §6 names the cases' - notes: 'PMAT-742 jidoka entry 10; first run of the release phase (0.65.0 cut)' + - perf_gate.sh --host lambda --phase release --workload W1 --receipt evidence/perf-gate-001-w1-lambda/receipt.r1.json --commit
is VERDICT PASS with ArmC-sig and ArmD as REPORT lines naming the UNMEASURED cell + - four --selftest rows, both polarities; each condition of historical_for_unmeasured has a row that goes RED without it; FALSIFY-PP-LLAMA-001-PERF-GATE-011; spec §6 names the cases + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: PMAT-742 jidoka entry 10; first run of the release phase (0.65.0 cut) - id: PMAT-745 github_issue: null item_type: bug - title: 'F-9: the crates.io cascade ran cargo publish --allow-dirty with no precondition; publishing must go only - through a preflight gate (clean tree, version from cargo metadata, tag at HEAD, HEAD on main, dogfood GO)' + title: 'F-9: the crates.io cascade ran cargo publish --allow-dirty with no precondition; publishing must go only through a preflight gate (clean tree, version from cargo metadata, tag at HEAD, HEAD on main, dogfood GO)' status: inprogress priority: high assigned_to: null @@ -10951,15 +10422,12 @@ roadmap: updated: 2026-09-03 07:20:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'scripts/check_publish_preflight.sh --selftest 16/16, both polarities of R1-R5; five must-fire mutations RED - (R1 dropped, GO check dropped, deferral whitelist shrunk, phase check dropped, grep -F removed); cascade-publish.sh - refuses on a non-zero gate, carries no dirty-tree override, and keeps its config backup outside the tree; - scripts/dogfood.sh --phase pre-publish records the two registry-bound rows as DEFER with their obligation, so R5 - is satisfiable before a cascade; ci.yml runs the case table; FALSIFY-PUB-CLI contract entry' - notes: 'PMAT-742 release rule F-9 (operator); a GitHub publish workflow is owed separately: no CARGO_REGISTRY_TOKEN - secret exists for the fleet, only PR_REVIEW_SIGNING_KEY_B64. Measured 2026-09-03: the full dogfood is NO-GO before - its own cascade by construction (publish-dry-run of a workspace root, cargo install of the unpublished version on - four hosts), which made the first R5 unsatisfiable; the pre-publish phase is the recorded, whitelisted answer' + - scripts/check_publish_preflight.sh --selftest 16/16, both polarities of R1-R5; five must-fire mutations RED (R1 dropped, GO check dropped, deferral whitelist shrunk, phase check dropped, grep -F removed); cascade-publish.sh refuses on a non-zero gate, carries no dirty-tree override, and keeps its config backup outside the tree; scripts/dogfood.sh --phase pre-publish records the two registry-bound rows as DEFER with their obligation, so R5 is satisfiable before a cascade; ci.yml runs the case table; FALSIFY-PUB-CLI contract entry + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'PMAT-742 release rule F-9 (operator); a GitHub publish workflow is owed separately: no CARGO_REGISTRY_TOKEN secret exists for the fleet, only PR_REVIEW_SIGNING_KEY_B64. Measured 2026-09-03: the full dogfood is NO-GO before its own cascade by construction (publish-dry-run of a workspace root, cargo install of the unpublished version on four hosts), which made the first R5 unsatisfiable; the pre-publish phase is the recorded, whitelisted answer' - id: PMAT-750 github_issue: null item_type: task @@ -10971,7 +10439,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/apr-cli/src/commands/finetune.rs:492 is resolved and the comment removed' + - the deferral at crates/apr-cli/src/commands/finetune.rs:492 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-751 github_issue: null @@ -10984,7 +10456,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-compute/src/backends/gpu/device/linalg/wgsl_forward.rs:774 is resolved and the comment removed' + - the deferral at crates/aprender-compute/src/backends/gpu/device/linalg/wgsl_forward.rs:774 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PILLAR1-001 github_issue: null @@ -10997,8 +10473,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: cross_val_score(LinearRegression, X, y, cv=5) returns a Vec of 5 scores matching - cross_validate().scores within 1e-5' + - 'Falsifier: cross_val_score(LinearRegression, X, y, cv=5) returns a Vec of 5 scores matching cross_validate().scores within 1e-5' phases: [] subtasks: [] estimated_effort: S @@ -11019,8 +10494,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr KNeighborsRegressor.fit/predict match sklearn.neighbors.KNeighborsRegressor within - 1e-5 MSE on iris/boston test sets' + - 'Falsifier: apr KNeighborsRegressor.fit/predict match sklearn.neighbors.KNeighborsRegressor within 1e-5 MSE on iris/boston test sets' phases: [] subtasks: [] estimated_effort: S @@ -11041,9 +10515,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for GaussianNB (fit(&Matrix,&Vector), predict()->Vector, - score()->accuracy); cross_validate::(...) compiles and matches direct-call predictions - on iris' + - 'Falsifier: impl Estimator for GaussianNB (fit(&Matrix,&Vector), predict()->Vector, score()->accuracy); cross_validate::(...) compiles and matches direct-call predictions on iris' phases: [] subtasks: [] estimated_effort: S @@ -11064,8 +10536,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for KNearestNeighbors (fit(&Matrix,&Vector) not &[usize]); cross_validate::(...) - compiles and runs on iris' + - 'Falsifier: impl Estimator for KNearestNeighbors (fit(&Matrix,&Vector) not &[usize]); cross_validate::(...) compiles and runs on iris' phases: [] subtasks: [] estimated_effort: S @@ -11086,8 +10557,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for LogisticRegression with &Vector signatures; cross_validate/grid_search - on iris binary classification compiles and yields >0.95 accuracy matching sklearn' + - 'Falsifier: impl Estimator for LogisticRegression with &Vector signatures; cross_validate/grid_search on iris binary classification compiles and yields >0.95 accuracy matching sklearn' phases: [] subtasks: [] estimated_effort: S @@ -11108,8 +10578,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for DecisionTreeClassifier; cross_validate::(...) - compiles and runs on iris with accuracy parity to sklearn.tree.DecisionTreeClassifier' + - 'Falsifier: impl Estimator for DecisionTreeClassifier; cross_validate::(...) compiles and runs on iris with accuracy parity to sklearn.tree.DecisionTreeClassifier' phases: [] subtasks: [] estimated_effort: S @@ -11130,8 +10599,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for DecisionTreeRegressor; cross_validate::(...) - compiles and runs, R² within 1e-3 of sklearn on california_housing' + - 'Falsifier: impl Estimator for DecisionTreeRegressor; cross_validate::(...) compiles and runs, R² within 1e-3 of sklearn on california_housing' phases: [] subtasks: [] estimated_effort: S @@ -11152,8 +10620,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for RandomForestRegressor (like RFC); cross_validate compiles, R² within - 1e-3 of sklearn on wine dataset' + - 'Falsifier: impl Estimator for RandomForestRegressor (like RFC); cross_validate compiles, R² within 1e-3 of sklearn on wine dataset' phases: [] subtasks: [] estimated_effort: S @@ -11174,8 +10641,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for GradientBoostingClassifier; cross_validate::(...) - compiles, accuracy parity on iris 3-class' + - 'Falsifier: impl Estimator for GradientBoostingClassifier; cross_validate::(...) compiles, accuracy parity on iris 3-class' phases: [] subtasks: [] estimated_effort: S @@ -11196,8 +10662,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Estimator for LinearSVM; cross_validate(LinearSVM, X, y, kfold) runs without error - and score() matches np.mean(pred==y)' + - 'Falsifier: impl Estimator for LinearSVM; cross_validate(LinearSVM, X, y, kfold) runs without error and score() matches np.mean(pred==y)' phases: [] subtasks: [] estimated_effort: S @@ -11239,8 +10704,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr DecisionTreeClassifier.predict_proba() sums to 1.0 and matches sklearn leaf class - proportions on iris within 1e-5' + - 'Falsifier: apr DecisionTreeClassifier.predict_proba() sums to 1.0 and matches sklearn leaf class proportions on iris within 1e-5' phases: [] subtasks: [] estimated_effort: S @@ -11261,8 +10725,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr DecisionTreeClassifier.with_min_samples_split(N) matches sklearn output (splits/leaves) - on iris dataset' + - 'Falsifier: apr DecisionTreeClassifier.with_min_samples_split(N) matches sklearn output (splits/leaves) on iris dataset' phases: [] subtasks: [] estimated_effort: S @@ -11283,8 +10746,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr DecisionTreeClassifier.with_min_samples_leaf(N) prevents overfitting on synthetic - 10-sample dataset matching sklearn' + - 'Falsifier: apr DecisionTreeClassifier.with_min_samples_leaf(N) prevents overfitting on synthetic 10-sample dataset matching sklearn' phases: [] subtasks: [] estimated_effort: S @@ -11305,8 +10767,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: PCA.explained_variance() and explained_variance_ratio() publicly accessible and match - sklearn within 1e-4 across multiple test datasets' + - 'Falsifier: PCA.explained_variance() and explained_variance_ratio() publicly accessible and match sklearn within 1e-4 across multiple test datasets' phases: [] subtasks: [] estimated_effort: S @@ -11327,8 +10788,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl Transformer for ICA in decomposition/ica.rs; enables use in generic cross_validate/grid_search - pipelines' + - 'Falsifier: impl Transformer for ICA in decomposition/ica.rs; enables use in generic cross_validate/grid_search pipelines' phases: [] subtasks: [] estimated_effort: S @@ -11349,8 +10809,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl UnsupervisedEstimator (Labels=Vec) for LocalOutlierFactor; cross_validate_unsupervised - accepts it' + - 'Falsifier: impl UnsupervisedEstimator (Labels=Vec) for LocalOutlierFactor; cross_validate_unsupervised accepts it' phases: [] subtasks: [] estimated_effort: S @@ -11371,8 +10830,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: impl UnsupervisedEstimator (Labels=Vec) for IsolationForest; cross_validate_unsupervised - accepts it' + - 'Falsifier: impl UnsupervisedEstimator (Labels=Vec) for IsolationForest; cross_validate_unsupervised accepts it' phases: [] subtasks: [] estimated_effort: S @@ -11393,8 +10851,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr MaxAbsScaler.fit_transform(data) output matches sklearn.preprocessing.MaxAbsScaler - within 1e-5 on random test matrix' + - 'Falsifier: apr MaxAbsScaler.fit_transform(data) output matches sklearn.preprocessing.MaxAbsScaler within 1e-5 on random test matrix' phases: [] subtasks: [] estimated_effort: S @@ -11415,8 +10872,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr Normalizer(norm=l2).fit_transform output matches sklearn.preprocessing.Normalizer - within 1e-5' + - 'Falsifier: apr Normalizer(norm=l2).fit_transform output matches sklearn.preprocessing.Normalizer within 1e-5' phases: [] subtasks: [] estimated_effort: S @@ -11542,8 +10998,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: match sklearn.metrics.explained_variance_score(y_true, y_pred) within 1e-4 (lift from - PCA module into metrics)' + - 'Falsifier: match sklearn.metrics.explained_variance_score(y_true, y_pred) within 1e-4 (lift from PCA module into metrics)' phases: [] subtasks: [] estimated_effort: S @@ -11606,8 +11061,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: match sklearn.metrics.mean_squared_log_error within 1e-4 on positive-valued regression - oracle' + - 'Falsifier: match sklearn.metrics.mean_squared_log_error within 1e-4 on positive-valued regression oracle' phases: [] subtasks: [] estimated_effort: S @@ -11649,8 +11103,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr davies_bouldin_score(X, labels) within 1e-3 of sklearn.metrics.davies_bouldin_score - on pinned iris dataset' + - 'Falsifier: apr davies_bouldin_score(X, labels) within 1e-3 of sklearn.metrics.davies_bouldin_score on pinned iris dataset' phases: [] subtasks: [] estimated_effort: S @@ -11671,8 +11124,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr calinski_harabasz_score(X, labels) within 1e-4 of sklearn.metrics.calinski_harabasz_score - on pinned iris dataset' + - 'Falsifier: apr calinski_harabasz_score(X, labels) within 1e-4 of sklearn.metrics.calinski_harabasz_score on pinned iris dataset' phases: [] subtasks: [] estimated_effort: S @@ -11693,8 +11145,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr adjusted_rand_score(y_true, y_pred) matches sklearn.metrics.adjusted_rand_score exactly - on synthetic test cases' + - 'Falsifier: apr adjusted_rand_score(y_true, y_pred) matches sklearn.metrics.adjusted_rand_score exactly on synthetic test cases' phases: [] subtasks: [] estimated_effort: S @@ -11715,8 +11166,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr silhouette_samples(X, labels) returns Vec of len(X), mean equals silhouette_score() - within 1e-5' + - 'Falsifier: apr silhouette_samples(X, labels) returns Vec of len(X), mean equals silhouette_score() within 1e-5' phases: [] subtasks: [] estimated_effort: S @@ -11737,8 +11187,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr tree.with_min_impurity_decrease(0.01) produces fewer splits than sklearn baseline - on noisy data' + - 'Falsifier: apr tree.with_min_impurity_decrease(0.01) produces fewer splits than sklearn baseline on noisy data' phases: [] subtasks: [] estimated_effort: S @@ -11780,8 +11229,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: make_pipeline(StandardScaler(), LinearRegression()) produces identical results to manual - Pipeline construction' + - 'Falsifier: make_pipeline(StandardScaler(), LinearRegression()) produces identical results to manual Pipeline construction' phases: [] subtasks: [] estimated_effort: S @@ -11802,8 +11250,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: ShuffleSplit(n_splits=5, test_size=0.2).split(100) returns 5 folds with 20 test/80 train - each, distinct random indices per fold' + - 'Falsifier: ShuffleSplit(n_splits=5, test_size=0.2).split(100) returns 5 folds with 20 test/80 train each, distinct random indices per fold' phases: [] subtasks: [] estimated_effort: S @@ -11824,8 +11271,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: LeaveOneOut.split(n_samples=5) returns 5 folds, each with 1 test sample and n-1 train - samples' + - 'Falsifier: LeaveOneOut.split(n_samples=5) returns 5 folds, each with 1 test sample and n-1 train samples' phases: [] subtasks: [] estimated_effort: S @@ -11846,8 +11292,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: expose alpha in GaussianNB/MultinomialNB/BernoulliNB; alpha=0 unsmoothed, alpha=1.0 matches - sklearn default on text classification' + - 'Falsifier: expose alpha in GaussianNB/MultinomialNB/BernoulliNB; alpha=0 unsmoothed, alpha=1.0 matches sklearn default on text classification' phases: [] subtasks: [] estimated_effort: S @@ -11868,8 +11313,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: GridSearchCV on Ridge alpha=[0.01,0.1,1.0,10.0] matches sklearn.GridSearchCV best_alpha - and best_score within 1e-3 on synthetic data; generic param_grid + step__param naming' + - 'Falsifier: GridSearchCV on Ridge alpha=[0.01,0.1,1.0,10.0] matches sklearn.GridSearchCV best_alpha and best_score within 1e-3 on synthetic data; generic param_grid + step__param naming' phases: [] subtasks: [] estimated_effort: M @@ -11890,8 +11334,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: fit on boston housing, MSE within 5% of sklearn.ensemble.GradientBoostingRegressor (n_estimators=100, - lr=0.1); fit time < sklearn on same CPU' + - 'Falsifier: fit on boston housing, MSE within 5% of sklearn.ensemble.GradientBoostingRegressor (n_estimators=100, lr=0.1); fit time < sklearn on same CPU' phases: [] subtasks: [] estimated_effort: M @@ -11912,8 +11355,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr OneHotEncoder.fit_transform(categorical_data) output shape and sparsity matches sklearn.preprocessing.OneHotEncoder - on iris.target' + - 'Falsifier: apr OneHotEncoder.fit_transform(categorical_data) output shape and sparsity matches sklearn.preprocessing.OneHotEncoder on iris.target' phases: [] subtasks: [] estimated_effort: M @@ -11934,8 +11376,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr TruncatedSVD(k) fit/transform match sklearn.decomposition.TruncatedSVD within 1e-3 - L2 error on pinned (200,100) matrix with known singular values' + - 'Falsifier: apr TruncatedSVD(k) fit/transform match sklearn.decomposition.TruncatedSVD within 1e-3 L2 error on pinned (200,100) matrix with known singular values' phases: [] subtasks: [] estimated_effort: M @@ -11956,8 +11397,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr NMF reconstruction error within 1e-2 of sklearn.decomposition.NMF after 200 iterations - on same (n_samples,n_features) with n_components=rank' + - 'Falsifier: apr NMF reconstruction error within 1e-2 of sklearn.decomposition.NMF after 200 iterations on same (n_samples,n_features) with n_components=rank' phases: [] subtasks: [] estimated_effort: M @@ -11978,8 +11418,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: fit/predict on count matrices; match sklearn.naive_bayes.MultinomialNB on 20-newsgroups-subset - TF data within 2% accuracy; <100ms on 1000x100 sparse' + - 'Falsifier: fit/predict on count matrices; match sklearn.naive_bayes.MultinomialNB on 20-newsgroups-subset TF data within 2% accuracy; <100ms on 1000x100 sparse' phases: [] subtasks: [] estimated_effort: M @@ -12000,8 +11439,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: Pipeline([(scaler,StandardScaler()),(model,LinearRegression())]) on iris_regression matches - sklearn Pipeline predictions within 1e-4 MSE' + - 'Falsifier: Pipeline([(scaler,StandardScaler()),(model,LinearRegression())]) on iris_regression matches sklearn Pipeline predictions within 1e-4 MSE' phases: [] subtasks: [] estimated_effort: M @@ -12022,8 +11460,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: learning_curve(LinearRegression, X, y, train_sizes=[0.1,0.3,0.5,0.7,0.9]) train_scores/val_scores - match sklearn.learning_curve within 1e-2 on boston' + - 'Falsifier: learning_curve(LinearRegression, X, y, train_sizes=[0.1,0.3,0.5,0.7,0.9]) train_scores/val_scores match sklearn.learning_curve within 1e-2 on boston' phases: [] subtasks: [] estimated_effort: M @@ -12044,8 +11481,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: validation_curve(Ridge, X, y, param_name=alpha, param_range=[0.01,0.1,1.0,10.0]) matches - sklearn.validation_curve output within 1e-2' + - 'Falsifier: validation_curve(Ridge, X, y, param_name=alpha, param_range=[0.01,0.1,1.0,10.0]) matches sklearn.validation_curve output within 1e-2' phases: [] subtasks: [] estimated_effort: M @@ -12066,8 +11502,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: RandomizedSearchCV on LogisticRegression {C:[0.1,1,10], solver:[lbfgs,saga]} finds score - within 0.01 of grid search on digits dataset' + - 'Falsifier: RandomizedSearchCV on LogisticRegression {C:[0.1,1,10], solver:[lbfgs,saga]} finds score within 0.01 of grid search on digits dataset' phases: [] subtasks: [] estimated_effort: M @@ -12088,8 +11523,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr SGDClassifier matches sklearn.linear_model.SGDClassifier accuracy within 1% on MNIST - binary subset, 10k samples' + - 'Falsifier: apr SGDClassifier matches sklearn.linear_model.SGDClassifier accuracy within 1% on MNIST binary subset, 10k samples' phases: [] subtasks: [] estimated_effort: M @@ -12110,8 +11544,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr SGDRegressor matches sklearn.linear_model.SGDRegressor R² within 0.05 on California - housing subset' + - 'Falsifier: apr SGDRegressor matches sklearn.linear_model.SGDRegressor R² within 0.05 on California housing subset' phases: [] subtasks: [] estimated_effort: M @@ -12132,8 +11565,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: kernel(x1,x2) matches sklearn.metrics.pairwise_kernels(X,Y,metric=rbf) within 1e-5; reusable - for kernel SVMs' + - 'Falsifier: kernel(x1,x2) matches sklearn.metrics.pairwise_kernels(X,Y,metric=rbf) within 1e-5; reusable for kernel SVMs' phases: [] subtasks: [] estimated_effort: M @@ -12175,8 +11607,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr MiniBatchKMeans 50% faster than sklearn on same hardware; inertia within 1e-3 of sklearn - on pinned iris-scale data' + - 'Falsifier: apr MiniBatchKMeans 50% faster than sklearn on same hardware; inertia within 1e-3 of sklearn on pinned iris-scale data' phases: [] subtasks: [] estimated_effort: M @@ -12197,8 +11628,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr RandomForestClassifier.with_max_features(sqrt) uses sqrt(n_features) per split vs - sklearn on wine dataset' + - 'Falsifier: apr RandomForestClassifier.with_max_features(sqrt) uses sqrt(n_features) per split vs sklearn on wine dataset' phases: [] subtasks: [] estimated_effort: M @@ -12219,8 +11649,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr DecisionTreeClassifier.with_class_weight(balanced) achieves >5% higher F1 on imbalanced - dataset vs uniform' + - 'Falsifier: apr DecisionTreeClassifier.with_class_weight(balanced) achieves >5% higher F1 on imbalanced dataset vs uniform' phases: [] subtasks: [] estimated_effort: M @@ -12241,8 +11670,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: binary classification on synthetic data, accuracy within 1% of sklearn.ensemble.AdaBoostClassifier - (n_estimators=50, lr=1.0)' + - 'Falsifier: binary classification on synthetic data, accuracy within 1% of sklearn.ensemble.AdaBoostClassifier (n_estimators=50, lr=1.0)' phases: [] subtasks: [] estimated_effort: M @@ -12263,8 +11691,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: hard & soft voting, accuracy within 0.5% of sklearn.ensemble.VotingClassifier on iris - with (LogReg, RFC, SVC)' + - 'Falsifier: hard & soft voting, accuracy within 0.5% of sklearn.ensemble.VotingClassifier on iris with (LogReg, RFC, SVC)' phases: [] subtasks: [] estimated_effort: M @@ -12306,8 +11733,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr PolynomialFeatures(degree=2).fit_transform(X) produces same number and order of columns - as sklearn.preprocessing.PolynomialFeatures' + - 'Falsifier: apr PolynomialFeatures(degree=2).fit_transform(X) produces same number and order of columns as sklearn.preprocessing.PolynomialFeatures' phases: [] subtasks: [] estimated_effort: M @@ -12328,8 +11754,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr FactorAnalysis likelihood match sklearn within 1e-2 on pinned synthetic data; loadings_/noise_variance - parity within 1e-3' + - 'Falsifier: apr FactorAnalysis likelihood match sklearn within 1e-2 on pinned synthetic data; loadings_/noise_variance parity within 1e-3' phases: [] subtasks: [] estimated_effort: M @@ -12350,8 +11775,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: fit/predict on binary feature matrices; match sklearn.naive_bayes.BernoulliNB within 1% - accuracy; support binarize parameter' + - 'Falsifier: fit/predict on binary feature matrices; match sklearn.naive_bayes.BernoulliNB within 1% accuracy; support binarize parameter' phases: [] subtasks: [] estimated_effort: M @@ -12372,8 +11796,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: match sklearn.naive_bayes.ComplementNB on imbalanced multiclass (20-newsgroups) within - 2% accuracy' + - 'Falsifier: match sklearn.naive_bayes.ComplementNB on imbalanced multiclass (20-newsgroups) within 2% accuracy' phases: [] subtasks: [] estimated_effort: M @@ -12394,8 +11817,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: match sklearn.metrics.roc_curve FPR/TPR arrays within 1e-4 on pinned binary classification - oracle' + - 'Falsifier: match sklearn.metrics.roc_curve FPR/TPR arrays within 1e-4 on pinned binary classification oracle' phases: [] subtasks: [] estimated_effort: M @@ -12437,8 +11859,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr::model_selection::cross_validate_unsupervised(kmeans, X, cv) compiles and returns - scores on clustered data' + - 'Falsifier: apr::model_selection::cross_validate_unsupervised(kmeans, X, cv) compiles and returns scores on clustered data' phases: [] subtasks: [] estimated_effort: M @@ -12459,8 +11880,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr NearestNeighbors.kneighbors(X, k) match sklearn.neighbors.NearestNeighbors (indices, - distances) within machine precision' + - 'Falsifier: apr NearestNeighbors.kneighbors(X, k) match sklearn.neighbors.NearestNeighbors (indices, distances) within machine precision' phases: [] subtasks: [] estimated_effort: M @@ -12481,8 +11901,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: apr RadiusNeighborsClassifier.predict matches sklearn on fixed-radius query; all neighbors - within eps contribute to vote' + - 'Falsifier: apr RadiusNeighborsClassifier.predict matches sklearn on fixed-radius query; all neighbors within eps contribute to vote' phases: [] subtasks: [] estimated_effort: M @@ -12503,8 +11922,7 @@ roadmap: updated: 2026-06-11 21:40:00+00:00 spec: null acceptance_criteria: - - 'Falsifier: ColumnTransformer([(num,StandardScaler(),[0,1,2]),(cat,OneHotEncoder(),[3,4])]) on mixed-type - data matches sklearn within 1e-4' + - 'Falsifier: ColumnTransformer([(num,StandardScaler(),[0,1,2]),(cat,OneHotEncoder(),[3,4])]) on mixed-type data matches sklearn within 1e-4' phases: [] subtasks: [] estimated_effort: M @@ -12525,11 +11943,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - 'ci.yml compute step pass check is anchored (e.g. grep -q ''; 0 failed;'' AND requires a ''test result: - ok.'' line) so a partial-failure run cannot merge green.' - - 'RED-turning mutation: add 10 `assert!(false)` tests to aprender-compute --lib on a scratch branch - — workspace-test MUST fail (today it exits 0 because grep ''test result.*0 failed'' substring-matches - ''10 failed'').' + - 'ci.yml compute step pass check is anchored (e.g. grep -q ''; 0 failed;'' AND requires a ''test result: ok.'' line) so a partial-failure run cannot merge green.' + - 'RED-turning mutation: add 10 `assert!(false)` tests to aprender-compute --lib on a scratch branch — workspace-test MUST fail (today it exits 0 because grep ''test result.*0 failed'' substring-matches ''10 failed'').' phases: [] subtasks: [] estimated_effort: null @@ -12539,10 +11954,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-01 - gates-or-theater - notes: 'The per-PR enforcement backbone is bypassable — every other gate''s credibility transits this - compute-step pass check; one-line fix. Workflow: ticket -> fix/ci-compute-pass-grep -> PR -> ci/gate - (small-CI-edit class, pre-authorized). Source: docs/specifications/fable-architectural-review.md §7b - ev_rank 1.' + notes: 'The per-PR enforcement backbone is bypassable — every other gate''s credibility transits this compute-step pass check; one-line fix. Workflow: ticket -> fix/ci-compute-pass-grep -> PR -> ci/gate (small-CI-edit class, pre-authorized). Source: docs/specifications/fable-architectural-review.md §7b ev_rank 1.' - id: PMAT-F2-DECODE-PHASE-001 github_issue: null item_type: task @@ -12554,13 +11966,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - validate_gpu_first_token is extended with >=8 greedy decode steps executed through the SAME prefill - mode production selects, per-step argmax + cosine>=0.95 vs CPU; new FALSIFY-CPU-GPU-012 in apr-cpu-vs-gpu-output-parity-v1.yaml - (NOT 007 - ids 001-011 are all taken and 007 is PMAT-742, the no-false-positive falsifier for this - very function; total_obligations must go 11 -> 12). - - 'RED-turning mutation: corrupt the batched-prefill KV scatter (or truncate the cache at decode step - 4) — the probe MUST reject; today it accepts because it validates only serial prefill (BATCHED_PREFILL - still default on sm_89).' + - validate_gpu_first_token is extended with >=8 greedy decode steps executed through the SAME prefill mode production selects, per-step argmax + cosine>=0.95 vs CPU; new FALSIFY-CPU-GPU-012 in apr-cpu-vs-gpu-output-parity-v1.yaml (NOT 007 - ids 001-011 are all taken and 007 is PMAT-742, the no-false-positive falsifier for this very function; total_obligations must go 11 -> 12). + - 'RED-turning mutation: corrupt the batched-prefill KV scatter (or truncate the cache at decode step 4) — the probe MUST reject; today it accepts because it validates only serial prefill (BATCHED_PREFILL still default on sm_89).' phases: [] subtasks: [] estimated_effort: null @@ -12570,30 +11977,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-03 - gates-or-theater - notes: 'PREREQ FINDINGS (2026-07-29 recon, verified in-tree - read before starting): (1) validate_gpu_first_token - executes ZERO decode steps AND never calls run_prefill, so it exercises neither batched-prefill kernels - nor any cached decode - the in-code comment at generate_2.rs claiming it -only checks the FIRST token- - was itself stale (since PMAT-919 it checks every PROMPT position) and is corrected in this tree. (2) - run_prefill is a PRIVATE method on OwnedQuantizedModelCuda in gguf::cuda while the probe lives in - infer::inference_result - the probe physically cannot call production prefill today; raising it to - pub(crate) or adding a probe entry point inside gguf/cuda is a design decision, not a mechanical edit. - (3) No public API returns per-step LOGITS from the production path - generate_gpu_resident returns - Vec only; generate_gpu_resident_logprobs is the nearest precedent to model a logits-capturing - helper on. (4) The probe resets the GPU KV cache before AND after its loop so validation does not - consume the model; running real prefill will allocate the prefill workspace and arm flash decoding, - so that teardown discipline must be re-derived. (5) The RED-turning mutation is NOT reachable by default - on both legs: batched prefill is default only on non-Blackwell (run_prefill: Err(_) => !is_blackwell), - so the gb10 leg needs an explicit BATCHED_PREFILL=1 matrix entry to be honest. (6) TRAP, not yet a - live bug: cuda/gpu_profile.rs detect_batched_prefill() returns unwrap_or(true) and ignores the Blackwell - carve-out that run_prefill applies, so GpuProfile.batched_prefill disagrees with the real decision - on Blackwell. It currently has ZERO readers (verified), so nothing is misreported today - but any - -the SAME prefill mode production selects- assertion must read the run_prefill decision, never that - field. (7) The probe fails OPEN when the CPU reference forward errors and when BOS is unknown; a decode - extension inherits both holes. (8) No workflow runs cargo test -p aprender-serve --features cuda --lib, - so cuda-nightly needs a new step. ORIGINAL: The #1864 remediation probe validates only serial prefill; - generate_2.rs:246-268 documents in-code that batched-prefill decode corruption (PMAT-810 ''CertainlyCertainly'') - ships through it silently. Workflow: ticket -> branch -> PR -> ci/gate; verify on cuda-nightly both - silicon legs. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 3.' + notes: 'PREREQ FINDINGS (2026-07-29 recon, verified in-tree - read before starting): (1) validate_gpu_first_token executes ZERO decode steps AND never calls run_prefill, so it exercises neither batched-prefill kernels nor any cached decode - the in-code comment at generate_2.rs claiming it -only checks the FIRST token- was itself stale (since PMAT-919 it checks every PROMPT position) and is corrected in this tree. (2) run_prefill is a PRIVATE method on OwnedQuantizedModelCuda in gguf::cuda while the probe lives in infer::inference_result - the probe physically cannot call production prefill today; raising it to pub(crate) or adding a probe entry point inside gguf/cuda is a design decision, not a mechanical edit. (3) No public API returns per-step LOGITS from the production path - generate_gpu_resident returns Vec only; generate_gpu_resident_logprobs is the nearest precedent to model a logits-capturing helper on. (4) The probe resets the GPU KV cache before AND after its loop so validation does not consume the model; running real prefill will allocate the prefill workspace and arm flash decoding, so that teardown discipline must be re-derived. (5) The RED-turning mutation is NOT reachable by default on both legs: batched prefill is default only on non-Blackwell (run_prefill: Err(_) => !is_blackwell), so the gb10 leg needs an explicit BATCHED_PREFILL=1 matrix entry to be honest. (6) TRAP, not yet a live bug: cuda/gpu_profile.rs detect_batched_prefill() returns unwrap_or(true) and ignores the Blackwell carve-out that run_prefill applies, so GpuProfile.batched_prefill disagrees with the real decision on Blackwell. It currently has ZERO readers (verified), so nothing is misreported today - but any -the SAME prefill mode production selects- assertion must read the run_prefill decision, never that field. (7) The probe fails OPEN when the CPU reference forward errors and when BOS is unknown; a decode extension inherits both holes. (8) No workflow runs cargo test -p aprender-serve --features cuda --lib, so cuda-nightly needs a new step. ORIGINAL: The #1864 remediation probe validates only serial prefill; generate_2.rs:246-268 documents in-code that batched-prefill decode corruption (PMAT-810 ''CertainlyCertainly'') ships through it silently. Workflow: ticket -> branch -> PR -> ci/gate; verify on cuda-nightly both silicon legs. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 3.' - id: PMAT-QA-FMTPARITY-DECODE-001 github_issue: null item_type: task @@ -12605,12 +11989,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - The format_parity gate greedy-decodes >=64 tokens per format via the cache path with per-step argmax - equality (near-tie cosine >=0.98 exemption); qwen-story B2 gains a GGUF leg so the gate actually executes - daily. - - 'RED-turning mutation: zero the SafeTensors-side KV write at decode step 32 — apr qa MUST exit 5; - today it stays green because the gate is one prefill forward + single final-position argmax, zero - decode steps.' + - The format_parity gate greedy-decodes >=64 tokens per format via the cache path with per-step argmax equality (near-tie cosine >=0.98 exemption); qwen-story B2 gains a GGUF leg so the gate actually executes daily. + - 'RED-turning mutation: zero the SafeTensors-side KV write at decode step 32 — apr qa MUST exit 5; today it stays green because the gate is one prefill forward + single final-position argmax, zero decode steps.' phases: [] subtasks: [] estimated_effort: null @@ -12620,14 +12000,11 @@ roadmap: - fable-review-2026-07-05 - ev-rank-04 - gates-or-theater - notes: 'apr qa''s format_parity gate (the tool the doctrine says to reach for FIRST) is a literal #1864 - clone; cross-format cached-decode drift is invisible to it. Workflow: ticket -> branch -> PR -> ci/gate. - Source: docs/specifications/fable-architectural-review.md §7b ev_rank 4.' + notes: 'apr qa''s format_parity gate (the tool the doctrine says to reach for FIRST) is a literal #1864 clone; cross-format cached-decode drift is invisible to it. Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 4.' - id: FALSIFY-CUDA-NF4-TRAIN-TRAJECTORY-001 github_issue: null item_type: task - title: GPU NF4 training trajectory gate (>=20 optimizer steps vs CPU oracle) — kill the step-0-only - asymmetry + title: GPU NF4 training trajectory gate (>=20 optimizer steps vs CPU oracle) — kill the step-0-only asymmetry status: planned priority: high assigned_to: null @@ -12635,11 +12012,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - '>=20 real optimizer steps GPU vs NF4-matched CPU oracle (identical data/lr); per-step |dLoss| within - band AND total decrease >= X nats by step 20; wired into cuda-nightly.yml.' - - 'RED-turning mutation: freeze the CUDA Adam t counter at 1 — red by step 3; the current step-0 gate - (parity_probe.rs:186, no optimizer step ever taken) stays green forever while CPU has an enforced - 400-step trajectory (train_to_loss_tests.rs).' + - '>=20 real optimizer steps GPU vs NF4-matched CPU oracle (identical data/lr); per-step |dLoss| within band AND total decrease >= X nats by step 20; wired into cuda-nightly.yml.' + - 'RED-turning mutation: freeze the CUDA Adam t counter at 1 — red by step 3; the current step-0 gate (parity_probe.rs:186, no optimizer step ever taken) stays green forever while CPU has an enforced 400-step trajectory (train_to_loss_tests.rs).' phases: [] subtasks: [] estimated_effort: null @@ -12649,11 +12023,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-05 - gates-or-theater - notes: 'GPU training is gated at step 0 only; #2251-class backward/stream bugs are structurally invisible. - GROUNDED 2026-07-05: CONFIRMED still actionable (parity_probe.rs is forward-only, no backward/optimizer; - 400-step CPU trajectory exists; no GPU trajectory test). Workflow: ticket -> branch -> PR -> ci/gate; - nightly proof on both silicon. Source: docs/specifications/fable-architectural-review.md §7b ev_rank - 5.' + notes: 'GPU training is gated at step 0 only; #2251-class backward/stream bugs are structurally invisible. GROUNDED 2026-07-05: CONFIRMED still actionable (parity_probe.rs is forward-only, no backward/optimizer; 400-step CPU trajectory exists; no GPU trajectory test). Workflow: ticket -> branch -> PR -> ci/gate; nightly proof on both silicon. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 5.' - id: PMAT-SERVE-MULTITURN-001 github_issue: null item_type: task @@ -12665,12 +12035,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - '(a) ollama_http_compat gains a 3-turn /api/chat sequence + a stream:true request asserting >=2 chunks - then done:true (per-PR at ci.yml:317); (b) FALSIFY-CHAT-008 rewritten to invoke the real chat_template - engine; (c) qwen-story B6b: 2 follow-up requests to the same server.' - - 'RED-turning mutation: handler drops all-but-last message -> (a) red; swap two turns pre-render -> - (b) red; kill KV reset between requests -> (c) red. Today every serve gate samples one request/one - turn and FALSIFY-CHAT-008 is a string tautology that never calls the template engine.' + - '(a) ollama_http_compat gains a 3-turn /api/chat sequence + a stream:true request asserting >=2 chunks then done:true (per-PR at ci.yml:317); (b) FALSIFY-CHAT-008 rewritten to invoke the real chat_template engine; (c) qwen-story B6b: 2 follow-up requests to the same server.' + - 'RED-turning mutation: handler drops all-but-last message -> (a) red; swap two turns pre-render -> (b) red; kill KV reset between requests -> (c) red. Today every serve gate samples one request/one turn and FALSIFY-CHAT-008 is a string tautology that never calls the template engine.' phases: [] subtasks: [] estimated_effort: null @@ -12680,29 +12046,11 @@ roadmap: - fable-review-2026-07-05 - ev-rank-06 - gates-or-theater - notes: 'PARTIALLY LANDED 2026-07-29: (a) ollama_http_compat gained a 3-turn /api/chat test asserting - on prompt_eval_count growth (NOT shape - the handler answers 200 + done:true even when generation - fails, so every pre-existing assertion there is satisfied by total failure); RED-verified by making - the handler keep only the last message (3-turn then consumed 26 prompt tokens == last-turn-alone 26). - (b) FALSIFY-CHAT-008 rewritten to call ChatMLTemplate::format_conversation - it was a tautology (producer - and verifier were the same format! over the same vector) and VERIFIED so: swapping two turns left - the OLD test passing. CHAT-006/007/008 were orphan test-only ids never declared in apr-chat-session-v1.yaml, - whose qa_gate still read -All 5 falsification tests pass-; now declared, gate says 8. (c) STILL OPEN: - qwen-story B6b two-follow-up-requests. ALSO: the streaming half was satisfied by GATING existing tests - rather than writing new ones - crates/apr-cli/tests/ollama_ndjson_streaming.rs (PMAT-928) already - has 4 real NDJSON multi-chunk/done:true tests and ran in ZERO workflows; both it and falsification_chat_http_cli - are now on ci.yml:317. NOTE the aprender-serve router CANNOT stream at all - to_chat_request hard-forces - stream:false (ollama_handlers.rs:184-186) and OllamaChatRequest.stream defaults to false, contradicting - Ollama-s wire default of true (apr-cli-s copy gets it right via default_stream); a stream:true assertion - in aprender-serve would need a handler change, which is why the existing apr-cli tests were gated - instead. ORIGINAL: Multi-turn KV/template accumulation is the #1864 gibberish vector and has no genuine - gate. Workflow: (a)/(b) per-PR; (c) rides qwen-story-daily; ci.yml:317 is ONE physical line — consolidate - edits in one PR. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 6.' + notes: 'PARTIALLY LANDED 2026-07-29: (a) ollama_http_compat gained a 3-turn /api/chat test asserting on prompt_eval_count growth (NOT shape - the handler answers 200 + done:true even when generation fails, so every pre-existing assertion there is satisfied by total failure); RED-verified by making the handler keep only the last message (3-turn then consumed 26 prompt tokens == last-turn-alone 26). (b) FALSIFY-CHAT-008 rewritten to call ChatMLTemplate::format_conversation - it was a tautology (producer and verifier were the same format! over the same vector) and VERIFIED so: swapping two turns left the OLD test passing. CHAT-006/007/008 were orphan test-only ids never declared in apr-chat-session-v1.yaml, whose qa_gate still read -All 5 falsification tests pass-; now declared, gate says 8. (c) STILL OPEN: qwen-story B6b two-follow-up-requests. ALSO: the streaming half was satisfied by GATING existing tests rather than writing new ones - crates/apr-cli/tests/ollama_ndjson_streaming.rs (PMAT-928) already has 4 real NDJSON multi-chunk/done:true tests and ran in ZERO workflows; both it and falsification_chat_http_cli are now on ci.yml:317. NOTE the aprender-serve router CANNOT stream at all - to_chat_request hard-forces stream:false (ollama_handlers.rs:184-186) and OllamaChatRequest.stream defaults to false, contradicting Ollama-s wire default of true (apr-cli-s copy gets it right via default_stream); a stream:true assertion in aprender-serve would need a handler change, which is why the existing apr-cli tests were gated instead. ORIGINAL: Multi-turn KV/template accumulation is the #1864 gibberish vector and has no genuine gate. Workflow: (a)/(b) per-PR; (c) rides qwen-story-daily; ci.yml:317 is ONE physical line — consolidate edits in one PR. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 6.' - id: PMAT-DRIFT-GATES-001 github_issue: null item_type: task - title: Make the claims-as-contract layer actually enforce (README/book/CLI drift caught on the offending - PR) + title: Make the claims-as-contract layer actually enforce (README/book/CLI drift caught on the offending PR) status: planned priority: high assigned_to: null @@ -12710,12 +12058,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - check_readme_claims.sh (or an extended readme_contract test) runs per-PR; book.yml + book-contracts.yml - triggers extended to crates/apr-cli/src/**; README/CLAUDE.md counts corrected (contracts, ~83.5k tests, - 82 crates). - - 'RED-turning mutation: PR changing the crates/ dir count without a README edit -> red; PR adding a - clap subcommand without a book chapter -> red on THAT PR, not the next book PR. Today the readme-claims - checker is in zero workflows despite status:''enforced'', and README 1331 != tree 1460.' + - check_readme_claims.sh (or an extended readme_contract test) runs per-PR; book.yml + book-contracts.yml triggers extended to crates/apr-cli/src/**; README/CLAUDE.md counts corrected (contracts, ~83.5k tests, 82 crates). + - 'RED-turning mutation: PR changing the crates/ dir count without a README edit -> red; PR adding a clap subcommand without a book chapter -> red on THAT PR, not the next book PR. Today the readme-claims checker is in zero workflows despite status:''enforced'', and README 1331 != tree 1460.' phases: [] subtasks: [] estimated_effort: null @@ -12725,9 +12069,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-07 - gates-or-theater - notes: 'The claims-as-contract layer is live-proven theater; the book/CLI parity path is filtered so - exactly the drift it exists to catch bypasses it. Workflow: ticket -> branch -> PR -> ci/gate; small-CI-edit - class. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 7.' + notes: 'The claims-as-contract layer is live-proven theater; the book/CLI parity path is filtered so exactly the drift it exists to catch bypasses it. Workflow: ticket -> branch -> PR -> ci/gate; small-CI-edit class. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 7.' - id: APR-ANTHROPIC-MSGS-INTEGRITY-001 github_issue: null item_type: task @@ -12739,9 +12081,7 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - 'apr serve exposes an Anthropic-compatible /v1/messages (+ count_tokens); contract apr-anthropic-messages-v1.yaml - with a falsifier: tool_call id/structure preserved byte-exact across >=3 turns incl. the #2245 salvage-parser - path.' + - 'apr serve exposes an Anthropic-compatible /v1/messages (+ count_tokens); contract apr-anthropic-messages-v1.yaml with a falsifier: tool_call id/structure preserved byte-exact across >=3 turns incl. the #2245 salvage-parser path.' - 'RED-turning mutation: drop the tool_call id remapping on turn 2 -> the falsifier MUST reject.' phases: [] subtasks: [] @@ -12752,10 +12092,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-09 - gates-or-theater - notes: 'mistral.rs ships /v1/messages + agent loop with ZERO correctness contracts; P5''s defensible - ground is provable tool-call integrity — a beat nobody claims. Feeds APR-ANTIGRAVITY-PARITY-001 already - atop the planned queue. Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md - §7b ev_rank 9.' + notes: 'mistral.rs ships /v1/messages + agent loop with ZERO correctness contracts; P5''s defensible ground is provable tool-call integrity — a beat nobody claims. Feeds APR-ANTIGRAVITY-PARITY-001 already atop the planned queue. Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 9.' - id: PMAT-GNB-SPEED-DEFENSE-001 github_issue: null item_type: task @@ -12767,11 +12104,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - Regression bisected to a commit or attributed to environment (sklearn 1.9 speedup / allocator / ln-hoist - erosion); margin restored to >=3x measured OR the contract honestly re-pinned with a dated measurement; - then 5 consecutive green nightlies. - - 'RED-turning mutation: (defensive) the beat-speed-nightly GaussianNB leg must return to a durable - green margin; red 07-03/07-04 nightlies are the current RED signal.' + - Regression bisected to a commit or attributed to environment (sklearn 1.9 speedup / allocator / ln-hoist erosion); margin restored to >=3x measured OR the contract honestly re-pinned with a dated measurement; then 5 consecutive green nightlies. + - 'RED-turning mutation: (defensive) the beat-speed-nightly GaussianNB leg must return to a durable green margin; red 07-03/07-04 nightlies are the current RED signal.' phases: [] subtasks: [] estimated_effort: null @@ -12781,9 +12115,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-10 - gates-or-theater - notes: 'A LIVE beat decaying toward its own gate; an untriaged decay becomes a flake, then a deleted - gate — five-whys before it flips. Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md - §7b ev_rank 10.' + notes: 'A LIVE beat decaying toward its own gate; an untriaged decay becomes a flake, then a deleted gate — five-whys before it flips. Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 10.' - id: PMAT-CUDA-NIGHTLY-PROBATIVE-001 github_issue: null item_type: task @@ -12795,12 +12127,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - Skip nights emit a distinct conclusion (neutral/skipped + weekly skip-rate report, alert >50%); the - lane adopts gqa_attention_parity extended to >=64 cached positions, >=10-step AdamW parity, and NF4 - double-roundtrip idempotence. - - 'RED-turning mutation: stride the GPU cache by q_dim (the PMAT-749 bug) -> red by step 8; freeze bias - correction -> red by step 3; perturb absmax on roundtrip 2 -> red. Today gqa horizon=2 positions, - gpu_cpu_parity.rs is assertion-free, both unwired.' + - Skip nights emit a distinct conclusion (neutral/skipped + weekly skip-rate report, alert >50%); the lane adopts gqa_attention_parity extended to >=64 cached positions, >=10-step AdamW parity, and NF4 double-roundtrip idempotence. + - 'RED-turning mutation: stride the GPU cache by q_dim (the PMAT-749 bug) -> red by step 8; freeze bias correction -> red by step 3; perturb absmax on roundtrip 2 -> red. Today gqa horizon=2 positions, gpu_cpu_parity.rs is assertion-free, both unwired.' phases: [] subtasks: [] estimated_effort: null @@ -12810,10 +12138,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-11 - gates-or-theater - notes: 'Yield-to-training turns busy-GPU nights into green no-ops (non-probative greens). GROUNDED 2026-07-05: - CONFIRMED — 2-position horizon, assertion-free _cuda_model parity test, neither wired into any workflow. - Workflow: small-CI-edit class; verify a real (non-skip) run on both legs. Source: docs/specifications/fable-architectural-review.md - §7b ev_rank 11.' + notes: 'Yield-to-training turns busy-GPU nights into green no-ops (non-probative greens). GROUNDED 2026-07-05: CONFIRMED — 2-position horizon, assertion-free _cuda_model parity test, neither wired into any workflow. Workflow: small-CI-edit class; verify a real (non-skip) run on both legs. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 11.' - id: PMAT-CASEFILE-MECH-001 github_issue: null item_type: task @@ -12825,11 +12150,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - '#153: a regression test asserting format detection reads <=8 bytes + a bind-before-ready ordering - test; #1599: a CI step asserting `cargo tree -p aprender --no-default-features -e normal` contains - no apr-cli.' - - 'RED-turning mutation: swap the 8-byte read for std::fs::read -> #153 test red; make apr-cli non-optional - -> #1599 step red. Today a refactor reintroducing either bug passes every gate.' + - '#153: a regression test asserting format detection reads <=8 bytes + a bind-before-ready ordering test; #1599: a CI step asserting `cargo tree -p aprender --no-default-features -e normal` contains no apr-cli.' + - 'RED-turning mutation: swap the 8-byte read for std::fs::read -> #153 test red; make apr-cli non-optional -> #1599 step red. Today a refactor reintroducing either bug passes every gate.' phases: [] subtasks: [] estimated_effort: null @@ -12839,9 +12161,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-12 - gates-or-theater - notes: 'Doctrine 7''s corpus claim is overstated: #153 and #1599 are CLOSED-BUT-UNMECHANIZED (zero regression - artifacts). Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md - §7b ev_rank 12.' + notes: 'Doctrine 7''s corpus claim is overstated: #153 and #1599 are CLOSED-BUT-UNMECHANIZED (zero regression artifacts). Workflow: ticket -> branch -> PR -> ci/gate. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 12.' - id: PMAT-MACOS-WGPU-NIGHTLY-001 github_issue: null item_type: task @@ -12853,8 +12173,7 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - nightly.yml macOS aarch64 leg adds a --features wgpu build + `cargo test -p aprender-compute --lib - --features gpu`; the macOS METAL assertion (device/mod.rs:500) executes. + - nightly.yml macOS aarch64 leg adds a --features wgpu build + `cargo test -p aprender-compute --lib --features gpu`; the macOS METAL assertion (device/mod.rs:500) executes. - 'RED-turning mutation: cfg-gate out Metal backend registration -> the macOS test leg fails.' phases: [] subtasks: [] @@ -12865,10 +12184,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-13 - gates-or-theater - notes: 'T5: the incumbent''s fastest 2026 platform (Ollama MLX ~2x decode, Gemma4 +90%) vs zero macOS - test execution here; the Metal/wgpu path is never compiled on Apple hardware. The nightly macOS lane - already exists. Workflow: small-CI-edit class; GitHub-hosted macos-latest, no fleet dependency. Source: - docs/specifications/fable-architectural-review.md §7b ev_rank 13.' + notes: 'T5: the incumbent''s fastest 2026 platform (Ollama MLX ~2x decode, Gemma4 +90%) vs zero macOS test execution here; the Metal/wgpu path is never compiled on Apple hardware. The nightly macOS lane already exists. Workflow: small-CI-edit class; GitHub-hosted macos-latest, no fleet dependency. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 13.' - id: PMAT-MSRV-GATE-001 github_issue: null item_type: task @@ -12880,10 +12196,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - 'A PR-blocking job: dtolnay/rust-toolchain@1.89 + `cargo check --workspace`; per-crate overrides reconciled - (aprender-train 1.87, aprender-graph 1.75).' - - 'RED-turning mutation: use a 1.93-only std API -> the MSRV job fails. Today it merges green and breaks - `cargo install aprender` for 1.89 users.' + - 'A PR-blocking job: dtolnay/rust-toolchain@1.89 + `cargo check --workspace`; per-crate overrides reconciled (aprender-train 1.87, aprender-graph 1.75).' + - 'RED-turning mutation: use a 1.93-only std API -> the MSRV job fails. Today it merges green and breaks `cargo install aprender` for 1.89 users.' phases: [] subtasks: [] estimated_effort: null @@ -12893,9 +12207,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-14 - gates-or-theater - notes: 'rust-version=1.89 is a published contract cargo enforces on every downstream install, but CI - never verifies it; 4-line job. Workflow: small-CI-edit class. Source: docs/specifications/fable-architectural-review.md - §7b ev_rank 14.' + notes: 'rust-version=1.89 is a published contract cargo enforces on every downstream install, but CI never verifies it; 4-line job. Workflow: small-CI-edit class. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 14.' - id: PMAT-PUBLISH-POLICY-001 github_issue: null item_type: task @@ -12907,12 +12219,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - 'CLEAN-ROOM GATE FIRST: a `cargo publish --dry-run --no-verify` cascade preflight (per the dev-dep-cycle - rules) recorded green; THEN either cascade v0.59.x to crates.io OR a written policy in ROADMAP.md - designating GH releases as the channel; CLAUDE.md''s stale ''release.yml: automated releases'' claim - fixed either way.' - - 'RED-turning mutation: (policy) the preflight artifact must exist before any publish; a publish without - it is the RED condition.' + - 'CLEAN-ROOM GATE FIRST: a `cargo publish --dry-run --no-verify` cascade preflight (per the dev-dep-cycle rules) recorded green; THEN either cascade v0.59.x to crates.io OR a written policy in ROADMAP.md designating GH releases as the channel; CLAUDE.md''s stale ''release.yml: automated releases'' claim fixed either way.' + - 'RED-turning mutation: (policy) the preflight artifact must exist before any publish; a publish without it is the RED condition.' phases: [] subtasks: [] estimated_effort: null @@ -12922,11 +12230,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-15 - gates-or-theater - notes: 'BLOCKED_BY: operator decision (publish authorization). T7 fired: doctrine 5 declares clean-room - publishability a HARD release gate while crates.io is 8 versions/14 days behind with zero automation. - NOTE: publish skipped since v0.51 by operator choice; this item is the deliberately operator-gated - one. Workflow: preflight -> operator GO/NO-GO -> cascade; never publish without the preflight artifact. - Source: docs/specifications/fable-architectural-review.md §7b ev_rank 15.' + notes: 'BLOCKED_BY: operator decision (publish authorization). T7 fired: doctrine 5 declares clean-room publishability a HARD release gate while crates.io is 8 versions/14 days behind with zero automation. NOTE: publish skipped since v0.51 by operator choice; this item is the deliberately operator-gated one. Workflow: preflight -> operator GO/NO-GO -> cascade; never publish without the preflight artifact. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 15.' - id: PMAT-MUTANTS-FULLTREE-001 github_issue: null item_type: task @@ -12938,10 +12242,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - A weekly scheduled sharded `cargo mutants -- --lib` (round-robin N crates/night within a time budget) - auto-filing an issue listing surviving mutants; first report produced. - - 'RED-turning mutation: the surviving-mutant list IS the RED signal; a week with new survivors outside - any diff is the failure the sweep exists to surface.' + - A weekly scheduled sharded `cargo mutants -- --lib` (round-robin N crates/night within a time budget) auto-filing an issue listing surviving mutants; first report produced. + - 'RED-turning mutation: the surviving-mutant list IS the RED signal; a week with new survivors outside any diff is the failure the sweep exists to surface.' phases: [] subtasks: [] estimated_effort: null @@ -12951,9 +12253,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-16 - gates-or-theater - notes: 'Mutation is diff-scoped PR-only; full-tree has never been re-sampled since the push-to-main - run was removed — mutation debt outside diffs compounds silently. Workflow: small-CI-edit class; clean-room - runners. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 16.' + notes: 'Mutation is diff-scoped PR-only; full-tree has never been re-sampled since the push-to-main run was removed — mutation debt outside diffs compounds silently. Workflow: small-CI-edit class; clean-room runners. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 16.' - id: PMAT-THEATER-TRIAGE-001 github_issue: null item_type: task @@ -12965,11 +12265,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - A committed classification manifest (wire / lib-twin-verified / archive-labeled) for all crates/*/tests - files; assertion-free tests completed or deleted (gpu_cpu_parity.rs _cuda_model never compared); top-10 - falsifiers wired into cuda-nightly or ci.yml:317 in ONE consolidated PR. - - 'RED-turning mutation: the manifest itself is the artifact; a crates/*/tests file that is neither - wired, lib-twin-verified, nor archive-labeled is the RED item.' + - A committed classification manifest (wire / lib-twin-verified / archive-labeled) for all crates/*/tests files; assertion-free tests completed or deleted (gpu_cpu_parity.rs _cuda_model never compared); top-10 falsifiers wired into cuda-nightly or ci.yml:317 in ONE consolidated PR. + - 'RED-turning mutation: the manifest itself is the artifact; a crates/*/tests file that is neither wired, lib-twin-verified, nor archive-labeled is the RED item.' phases: [] subtasks: [] estimated_effort: null @@ -12979,11 +12276,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-17 - gates-or-theater - notes: 'BLOCKED_BY: PMAT-CUDA-NIGHTLY-PROBATIVE-001 (shares the lane). ~595 unexecuted integration-test - files (incl. the falsify_*/parity corpus and the assertion-free gpu_cpu_parity.rs) read as coverage - but enforce nothing. Workflow: consolidate ALL ci.yml:317 edits into one PR to avoid merge-queue conflicts - (single-physical-line constraint). Source: docs/specifications/fable-architectural-review.md §7b ev_rank - 17.' + notes: 'BLOCKED_BY: PMAT-CUDA-NIGHTLY-PROBATIVE-001 (shares the lane). ~595 unexecuted integration-test files (incl. the falsify_*/parity corpus and the assertion-free gpu_cpu_parity.rs) read as coverage but enforce nothing. Workflow: consolidate ALL ci.yml:317 edits into one PR to avoid merge-queue conflicts (single-physical-line constraint). Source: docs/specifications/fable-architectural-review.md §7b ev_rank 17.' - id: PMAT-COVERAGE-FLOOR-001 github_issue: null item_type: task @@ -12995,8 +12288,7 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/fable-architectural-review.md acceptance_criteria: - - sovereign-ci coverage_min + test_workspace set for aprender (or coverage-nightly promoted to fail - below a committed baseline). + - sovereign-ci coverage_min + test_workspace set for aprender (or coverage-nightly promoted to fail below a committed baseline). - 'RED-turning mutation: delete a tested module''s tests -> the coverage job goes red.' phases: [] subtasks: [] @@ -13007,11 +12299,7 @@ roadmap: - fable-review-2026-07-05 - ev-rank-18 - gates-or-theater - notes: 'BLOCKED_BY: paiml/.github sovereign-ci reusable workflow (cross-repo change). The >=95% standard - is enforced nowhere (vacuous root-facade coverage job, coverage_min unset, coverage-nightly report-mode) - — ranked last because the coverage+contracts co-evolution rule makes a naive floor counterproductive - without scoped work. Workflow: cross-repo — coordinate with the sovereign-ci owner before edit. Source: - docs/specifications/fable-architectural-review.md §7b ev_rank 18.' + notes: 'BLOCKED_BY: paiml/.github sovereign-ci reusable workflow (cross-repo change). The >=95% standard is enforced nowhere (vacuous root-facade coverage job, coverage_min unset, coverage-nightly report-mode) — ranked last because the coverage+contracts co-evolution rule makes a naive floor counterproductive without scoped work. Workflow: cross-repo — coordinate with the sovereign-ci owner before edit. Source: docs/specifications/fable-architectural-review.md §7b ev_rank 18.' - id: SPEC-DIST-393-GPU-BACKEND github_issue: 393 item_type: task @@ -13023,10 +12311,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/roadmap-next-wave-2026-07-05.md acceptance_criteria: - - Distributed worker gradients are computed on the wgpu/CUDA backend, not the current CPU stub (classify_trainer.rs:1483 - `let backend = "cpu"`); --gpu-backend actually dispatches GPU matmul in the data-parallel path. - - 'RED-turning mutation: run a distributed worker with --gpu-backend cuda and assert the gradient tensors - originate from the GPU path — today they come from the hardcoded CPU stub regardless of the flag.' + - Distributed worker gradients are computed on the wgpu/CUDA backend, not the current CPU stub (classify_trainer.rs:1483 `let backend = "cpu"`); --gpu-backend actually dispatches GPU matmul in the data-parallel path. + - 'RED-turning mutation: run a distributed worker with --gpu-backend cuda and assert the gradient tensors originate from the GPU path — today they come from the hardcoded CPU stub regardless of the flag.' phases: [] subtasks: [] estimated_effort: null @@ -13036,9 +12322,7 @@ roadmap: - distributed - github-393 - from-issue-triage-2026-07-05 - notes: 'Phase-2 distributed CLI wiring (--role/--bind/--coordinator/--expect-workers -> DistributedConfig, - TCP AllReduce coordinator/worker) landed via PR #2294 (in #2286). The heterogeneous CUDA+wgpu GPU - worker execution and Phase-3 DiLoCo remain. Tracks GitHub #393.' + notes: 'Phase-2 distributed CLI wiring (--role/--bind/--coordinator/--expect-workers -> DistributedConfig, TCP AllReduce coordinator/worker) landed via PR #2294 (in #2286). The heterogeneous CUDA+wgpu GPU worker execution and Phase-3 DiLoCo remain. Tracks GitHub #393.' - id: M-GPU-MOE-2-WGPU-FORWARD github_issue: 1582 item_type: task @@ -13050,10 +12334,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/roadmap-next-wave-2026-07-05.md acceptance_criteria: - - qwen3-moe forward runs on the wgpu backend with per-layer cosine >=0.99 vs the CPU oracle; trueno-gpu - wgpu QuantizeKernel + GemmKernel authored. - - 'RED-turning mutation: run qwen3-moe forward --backend wgpu and assert per-layer cosine >=0.99 vs - CPU — today the wgpu MoE path does not exist.' + - qwen3-moe forward runs on the wgpu backend with per-layer cosine >=0.99 vs the CPU oracle; trueno-gpu wgpu QuantizeKernel + GemmKernel authored. + - 'RED-turning mutation: run qwen3-moe forward --backend wgpu and assert per-layer cosine >=0.99 vs CPU — today the wgpu MoE path does not exist.' phases: [] subtasks: [] estimated_effort: null @@ -13064,8 +12346,7 @@ roadmap: - moe - github-1582 - from-issue-triage-2026-07-05 - notes: 'Blocked on trueno-gpu wgpu kernel authoring (large 3-part item). Portable-GPU counterpart to - the CUDA qwen3-moe path. Tracks GitHub #1582.' + notes: 'Blocked on trueno-gpu wgpu kernel authoring (large 3-part item). Portable-GPU counterpart to the CUDA qwen3-moe path. Tracks GitHub #1582.' - id: M-GPU-MOE-3-Q8K-THROUGHPUT github_issue: 1583 item_type: task @@ -13077,11 +12358,8 @@ roadmap: updated: 2026-07-05 00:00:00+00:00 spec: docs/specifications/roadmap-next-wave-2026-07-05.md acceptance_criteria: - - 'CUDA f32->Q8_K activation-quant kernel wired into the expert path + DP4A dispatch; >=150 tok/s on - RTX 4090 at VRAM <=95%; flips qwen3-moe-forward-gpu-v1 to ACTIVE_RUNTIME. (Requires the #1749 MoE-aware - `apr bench` dispatch fix first.)' - - 'RED-turning mutation: `apr bench qwen3-coder-30b-a3b.gguf --device cuda` must report >=150 tok/s - (currently the bench path panics on MoE GGUFs, #1749, and the fp32-activation path is below target).' + - 'CUDA f32->Q8_K activation-quant kernel wired into the expert path + DP4A dispatch; >=150 tok/s on RTX 4090 at VRAM <=95%; flips qwen3-moe-forward-gpu-v1 to ACTIVE_RUNTIME. (Requires the #1749 MoE-aware `apr bench` dispatch fix first.)' + - 'RED-turning mutation: `apr bench qwen3-coder-30b-a3b.gguf --device cuda` must report >=150 tok/s (currently the bench path panics on MoE GGUFs, #1749, and the fp32-activation path is below target).' phases: [] subtasks: [] estimated_effort: null @@ -13093,38 +12371,27 @@ roadmap: - github-1583 - github-1838 - from-issue-triage-2026-07-05 - notes: 'Consolidates #1583 (>=150 tok/s throughput target) + #1838 (the CUDA f32->Q8K activation-quant - approach to close v1.8.0). The L47 expert-routing argmax-divergence cascade (47/48 layers >=0.99, - documented in the #1583 thread) is parked separately as a precision-uplift item. Tracks GitHub #1583 - and #1838.' + notes: 'Consolidates #1583 (>=150 tok/s throughput target) + #1838 (the CUDA f32->Q8K activation-quant approach to close v1.8.0). The L47 expert-routing argmax-divergence cascade (47/48 layers >=0.99, documented in the #1583 thread) is parked separately as a precision-uplift item. Tracks GitHub #1583 and #1838.' - id: APR-PERF-GATE-001 github_issue: 2706 item_type: epic title: The receipt rule — a performance number is evidence only if something can prove how it was measured - status: in_progress + status: inprogress priority: critical assigned_to: null - created: &id001 2026-08-27 00:00:00+00:00 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'The epic closes when docs/specifications/PP-LLAMA-001-MASTER.md reaches ARMED. Its section 7.5 - states the conditions, and they are the acceptance criteria of this epic verbatim.' - - 'PP-6, PP-26, PP-27, PP-28, PP-29 and PP-33 are ARMED (both selftest cases present under the exact - names in section 6 of the master).' - - 'PP-2, PP-13, PP-24 and PP-30 are ARMED, which requires the GET /v1/effective-config endpoint - (master section 12 row 6).' - - 'PP-29: scripts/spec_conformance.sh is GREEN inside the guard-runner-labels job, which the bare - required check gate needs at .github/workflows/ci.yml. It replaces the retired mutation registry.' - - 'The JOIN (master section 12 row 7) reproduces the committed zero-GPU fixture to four decimals.' - - 'One MEASURED reference-cell receipt exists at n >= 5 interleaved replicates (master section 12 - row 18), and armed_by is set in scripts/perf-matrix.yaml for every band that PASSES P-5.' - - 'scripts/perf-matrix.yaml carries a delta row with a named author for every gated metric, replacing - the legacy B1/B2 floors, in the same commit.' - - 'F-BATCH-001 passes at every c > 1 (measured 2.45 on lambda, 2.85 on gx10, postcondition < 2)' - - 'Child tickets (41 as of 2026-08-29), linked by github_issue 2706: BENCH-003, PERF-000 .. PERF-037, PERF-039, - PERF-040. PERF-038 was never issued: no commit, branch, PR or issue in any repo mentions it (searched - 2026-08-29), so the sequence is deliberately left with a hole rather than filled with an invented ticket.' + - The epic closes when docs/specifications/PP-LLAMA-001-MASTER.md reaches ARMED. Its section 7.5 states the conditions, and they are the acceptance criteria of this epic verbatim. + - PP-6, PP-26, PP-27, PP-28, PP-29 and PP-33 are ARMED (both selftest cases present under the exact names in section 6 of the master). + - PP-2, PP-13, PP-24 and PP-30 are ARMED, which requires the GET /v1/effective-config endpoint (master section 12 row 6). + - 'PP-29: scripts/spec_conformance.sh is GREEN inside the guard-runner-labels job, which the bare required check gate needs at .github/workflows/ci.yml. It replaces the retired mutation registry.' + - The JOIN (master section 12 row 7) reproduces the committed zero-GPU fixture to four decimals. + - One MEASURED reference-cell receipt exists at n >= 5 interleaved replicates (master section 12 row 18), and armed_by is set in scripts/perf-matrix.yaml for every band that PASSES P-5. + - scripts/perf-matrix.yaml carries a delta row with a named author for every gated metric, replacing the legacy B1/B2 floors, in the same commit. + - F-BATCH-001 passes at every c > 1 (measured 2.45 on lambda, 2.85 on gx10, postcondition < 2) + - 'Child tickets (41 as of 2026-08-29), linked by github_issue 2706: BENCH-003, PERF-000 .. PERF-037, PERF-039, PERF-040. PERF-038 was never issued: no commit, branch, PR or issue in any repo mentions it (searched 2026-08-29), so the sequence is deliberately left with a hole rather than filled with an invented ticket.' phases: [] subtasks: [] estimated_effort: null @@ -13133,17 +12400,7 @@ roadmap: - gate - receipt-rule - epic - notes: 'Governed by docs/specifications/PP-LLAMA-001-MASTER.md since 2026-09-02; the superseded v2.2 - spec is at docs/archive/perf-2026-09-01/ and the reviewed draft it replaced at - docs/archive/perf-2026-09-02/. Status reconciled against origin/main by PERF-040 on 2026-08-29 at - 50d2bc2bb: 0 of 8 scripts/perf-matrix.yaml cells carry a baseline (all UNMEASURED); perf_gate.sh IS - invoked, but only as --selftest at .github/workflows/ci.yml, because nothing on main can write the - receipt its real mode reads (PERF-024/PERF-025, open PR #2744); F-BATCH-001 is RED at c=2 per - contracts/batch-admission-v1.yaml. NO CELL EXPIRES BY DATE ANY MORE. The fixed calendar expiry is - replaced by the derived-expiry rule of the master sections 8 and 12: a cell inherits the latest - expiry among the section 12 obligation rows that block it, computed by scripts/spec_conformance.sh - into evidence/parity/derived_expiries.json, and an expiry moves only by an amendment recorded in the - master Appendix D. On expiry an instrument row makes every cell it blocks FAIL: INSTRUMENT.' + notes: 'Governed by docs/specifications/PP-LLAMA-001-MASTER.md since 2026-09-02; the superseded v2.2 spec is at docs/archive/perf-2026-09-01/ and the reviewed draft it replaced at docs/archive/perf-2026-09-02/. Status reconciled against origin/main by PERF-040 on 2026-08-29 at 50d2bc2bb: 0 of 8 scripts/perf-matrix.yaml cells carry a baseline (all UNMEASURED); perf_gate.sh IS invoked, but only as --selftest at .github/workflows/ci.yml, because nothing on main can write the receipt its real mode reads (PERF-024/PERF-025, open PR #2744); F-BATCH-001 is RED at c=2 per contracts/batch-admission-v1.yaml. NO CELL EXPIRES BY DATE ANY MORE. The fixed calendar expiry is replaced by the derived-expiry rule of the master sections 8 and 12: a cell inherits the latest expiry among the section 12 obligation rows that block it, computed by scripts/spec_conformance.sh into evidence/parity/derived_expiries.json, and an expiry moves only by an amendment recorded in the master Appendix D. On expiry an instrument row makes every cell it blocks FAIL: INSTRUMENT.' - id: BENCH-003 github_issue: 2706 item_type: task @@ -13151,7 +12408,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13161,9 +12418,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: scripts/lib/bench_threshold.py bootstrap_median_floor() - derives the per-host floor by resampling raw samples (landed ce712eae0 / PR #2705). The RFC - 3x-pooled-stddev rule is recorded there as falsified against this repo own data.' + notes: 'VERIFIED on origin/main 2026-08-29: scripts/lib/bench_threshold.py bootstrap_median_floor() derives the per-host floor by resampling raw samples (landed ce712eae0 / PR #2705). The RFC 3x-pooled-stddev rule is recorded there as falsified against this repo own data.' - id: PERF-000 github_issue: 2706 item_type: task @@ -13171,7 +12426,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13181,17 +12436,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: scripts/perf000_serialization_probe.sh (landed ce712eae0 / - PR #2705) carries the pre-recorded prediction; the answer is written into - contracts/batch-admission-v1.yaml F-BATCH-001 measured block.' + notes: 'VERIFIED on origin/main 2026-08-29: scripts/perf000_serialization_probe.sh (landed ce712eae0 / PR #2705) carries the pre-recorded prediction; the answer is written into contracts/batch-admission-v1.yaml F-BATCH-001 measured block.' - id: PERF-001 github_issue: 2706 item_type: task title: Iteration-level scheduling (Orca design) — REAL BUT PARTIAL, F-BATCH-001 red at c=2 - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13201,16 +12454,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: crates/aprender-serve/src/api/iteration_scheduler.rs - implements the Orca (OSDI 2022) design. PARTIAL BY ITS OWN CONTRACT: - contracts/batch-admission-v1.yaml F-BATCH-001 records verdict RED AT c=2 (serialization_index 2.45 >= - 2), so the epic F-BATCH-001 acceptance criterion is NOT met. DOWNGRADED from completed 2026-08-29 by - PERF-041: the credited 3.32x aggregate at N=8 is throughput of GARBAGE tokens. Batched CUDA decode emits a - constant token to the max_tokens cap for every m>1 and never emits a stop token (#2753); the m=1 fast path - in the same run returns coherent English with finish=stop. Aggregate at c=2 is honestly 0.82x of a SINGLE - client. F-BATCH-001 stays RED and the mechanism, not just the margin, is unfinished. PP cross-ref (master - Appendix A): PP-26 (batch-invariance witness) and section 9 defects 2 and 5. Master section 12 row 1 is the - discharging row; no c>1 aggregate may be published while this is red.' + notes: 'VERIFIED on origin/main 2026-08-29: crates/aprender-serve/src/api/iteration_scheduler.rs implements the Orca (OSDI 2022) design. PARTIAL BY ITS OWN CONTRACT: contracts/batch-admission-v1.yaml F-BATCH-001 records verdict RED AT c=2 (serialization_index 2.45 >= 2), so the epic F-BATCH-001 acceptance criterion is NOT met. DOWNGRADED from completed 2026-08-29 by PERF-041: the credited 3.32x aggregate at N=8 is throughput of GARBAGE tokens. Batched CUDA decode emits a constant token to the max_tokens cap for every m>1 and never emits a stop token (#2753); the m=1 fast path in the same run returns coherent English with finish=stop. Aggregate at c=2 is honestly 0.82x of a SINGLE client. F-BATCH-001 stays RED and the mechanism, not just the margin, is unfinished. PP cross-ref (master Appendix A): PP-26 (batch-invariance witness) and section 9 defects 2 and 5. Master section 12 row 1 is the discharging row; no c>1 aggregate may be published while this is red.' - id: PERF-002 github_issue: 2706 item_type: task @@ -13218,7 +12462,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13228,10 +12472,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: contracts/batch-admission-v1.yaml (F-BATCH-002 fast-path - admission, F-BATCH-003 mid-generation join, F-BATCH-004 c=1 latency) cites APR-PERF-GATE-001 s10.1 - step 6 PERF-001/PERF-002. PERF-000 falsified the hang framing: it is a latency regression, not a - deadlock.' + notes: 'VERIFIED on origin/main 2026-08-29: contracts/batch-admission-v1.yaml (F-BATCH-002 fast-path admission, F-BATCH-003 mid-generation join, F-BATCH-004 c=1 latency) cites APR-PERF-GATE-001 s10.1 step 6 PERF-001/PERF-002. PERF-000 falsified the hang framing: it is a latency regression, not a deadlock.' - id: PERF-003 github_issue: 2706 item_type: task @@ -13239,7 +12480,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13249,18 +12490,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: ensure_accelerator_available() in - crates/apr-cli/src/commands/serve/mod.rs returns CliError::FeatureDisabled when an accelerator is - requested and no cuda/wgpu feature is compiled in; contracts/accelerator-request-v1.yaml carries - F-ACCEL-001..007.' + notes: 'VERIFIED on origin/main 2026-08-29: ensure_accelerator_available() in crates/apr-cli/src/commands/serve/mod.rs returns CliError::FeatureDisabled when an accelerator is requested and no cuda/wgpu feature is compiled in; contracts/accelerator-request-v1.yaml carries F-ACCEL-001..007.' - id: PERF-004 github_issue: 2706 item_type: task title: Receipt schema v2.2 — all metrics, workload, tokenization, scheduler block, drain - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13270,15 +12508,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from completed 2026-08-29. Schema half IS on origin/main - (scripts/lib/bench_receipt.py plus its 14-case discrimination table; perf_gate.sh arm_c_integrity - requires tokenization.method and drain_ms; crates/aprender-test-lib/src/perf_gate/receipt.rs names - the s4.4.9 scheduler block). Producer-mapping half is NOT: scripts/perf-receipt-fields.yaml, - scripts/lib/perf_receipt.py and check_perf_receipt_fields_have_producers.sh are ABSENT from - origin/main, PR #2716 was CLOSED unmerged, and PR #2711 held PERF-004-SCHEMA back after adversarial - verification found its claimed end-to-end run could not have executed. Branch feat/perf-004-schema - pushed. PP cross-ref (master Appendix A): PP-2, PP-13 and PP-30 (server-reported config, no inferred field, - started_utc plus clock_source); also PP-4, PP-10 and PP-11. Master section 12 row 6.' + notes: 'CORRECTED from completed 2026-08-29. Schema half IS on origin/main (scripts/lib/bench_receipt.py plus its 14-case discrimination table; perf_gate.sh arm_c_integrity requires tokenization.method and drain_ms; crates/aprender-test-lib/src/perf_gate/receipt.rs names the s4.4.9 scheduler block). Producer-mapping half is NOT: scripts/perf-receipt-fields.yaml, scripts/lib/perf_receipt.py and check_perf_receipt_fields_have_producers.sh are ABSENT from origin/main, PR #2716 was CLOSED unmerged, and PR #2711 held PERF-004-SCHEMA back after adversarial verification found its claimed end-to-end run could not have executed. Branch feat/perf-004-schema pushed. PP cross-ref (master Appendix A): PP-2, PP-13 and PP-30 (server-reported config, no inferred field, started_utc plus clock_source); also PP-4, PP-10 and PP-11. Master section 12 row 6.' - id: PERF-005 github_issue: 2706 item_type: task @@ -13286,7 +12516,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13296,18 +12526,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: the GPU-less device test is the pair in - crates/apr-cli/src/commands/serve/mod.rs tests: the_refusal_is_total_over_every_input (exhaustive - over all 16 input cells, Err exactly when a request cannot be honoured) and - the_guard_is_actually_wired_into_run (fails if run() stops calling the check).' + notes: 'VERIFIED on origin/main 2026-08-29: the GPU-less device test is the pair in crates/apr-cli/src/commands/serve/mod.rs tests: the_refusal_is_total_over_every_input (exhaustive over all 16 input cells, Err exactly when a request cannot be honoured) and the_guard_is_actually_wired_into_run (fails if run() stops calling the check).' - id: PERF-006 github_issue: 2706 item_type: task title: One compute_class() and max_in_flight -> banner, /health, receipt (andon) - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13317,13 +12544,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. NOT on origin/main: - crates/aprender-test-lib/src/perf_gate/mod.rs:310 asserts max_in_flight is neither emitted nor - classified, and the only compute_class() is the bench-local one in - crates/apr-cli/src/commands/bench.rs:283, not one function feeding banner + /health + receipt. Open - PR #2711 (branch feat/receipt-rule-b2, pushed) carries the andon commit. PP cross-ref (master Appendix A): - PP-2, PP-13 and PP-16. compute_class must be the dispatch path taken, read from the process, and - max_in_flight must be server-reported. Master section 12 row 6.' + notes: 'CORRECTED from planned 2026-08-29. NOT on origin/main: crates/aprender-test-lib/src/perf_gate/mod.rs:310 asserts max_in_flight is neither emitted nor classified, and the only compute_class() is the bench-local one in crates/apr-cli/src/commands/bench.rs:283, not one function feeding banner + /health + receipt. Open PR #2711 (branch feat/receipt-rule-b2, pushed) carries the andon commit. PP cross-ref (master Appendix A): PP-2, PP-13 and PP-16. compute_class must be the dispatch path taken, read from the process, and max_in_flight must be server-reported. Master section 12 row 6.' - id: PERF-007 github_issue: 2706 item_type: task @@ -13331,7 +12552,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13341,11 +12562,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. Searched origin/main (scripts/, .github/, contracts/, docs/) for - a signed receipt push or a staleness arm: no artifact. gh search issues/prs --repo paiml/infra - PERF-007 returns []. No aprender branch or open PR references it. PP cross-ref (master Appendix A): PP-21 - (signature valid and covering the commit under test), with PP-20 for the pin staleness half. Master section - 12 rows 0c and 12.' + notes: 'CONFIRMED planned 2026-08-29. Searched origin/main (scripts/, .github/, contracts/, docs/) for a signed receipt push or a staleness arm: no artifact. gh search issues/prs --repo paiml/infra PERF-007 returns []. No aprender branch or open PR references it. PP cross-ref (master Appendix A): PP-21 (signature valid and covering the commit under test), with PP-20 for the pin staleness half. Master section 12 rows 0c and 12.' - id: PERF-008 github_issue: 2706 item_type: task @@ -13353,7 +12570,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13363,10 +12580,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. On origin/main: scripts/check_no_fabricated_baselines.sh - (+545 lines, shape matching not literals) and scripts/fabricated_baseline_rust_sites.txt (73 lines, - the committed true count), landed de8fbc407 / PR #2710. The shrink-only claim it printed but did not - enforce was armed in 50d2bc2bb / PR #2733 via scripts/check_baseline_ratchets.sh. proof:scripts/check_no_fabricated_baselines.sh' + notes: 'CORRECTED from planned 2026-08-29. On origin/main: scripts/check_no_fabricated_baselines.sh (+545 lines, shape matching not literals) and scripts/fabricated_baseline_rust_sites.txt (73 lines, the committed true count), landed de8fbc407 / PR #2710. The shrink-only claim it printed but did not enforce was armed in 50d2bc2bb / PR #2733 via scripts/check_baseline_ratchets.sh. proof:scripts/check_no_fabricated_baselines.sh' - id: PERF-009 github_issue: 2706 item_type: task @@ -13374,7 +12588,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13384,9 +12598,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: scripts/check_no_competing_harnesses.sh (landed ce712eae0 / - PR #2705) names apr test llm bench canonical at BASELINE=0 and the shrink-only baseline is enforced - by check_baseline_ratchets.sh.' + notes: 'VERIFIED on origin/main 2026-08-29: scripts/check_no_competing_harnesses.sh (landed ce712eae0 / PR #2705) names apr test llm bench canonical at BASELINE=0 and the shrink-only baseline is enforced by check_baseline_ratchets.sh.' - id: PERF-010 github_issue: 2706 item_type: task @@ -13394,7 +12606,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13404,11 +12616,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. On origin/main: scripts/check_perf_claims_cite_receipts.sh - (339 lines), scripts/perf_claim_citation_baseline.txt (156 lines), the widened - scripts/check_no_claim_literals.sh and the book/ edits, all landed de8fbc407 / PR #2710. RESIDUAL, - open in PR #2742: the [X]-figure detector caught 1 of 6 shapes and missed the U+00D7 form the epic - own headline fabrication is written in. proof:scripts/check_perf_claims_cite_receipts.sh' + notes: 'CORRECTED from planned 2026-08-29. On origin/main: scripts/check_perf_claims_cite_receipts.sh (339 lines), scripts/perf_claim_citation_baseline.txt (156 lines), the widened scripts/check_no_claim_literals.sh and the book/ edits, all landed de8fbc407 / PR #2710. RESIDUAL, open in PR #2742: the [X]-figure detector caught 1 of 6 shapes and missed the U+00D7 form the epic own headline fabrication is written in. proof:scripts/check_perf_claims_cite_receipts.sh' - id: PERF-011 github_issue: 2706 item_type: task @@ -13416,7 +12624,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13426,19 +12634,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. -DGGML_CUDA_ARCHITECTURES=121 appears on origin/main only as - prose (the spec at lines 509 and 690, and .claude/skills/apr-dogfood/SKILL.md) - no build script, no - receipt, no proof. gh search issues/prs --repo paiml/infra PERF-011 returns []. Blocks the gx10 - comparator cells. PP cross-ref (master Appendix A): PP-20 (the comparator pin carries commit, cmake line, - template and expiry) and master section 12 row 15, the gx10 shakedown cell.' + notes: 'CONFIRMED planned 2026-08-29. -DGGML_CUDA_ARCHITECTURES=121 appears on origin/main only as prose (the spec at lines 509 and 690, and .claude/skills/apr-dogfood/SKILL.md) - no build script, no receipt, no proof. gh search issues/prs --repo paiml/infra PERF-011 returns []. Blocks the gx10 comparator cells. PP cross-ref (master Appendix A): PP-20 (the comparator pin carries commit, cmake line, template and expiry) and master section 12 row 15, the gx10 shakedown cell.' - id: PERF-012 github_issue: 2706 item_type: task title: mini c=8/c=16 — measure or re-decide NOT_APPLICABLE - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13448,19 +12652,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. Branch evidence/perf-012-mini is PUSHED (9aae2e13f, - evidence/perf-012-mini/findings.md plus 8 raw band JSONs) and concludes mini serializes on arm64 too - and its Metal path does not exist. NOT on origin/main and NO PR is open, so the finding is currently - unreviewable and uncitable by the gate. PP cross-ref (master Appendix A): PP-16 and PP-24. The master - decides mini as NA with decided_by rather than a permanent UNMEASURED; master section 12 row 5.' + notes: 'CORRECTED from planned 2026-08-29. Branch evidence/perf-012-mini is PUSHED (9aae2e13f, evidence/perf-012-mini/findings.md plus 8 raw band JSONs) and concludes mini serializes on arm64 too and its Metal path does not exist. NOT on origin/main and NO PR is open, so the finding is currently unreviewable and uncitable by the gate. PP cross-ref (master Appendix A): PP-16 and PP-24. The master decides mini as NA with decided_by rather than a permanent UNMEASURED; master section 12 row 5.' - id: PERF-013 github_issue: 2706 item_type: task title: Dedicated single-agent intel label; forjar apply + deploy + verify - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13470,11 +12670,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. paiml/infra#338 is MERGED - the perf-solo label ships at - cardinality 1 on intel-clean-room-16 - but it closed with one item explicitly unproven: no job has - ever run on the label. Open PR #2720 (branch perf/perf-solo-lane-receipt, pushed) puts perf-solo on - the BEAT speed lane runs-on and records RUNNER_NAME. PP cross-ref (master Appendix A): PP-19 (one global - concurrency group per host, cancel-in-progress false, no foreign compute PID). Master section 12 row 12.' + notes: 'CORRECTED from planned 2026-08-29. paiml/infra#338 is MERGED - the perf-solo label ships at cardinality 1 on intel-clean-room-16 - but it closed with one item explicitly unproven: no job has ever run on the label. Open PR #2720 (branch perf/perf-solo-lane-receipt, pushed) puts perf-solo on the BEAT speed lane runs-on and records RUNNER_NAME. PP cross-ref (master Appendix A): PP-19 (one global concurrency group per host, cancel-in-progress false, no foreign compute PID). Master section 12 row 12.' - id: PERF-014 github_issue: 2706 item_type: task @@ -13482,7 +12678,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13492,9 +12688,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: crates/apr-cli/src/commands/profile_print_hotspot.rs was - rewritten in ce712eae0 / PR #2705 and again in de8fbc407 / PR #2710; profile.rs:389 now names the - PERF-014 shape as the pattern to refuse.' + notes: 'VERIFIED on origin/main 2026-08-29: crates/apr-cli/src/commands/profile_print_hotspot.rs was rewritten in ce712eae0 / PR #2705 and again in de8fbc407 / PR #2710; profile.rs:389 now names the PERF-014 shape as the pattern to refuse.' - id: PERF-015 github_issue: 2706 item_type: task @@ -13502,7 +12696,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13512,9 +12706,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED on origin/main 2026-08-29: crates/apr-cli/src/commands/kernel.rs:348 - PERF-015: - returns (hotspots, wall_us, tokens), the pass now times ITSELF - and kernel.rs:200 records that both - terms of the ratio come from the SAME pass (landed ce712eae0 / PR #2705).' + notes: 'VERIFIED on origin/main 2026-08-29: crates/apr-cli/src/commands/kernel.rs:348 - PERF-015: returns (hotspots, wall_us, tokens), the pass now times ITSELF - and kernel.rs:200 records that both terms of the ratio come from the SAME pass (landed ce712eae0 / PR #2705).' - id: PERF-016 github_issue: 2706 item_type: task @@ -13522,7 +12714,7 @@ roadmap: status: completed priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13532,10 +12724,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. On origin/main: - crates/apr-cli/src/commands/profile_perf016_tests.rs (198 lines) plus the annotated call sites in - profile_ollama.rs:224/347/437 and profile.rs:380, landed de8fbc407 / PR #2710. The audit found a - third fabricated causal claim and a guard that was GREEN on it. proof:crates/apr-cli/src/commands/profile_perf016_tests.rs' + notes: 'CORRECTED from planned 2026-08-29. On origin/main: crates/apr-cli/src/commands/profile_perf016_tests.rs (198 lines) plus the annotated call sites in profile_ollama.rs:224/347/437 and profile.rs:380, landed de8fbc407 / PR #2710. The audit found a third fabricated causal claim and a guard that was GREEN on it. proof:crates/apr-cli/src/commands/profile_perf016_tests.rs' - id: PERF-017 github_issue: 2706 item_type: task @@ -13543,7 +12732,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13553,11 +12742,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. scripts/perf_gate.sh has arm_e_interference() but it is REPORTING - only (W2, and W2 has no injector - see PERF-020); nothing on origin/main ratchets Arm E. Depends on - PERF-001, whose F-BATCH-001 is still RED at c=2. No branch, no PR. PP cross-ref (master Appendix A): PP-4 - (prefill is first-class and present on every band) and PP-31 (per-band ratchets seeded at the last MEASURED - receipt). Arm E becomes itl_p95, REPORTING.' + notes: 'CONFIRMED planned 2026-08-29. scripts/perf_gate.sh has arm_e_interference() but it is REPORTING only (W2, and W2 has no injector - see PERF-020); nothing on origin/main ratchets Arm E. Depends on PERF-001, whose F-BATCH-001 is still RED at c=2. No branch, no PR. PP cross-ref (master Appendix A): PP-4 (prefill is first-class and present on every band) and PP-31 (per-band ratchets seeded at the last MEASURED receipt). Arm E becomes itl_p95, REPORTING.' - id: PERF-018 github_issue: 2706 item_type: task @@ -13565,7 +12750,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13575,19 +12760,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. scripts/perf_gate.sh has arm_d_memory() in REPORTING mode; no - block table or paged KV allocator exists under crates/aprender-serve/src on origin/main. Depends on - PERF-001. No branch, no PR. PP cross-ref (master Appendix A): PP-24 (slots_admitted and the derived ladder) - and PP-2 (kv_per_slot, kv_bytes_reserved and vram_peak reported by the server). Arm D becomes REPORTING - fields in PP-2.' + notes: 'CONFIRMED planned 2026-08-29. scripts/perf_gate.sh has arm_d_memory() in REPORTING mode; no block table or paged KV allocator exists under crates/aprender-serve/src on origin/main. Depends on PERF-001. No branch, no PR. PP cross-ref (master Appendix A): PP-24 (slots_admitted and the derived ladder) and PP-2 (kv_per_slot, kv_bytes_reserved and vram_peak reported by the server). Arm D becomes REPORTING fields in PP-2.' - id: PERF-019 github_issue: 2706 item_type: task title: One client, both servers; retire llama-bench from the comparator path - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13597,21 +12778,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. scripts/check_comparator_one_client.sh is ABSENT from - origin/main. PR #2713 was CLOSED unmerged; PR #2711 explicitly held PERF-019 back because its guard - has a vacuous pass one level below where it believed it closed one (the sentinel proves the filter - engaged, nothing proves the walker did). Branch feat/perf-019-oneclient pushed; carried in open PR - #2742. PP cross-ref (master Appendix A): PP-25 (one client binary drives both lanes, its sha256 in the - receipt) and master section 5.3, which retires llama-bench from the comparator path entirely. Master section - 12 row 7.' + notes: 'CORRECTED from planned 2026-08-29. scripts/check_comparator_one_client.sh is ABSENT from origin/main. PR #2713 was CLOSED unmerged; PR #2711 explicitly held PERF-019 back because its guard has a vacuous pass one level below where it believed it closed one (the sentinel proves the filter engaged, nothing proves the walker did). Branch feat/perf-019-oneclient pushed; carried in open PR #2742. PP cross-ref (master Appendix A): PP-25 (one client binary drives both lanes, its sha256 in the receipt) and master section 5.3, which retires llama-bench from the comparator path entirely. Master section 12 row 7.' - id: PERF-020 github_issue: 2706 item_type: task title: Workload W2 corpus + injector; Arms D and E, REPORTING - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13621,20 +12796,15 @@ roadmap: labels: - perf - receipt-rule - notes: 'CORRECTED from planned 2026-08-29. Arms D and E exist in scripts/perf_gate.sh on origin/main in - REPORTING mode, and crates/aprender-serve/benchmarks/qwen-coder/prompts-w2.jsonl is committed - but - crates/aprender-test-lib/src/perf_gate/mod.rs:134 declares the Arm E out-of-band injector unproduced, - and PR #2746 (PERF-039) shows the corpus was unreadable by the only loader in the tree, so nothing - had ever parsed that file. PP cross-ref (master Appendix A): master section 5.1 workload W2, REPORTING, and - PP-4 (agg, dec and prefill on every band).' + notes: 'CORRECTED from planned 2026-08-29. Arms D and E exist in scripts/perf_gate.sh on origin/main in REPORTING mode, and crates/aprender-serve/benchmarks/qwen-coder/prompts-w2.jsonl is committed - but crates/aprender-test-lib/src/perf_gate/mod.rs:134 declares the Arm E out-of-band injector unproduced, and PR #2746 (PERF-039) shows the corpus was unreadable by the only loader in the tree, so nothing had ever parsed that file. PP cross-ref (master Appendix A): master section 5.1 workload W2, REPORTING, and PP-4 (agg, dec and prefill on every band).' - id: PERF-021 github_issue: 2706 item_type: task title: Accelerator contract — retire boolean --gpu for a quantity, resolved-quantity reporting - status: in_progress + status: inprogress priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13644,13 +12814,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'VERIFIED PARTIAL on origin/main 2026-08-29: GpuLayerRequest - (crates/apr-cli/src/commands/serve/types.rs:504), --gpu-layers, --device and --list-devices - (serve_commands.rs, dispatch_run.rs:184) all ship, and explicit-wins is enforced at - serve/mod.rs:83-95. Open PR #2707 (branch feat/perf-021-landing, pushed, 9 commits) reports that two - of three surfaces verified nothing, so in_progress is correct. PP cross-ref (master Appendix A): PP-15 (no - boolean accelerator flag on any surface; a quantity with a server-reported resolved value). Master section - 12 row 0d, section 9 defect 9.' + notes: 'VERIFIED PARTIAL on origin/main 2026-08-29: GpuLayerRequest (crates/apr-cli/src/commands/serve/types.rs:504), --gpu-layers, --device and --list-devices (serve_commands.rs, dispatch_run.rs:184) all ship, and explicit-wins is enforced at serve/mod.rs:83-95. Open PR #2707 (branch feat/perf-021-landing, pushed, 9 commits) reports that two of three surfaces verified nothing, so in_progress is correct. PP cross-ref (master Appendix A): PP-15 (no boolean accelerator flag on any surface; a quantity with a server-reported resolved value). Master section 12 row 0d, section 9 defect 9.' - id: PERF-022 github_issue: 2706 item_type: task @@ -13658,7 +12822,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13668,12 +12832,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. The O-1 three-way choice is recorded only as a spec question - (APR-PERF-GATE-001-v2.2.md line 1098); no five-whys and no costing exists on origin/main. PR #2707 - states plainly that none of its work ships CUDA in the published artifact and that no code change - substitutes for this decision. Operator-owned escalation. PP cross-ref (master Appendix A): PP-19. Any - distribution option that puts two runs on one device breaks the isolation rule, so the cost of each option - is a cost against PP-19. Master section 12 row 12.' + notes: 'CONFIRMED planned 2026-08-29. The O-1 three-way choice is recorded only as a spec question (APR-PERF-GATE-001-v2.2.md line 1098); no five-whys and no costing exists on origin/main. PR #2707 states plainly that none of its work ships CUDA in the published artifact and that no code change substitutes for this decision. Operator-owned escalation. PP cross-ref (master Appendix A): PP-19. Any distribution option that puts two runs on one device breaks the isolation rule, so the cost of each option is a cost against PP-19. Master section 12 row 12.' - id: PERF-023 github_issue: 2706 item_type: task @@ -13681,7 +12840,7 @@ roadmap: status: planned priority: high assigned_to: null - created: *id001 + created: 2026-08-27 00:00:00+00:00 updated: 2026-08-29 00:00:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: [] @@ -13691,17 +12850,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'CONFIRMED planned 2026-08-29. Filed by PR #2707, which REFUSES a partial --gpu-layers request - rather than rounding it, because OwnedQuantizedModelCuda takes no layer count and uploads every - layer. The free-VRAM query that would let a partial request be honoured does not exist in any apr - build. No branch, no PR of its own. PP cross-ref (master Appendix A): PP-2 and PP-24. The free-VRAM query is - the unrecorded input of master section 9 defect 7 and of the registered max_batch prediction in section 10. - Master section 12 row 6.' + notes: 'CONFIRMED planned 2026-08-29. Filed by PR #2707, which REFUSES a partial --gpu-layers request rather than rounding it, because OwnedQuantizedModelCuda takes no layer count and uploads every layer. The free-VRAM query that would let a partial request be honoured does not exist in any apr build. No branch, no PR of its own. PP cross-ref (master Appendix A): PP-2 and PP-24. The free-VRAM query is the unrecorded input of master section 9 defect 7 and of the registered max_batch prediction in section 10. Master section 12 row 6.' - id: PERF-024 github_issue: 2706 item_type: task - title: 'Conformant s4.4 measurement protocol for the load test - termination rule, drain_ms, tokenization block' - status: in_progress + title: Conformant s4.4 measurement protocol for the load test - termination rule, drain_ms, tokenization block + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13714,18 +12868,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. NOT on origin/main: - crates/aprender-test-lib/src/llm/band.rs and perf_gate/{bootstrap,metrics}.rs are absent, and main - own perf_gate/mod.rs names the integration work as a separate ticket. PR #2717 CLOSED unmerged; - branch feat/perf-024-conformant-client pushed; carried in open PR #2744 (stacked on #2742). PP cross-ref - (master Appendix A): PP-27 and PP-28 (streaming with a dual witness; temperature, seed, ignore_eos and - max_tokens on the wire; completion_tokens equal to n_predict), with PP-10 and PP-11 for drain and - tokenization. Master section 5.1 and section 12 row 0b.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. NOT on origin/main: crates/aprender-test-lib/src/llm/band.rs and perf_gate/{bootstrap,metrics}.rs are absent, and main own perf_gate/mod.rs names the integration work as a separate ticket. PR #2717 CLOSED unmerged; branch feat/perf-024-conformant-client pushed; carried in open PR #2744 (stacked on #2742). PP cross-ref (master Appendix A): PP-27 and PP-28 (streaming with a dual witness; temperature, seed, ignore_eos and max_tokens on the wire; completion_tokens equal to n_predict), with PP-10 and PP-11 for drain and tokenization. Master section 5.1 and section 12 row 0b.' - id: PERF-025 github_issue: 2706 item_type: task - title: 'apr test llm bench --band - give the s4.4 protocol a caller and perf_gate.sh real mode an input' - status: in_progress + title: apr test llm bench --band - give the s4.4 protocol a caller and perf_gate.sh real mode an input + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13738,17 +12886,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. This is the ticket - the operator note calls the band CLI. On 50d2bc2bb a grep for - ReceiptInput/BandInput/DerivedBand/perf_gate:: outside the module returns rc=1 - nothing calls the - protocol or the receipt producer, and perf_gate.sh real mode is invoked nowhere (only --selftest, - ci.yml:1011). Open PR #2744; abandoned branch feat/n1-band-cli contributed the shape only. PP cross-ref - (master Appendix A): PP-4 and PP-7 (all three metrics per band; raw per-request samples retained). Master - section 12 rows 0b and 7.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. This is the ticket the operator note calls the band CLI. On 50d2bc2bb a grep for ReceiptInput/BandInput/DerivedBand/perf_gate:: outside the module returns rc=1 - nothing calls the protocol or the receipt producer, and perf_gate.sh real mode is invoked nowhere (only --selftest, ci.yml:1011). Open PR #2744; abandoned branch feat/n1-band-cli contributed the shape only. PP cross-ref (master Appendix A): PP-4 and PP-7 (all three metrics per band; raw per-request samples retained). Master section 12 rows 0b and 7.' - id: PERF-026 github_issue: 2706 item_type: task - title: 'drain_ms producer and receipt emitter - the gate demanded a field nothing in the repo could write' + title: drain_ms producer and receipt emitter - the gate demanded a field nothing in the repo could write status: completed priority: high assigned_to: null @@ -13762,15 +12904,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: crates/aprender-test-lib/src/perf_gate/drain.rs (778 lines) and perf_gate/receipt.rs - (537 lines), landed 50d2bc2bb / PR #2733. receipt.rs refuses to synthesise what it cannot measure and - names every absent field in unproduced_fields with its reason. PR #2724 was CLOSED unmerged; the - batch is what landed. proof:crates/aprender-test-lib/src/perf_gate/drain.rs' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: crates/aprender-test-lib/src/perf_gate/drain.rs (778 lines) and perf_gate/receipt.rs (537 lines), landed 50d2bc2bb / PR #2733. receipt.rs refuses to synthesise what it cannot measure and names every absent field in unproduced_fields with its reason. PR #2724 was CLOSED unmerged; the batch is what landed. proof:crates/aprender-test-lib/src/perf_gate/drain.rs' - id: PERF-027 github_issue: 2706 item_type: task - title: 'Six guards named the CODE for failures that were the HOST - one classifier, eleven decision points' + title: Six guards named the CODE for failures that were the HOST - one classifier, eleven decision points status: completed priority: high assigned_to: null @@ -13784,15 +12922,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: scripts/cargo_classify.sh (265 lines, sourceable and option-neutral) applied at 11 - decision points across check_facade_compat.sh, check_book_examples_compile.sh, - check_format_sovereignty.sh, check_wasm32_core_builds.sh, check_lockfile_current.sh and - check_readme_claims.sh, plus scripts/lib/cargo_failure_cases/ - landed 50d2bc2bb / PR #2733. proof:scripts/cargo_classify.sh' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: scripts/cargo_classify.sh (265 lines, sourceable and option-neutral) applied at 11 decision points across check_facade_compat.sh, check_book_examples_compile.sh, check_format_sovereignty.sh, check_wasm32_core_builds.sh, check_lockfile_current.sh and check_readme_claims.sh, plus scripts/lib/cargo_failure_cases/ - landed 50d2bc2bb / PR #2733. proof:scripts/cargo_classify.sh' - id: PERF-028 github_issue: 2706 item_type: task - title: 'Twelve baselines said SHRINK-ONLY and compared against nothing' + title: Twelve baselines said SHRINK-ONLY and compared against nothing status: completed priority: high assigned_to: null @@ -13806,14 +12940,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: scripts/check_baseline_ratchets.sh (358 lines) and scripts/lib_baseline_ratchet.sh (284 - lines), landed 50d2bc2bb / PR #2733. Open PR #2742 extends it to tell a detector WIDENING from - LAUNDERING, which PERF-010 needed. proof:scripts/lib_baseline_ratchet.sh' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: scripts/check_baseline_ratchets.sh (358 lines) and scripts/lib_baseline_ratchet.sh (284 lines), landed 50d2bc2bb / PR #2733. Open PR #2742 extends it to tell a detector WIDENING from LAUNDERING, which PERF-010 needed. proof:scripts/lib_baseline_ratchet.sh' - id: PERF-029 github_issue: 2706 item_type: task - title: 'A dead byte-identical benchmark client, and 169 tests that ran only by feature-unification accident' + title: A dead byte-identical benchmark client, and 169 tests that ran only by feature-unification accident status: completed priority: high assigned_to: null @@ -13827,13 +12958,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: crates/aprender-serve/src/http_client/preflight.rs (370 lines, same sha256 as its - sibling benchmark_runner.rs) no longer exists in the tree; deleted in 50d2bc2bb / PR #2733. proof:PR#2733' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: crates/aprender-serve/src/http_client/preflight.rs (370 lines, same sha256 as its sibling benchmark_runner.rs) no longer exists in the tree; deleted in 50d2bc2bb / PR #2733. proof:PR#2733' - id: PERF-030 github_issue: 2706 item_type: task - title: 'The receipt producer recorded accel_absent for every accelerator - SIGPIPE under pipefail' + title: The receipt producer recorded accel_absent for every accelerator - SIGPIPE under pipefail status: completed priority: high assigned_to: null @@ -13847,15 +12976,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: scripts/parity_host_receipt.sh now reads both accelerator probes from herestrings, never - a pipe, with the measurement in the comment (141 on 10/10 repeats with pipefail, 0 without, pattern - matches 5 times). Found on gx10, reproduced on lambda, landed 50d2bc2bb / PR #2733. proof:scripts/parity_host_receipt.sh' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: scripts/parity_host_receipt.sh now reads both accelerator probes from herestrings, never a pipe, with the measurement in the comment (141 on 10/10 repeats with pipefail, 0 without, pattern matches 5 times). Found on gx10, reproduced on lambda, landed 50d2bc2bb / PR #2733. proof:scripts/parity_host_receipt.sh' - id: PERF-031 github_issue: 2706 item_type: task - title: 'Run the BEAT speed lane on perf-solo and make the job name its own runner' - status: in_progress + title: Run the BEAT speed lane on perf-solo and make the job name its own runner + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13868,15 +12994,11 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2720 - (branch perf/perf-solo-lane-receipt, pushed). It is the half PERF-013 left unproven: all 16 agents on - intel report hostname mac-server, so RUNNER_NAME is the only field that can say which agent served a - job. PP cross-ref (master Appendix A): PP-19. A speed lane that shares a host with any other job is the - confound PP-19 exists to remove. Master section 12 row 12.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2720 (branch perf/perf-solo-lane-receipt, pushed). It is the half PERF-013 left unproven: all 16 agents on intel report hostname mac-server, so RUNNER_NAME is the only field that can say which agent served a job. PP cross-ref (master Appendix A): PP-19. A speed lane that shares a host with any other job is the confound PP-19 exists to remove. Master section 12 row 12.' - id: PERF-032 github_issue: 2706 item_type: task - title: 'check_hardcoded_paths --full has never gated anything; 20 shipped paths landed behind it' + title: check_hardcoded_paths --full has never gated anything; 20 shipped paths landed behind it status: completed priority: high assigned_to: null @@ -13890,15 +13012,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on - origin/main: scripts/check_hardcoded_paths.sh (+158 lines) and - scripts/hardcoded_path_shipped_baseline.txt, with the --full mode now invoked from - .github/workflows/ci.yml; landed 50d2bc2bb / PR #2733. proof:scripts/check_hardcoded_paths.sh' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. VERIFIED on origin/main: scripts/check_hardcoded_paths.sh (+158 lines) and scripts/hardcoded_path_shipped_baseline.txt, with the --full mode now invoked from .github/workflows/ci.yml; landed 50d2bc2bb / PR #2733. proof:scripts/check_hardcoded_paths.sh' - id: PERF-033 github_issue: 2706 item_type: task - title: 'The comparator pin was global while its builds are per-host, and it accepted a bare prefix' - status: in_progress + title: The comparator pin was global while its builds are per-host, and it accepted a bare prefix + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13911,16 +13030,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 - (branch feat/p1-batch2, pushed; merged from feat/m1-pin). gx10 was pointed at one of four llama.cpp - trees, and a pin of 23b8cc4 accepted two different trees at rc=0. Not on origin/main. PP cross-ref (master - Appendix A): PP-20, and master section 5.3, which makes the pin a per-band template with pinned_on and - pin_expiry. Master section 12 row 3.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 (branch feat/p1-batch2, pushed; merged from feat/m1-pin). gx10 was pointed at one of four llama.cpp trees, and a pin of 23b8cc4 accepted two different trees at rc=0. Not on origin/main. PP cross-ref (master Appendix A): PP-20, and master section 5.3, which makes the pin a per-band template with pinned_on and pin_expiry. Master section 12 row 3.' - id: PERF-034 github_issue: 2706 item_type: task - title: 'The decode sampler full-sorted 152,064 logits per token to keep 40' - status: in_progress + title: The decode sampler full-sorted 152,064 logits per token to keep 40 + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13933,16 +13048,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 - (branch feat/p1-batch2, pushed; merged from feat/m2-alloc). Reported 4.00 allocs/token and 5,474,948 - B -> 0.00 and 0, about 10.4x; its allocation harness is only correct under --test-threads=1, fixed in - the same branch. Not on origin/main. PP cross-ref (master Appendix A): master section 9 defect 4 (decode at - c=1 is a gated metric under P-3) and PP-28, since the sampler is pinned on the wire for both lanes.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 (branch feat/p1-batch2, pushed; merged from feat/m2-alloc). Reported 4.00 allocs/token and 5,474,948 B -> 0.00 and 0, about 10.4x; its allocation harness is only correct under --test-threads=1, fixed in the same branch. Not on origin/main. PP cross-ref (master Appendix A): master section 9 defect 4 (decode at c=1 is a gated metric under P-3) and PP-28, since the sampler is pinned on the wire for both lanes.' - id: PERF-035 github_issue: 2706 item_type: task - title: 'CUDA was built by no required check, and a 4,545-line CUDA path had never compiled once' - status: in_progress + title: CUDA was built by no required check, and a 4,545-line CUDA path had never compiled once + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13955,17 +13066,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 - (branch feat/p1-batch2, pushed; merged from feat/m3-cuda-ci). A type error in - aprender-serve/src/cuda/mod.rs left the required scope green. Not on origin/main. PP cross-ref (master - Appendix A): master section 9 defect 8, whose lever is now server_config.build_features_cli from GET - /v1/effective-config (PP-2) rather than a harness flag (PP-13); PP-18 for the ancestor check on the - measuring binaries.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 (branch feat/p1-batch2, pushed; merged from feat/m3-cuda-ci). A type error in aprender-serve/src/cuda/mod.rs left the required scope green. Not on origin/main. PP cross-ref (master Appendix A): master section 9 defect 8, whose lever is now server_config.build_features_cli from GET /v1/effective-config (PP-2) rather than a harness flag (PP-13); PP-18 for the ancestor check on the measuring binaries.' - id: PERF-036 github_issue: 2706 item_type: task - title: '215 hardcoded machine paths in aprender-serve, across 185 files' - status: in_progress + title: 215 hardcoded machine paths in aprender-serve, across 185 files + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -13978,17 +13084,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 - (branch feat/p1-batch2, pushed; merged from feat/m5-serve-paths). The population PERF-032 ratchet now - refuses to grow. Not on origin/main. PP cross-ref (master Appendix A): no invariant maps directly. It is a - precondition of master section 12 row 15, the gx10 shakedown cell: a receipt is reproducible only if the - paths it names exist on a host other than the author machine (PP-18 is the provenance half of the same - requirement).' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2738 (branch feat/p1-batch2, pushed; merged from feat/m5-serve-paths). The population PERF-032 ratchet now refuses to grow. Not on origin/main. PP cross-ref (master Appendix A): no invariant maps directly. It is a precondition of master section 12 row 15, the gx10 shakedown cell: a receipt is reproducible only if the paths it names exist on a host other than the author machine (PP-18 is the provenance half of the same requirement).' - id: PERF-037 github_issue: 2706 item_type: task - title: 'The chain only two harness invocations were swallowed, and the harness wrote its receipt before validating' - status: in_progress + title: The chain only two harness invocations were swallowed, and the harness wrote its receipt before validating + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -14001,18 +13102,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2741 - (branch feat/r3-batch3, pushed). A fabricated PASS, not a late diagnosis: test_llm.rs:118 writes - --output before :139 validates, so a swallowed refusal left a well-formed report the producer read as - a sample - measured rc=0 and lane PASS on a run where 3 of 10 requests died. Not on origin/main. - PP cross-ref (master Appendix A): PP-10 (nothing issued at or after window close; drained requests recorded with - drain_ms) and PP-21 (the receipt is signed after it is complete, never before). Master section 12 rows 0b - and 0c.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2741 (branch feat/r3-batch3, pushed). A fabricated PASS, not a late diagnosis: test_llm.rs:118 writes --output before :139 validates, so a swallowed refusal left a well-formed report the producer read as a sample - measured rc=0 and lane PASS on a run where 3 of 10 requests died. Not on origin/main. PP cross-ref (master Appendix A): PP-10 (nothing issued at or after window close; drained requests recorded with drain_ms) and PP-21 (the receipt is signed after it is complete, never before). Master section 12 rows 0b and 0c.' - id: PERF-039 github_issue: 2706 item_type: task - title: 'W1 corpus had three formats and no file, and seed/ignore_eos had no wire representation' - status: in_progress + title: W1 corpus had three formats and no file, and seed/ignore_eos had no wire representation + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -14025,18 +13120,12 @@ roadmap: labels: - perf - receipt-rule - notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2746 - (branch feat/t2-batch4, pushed). The spec said prompts-w1.jsonl, the only loader parsed YAML, the CLI - help promised a JSON array, and ignore_eos appeared nowhere in the tree. prompts-w2.jsonl was already - committed and unreadable by that loader, which is why PERF-020 is not complete. Not on origin/main. PP - cross-ref (master Appendix A): PP-28. Master section 5.1 records that adding ignore_eos to prompts-w1.jsonl - rotates the corpus sha256, which is a component of the PP-22 join key and the PP-9 cell key. Master section - 12 row 0b.' + notes: 'Filed after the roadmap was last written; added by PERF-040 on 2026-08-29. Open PR #2746 (branch feat/t2-batch4, pushed). The spec said prompts-w1.jsonl, the only loader parsed YAML, the CLI help promised a JSON array, and ignore_eos appeared nowhere in the tree. prompts-w2.jsonl was already committed and unreadable by that loader, which is why PERF-020 is not complete. Not on origin/main. PP cross-ref (master Appendix A): PP-28. Master section 5.1 records that adding ignore_eos to prompts-w1.jsonl rotates the corpus sha256, which is a component of the PP-22 join key and the PP-9 cell key. Master section 12 row 0b.' - id: PERF-040 github_issue: 2706 item_type: task - title: 'Reconcile docs/roadmaps/roadmap.yaml with origin/main - the record said planned for shipped work' - status: in_progress + title: Reconcile docs/roadmaps/roadmap.yaml with origin/main - the record said planned for shipped work + status: inprogress priority: high assigned_to: null created: 2026-08-29 00:00:00+00:00 @@ -14049,15 +13138,7 @@ roadmap: labels: - perf - receipt-rule - notes: 'This ticket. Added 2026-08-29. Every one of the 26 pre-existing github_issue 2706 entries was - re-decided against origin/main at 50d2bc2bb by naming a merge commit or a file that does exist there, - never by trusting a report. Three planned entries were in fact shipped (PERF-008, PERF-010, PERF-016, - all in PR #2710); three more were under way rather than untouched (PERF-012, PERF-013, PERF-019); one - entry marked completed was not (PERF-004); and 16 tickets filed after the file was last written were - absent from it entirely. PERF-038 was searched for and does not exist anywhere. Branch feat/u1-roadmap. PP - cross-ref (master Appendix A): master section 13. All 42 spec fields in this file now name - docs/specifications/PP-LLAMA-001-MASTER.md; the superseded documents and their local paths are in - evidence/parity/LEDGER.md section 13.' + notes: 'This ticket. Added 2026-08-29. Every one of the 26 pre-existing github_issue 2706 entries was re-decided against origin/main at 50d2bc2bb by naming a merge commit or a file that does exist there, never by trusting a report. Three planned entries were in fact shipped (PERF-008, PERF-010, PERF-016, all in PR #2710); three more were under way rather than untouched (PERF-012, PERF-013, PERF-019); one entry marked completed was not (PERF-004); and 16 tickets filed after the file was last written were absent from it entirely. PERF-038 was searched for and does not exist anywhere. Branch feat/u1-roadmap. PP cross-ref (master Appendix A): master section 13. All 42 spec fields in this file now name docs/specifications/PP-LLAMA-001-MASTER.md; the superseded documents and their local paths are in evidence/parity/LEDGER.md section 13.' - id: PMAT-753 github_issue: null item_type: task @@ -14069,7 +13150,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-contracts/src/probar_gen/wired.rs:251 is resolved and the comment removed' + - the deferral at crates/aprender-contracts/src/probar_gen/wired.rs:251 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-754 github_issue: null @@ -14082,7 +13167,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-data/src/tui/adapter.rs:462 is resolved and the comment removed' + - the deferral at crates/aprender-data/src/tui/adapter.rs:462 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-755 github_issue: null @@ -14095,7 +13184,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-db/src/wasm/streaming_parquet.rs:129 is resolved and the comment removed' + - the deferral at crates/aprender-db/src/wasm/streaming_parquet.rs:129 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-756 github_issue: null @@ -14108,7 +13201,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-graph/benchmarks/compare_networkx.py:77 is resolved and the comment removed' + - the deferral at crates/aprender-graph/benchmarks/compare_networkx.py:77 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-757 github_issue: null @@ -14121,7 +13218,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-graph/benchmarks/compare_networkx.py:85 is resolved and the comment removed' + - the deferral at crates/aprender-graph/benchmarks/compare_networkx.py:85 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-758 github_issue: null @@ -14134,7 +13235,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-serve/benches/external_matrix.rs:138 is resolved and the comment removed' + - the deferral at crates/aprender-serve/benches/external_matrix.rs:138 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-759 github_issue: null @@ -14147,7 +13252,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-serve/src/cuda/executor/layers/cublas_prefill/mod.rs:34 is resolved and the comment removed' + - the deferral at crates/aprender-serve/src/cuda/executor/layers/cublas_prefill/mod.rs:34 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-760 github_issue: null @@ -14160,7 +13269,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-test-lib/src/playbook/runner.rs:185 is resolved and the comment removed' + - the deferral at crates/aprender-test-lib/src/playbook/runner.rs:185 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-761 github_issue: null @@ -14173,7 +13286,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-test-lib/src/playbook/runner.rs:223 is resolved and the comment removed' + - the deferral at crates/aprender-test-lib/src/playbook/runner.rs:223 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-762 github_issue: null @@ -14186,7 +13303,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:111 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:111 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-763 github_issue: null @@ -14199,7 +13320,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:142 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:142 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-764 github_issue: null @@ -14212,7 +13337,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:149 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:149 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-765 github_issue: null @@ -14225,7 +13354,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:179 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:179 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-766 github_issue: null @@ -14238,7 +13371,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:251 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_backward.rs:251 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-767 github_issue: null @@ -14251,7 +13388,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/autograd/wgpu_training.rs:379 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/autograd/wgpu_training.rs:379 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-929 github_issue: null @@ -14264,14 +13405,17 @@ roadmap: updated: 2026-09-04 16:30:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'perf_gate.sh --phase release PASS on the release sha with no SKIP hiding a FAIL; dogfood --phase pre-publish GO; tag from cargo metadata, absent on crates.io; cascade only through check_publish_preflight.sh (R1-R5), never --allow-dirty; post-publish dogfood on the published crate' - - 'receipt in docs/audits/ with claimed-vs-rerun table, jidoka log, estimates with basis, transcript-gate PASS, status-lint PASS' + - perf_gate.sh --phase release PASS on the release sha with no SKIP hiding a FAIL; dogfood --phase pre-publish GO; tag from cargo metadata, absent on crates.io; cascade only through check_publish_preflight.sh (R1-R5), never --allow-dirty; post-publish dogfood on the published crate + - receipt in docs/audits/ with claimed-vs-rerun table, jidoka log, estimates with basis, transcript-gate PASS, status-lint PASS + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Tickets minted in this run: PMAT-930..953 (ledger scanner, dogfood gates, PERF-009 guard blind spot, stdio MCP transport races, wgpu init deadlock). Operator decisions quoted in the receipt.' - id: PMAT-930 github_issue: null item_type: bug - title: 'PP-9 live scan read only the first pipe table of evidence/parity/LEDGER.md: a blank line after row 4 left - rows 5 and 6 outside the spend-key universe, so a re-spend of row 6 passed spec_conformance.sh' + title: 'PP-9 live scan read only the first pipe table of evidence/parity/LEDGER.md: a blank line after row 4 left rows 5 and 6 outside the spend-key universe, so a re-spend of row 6 passed spec_conformance.sh' status: inprogress priority: high assigned_to: null @@ -14279,20 +13423,16 @@ roadmap: updated: 2026-09-03 13:40:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'scripts/lib/spec_conformance.py emits L2 for a ledger row that sits outside the table it reads (same column - count as the header, row-id first cell, after the first table break, before the superseded section); the ledger - is re-joined so the live scan reports LEDGER 6 6; selftest cases ledger_row_outside_table (L2) and - ledger_rows_contiguous (CLEAN) named beside PP-9 in §6; must-fire mutation (the L2 emit removed) turns - ledger_row_outside_table BROKE; Appendix D row, RATIONALE PP-9 paragraph, contract invariant + falsification - test in pp-llama-001-spec-conformance-v1.yaml; pv validate green' - notes: 'Found by PMAT-929 (paiml-implement run 4) live-mutating Appendix C on 68b059ca9: duplicating row 6 as row 7 - inside the v3 table produced PASS "no cell was spent twice"; the scanner had parsed 4 of 6 rows. Five-whys in - .pmat/jidoka.jsonl and docs/audits/impl-PMAT-929-receipt.md' + - scripts/lib/spec_conformance.py emits L2 for a ledger row that sits outside the table it reads (same column count as the header, row-id first cell, after the first table break, before the superseded section); the ledger is re-joined so the live scan reports LEDGER 6 6; selftest cases ledger_row_outside_table (L2) and ledger_rows_contiguous (CLEAN) named beside PP-9 in §6; must-fire mutation (the L2 emit removed) turns ledger_row_outside_table BROKE; Appendix D row, RATIONALE PP-9 paragraph, contract invariant + falsification test in pp-llama-001-spec-conformance-v1.yaml; pv validate green + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by PMAT-929 (paiml-implement run 4) live-mutating Appendix C on 68b059ca9: duplicating row 6 as row 7 inside the v3 table produced PASS "no cell was spent twice"; the scanner had parsed 4 of 6 rows. Five-whys in .pmat/jidoka.jsonl and docs/audits/impl-PMAT-929-receipt.md' - id: PMAT-931 github_issue: null item_type: bug - title: 'PMAT-930 review: L2 was a whitelist of one row shape — a ledger row with no leading pipe or one extra pipe - passed both the first-table parse and L2; redesign L2 as a universe, add L3 (malformed row) and a mutation set' + title: 'PMAT-930 review: L2 was a whitelist of one row shape — a ledger row with no leading pipe or one extra pipe passed both the first-table parse and L2; redesign L2 as a universe, add L3 (malformed row) and a mutation set' status: inprogress priority: high assigned_to: null @@ -14300,21 +13440,16 @@ roadmap: updated: 2026-09-03 16:10:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'L2: every pipe line before the superseded heading whose first cell (backticks stripped) is a row id and that - does not belong to a group opening with a header row is a ledger row outside the table, whatever its column - count or leading pipe; those rows also enter the L1 spend check. L3: a first-table row whose cell count differs - from the header is refused. Fixtures ledger_row_no_leading_pipe, ledger_row_backticked_id, ledger_row_trailing_pipes, - ledger_row_extra_pipe, ledger_side_table_ok, ledger_superseded_rows_ok, ledger_respend_outside_table beside the - two of PMAT-930; scripts/mutate_spec_conformance.sh kills 8/8; the live scan on main stays PASS with LEDGER 6 6' - notes: 'Found by the PMAT-930 review quorum (paiml-agy-delegate, 3 lanes + the §3.E arm, gemini-3.1-pro-high, conversations - df32ef55, f41060f3, 02623f0a, b2af861a); two of the four escape shapes re-run by Fable on 386b0bd40 (no leading pipe, - extra pipe: violations=[]). Five-whys in .pmat/jidoka.jsonl. Landed in PR #2861 with PMAT-930' + - 'L2: every pipe line before the superseded heading whose first cell (backticks stripped) is a row id and that does not belong to a group opening with a header row is a ledger row outside the table, whatever its column count or leading pipe; those rows also enter the L1 spend check. L3: a first-table row whose cell count differs from the header is refused. Fixtures ledger_row_no_leading_pipe, ledger_row_backticked_id, ledger_row_trailing_pipes, ledger_row_extra_pipe, ledger_side_table_ok, ledger_superseded_rows_ok, ledger_respend_outside_table beside the two of PMAT-930; scripts/mutate_spec_conformance.sh kills 8/8; the live scan on main stays PASS with LEDGER 6 6' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by the PMAT-930 review quorum (paiml-agy-delegate, 3 lanes + the §3.E arm, gemini-3.1-pro-high, conversations df32ef55, f41060f3, 02623f0a, b2af861a); two of the four escape shapes re-run by Fable on 386b0bd40 (no leading pipe, extra pipe: violations=[]). Five-whys in .pmat/jidoka.jsonl. Landed in PR #2861 with PMAT-930' - id: PMAT-932 github_issue: null item_type: bug - title: 'PMAT-931 second review: the run-skip rule failed both ways (a dummy first line hid every row after it; a - blank line inside the §13 table flagged eleven legitimate rows) and the mutation harness had no green baseline - and scored a crash as a kill' + title: 'PMAT-931 second review: the run-skip rule failed both ways (a dummy first line hid every row after it; a blank line inside the §13 table flagged eleven legitimate rows) and the mutation harness had no green baseline and scored a crash as a kill' status: inprogress priority: high assigned_to: null @@ -14322,21 +13457,16 @@ roadmap: updated: 2026-09-03 17:20:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'a run of pipe lines is skipped only when it opens with a header (header line + separator) other than the ledger - header; a run with the ledger header or no header is read row by row; a row counts when its first cell is a row id - and its width is within two columns of the ledger header; L0 when the first table is not the ledger; seven fixtures - (ledger_fragment_after_dummy_line, ledger_row_bold_id, ledger_side_table_split_ok, ledger_side_table_same_width_ok, - ledger_second_table_same_header, ledger_row_extra_pipe_outside, ledger_first_table_not_ledger); the harness runs - the unmutated table first, counts a crash as unviable, and reports 10/10 killed' - notes: 'Found by the PMAT-931 review quorum (paiml-agy-delegate, 3 lanes + the §3.E arm, gemini-3.1-pro-high, conversations - 519483fd, cb269b2c, 804fdc9e, 972bd0c8). Re-run by Fable on 45588b6d1: dummy-first-line escape confirmed (violations - NONE); blank line at LEDGER.md:100 flagged 11 rows (confirmed); the bold-id escape was REFUTED (strip_md already - strips emphasis: L1,L2 fired). Landed in PR #2861 with PMAT-930 and PMAT-931' + - a run of pipe lines is skipped only when it opens with a header (header line + separator) other than the ledger header; a run with the ledger header or no header is read row by row; a row counts when its first cell is a row id and its width is within two columns of the ledger header; L0 when the first table is not the ledger; seven fixtures (ledger_fragment_after_dummy_line, ledger_row_bold_id, ledger_side_table_split_ok, ledger_side_table_same_width_ok, ledger_second_table_same_header, ledger_row_extra_pipe_outside, ledger_first_table_not_ledger); the harness runs the unmutated table first, counts a crash as unviable, and reports 10/10 killed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by the PMAT-931 review quorum (paiml-agy-delegate, 3 lanes + the §3.E arm, gemini-3.1-pro-high, conversations 519483fd, cb269b2c, 804fdc9e, 972bd0c8). Re-run by Fable on 45588b6d1: dummy-first-line escape confirmed (violations NONE); blank line at LEDGER.md:100 flagged 11 rows (confirmed); the bold-id escape was REFUTED (strip_md already strips emphasis: L1,L2 fired). Landed in PR #2861 with PMAT-930 and PMAT-931' - id: PMAT-933 github_issue: null item_type: bug - title: 'PMAT-932 third review: a run under a decorative header was skipped whole and a row three columns off was - dropped rather than refused; the L2 universe is now every row that claims a spend (RECORDED or CONFORMANT)' + title: 'PMAT-932 third review: a run under a decorative header was skipped whole and a row three columns off was dropped rather than refused; the L2 universe is now every row that claims a spend (RECORDED or CONFORMANT)' status: inprogress priority: high assigned_to: null @@ -14344,21 +13474,16 @@ roadmap: updated: 2026-09-03 18:05:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'a line outside the first table is a ledger row iff it has two or more pipes, a row-id first cell and a cell that - claims RECORDED or CONFORMANT; no run, header or width condition; fixtures ledger_row_under_foreign_header (L1,L2), - ledger_row_three_columns_off_outside (L2), ledger_row_conformant_outside (L2), ledger_row_without_tier_outside_ok - (CLEAN); ledger_first_table_not_ledger becomes L0,L2; mutants tier-claim-check-removed and conformant-tier-dropped - replace header-skip-removed and width-tolerance-removed; 10/10 killed' - notes: 'Found by the PMAT-932 review (paiml-agy-delegate: the §3.E arm 611de8db and lanes 87ecbcb2, 12f3e8e4; lane 2 - never returned). Re-run by Fable on fa6cf7706: a dummy header + separator + a RECORDED re-spend produced no - violation (confirmed); a short RECORDED row outside the table produced none (confirmed once the probe carried the - tier). The L0 objection (a table above the ledger) is designed behaviour and was rejected. Landed in PR #2861' + - a line outside the first table is a ledger row iff it has two or more pipes, a row-id first cell and a cell that claims RECORDED or CONFORMANT; no run, header or width condition; fixtures ledger_row_under_foreign_header (L1,L2), ledger_row_three_columns_off_outside (L2), ledger_row_conformant_outside (L2), ledger_row_without_tier_outside_ok (CLEAN); ledger_first_table_not_ledger becomes L0,L2; mutants tier-claim-check-removed and conformant-tier-dropped replace header-skip-removed and width-tolerance-removed; 10/10 killed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by the PMAT-932 review (paiml-agy-delegate: the §3.E arm 611de8db and lanes 87ecbcb2, 12f3e8e4; lane 2 never returned). Re-run by Fable on fa6cf7706: a dummy header + separator + a RECORDED re-spend produced no violation (confirmed); a short RECORDED row outside the table produced none (confirmed once the probe carried the tier). The L0 objection (a table above the ledger) is designed behaviour and was rejected. Landed in PR #2861' - id: PMAT-934 github_issue: null item_type: bug - title: 'PMAT-933 fourth review: a spend row with a non-row-id first cell (foo, #0c, 7bis) and a backticked tier - (`RECORDED`) both escaped L2; the id is now reported, never required, the tier is read through the shared - normalisation, and no heading ends the universe' + title: 'PMAT-933 fourth review: a spend row with a non-row-id first cell (foo, #0c, 7bis) and a backticked tier (`RECORDED`) both escaped L2; the id is now reported, never required, the tier is read through the shared normalisation, and no heading ends the universe' status: inprogress priority: high assigned_to: null @@ -14366,21 +13491,16 @@ roadmap: updated: 2026-09-03 19:10:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'a pipe line after the first table is a ledger row iff some cell, backticks stripped, starts with RECORDED or - CONFORMANT; the id is reported (row id or the raw first cell); the superseded cutoff is gone; fixtures - ledger_row_nonnumeric_id_outside, ledger_row_backticked_tier_outside, ledger_reserved_word_in_side_table (L2), - ledger_row_after_superseded_heading (L1,L2); mutants tier-backtick-strip-removed and id-required-reintroduced - replace backtick-strip-removed and superseded-cutoff-removed; 10/10 killed' - notes: 'Found by the PMAT-933 review (paiml-agy-delegate: the §3.E arm f5451570 and lanes d7910b93, 76cbe3d0, - dc6aa69e; the delegate itself found the backticked tier). Re-run by Fable on 7ff61b831: `| foo |` and a - backticked RECORDED both produced no violation (confirmed). The §13 reserved-word false positive is accepted as - fail-closed and documented. Landed in PR #2861' + - a pipe line after the first table is a ledger row iff some cell, backticks stripped, starts with RECORDED or CONFORMANT; the id is reported (row id or the raw first cell); the superseded cutoff is gone; fixtures ledger_row_nonnumeric_id_outside, ledger_row_backticked_tier_outside, ledger_reserved_word_in_side_table (L2), ledger_row_after_superseded_heading (L1,L2); mutants tier-backtick-strip-removed and id-required-reintroduced replace backtick-strip-removed and superseded-cutoff-removed; 10/10 killed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by the PMAT-933 review (paiml-agy-delegate: the §3.E arm f5451570 and lanes d7910b93, 76cbe3d0, dc6aa69e; the delegate itself found the backticked tier). Re-run by Fable on 7ff61b831: `| foo |` and a backticked RECORDED both produced no violation (confirmed). The §13 reserved-word false positive is accepted as fail-closed and documented. Landed in PR #2861' - id: PMAT-935 github_issue: null item_type: bug - title: 'PMAT-934 fifth review: __RECORDED__ was not a tier, __lambda__ / aaaa / a zero-width space were - new keys, and L1 deduped only RECORDED rows; one normaliser for every ledger cell, L1 on the same tiers as L2, - and the threat model stated' + title: 'PMAT-934 fifth review: __RECORDED__ was not a tier, __lambda__ / aaaa / a zero-width space were new keys, and L1 deduped only RECORDED rows; one normaliser for every ledger cell, L1 on the same tiers as L2, and the threat model stated' status: inprogress priority: high assigned_to: null @@ -14388,20 +13508,16 @@ roadmap: updated: 2026-09-03 19:50:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - '_norm strips code tags, format characters, no-break spaces, whitespace runs and wrapping backticks/asterisks/ - underscores; spend keys casefold; L1 keys on SPEND_TIERS; LEDGER reports the universe count; fixtures - ledger_row_underscored_tier, ledger_respend_conformant, ledger_respend_emphasised_key, ledger_respend_zero_width_key - (L1); mutants l1-respend-check-removed, l1-tier-filter-narrowed, wrap-emphasis-strip-removed, key-normaliser-bypassed, - key-casefold-removed; 15/15 killed; the threat model (honest re-roll, not forgery) written in RATIONALE and the docstring' - notes: 'Found by the PMAT-934 review (paiml-agy-delegate: the §3.E arm 044542d6, lanes 1ca23c06, 27e31188, 4c1a7eac; - the delegate found the L1 tier gap and widened the key renderings to six). Re-run by Fable on 45b29e793: __RECORDED__, - __lambda__ and a CONFORMANT re-spend each produced no violation (confirmed). Landed in PR #2861' + - _norm strips code tags, format characters, no-break spaces, whitespace runs and wrapping backticks/asterisks/ underscores; spend keys casefold; L1 keys on SPEND_TIERS; LEDGER reports the universe count; fixtures ledger_row_underscored_tier, ledger_respend_conformant, ledger_respend_emphasised_key, ledger_respend_zero_width_key (L1); mutants l1-respend-check-removed, l1-tier-filter-narrowed, wrap-emphasis-strip-removed, key-normaliser-bypassed, key-casefold-removed; 15/15 killed; the threat model (honest re-roll, not forgery) written in RATIONALE and the docstring + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Found by the PMAT-934 review (paiml-agy-delegate: the §3.E arm 044542d6, lanes 1ca23c06, 27e31188, 4c1a7eac; the delegate found the L1 tier gap and widened the key renderings to six). Re-run by Fable on 45b29e793: __RECORDED__, __lambda__ and a CONFORMANT re-spend each produced no violation (confirmed). Landed in PR #2861' - id: PMAT-936 github_issue: null item_type: bug - title: 'check_shell_lint_ratchet.sh ratcheted a nondeterministic number: bashrs 7.0.1 cross-contaminates files linted in - one invocation, so the same main tree counted 13 errors on the fleet and 53 on a workstation, and a branch that removed - 180 findings counted 57 on the fleet (#2860 RED) and 12 locally' + title: 'check_shell_lint_ratchet.sh ratcheted a nondeterministic number: bashrs 7.0.1 cross-contaminates files linted in one invocation, so the same main tree counted 13 errors on the fleet and 53 on a workstation, and a branch that removed 180 findings counted 57 on the fleet (#2860 RED) and 12 locally' status: inprogress priority: high assigned_to: null @@ -14409,16 +13525,16 @@ roadmap: updated: 2026-09-03 21:30:00+00:00 spec: null acceptance_criteria: - - 'the ratchet lints each script in its own bashrs invocation (sorted, file name prefixed); the count is identical on - any host for the same tree; baseline re-seeded 13 -> 9 with the shrink-only meta-ratchet green; bashrs gating findings - 0 on the ratchet script' - notes: 'Measured 2026-09-03 (PMAT-929): single-invocation main=53 / batch=12 locally, 13 / 57 on the fleet; per-file - main=12 / batch=9 on both. Landed in PR #2860' + - the ratchet lints each script in its own bashrs invocation (sorted, file name prefixed); the count is identical on any host for the same tree; baseline re-seeded 13 -> 9 with the shrink-only meta-ratchet green; bashrs gating findings 0 on the ratchet script + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'Measured 2026-09-03 (PMAT-929): single-invocation main=53 / batch=12 locally, 13 / 57 on the fleet; per-file main=12 / batch=9 on both. Landed in PR #2860' - id: PMAT-937 github_issue: null item_type: task - title: 'CB-200 (TDG grade gate) ratchet baseline recorded in .pmat-gates.toml [tdg] baseline = 609 so pmat comply 3.36.0 - reports Warn (debt held flat) instead of Fail; the dogfood pmat-comply row reads it as GO with the absolute count' + title: CB-200 (TDG grade gate) ratchet baseline recorded in .pmat-gates.toml [tdg] baseline = 609 so pmat comply 3.36.0 reports Warn (debt held flat) instead of Fail; the dogfood pmat-comply row reads it as GO with the absolute count status: inprogress priority: high assigned_to: null @@ -14426,10 +13542,12 @@ roadmap: updated: 2026-09-03 21:30:00+00:00 spec: null acceptance_criteria: - - 'pmat comply check (3.36.0): CB-200 -> Warn "at the recorded baseline of 609 — this is debt held flat, not a clean - tree"; any new definition below B fails the gate; PMAT-768 (the 609) stays open' - notes: 'pmat 3.36.0 carries the #1159 comply char-boundary fix (paiml-mcp-agent-toolkit#1166 -> #1171); the comply row - could not run before it. Measured 2026-09-03 on the batch tree. Landed in PR #2860' + - 'pmat comply check (3.36.0): CB-200 -> Warn "at the recorded baseline of 609 — this is debt held flat, not a clean tree"; any new definition below B fails the gate; PMAT-768 (the 609) stays open' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: 'pmat 3.36.0 carries the #1159 comply char-boundary fix (paiml-mcp-agent-toolkit#1166 -> #1171); the comply row could not run before it. Measured 2026-09-03 on the batch tree. Landed in PR #2860' - id: PMAT-938 github_issue: null item_type: task @@ -14442,6 +13560,10 @@ roadmap: spec: null acceptance_criteria: - 'pmat verify --format json (3.36.0): satd stage ok; pmat analyze satd --strict: 0; the dogfood pmat-verify row PASSes; every deferral cites PMAT-750..767 or PMAT-939..947; crate --lib tests and clippy green for every touched crate' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'PMAT-929 run 4, batch PR #2860. A ticket reference inside a marker does not exempt it (measured); the hook refuses any edit to a file with a function over 25 cognitive, so the decompositions were the price of the rewrite' - id: PMAT-939 github_issue: null @@ -14454,7 +13576,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/apr-cli/src/commands/gguf.rs:296 is resolved and the comment removed' + - the deferral at crates/apr-cli/src/commands/gguf.rs:296 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-940 github_issue: null @@ -14467,7 +13593,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-contracts/src/scoring/codebase.rs:154 is resolved and the comment removed' + - the deferral at crates/aprender-contracts/src/scoring/codebase.rs:154 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-941 github_issue: null @@ -14480,7 +13610,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-distribute/src/executor/microvm.rs:538 is resolved and the comment removed' + - the deferral at crates/aprender-distribute/src/executor/microvm.rs:538 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-942 github_issue: null @@ -14493,7 +13627,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-distribute/src/executor/microvm.rs:539 is resolved and the comment removed' + - the deferral at crates/aprender-distribute/src/executor/microvm.rs:539 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-943 github_issue: null @@ -14506,7 +13644,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-serve/examples/gpu_showcase_benchmark.rs:572 is resolved and the comment removed' + - the deferral at crates/aprender-serve/examples/gpu_showcase_benchmark.rs:572 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-944 github_issue: null @@ -14519,7 +13661,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/config/train/loader/data.rs:990 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/config/train/loader/data.rs:990 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-945 github_issue: null @@ -14532,7 +13678,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-train/src/train/pretrain_real.rs:488 is resolved and the comment removed' + - the deferral at crates/aprender-train/src/train/pretrain_real.rs:488 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-946 github_issue: null @@ -14545,7 +13695,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-viz/wasm-pkg/src/lib.rs:620 is resolved and the comment removed' + - the deferral at crates/aprender-viz/wasm-pkg/src/lib.rs:620 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-947 github_issue: null @@ -14558,7 +13712,11 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'the deferral at crates/aprender-zram-core/src/gpu/mod.rs:196 is resolved and the comment removed' + - the deferral at crates/aprender-zram-core/src/gpu/mod.rs:196 is resolved and the comment removed + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Minted by the PMAT-938 sweep (PR #2860); the marker text is kept in the comment, keyword-free' - id: PMAT-948 github_issue: null @@ -14571,8 +13729,12 @@ roadmap: updated: 2026-09-04 00:10:00+00:00 spec: null acceptance_criteria: - - 'crates/apr-cli/Cargo.toml wgpu feature enables the training backend it calls; cargo check -p apr-cli --lib --features wgpu succeeds; the function is reached by a build CI runs' - notes: 'Found by the PMAT-938 finetune.rs decomposition (type-checked with --features wgpu,entrenar/gpu); feature-graph fix outside that ticket' + - crates/apr-cli/Cargo.toml wgpu feature enables the training backend it calls; cargo check -p apr-cli --lib --features wgpu succeeds; the function is reached by a build CI runs + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Found by the PMAT-938 finetune.rs decomposition (type-checked with --features wgpu,entrenar/gpu); feature-graph fix outside that ticket - id: PMAT-949 github_issue: null item_type: bug @@ -14585,8 +13747,12 @@ roadmap: spec: null acceptance_criteria: - 'check_no_competing_harnesses.sh computes_rate matches date -u +%s; selftest row "date -u +%s counts as timing" turns BROKE when the widening is reverted (measured: selftest rc=1)' - - 'ship-002/ship-008 allowlisted with the stated reason (duration_sec is provenance of one run, never a quoted rate); dropping the ship-002 entry makes the guard FAIL on the tree (measured)' - - 'eval-shard.sh, ex-06-pull-and-rerun.sh, eval-shard-determinism-probe.sh honour SOURCE_DATE_EPOCH through a DATE_PIN array with no date +%s fallback; bashrs error lines 0; guard count=0 baseline=0 on the merged tree' + - ship-002/ship-008 allowlisted with the stated reason (duration_sec is provenance of one run, never a quoted rate); dropping the ship-002 entry makes the guard FAIL on the tree (measured) + - eval-shard.sh, ex-06-pull-and-rerun.sh, eval-shard-determinism-probe.sh honour SOURCE_DATE_EPOCH through a DATE_PIN array with no date +%s fallback; bashrs error lines 0; guard count=0 baseline=0 on the merged tree + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found when #2860 reached the PERF-009 step for the first time (the README-count step before it had been failing). Fixed in the same PR (e70b00760). Five-whys: the DET002 fix chose an epoch fallback because it is the idiom bashrs documents; the guard reads any date +%s as a rate because the four deleted harnesses all timed that way; the -u form was never in the case table.' - id: PMAT-950 github_issue: null @@ -14601,6 +13767,10 @@ roadmap: acceptance_criteria: - 'send_jsonrpc waits for the child before returning a stdin write error; a non-zero exit always reports process exited : ' - 'test_stdio_transport_exit_before_request_is_read (child closes stdin, 1 MiB request) is deterministic: 40/40 green with the fix, RED (got: write stdin: Broken pipe) with the transport change reverted' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found by the predicted-main clean-room (8100ecd06): 1 failed of 6569 in batuta lib tests, the race between the child exit and the parent write. Fixed in #2860.' - id: PMAT-951 github_issue: null @@ -14613,8 +13783,12 @@ roadmap: updated: 2026-09-04 16:30:00+00:00 spec: docs/specifications/0.66-performance-parity-report.md acceptance_criteria: - - 'every obligation row in the spec §11 DAG landed or UNMEASURED{owner, expires}; CONFORMANT ledger rows on both proof hosts per workstream; training parity gate T-7 ARMED on both hosts' - notes: 'Spec reviewed by agy /teamwork-preview and a 3-lane agy --mode plan quorum (receipt attached to the spec PR).' + - every obligation row in the spec §11 DAG landed or UNMEASURED{owner, expires}; CONFORMANT ledger rows on both proof hosts per workstream; training parity gate T-7 ARMED on both hosts + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Spec reviewed by agy /teamwork-preview and a 3-lane agy --mode plan quorum (receipt attached to the spec PR). - id: PMAT-952 github_issue: null item_type: bug @@ -14626,8 +13800,12 @@ roadmap: updated: 2026-09-04 15:50:00+00:00 spec: null acceptance_criteria: - - 'the shared_instance initializer takes no mutex (the OnceLock already serializes the one-time enumeration, PMAT-778 intent preserved)' + - the shared_instance initializer takes no mutex (the OnceLock already serializes the one-time enumeration, PMAT-778 intent preserved) - 'test_pmat952_shared_instance_does_not_deadlock_against_device_init_lock: a fresh child process holds DEVICE_INIT_LOCK and calls shared_instance() from another thread; green on the fix, RED (child exit 101 after the 30 s probe timeout) with the mutex restored' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found by the 0.65.0 release clean-room on 587ad0797 (2 green runs, 1 hang the same day: only the first initialization of a process can race). gdb backtrace under the release receipt evidence. Reachable in production whenever is_available() and GpuDevice::new() race on the wgpu path.' - id: PMAT-953 github_issue: null @@ -14640,9 +13818,13 @@ roadmap: updated: 2026-09-04 16:10:00+00:00 spec: null acceptance_criteria: - - 'send_jsonrpc returns the stdin write error only when the child exited cleanly AND wrote nothing; a response on stdout is parsed regardless of EPIPE on the request' + - send_jsonrpc returns the stdin write error only when the child exited cleanly AND wrote nothing; a response on stdout is parsed regardless of EPIPE on the request - 'test_stdio_transport_clean_exit_without_reading_keeps_its_response (child closes stdin, echoes a response, exits 0; 1 MiB request) is green on the fix and RED (got: Err("write stdin: Broken pipe")) with the stdout-empty guard reverted' - notes: 'Found by the 0.65.0 release clean-room run 2 on 587ad0797 (88537 passed, 4 failed, all in mcp_client_tests.rs). Released 0.65.0 carries the defect by operator decision (cherry-pick behind the tag).' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Found by the 0.65.0 release clean-room run 2 on 587ad0797 (88537 passed, 4 failed, all in mcp_client_tests.rs). Released 0.65.0 carries the defect by operator decision (cherry-pick behind the tag). - id: PMAT-954 github_issue: null item_type: bug @@ -14654,8 +13836,12 @@ roadmap: updated: 2026-09-04 16:40:00+00:00 spec: null acceptance_criteria: - - 'a DEFER line printed by cascade-publish.sh survives the drain log filter' - notes: 'Found on the 0.65.0 cut; the reason had to be recovered by running cascade-publish.sh --only-tier 2 by hand.' + - a DEFER line printed by cascade-publish.sh survives the drain log filter + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Found on the 0.65.0 cut; the reason had to be recovered by running cascade-publish.sh --only-tier 2 by hand. - id: PMAT-955 github_issue: null item_type: bug @@ -14667,9 +13853,13 @@ roadmap: updated: 2026-09-04 16:40:00+00:00 spec: null acceptance_criteria: - - 'every sibling dev-dependency in a publishable crate is path-only (cargo metadata req "*"); preflight R6 refuses a versioned sibling dev-dependency, with a fixture row on both polarities and the R6 mutation RED' - - '0.65.1 cut from the fixed tree publishes all 74 crates (the 48 already at 0.65.0 move to 0.65.1); v0.65.0 is never moved' - notes: 'Memory rule feedback_crates_io_devdep_publish_cycles existed since 0.60.0 but had no guard; R6 is that guard, on the surface where the publish decision is made.' + - every sibling dev-dependency in a publishable crate is path-only (cargo metadata req "*"); preflight R6 refuses a versioned sibling dev-dependency, with a fixture row on both polarities and the R6 mutation RED + - 0.65.1 cut from the fixed tree publishes all 74 crates (the 48 already at 0.65.0 move to 0.65.1); v0.65.0 is never moved + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Memory rule feedback_crates_io_devdep_publish_cycles existed since 0.60.0 but had no guard; R6 is that guard, on the surface where the publish decision is made. - id: PMAT-956 github_issue: null item_type: bug @@ -14681,8 +13871,12 @@ roadmap: updated: 2026-09-04 16:55:00+00:00 spec: null acceptance_criteria: - - 'baseline entries for prose files are keyed by path plus the normalised claim text (content-keyed), so a relocation is the same entry; the set-aperture rule (a2) already states the intent' + - baseline entries for prose files are keyed by path plus the normalised claim text (content-keyed), so a relocation is the same entry; the set-aperture rule (a2) already states the intent - 'case rows: an insert above a baselined CHANGELOG line passes unchanged; a copied claim (occurrence count up) still refuses; a claim whose text is absent at the comparand still refuses' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found on the 0.65.1 cut (PMAT-955 PR): the release note was moved out of CHANGELOG.md into the GitHub release and the receipt because the guard could not admit the shifted coordinates. Fix the guard in its own PR, then add the 0.65.0/0.65.1 entries.' - id: PMAT-957 github_issue: null @@ -14696,7 +13890,11 @@ roadmap: spec: null acceptance_criteria: - 'driver_and_context, gpu_buffer and cuda_graph tests share one device and run under one process-wide mutex; 20 runs at --test-threads=48 on lambda: 0 failures, 0 signals' - - 'a must-fire mutation (mutex removed) reproduces the failure within 20 runs' + - a must-fire mutation (mutex removed) reproduces the failure within 20 runs + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Evidence: pp4-work/evidence/gpu-flake (t48-*.out, t4-*.out, characterize.log). CI cannot see this suite (no GPU runner); the release clean-room is the only gate that does.' - id: PMAT-958 github_issue: null @@ -14711,13 +13909,17 @@ roadmap: acceptance_criteria: - 'build.rs copies scripts/perf-matrix.yaml into OUT_DIR in the workspace, embeds perf-matrix.vendored.yaml in a published crate, and fails the build when the two differ (measured: drift mutation -> failed to run custom build command)' - 'cargo publish -p aprender-test-lib --dry-run --locked verifies (measured at 0.65.1 deps: Packaged 242 files, Verifying, Finished)' - - 'check_package_includes.sh reports any include_str!/include_bytes! in non-test code whose target escapes the crate (rows 5-7; mutation with the predicate disabled -> row 5 BROKE)' - - '0.65.2 cut from the fixed tree publishes all 74 crates' - notes: 'CB-510 guard covered include!() only; the pre-publish dogfood DEFERs member dry-runs, so no pre-publish gate could see a verification failure.' + - check_package_includes.sh reports any include_str!/include_bytes! in non-test code whose target escapes the crate (rows 5-7; mutation with the predicate disabled -> row 5 BROKE) + - 0.65.2 cut from the fixed tree publishes all 74 crates + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: CB-510 guard covered include!() only; the pre-publish dogfood DEFERs member dry-runs, so no pre-publish gate could see a verification failure. - id: PMAT-959 github_issue: null item_type: bug - title: 'aprender-present-lib src/browser/showcase.rs include_bytes!s ../../../../demo/assets/sentiment_mini.apr (repo root), but the asset lives at crates/aprender-present/demo/assets/; the wasm32 build of the published crate cannot compile' + title: aprender-present-lib src/browser/showcase.rs include_bytes!s ../../../../demo/assets/sentiment_mini.apr (repo root), but the asset lives at crates/aprender-present/demo/assets/; the wasm32 build of the published crate cannot compile status: planned priority: medium assigned_to: null @@ -14725,8 +13927,12 @@ roadmap: updated: 2026-09-04 20:35:00+00:00 spec: null acceptance_criteria: - - 'the asset is vendored inside crates/aprender-present-lib (or reached through build.rs with a vendored copy, as PMAT-958 did for perf-matrix.yaml) and the wasm32 build of the packaged crate compiles' - notes: 'Found by the PMAT-958 widening of check_package_includes.sh; wasm32-only files are outside the host verification build, so the guard prints them as SKIPPED rather than failing — this is the one live residual.' + - the asset is vendored inside crates/aprender-present-lib (or reached through build.rs with a vendored copy, as PMAT-958 did for perf-matrix.yaml) and the wasm32 build of the packaged crate compiles + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Found by the PMAT-958 widening of check_package_includes.sh; wasm32-only files are outside the host verification build, so the guard prints them as SKIPPED rather than failing — this is the one live residual. - id: PMAT-960 github_issue: null item_type: bug @@ -14738,8 +13944,12 @@ roadmap: updated: 2026-09-04 23:40:00+00:00 spec: null acceptance_criteria: - - 'in --phase post-publish the row PASSes iff the crate version is in the crates.io index and FAILs otherwise; pre-publish polarity unchanged; case rows for both phases and both polarities; must-fire mutation RED' - notes: 'Same shape the 0.64.0 cut recorded in evidence/dogfood/0.64.0/VERDICT.md. Found by the 0.65.2 post-publish run (receipt-20260904T232050Z.json).' + - in --phase post-publish the row PASSes iff the crate version is in the crates.io index and FAILs otherwise; pre-publish polarity unchanged; case rows for both phases and both polarities; must-fire mutation RED + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Same shape the 0.64.0 cut recorded in evidence/dogfood/0.64.0/VERDICT.md. Found by the 0.65.2 post-publish run (receipt-20260904T232050Z.json). - id: PMAT-961 github_issue: null item_type: bug @@ -14752,27 +13962,35 @@ roadmap: spec: null acceptance_criteria: - 'a declared build line that does not name GGML_CUDA (or CMAKE_CUDA_ARCHITECTURES) matches a cache that has it OFF/unset; a declared ON still refuses a cache OFF; case rows for the intel and mini shapes (measured: both ok on the fix, both cmake_mismatch under the mutation)' - notes: 'Found producing the 0.65.2 post-publish receipts (the first release not grandfathered out of the parity requirement). The intel and mini 0.65.2 receipts were produced with this patched resolver and say so.' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: Found producing the 0.65.2 post-publish receipts (the first release not grandfathered out of the parity requirement). The intel and mini 0.65.2 receipts were produced with this patched resolver and say so. - id: PMAT-962 github_issue: null item_type: bug title: 'Post-publish parity of the published 0.65.2 (cargo install aprender, default features) is FAIL on lambda CPU: decode 0.59x, prefill 0.005x of llama.cpp 39173bcac at c=1/4/8/16 (5 interleaved replicates per band); TTFT 2.6 s vs 16 ms at c=1 - the CPU prefill runs at decode speed' - status: todo + status: planned priority: critical assigned_to: null created: 2026-09-05 01:15:00+00:00 updated: 2026-09-05 01:15:00+00:00 spec: docs/specifications/0.66-performance-parity-report.md acceptance_criteria: - - 'evidence/dogfood//lambda.json parity lane cpu verdict PASS against the pinned comparator (floor 1.0 from scripts/perf-matrix.yaml#arms.L3.delta), measured by scripts/parity_host_receipt.sh on the published binary, not on a tree build' + - evidence/dogfood//lambda.json parity lane cpu verdict PASS against the pinned comparator (floor 1.0 from scripts/perf-matrix.yaml#arms.L3.delta), measured by scripts/parity_host_receipt.sh on the published binary, not on a tree build - 'prefill tok/s within the L3 band of the comparator at c=1 (measured 47.7 vs 8982.4 on 2026-09-05): the prefill must batch the prompt, not decode it one token at a time on CPU' - - 'the receipt records the install command and feature set that produced each lane; a lane from a --features cuda install is labelled as such' + - the receipt records the install command and feature set that produced each lane; a lane from a --features cuda install is labelled as such + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Measured 2026-09-05 by the 0.65.2 post-publish host receipt (evidence/dogfood/0.65.2/lambda.json, run_id e167c1ab2c68496cbe1a2a881ab25900). Subject aggregate tok/s at c=1 23.2 vs comparator 75.2; subject decode 44.1 vs 74.2 at c=1. Every c>1 band is INVALID-CORRECTNESS(#2753/#2776): no PP-26 witness was run, so no c>1 ratio is quoted (P-4). The published default-feature binary resolves 0 GPU layers on a 4090 host; a second install of the same crate with --features cuda (167 s) gave the cuda lane, also FAIL at c=1: decode 0.69x, prefill 0.18x (326.8 vs 492.5 aggregate at c=1; TTFT 24 vs 5 ms). c>1 bands: INVALID-CORRECTNESS(#2753/#2776), no witness, ratios struck. Related: chunked prefill (Arm E), the accelerator-quantity contract, and the 0.66 parity report section 6.' - id: PMAT-963 github_issue: null item_type: bug title: 'No pre-publish gate owns c>=8 request failures on the published default-feature (CPU) build or on aarch64: the only pre-publish ladder is perf_gate.sh --host lambda --phase release --workload W1 on the x86 tree build (CB-1400 class). Post-publish, the published 0.65.2 apr serve fails every request at c>=8 on gx10 and mini (0/8, 0/16 in all 5 replicates) and one c=16 replicate on intel (0/16), while the pinned llama.cpp serves the same bands; no parity block can be emitted for those hosts' - status: todo + status: planned priority: critical assigned_to: null created: 2026-09-05 01:40:00+00:00 @@ -14781,44 +13999,56 @@ roadmap: acceptance_criteria: - 'scripts/parity_host_receipt.sh on the published binary emits a block on gx10 and intel: every band of the declared ladder [1,4,8,16] has 5 replicates with successful == total_requests' - 'the failure mode is named from the client side (apr test llm bench records the per-request error kind: timeout vs connection vs HTTP status) - today the run json carries only successful/failed counts, so the receipt cannot say WHY a request failed (own sub-ticket)' - - 'root cause is traced to the module (the writer-lock serialisation of concurrent requests and the prefill-at-decode-speed path, cf. PMAT-962), not to the protocol timeout' + - root cause is traced to the module (the writer-lock serialisation of concurrent requests and the prefill-at-decode-speed path, cf. PMAT-962), not to the protocol timeout - 'a pre-publish gate runs the ladder on the default-feature build and on at least one aarch64 host, or the release runbook says in writing that it does not and why (five whys: 1 the release cut ran perf_gate.sh once, host=lambda phase=release workload=W1 (evidence/release/0.65.2/perf-gate-8e1e9ad40.txt: one line, one host); 2 perf_gate.sh takes one --host and the runbook (pp4-work/release_cut.sh:10) calls it for lambda only; 3 the matrix cells for gx10/intel W1 are UNMEASURED and mini W1 is NA, so the gate has nothing to fail there; 4 the pre-publish dogfood runs on the cut host and its parity row (check_parity_receipt) reads the lambda receipt; 5 nothing in .github/workflows or scripts/release*.sh runs the ladder on a published or default-feature binary before cargo publish - the first ladder the published binary ever met was the post-publish host receipt)' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Measured 2026-09-05 by the 0.65.2 post-publish host receipts (evidence/dogfood/0.65.2/{gx10,intel}.json, key parity_attempt; kept work dirs on the hosts are named there). gx10: TTFT 17.6 s at c=1 and 36 s at c=4 with 4/4 successes, then 0 successes at c=8 and c=16 in every replicate. intel: c=16 replicate 2 had 0/16 successful, replicate 1 9/16, the other three 16/16. mini (M4): 2/2 at c=1 (4.5 tok/s, TTFT 13.9 s) and 4/4 at c=4 (TTFT 49.5 s), then 0/8 and 0/16 in every replicate. The protocol window is http_duration_secs = 30 (scripts/llama_pin.toml#protocol.http). The receipt validator (scripts/lib/bench_receipt.py) correctly refuses a band with zero subject throughput as a non-measurement, so these hosts carry parity_attempt instead of parity and check_multiplatform_dogfood.sh stays FAIL for them: the post-publish verdict for 0.65.2 is NO-GO on this evidence.' - id: PMAT-964 github_issue: null item_type: bug title: 'H12 floor unwired for aarch64 pre-publish (CB-1400 class): the H12 throughput floor (>= 10 tok/s) exists only inside apr bench itself (crates/apr-cli/src/commands/bench.rs:260) and in the post-publish bench_host_receipt.sh; no workflow or release script runs apr bench before cargo publish on any host, and no pre-publish step runs on aarch64 at all. Post-publish, the published aarch64 0.65.2 decodes at 3.5 tok/s on gx10/GB10 and 4.5 tok/s on mini/M4 at c=1 (0.046x / 0.05x the pinned llama.cpp CPU medians 75.7 / 90.4) and apr bench measures 7.7 / 8.1 tok/s, below the floor it ships' - status: todo + status: planned priority: critical assigned_to: null created: 2026-09-05 01:40:00+00:00 updated: 2026-09-05 01:40:00+00:00 spec: docs/specifications/0.66-performance-parity-report.md acceptance_criteria: - - 'the published aarch64 binary (crates.io, default features) reaches the H12 floor in apr bench on gx10 and a cpu-lane parity ratio within the L3 band at c=1' - - 'the receipt names which SIMD path the published binary took on aarch64 (NEON vs scalar) - the tree build measured 1.21x on GB10 (#2567) and the published binary measures 0.046x, so the two are not the same code path or the same build flags' + - the published aarch64 binary (crates.io, default features) reaches the H12 floor in apr bench on gx10 and a cpu-lane parity ratio within the L3 band at c=1 + - the receipt names which SIMD path the published binary took on aarch64 (NEON vs scalar) - the tree build measured 1.21x on GB10 (#2567) and the published binary measures 0.046x, so the two are not the same code path or the same build flags - 'H12 runs before cargo publish on an aarch64 host, or the release runbook names the workflow file:line that would (five whys: 1 the published aarch64 binary is below the H12 floor; 2 nothing pre-publish measured it - grep of .github/workflows/*.yml, scripts/release*.sh, scripts/dogfood.sh, scripts/perf_gate.sh and Makefile finds no apr bench invocation (the only hit is a docs example in scripts/gen-cli-chapter-stubs.sh:52); 3 H12 is asserted inside apr bench (bench.rs:260) and by bench_host_receipt.sh, both of which run only when someone runs them on a host after install; 4 the release cut has no aarch64 stage - perf gate, clean-room and pre-publish dogfood all ran on lambda x86; 5 the matrix marks gx10/intel W1 UNMEASURED and mini NA, so the gate reports rather than fails there)' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Measured 2026-09-05: evidence/dogfood/0.65.2/gx10.json (parity_attempt band c=1: apr 3.5/3.5/3.6/3.5/3.5 tok/s (median 3.5), TTFT ~17.5 s; comparator 77.8/75.7/73.3/77.8/73.8 (median 75.7); bench_attempt: apr bench 7.7 tok/s, Performance Grade F, exit non-zero). mini (M4, aarch64-apple, same published crate): 4.5 tok/s at c=1 vs 90.4 (0.05x), apr bench 8.1 tok/s (exit 5, below the H12 floor) - evidence/dogfood/0.65.2/mini.json. Related: PMAT-962 (lambda, same binary family, 0.59x decode), PMAT-963 (c>=8 request failures), #2567 (aarch64 Q4_K tree-build ratio).' - id: PMAT-965 github_issue: null item_type: bug title: 'parity_host_receipt.sh and bench_host_receipt.sh exit silently (0 s, empty log, rc=1) under macOS bash 3.2 - a silent-pass shape; they must fail closed with a message on BASH_VERSINFO<4 (the missing-flock case already fails closed with a message: measured on mini, "FAIL no flock(1)")' - status: todo + status: planned priority: high assigned_to: null created: 2026-09-05 05:30:00+00:00 updated: 2026-09-05 05:30:00+00:00 spec: null acceptance_criteria: - - 'under bash 3.2 (or any BASH_VERSINFO[0] < 4) both scripts print one FAIL line naming the version they need and exit non-zero before touching the lock; case row + mutation (guard removed -> silent exit) in the same PR' + - under bash 3.2 (or any BASH_VERSINFO[0] < 4) both scripts print one FAIL line naming the version they need and exit non-zero before touching the lock; case row + mutation (guard removed -> silent exit) in the same PR - 'setsid is not used by either script (the mini launcher used it; recorded so nobody adds it): the guard is bash version + flock only' - - 'the host prerequisites (Homebrew bash, util-linux flock) are declared in paiml/infra machines/mini/forjar.yaml, not hand-installed - the 2026-09-05 mini run used a HAND install of both (brew install bash; brew install util-linux), which is the reaper class' + - the host prerequisites (Homebrew bash, util-linux flock) are declared in paiml/infra machines/mini/forjar.yaml, not hand-installed - the 2026-09-05 mini run used a HAND install of both (brew install bash; brew install util-linux), which is the reaper class + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found producing the 0.65.2 mini receipt: chain3 ran under /bin/bash 3.2.57, parity rc=1 in 0 s with an empty parity.log; under Homebrew bash 5.3.15 the script proceeded and then refused on flock (fail-closed, correct); util-linux flock fixed that. Sibling infra PR declares both on mini.' - id: PMAT-966 github_issue: null item_type: bug title: 'witness=null on every band is a HARNESS defect: --witness-json is opt-in, so parity_block.py emits c>1 bands with no PP-26 witness and no validity mark, and perf_gate.sh grades them; PP-26 says absence is invalidity - the harness must print validity_by_band itself (no witness on c>1 => INVALID-CORRECTNESS), never a hand afterwards' - status: todo + status: planned priority: critical assigned_to: null created: 2026-09-05 07:10:00+00:00 @@ -14826,25 +14056,33 @@ roadmap: spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - 'scripts/lib/parity_block.py writes validity_by_band on every lane: c=1 MEASURED when the band completed, every c>1 band INVALID-CORRECTNESS(PP-26 absent) unless a witness with result PASS, min_agree_tokens >= 64 and max_constant_run <= 16 is attached; ratio fields on an INVALID band are null, not numbers' - - 'perf_gate.sh and check_parity_receipt.sh REFUSE a c>1 band that carries a ratio without a witness (fail closed), and print the validity line per band in the verdict' + - perf_gate.sh and check_parity_receipt.sh REFUSE a c>1 band that carries a ratio without a witness (fail closed), and print the validity line per band in the verdict - 'must-fire mutation: run scripts/parity_host_receipt.sh without --witness-json against a live pair; the emitted block must self-mark every c>1 band INVALID-CORRECTNESS and carry no c>1 ratio (RED today: the 0.65.2 lambda block carried ratio_aggregate_tok_per_sec on c=4/8/16 with witness=null)' - - 'the 0.65.2 receipts keep their hand-annotated validity_by_band with validity_by_band_source naming this ticket; the ledger rows 7-11 what_it_lacks name it' + - the 0.65.2 receipts keep their hand-annotated validity_by_band with validity_by_band_source naming this ticket; the ledger rows 7-11 what_it_lacks name it + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found on the 0.65.2 post-publish receipts (evidence/dogfood/0.65.2/*.json): every band of both lambda lanes and of the three refused attempts has witness: null, and the block still carried per-band ratios and verdicts at c=4/8/16. The validity marks now in those files were written by hand afterwards - the gate grading its own paper - and are labelled so. Ruling 2026-09-05 (noah): hand-edited validity is not validity.' - id: PMAT-967 github_issue: null item_type: bug title: 'A release-phase perf-gate verdict with no artifact identity (CB-1400 sibling): VERDICT PASS host=lambda phase=release workload=W1 on every 0.65.x cut graded evidence/perf-gate-001-w1-lambda/receipt.r1.json - commit 745fa8588, a dev checkout with feature_set [cuda], binary sha256 9d0b08b0... - not the crates.io cli build that was published; the verdict line must carry feature_set and the built-binary sha256 (PP-18/PP-25), and a verdict from a checkout is phase=pre-publish-checkout, never quotable as release' - status: todo + status: planned priority: critical assigned_to: null created: 2026-09-05 07:10:00+00:00 updated: 2026-09-05 07:10:00+00:00 spec: docs/specifications/PP-LLAMA-001-MASTER.md acceptance_criteria: - - 'the VERDICT line prints feature_set=[...] binary_sha256=<64 hex> install_source={registry|checkout} read from receipt.provenance (absent => FAIL INSTRUMENT, not PASS)' - - 'when install_source is not a registry install (cargo install from crates.io of the version under release), --phase release is relabelled phase=pre-publish-checkout in the verdict line and the run exits with a REPORT, never a PASS that a release runbook can quote; release_cut.sh (pp4-work) and scripts/release*.sh stop passing a stale checkout receipt as the release receipt' + - the VERDICT line prints feature_set=[...] binary_sha256=<64 hex> install_source={registry|checkout} read from receipt.provenance (absent => FAIL INSTRUMENT, not PASS) + - when install_source is not a registry install (cargo install from crates.io of the version under release), --phase release is relabelled phase=pre-publish-checkout in the verdict line and the run exits with a REPORT, never a PASS that a release runbook can quote; release_cut.sh (pp4-work) and scripts/release*.sh stop passing a stale checkout receipt as the release receipt - 'must-fire mutation: feed receipt.r1.json (745fa8588, checkout) with --phase release --commit - today it prints PASS phase=release; after the fix it prints phase=pre-publish-checkout and no PASS' - - 'the three 0.65.x cut lines are relabelled in evidence/release/0.65.2/perf-gate-8e1e9ad40.txt and docs/audits/impl-PMAT-929-receipt.md (done in this PR)' + - the three 0.65.x cut lines are relabelled in evidence/release/0.65.2/perf-gate-8e1e9ad40.txt and docs/audits/impl-PMAT-929-receipt.md (done in this PR) + phases: [] + subtasks: [] + estimated_effort: null + labels: [] notes: 'Found 2026-09-05 while answering "which pre-publish gate should have been red": the receipt the gate graded on 587ad0797, 752f55346 and 8e1e9ad40 was the same 2026-09-01 file (ledger row 3, SPENT, subject lane invalid, unsigned); its PASS meant only that no W1 arm was ARMED. Nothing pre-publish ever measured the published default-feature (cli, CPU-only) binary; the first ladder it met was the post-publish host receipt (PMAT-962..964).' - id: PMAT-968 github_issue: null @@ -16433,7 +15671,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16445,7 +15683,7 @@ roadmap: - id: PMAT-1062 github_issue: null item_type: task - title: 'BSE-01 guard job runs all, reports all; CARGO_TARGET_DIR per container step; aprender timeout-minutes' + title: BSE-01 guard job runs all, reports all; CARGO_TARGET_DIR per container step; aprender timeout-minutes status: planned priority: high assigned_to: null @@ -16453,7 +15691,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16465,7 +15703,7 @@ roadmap: - id: PMAT-1063 github_issue: null item_type: task - title: 'BSE-14 scripts/predict_merge.sh — merge(origin/main, HEAD) in a temp worktree, guard_tree --list guards, freshness tuple, --check refuses on movement' + title: BSE-14 scripts/predict_merge.sh — merge(origin/main, HEAD) in a temp worktree, guard_tree --list guards, freshness tuple, --check refuses on movement status: planned priority: high assigned_to: null @@ -16473,7 +15711,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16485,7 +15723,7 @@ roadmap: - id: PMAT-1064 github_issue: null item_type: task - title: 'BSE-02 guard-tree job first (the cargo-free guards), parallel to the builds' + title: BSE-02 guard-tree job first (the cargo-free guards), parallel to the builds status: planned priority: high assigned_to: null @@ -16493,7 +15731,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16505,7 +15743,7 @@ roadmap: - id: PMAT-1065 github_issue: null item_type: task - title: 'BSE-09b merge=union on GitHub''s merge engine (goal lane); BSE-09a sorted-insert only if union CONFLICTS' + title: BSE-09b merge=union on GitHub's merge engine (goal lane); BSE-09a sorted-insert only if union CONFLICTS status: planned priority: medium assigned_to: null @@ -16513,7 +15751,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16525,7 +15763,7 @@ roadmap: - id: PMAT-1066 github_issue: null item_type: task - title: 'BSE-10a CI tool pins + baseline tool_version — assert, never install (tools.toml, check_tool_versions.sh)' + title: BSE-10a CI tool pins + baseline tool_version — assert, never install (tools.toml, check_tool_versions.sh) status: planned priority: medium assigned_to: null @@ -16533,7 +15771,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16553,7 +15791,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16565,7 +15803,7 @@ roadmap: - id: PMAT-1068 github_issue: null item_type: task - title: 'BSE-03 three ratchet classes → D2 comparand diff measured on origin/main@SHA in-run; README count derived; threat model first (PR-B)' + title: BSE-03 three ratchet classes → D2 comparand diff measured on origin/main@SHA in-run; README count derived; threat model first (PR-B) status: planned priority: high assigned_to: null @@ -16573,7 +15811,7 @@ roadmap: updated: 2026-09-07T01:23:54Z spec: docs/specifications/build-system-enhancement.md (paiml/infra) acceptance_criteria: - - 'The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both.' + - The A_i command of the matching §4 item in the spec exits 0 on the branch and its named mutation goes RED; Fable re-runs both. phases: [] subtasks: [] estimated_effort: null @@ -16616,3 +15854,20 @@ roadmap: estimated_effort: null labels: [] notes: null +- id: PMAT-1078 + github_issue: null + item_type: task + title: 'pr-review-receipt is dispatch-only: 96 h of fleet runner-time for a job that gates nothing' + status: inprogress + priority: medium + assigned_to: null + created: 2026-09-08T07:28:32Z + updated: 2026-09-08T07:28:57.259166569+00:00 + spec: null + acceptance_criteria: + - 'BSE-15 measured the pr-review-receipt job in aprender ci.yml as the fleet''s single largest consumer of runner-hours: 96 h of aprender PR time in the 30 days to 2026-09-07, inside a fleet that threw away 42.1 percent of everything it spent. It is 150 minutes of two mutation sweeps on a clean-room runner on every push to every open PR, and it gates nothing: not a required context, no job needs: it, and gate deliberately stopped reading it (PP-066 C0-5, #2982). pr-review-quorum.yml judges the receipt from the BASE with its own script and consumes no artifact from it. Move the job to workflow_dispatch only, keep it fully wired and runnable on demand, and move check_pr_review_wiring.sh R4 with the policy so putting it back on every PR is a RED check rather than a quiet reversion.' + phases: [] + subtasks: [] + estimated_effort: null + labels: [] + notes: null diff --git a/scripts/check_pr_review_wiring.sh b/scripts/check_pr_review_wiring.sh old mode 100755 new mode 100644 index 393d2eee66..2e608e914f --- a/scripts/check_pr_review_wiring.sh +++ b/scripts/check_pr_review_wiring.sh @@ -46,11 +46,24 @@ # and a step's `if:` at 8 or more. A step-level `if:` would leave the JOB # reporting success on an event where it checked nothing. # -# R4 that `if:` evaluates TRUE on `pull_request` and FALSE on `push`, -# `merge_group` and `workflow_dispatch` — both polarities, because +# R4 that `if:` evaluates TRUE on `workflow_dispatch` and FALSE on `push`, +# `pull_request` and `merge_group` — both polarities, because # "it has an `if:`" is satisfied by `if: false`, which is a gate that # never runs, and by `if: always()`, which is no gate at all. # +# `pull_request` MOVED FROM THE TRUE COLUMN TO THE FALSE ONE on +# 2026-09-08 (BSE-15, BSE-001 §4 wave 5). This job is 150 minutes of two +# mutation sweeps on a clean-room runner, on every push to every open PR, +# and it gates nothing: `gate` deliberately stopped reading it (PP-066 +# C0-5, #2982), no job `needs:` it, it is not a required context, and +# pr-review-quorum.yml judges the receipt from the BASE with its own +# script. It measured 96 h of aprender PR runner-time in the 30 days to +# 2026-09-07 — the fleet's single largest consumer. So it is dispatch-only, +# and this table is what makes putting it back on every PR a RED check +# rather than a quiet reversion: the row "R4 the per-PR wiring this +# repository moved away from" carries that old `if:` verbatim, asserted +# FAIL. +# # THE EVALUATOR IS DELIBERATELY NARROW, AND REFUSES RATHER THAN GUESSES. # It understands exactly one expression shape — a disjunction of # `github.event_name == ''` — and any other `if:` is a hard FAILURE @@ -88,8 +101,8 @@ GUARD_RE="(^|[[:space:];&|(])((ba)?sh[[:space:]]+|[.]/)?[^[:space:]]*check_pr_re # Events the workflow can be triggered by, and whether the receipt job must run. # Driven as a table rather than asserted once: the FALSE rows are what stop # `if: always()` and a step-level `if:` from reading as compliance. -EVENTS_TRUE='pull_request' -EVENTS_FALSE='push merge_group workflow_dispatch' +EVENTS_TRUE='workflow_dispatch' +EVENTS_FALSE='push pull_request merge_group' # --------------------------------------------------------------------------- # invoking_job — name of the job whose steps invoke the receipt guard. @@ -226,7 +239,9 @@ check_file() { eval_if "$ifexpr" "$ev" case $? in 0) printf 'ok R4 %-18s -> runs\n' "$ev" ;; - 1) printf 'FAIL R4: %s -> SKIPPED, but the receipt is addressed to a PR.\n' "$ev"; rc=1 ;; + 1) printf 'FAIL R4: %s -> SKIPPED, which leaves the receipt sweep unreachable.\n' "$ev" + printf ' This is the one event that must still run it:\n' + printf ' gh workflow run ci.yml --ref \n'; rc=1 ;; *) printf 'FAIL R4: this guard cannot evaluate `%s`.\n' "$ifexpr" printf ' It understands only a disjunction of\n' printf " github.event_name == ''. Extend the evaluator and add a\n" @@ -238,8 +253,10 @@ check_file() { eval_if "$ifexpr" "$ev" case $? in 1) printf 'ok R4 %-18s -> skipped\n' "$ev" ;; - 0) printf 'FAIL R4: %s -> runs. There is no PR number on this event, so the\n' "$ev" - printf ' receipt path evidence/pr-review/// has no subject.\n'; rc=1 ;; + 0) printf 'FAIL R4: %s -> runs, and only workflow_dispatch may. On pull_request\n' "$ev" + printf ' this job cost 96 h of fleet runner-time in 30 days while gating\n' + printf ' nothing (BSE-15); on push and merge_group there is no PR number,\n' + printf ' so evidence/pr-review/// has no subject.\n'; rc=1 ;; *) printf 'FAIL R4: this guard cannot evaluate `%s`.\n' "$ifexpr"; return 1 ;; esac done @@ -270,7 +287,7 @@ if [ "${1:-}" = "--self-test" ]; then } INVOKE=' - run: bash scripts/check_pr_review_receipt.sh tests/fixtures/pr-review/row-14-complete-gpu-review' - JOBIF=" if: github.event_name == 'pull_request'" + JOBIF=" if: github.event_name == 'workflow_dispatch'" # assert_file