Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
85cf9a3
fix(guard): check_pr_review_counts.sh was RED on main and ran nowhere…
noahgift Sep 21, 2026
f4fcf33
Merge remote-tracking branch 'origin/main' into PMAT-3646-pr-review-c…
noahgift Sep 21, 2026
e3ceb27
PMAT-3076: F16/BF16 CPU matvec reads the row with AVX2+F16C+FMA inste…
noahgift Sep 21, 2026
eebd642
feat(release): batching is the default merge path — scripts/batch_fol…
noahgift Sep 21, 2026
62ae1b6
PMAT-3673: AD-04 quorum receipt for #3674 — 3/3 PASS, all three lanes…
noahgift Sep 21, 2026
135bcfb
PMAT-3076: the greedy-parity gate against pinned llama.cpp, and the m…
noahgift Sep 21, 2026
4645aea
PMAT-3076: the parity gate is a host-side gate, not a tree guard; it …
noahgift Sep 21, 2026
e5b2e75
fix(tokenizer): the unknown token is the model's, not BPE's — Qwen3.5…
noahgift Sep 21, 2026
e80df17
PMAT-3076: wire the parity gate. The case table runs on every PR, the…
noahgift Sep 21, 2026
97093d2
PMAT-3076: say in the declaration who runs it; round 4's two FAILs re…
noahgift Sep 21, 2026
7acdb8f
PMAT-3076: AD-04 quorum receipt, 3/3 PASS on 97093d2a5
noahgift Sep 21, 2026
9cc89e3
roadmap(PMAT-3609): the three repo-layout facts round 2 lane 1 misrea…
noahgift Sep 21, 2026
8964ed3
WIP PMAT-3672: single chat-template application (parked for P0 #3685)
noahgift Sep 21, 2026
e2d12bd
ci(diet): coverage on tags only, perf-gate table path-scoped, model s…
noahgift Sep 21, 2026
3e7a88c
audit(PMAT-3609): quorum round 3 receipt, judged at 9cc89e3a9
noahgift Sep 21, 2026
f7b25a6
ci(diet): quorum round 1 findings — book nightly + path-filter RULE 3…
noahgift Sep 21, 2026
64a153c
fix(guard): a pinned pv that panics was UNMEASURED fleet state — only…
noahgift Sep 21, 2026
6fd2416
fix(release): the publish universe's size is derived, never 74 — ORDE…
noahgift Sep 21, 2026
0517e75
fix(cli): a model file that fails to parse is named by its magic byte…
noahgift Sep 21, 2026
ea0861e
Merge remote-tracking branch 'origin/main' into PMAT-3646-pr-review-c…
noahgift Sep 21, 2026
62ae8ea
fix(guard): check_pr_review_counts.sh leaves the unwired-guards ledge…
noahgift Sep 21, 2026
b6282d1
PMAT-3672: apr run templates the prompt ONCE, in realizar; --chat tra…
noahgift Sep 21, 2026
1d58252
Merge commit '62ae1b628' into release/0.70-batch-1
noahgift Sep 21, 2026
7ef78c0
Merge commit '64a153c00' into release/0.70-batch-1
noahgift Sep 21, 2026
a9c4c9d
Merge commit '62ae8ea3c' into release/0.70-batch-1
noahgift Sep 21, 2026
e54f68c
Merge commit '3e7a88cd0' into release/0.70-batch-1
noahgift Sep 21, 2026
56aa766
Merge commit '6fd241645' into release/0.70-batch-1
noahgift Sep 21, 2026
4abf137
Merge commit '7acdb8f0b' into release/0.70-batch-1
noahgift Sep 21, 2026
6dccdc4
batch: regenerate the generated set once (batch_fold.sh --regen)
noahgift Sep 21, 2026
9a0c3cb
Merge commit 'f7b25a6c6' into release/0.70-batch-1
noahgift Sep 21, 2026
b97b84b
Merge commit '0517e75a7' into release/0.70-batch-1
noahgift Sep 21, 2026
5b72bb6
batch: regenerate the generated set once (batch_fold.sh --regen)
noahgift Sep 21, 2026
c995801
fix(release): a blank line in publish-order.txt is refused by its lin…
noahgift Sep 21, 2026
59f7fe7
Merge commit 'c995801d5' into release/0.70-batch-1
noahgift Sep 21, 2026
fe8fbf7
Merge commit 'b6282d187' into release/0.70-batch-1
noahgift Sep 21, 2026
f31b127
batch: regenerate the generated set once (batch_fold.sh --regen)
noahgift Sep 21, 2026
44ff6ea
Merge remote-tracking branch 'origin/main' into release/0.70-batch-1
noahgift Sep 21, 2026
0a8fc20
batch: regenerate the generated set once (batch_fold.sh --regen)
noahgift Sep 21, 2026
32dd7b6
Merge origin/main (225b2a9ab, the v0.69.0 bump) into release/0.70-bat…
noahgift Sep 21, 2026
8c08dd8
fix(test): no lib test asserts a truncated duration is positive — the…
noahgift Sep 21, 2026
a48bb55
fix(batch-1): float16_greedy_parity.sh's two messages named `apr` as …
noahgift Sep 21, 2026
eb454d4
Revert "Merge commit 'f7b25a6c6' into release/0.70-batch-1"
noahgift Sep 21, 2026
4f22e04
PMAT-3694: parity_receipt_denominator.sh classifies with awk, not pyt…
noahgift Sep 21, 2026
0aac053
PMAT-3694: regenerate roadmap.yaml (make roadmap-aggregate) — +21 lin…
noahgift Sep 21, 2026
c2d8a35
docs(PMAT-3703): every remaining timing hit listed with its reason, p…
noahgift Sep 21, 2026
fc54dd6
fix(cli): apr hex / apr trace name a GGUF or SafeTensors file by its …
noahgift Sep 21, 2026
030af09
PMAT-3699: the release bump PR body passes §6 R-2 by construction, an…
noahgift Sep 21, 2026
fb71336
PMAT-3694: quorum receipt — AGREED 3/3 PASS on 0aac053f2
noahgift Sep 21, 2026
0cb1e4b
PMAT-3699: quorum receipt — 3 PASS at 030af09a2 (round 3)
noahgift Sep 21, 2026
5d7dbda
wip(PMAT-3676): coverage_on: tag + v* tag trigger + producers R3/R5 +…
noahgift Sep 21, 2026
ae912b4
Merge remote-tracking branch 'origin/main' into PMAT-3676-coverage-on…
noahgift Sep 21, 2026
88713bd
audit(PMAT-3691): quorum round 2 receipt, 3/3 PASS, judged at fc54dd609
noahgift Sep 21, 2026
a738b92
fix(ci): coverage on tags only, done so sovereign-ci's gate reads it …
noahgift Sep 21, 2026
91fc42d
PMAT-3708: the autopilot never inherits a dogfood GO -- R5 is judged …
noahgift Sep 21, 2026
629143e
PMAT-3708: quorum receipt — 3 PASS at 91fc42d16 (round 1)
noahgift Sep 21, 2026
262dfb2
fix(claims): three tok/s literals in AppState docs moved to docs/BEAT…
noahgift Sep 21, 2026
d00665a
PMAT-3717: the model matrix runs at T-1 on BOTH hosts before any tag,…
noahgift Sep 21, 2026
789e412
feat(ladder): the model gate's universe is each host's measured Q4_K …
noahgift Sep 21, 2026
d36fd12
PMAT-3717: quorum receipt — 3 PASS at d00665a7f (round 1)
noahgift Sep 21, 2026
6a6f897
PMAT-3711: apr qa golden_output — a GPU error is a FAIL naming it, an…
noahgift Sep 21, 2026
8e12148
PMAT-3711: regenerate roadmap.yaml (make roadmap-aggregate) — the PMA…
noahgift Sep 21, 2026
8a51105
PMAT-3717: the T-1 ladder runs under choom -n 1000 and the wrapper ta…
noahgift Sep 21, 2026
6eee66b
feat(ladder): every GPU apr call runs under the fleet lock, choom'd t…
noahgift Sep 21, 2026
cee1c41
PMAT-3717: quorum receipt — 3 PASS at 8a51105dc (round 2: the choom-o…
noahgift Sep 21, 2026
07b99cb
PMAT-3711: quorum receipt — AGREED 3/3 PASS on 8e1214835
noahgift Sep 21, 2026
6c8c1e8
PMAT-3543: the post-publish dogfood asserts the version IS published,…
noahgift Sep 21, 2026
3fadee1
WIP PMAT-3718: run --json prompt_tokens/completion_tokens/finish_reas…
noahgift Sep 21, 2026
034a57b
PMAT-3715: release-readiness-v1 — the tag is refused unless every rel…
noahgift Sep 21, 2026
0e99993
PMAT-3715: the 0.69.0 proof keeps a summary, not the 348 KB report it…
noahgift Sep 21, 2026
89c84c3
PMAT-3543: quorum receipt — round 3 at 6c8c1e8ab: 2 PASS + lane 2 NO-…
noahgift Sep 21, 2026
7d7a338
feat(ladder): the model gate judges cells (verb x thinking x context …
noahgift Sep 21, 2026
336b723
PMAT-3733: apr inspect --json shows every GGUF header key — the reade…
noahgift Sep 21, 2026
7dad33b
PMAT-3733: rustfmt + the measured record in the fragment
noahgift Sep 21, 2026
47658db
PMAT-3563 (A): the pinned llama.cpp comparator resolves and PROVES it…
noahgift Sep 21, 2026
043333a
fix(tokenizer): GGUF byte-level BPE is the model's tokenization, not …
noahgift Sep 21, 2026
0ac1586
PMAT-3697: 4 guard-tree guards are python-free or UNMEASURED on a pyt…
noahgift Sep 21, 2026
78b03cb
PMAT-3697: regenerate roadmap.yaml (make roadmap-aggregate) — the PMA…
noahgift Sep 21, 2026
ba9afe3
PMAT-3715: implementation receipt — every criterion quoted verbatim w…
noahgift Sep 21, 2026
bc37412
fix(ladder): a pass beyond the declared arithmetic is RED; the rung f…
noahgift Sep 21, 2026
d4a31bd
refactor(tokenizer): split the byte-level BPE into small matchers; gu…
noahgift Sep 21, 2026
539ad77
audit(surface): re-map the rows whose cited lines #3726 moved; add ap…
noahgift Sep 21, 2026
9026b70
contract(dogfood-coverage): the feature denominator is 838 after apr …
noahgift Sep 21, 2026
8fe36c0
PMAT-3563 (A): quorum receipt — round 1 at 47658dbab: 2 PASS + lane 2…
noahgift Sep 21, 2026
9d19ed6
PMAT-3733: AD-04 quorum receipt — 3/3 PASS (gemini-3.1-pro-high, gemi…
noahgift Sep 21, 2026
d8405c6
PMAT-3718: rustfmt + the measured record in the fragment
noahgift Sep 21, 2026
234d7a9
docs(roadmap): PMAT-3712 quotes the issue author's done_when 1 amendm…
noahgift Sep 21, 2026
b7a45a2
PMAT-3697: quorum receipt — AGREED 3/3 PASS on 78b03cbdd (batch 1)
noahgift Sep 21, 2026
589528a
roadmap: PMAT-3719 leaves this branch; the cop moved #3719 to another…
noahgift Sep 21, 2026
0eb3752
roadmap: regenerate the aggregate from the base so PMAT-3719 leaves i…
noahgift Sep 21, 2026
c57c260
roadmap: regenerate from this branch's own base (262dfb2f6), not the …
noahgift Sep 21, 2026
f85ed70
PMAT-3571 (1): apr serve refuses, at load, a model whose transformer …
noahgift Sep 21, 2026
84289cb
Merge origin/main into PMAT-3715 — #3706 ties pc_extract to Σ, so rel…
noahgift Sep 21, 2026
8928f12
evidence(tokenizer-parity): per-host receipts and the id-0 mutant (#3…
noahgift Sep 21, 2026
ecf5bca
roadmap(PMAT-3726): double the apostrophes in the single-quoted notes…
noahgift Sep 21, 2026
fd636b3
test(ladder): a mutant deleting the qwen35 families rule is killed; t…
noahgift Sep 21, 2026
d7875fd
PMAT-3747 (#3568 PR 1/4): the TokenConstraint hook and the llguidance…
noahgift Sep 21, 2026
c5047bd
PMAT-3747: regenerate roadmap.yaml (make roadmap-aggregate) — the PMA…
noahgift Sep 21, 2026
c5355ee
PMAT-3718: done_when 1 case row — a fixed text prompt through the GGU…
noahgift Sep 21, 2026
7e6bc1a
PMAT-3571 (1): every apr serve route refuses a zero-layer stack — the…
noahgift Sep 21, 2026
187b390
PMAT-3718: fragment — double the quote in apr's (YAML single-quoted s…
noahgift Sep 21, 2026
939e945
evidence(tokenizer-parity): compact receipts; final lambda run with t…
noahgift Sep 21, 2026
a814867
PMAT-3718: AD-04 quorum receipt — 3/3 PASS (gemini-3.1-pro-high x2, g…
noahgift Sep 21, 2026
c7dfd64
PMAT-3715: round-3 quorum receipt (3 PASS at 84289cb7b) and the VERBS…
noahgift Sep 21, 2026
a1a1bc8
PMAT-3747: quorum receipt — AGREED 3/3 PASS on c5047bd94 (#3568 PR 1/4)
noahgift Sep 21, 2026
585c9a6
fix(cli): apr tokenize encode no longer splits encode-corpus's doc co…
noahgift Sep 21, 2026
02ca8cc
audit(PMAT-3571 unit 1): quorum receipt on 7e6bc1a50 — 2 lane PASS, s…
noahgift Sep 21, 2026
a3d6711
PMAT-3756: the pinned llama.cpp resolves on intel and mini — and the …
noahgift Sep 21, 2026
d0c506a
PMAT-3756: regenerate roadmap.yaml (make roadmap-aggregate) — the PMA…
noahgift Sep 21, 2026
5253817
audit(quorum): PMAT-3726 agreed, 3/3 PASS at 585c9a67b
noahgift Sep 21, 2026
88a07cc
PMAT-3756: quorum receipt — AGREED 3/3 PASS (gemini-3.1-pro-high, gem…
noahgift Sep 21, 2026
2de0e9e
fold #3699 (0cb1e4bd6) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
2096e87
fold #3708 (629143eeb) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
6427b90
fold #3721 (6eee66bb0) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
04e3a1d
fold #3717 (cee1c410f) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
8bd245b
fold #3738 (fd636b3d7) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
9e0b5f0
fold #3694 (fb71336f1) into release/0.69.1-batch-1
noahgift Sep 21, 2026
b6f0a32
fold #3703 (c2d8a3532) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
4a28193
fold #3691 (88713bdc3) into release/0.69.1-batch-1 — error.rs/hex.rs/…
noahgift Sep 21, 2026
bfe6c6c
fold #3711 (07b99cb6a) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
e6190d6
fold #3688 (a738b926c) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
4948966
fold #3715 (c7dfd6427) into release/0.69.1-batch-1
noahgift Sep 21, 2026
bd3bd0b
fold #3543 (89c84c352) into release/0.69.1-batch-1
noahgift Sep 21, 2026
0097311
fold #3563 (8fe36c080) into release/0.69.1-batch-1
noahgift Sep 21, 2026
8977b7f
fold #3756 (88a07cc2a) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
6ef253b
fold #3733 (9d19ed688) into release/0.69.1-batch-1
noahgift Sep 21, 2026
05fd525
fold #3697 (b7a45a250) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
2423775
fold #3747 (a1a1bc8cc) into release/0.69.1-batch-1 — generated files …
noahgift Sep 21, 2026
99af3cc
fold #3718 (a814867c9) into release/0.69.1-batch-1
noahgift Sep 21, 2026
98306fc
fold #3726 (5253817e5) into release/0.69.1-batch-1: main + #3726's OW…
noahgift Sep 21, 2026
48c5b72
fold #3571 unit (1) (02ca8cc8e) into release/0.69.1-batch-1 — handler…
noahgift Sep 21, 2026
ded8a93
release/0.69.1-batch-1: regenerate roadmap.yaml from the fragments (m…
noahgift Sep 21, 2026
5be1ec0
PMAT-3715: run_shapes_gate_with under the complexity ratchet — pure r…
noahgift Sep 21, 2026
cf8d0f3
PMAT-3747: split the constrain case table's fake models under the com…
noahgift Sep 21, 2026
2a40dda
PMAT-3715: receipt §6 — the complexity delta's own scope and measurem…
noahgift Sep 21, 2026
9e32cce
fix(release): the bump-body table's fixture ladder receipts meet the …
noahgift Sep 21, 2026
29b59c8
release/0.69.1-batch-1: PMAT-3571's cop-ruling quotes move from accep…
noahgift Sep 21, 2026
aa0fb37
fold #3747 complexity fix (0e, cf8d0f309) into release/0.69.1-batch-1…
noahgift Sep 21, 2026
21a1588
fold #3715 complexity fix (97, 2a40dda85) into release/0.69.1-batch-1…
noahgift Sep 21, 2026
0544909
fold #3770 (62, 9e32cce9a) into release/0.69.1-batch-1 — check_releas…
noahgift Sep 21, 2026
42ae22a
fix(release): the bump-body table seeds every python module the ladde…
noahgift Sep 21, 2026
519a89b
fold fix/0691-bump-fixture-libs (62, 42ae22a98) into release/0.69.1-b…
noahgift Sep 21, 2026
6c40a8a
release/0.69.1-batch-1: three combination fixes found by PR #3772's f…
noahgift Sep 21, 2026
aae778d
fix(batch-1): the #3571 fold put a test module above the REALIZR_CONT…
noahgift Sep 21, 2026
05d9956
PMAT-3792: quorum receipt — round at f523c8889: 2 PASS + lane 3 NO-VE…
noahgift Sep 21, 2026
a669642
fold c3's batch-1 guard fix (aae778d15) into release/0.69.1-batch-1 —…
noahgift Sep 22, 2026
34a7fcd
batch-1: regenerate census.json (1828 -> 1829) and the README contrac…
noahgift Sep 22, 2026
3f59f6d
batch-1: restore PMAT-3792's fragment and receipt, and drop a new cla…
noahgift Sep 22, 2026
935f2cc
batch-1: regenerate the roadmap aggregate for the restored PMAT-3792 …
noahgift Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude/skills/apr-dogfood/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -1591,7 +1591,7 @@ The nine clusters at zero, largest first: `http-orchestrate-banco` (95),
`test-harness` (49), `rag-eval` (44), `qa-cgp` (37), `simulation` (18),
`orchestrate-pacha-secrets` (17).

**Report both numbers or neither (T2).** "5 of 14 clusters gated (35.7%)" without "144 of 837 features gated (17.2%)" beside it is a proxy masquerading as coverage, and the gate refuses to emit it — *on this line too*.
**Report both numbers or neither (T2).** "5 of 14 clusters gated (35.7%)" without "144 of 838 features gated (17.2%)" beside it is a proxy masquerading as coverage, and the gate refuses to emit it — *on this line too*.

The rule is about the NUMBER, not about a phrasing, and it is enforced on every
surface that can emit one: the gate's own report, the receipt, the output of
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/book-contracts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ on:
- "crates/aprender-core/src/**"
- "scripts/book-gate.sh"
- ".github/workflows/book-contracts.yml"
# #3676 rule 3 (scripts/check_workflow_path_filters.sh): a path filter is a
# claim that nothing outside these paths can break this gate; the nightly run
# re-checks the claim every day. Set ~5h early for the dispatch delay (#3292).
schedule:
- cron: '45 22 * * *'

permissions:
contents: read
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/book.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ on:
- "crates/aprender-core/src/lib.rs"
- "crates/apr-cli/src/extended_commands.rs"
- "crates/apr-cli/src/tool_commands.rs"
# #3676 rule 3 (scripts/check_workflow_path_filters.sh): a path filter is a
# claim that nothing outside these paths can break this gate; the nightly run
# re-checks the claim every day. Set ~5h early for the dispatch delay (#3292).
schedule:
- cron: '30 22 * * *'

permissions:
contents: read
Expand Down
91 changes: 73 additions & 18 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ name: CI
on:
push:
branches: [main, master]
# #3676: sovereign-ci's `coverage_on: tag` (below) runs coverage only on a push of a
# v* tag, and its gate REQUIRES it to succeed there. A push filtered to branches never
# fires for a tag, so this is the reusable's second required edit.
tags: ['v*']
pull_request:
branches: [main, master]
# Merge queue: GitHub dispatches a `merge_group` event for each batch it forms.
Expand Down Expand Up @@ -63,7 +67,7 @@ jobs:
# 23916c00d adds an OPTIONAL `runs_on` input whose default is the label set
# this repo already gets, and 70e51ec04 swaps the digest on every job. No
# input this repo passes changes meaning.
uses: paiml/.github/.github/workflows/sovereign-ci.yml@70e51ec045d95983e9a3d02342d13283bf5f9dc1
uses: paiml/.github/.github/workflows/sovereign-ci.yml@f713290c86fcd70d6f26a0faab14e67e6713586f
with:
repo: ${{ github.event.repository.name }}
# Phase 3 pilot (heavy workload) — build-performance.md §7 Phase 3.
Expand Down Expand Up @@ -112,6 +116,20 @@ jobs:
# MECHANISM is live fleet-wide via sovereign-ci (#37); a single-crate repo is
# the natural first coverage pilot. aprender's blocking-quality pilot is the
# diff-scoped mutation gate below.
#
# #3676 (operator 2026-09-21: "YES, coverage on tags release only"): so this
# job gated nothing AND measured nothing (0 tests on the facade root), at the
# cost of an instrumented rebuild on every PR, merge group and push (237 s
# on main run 35563537942). `coverage_on: tag` runs it only on a push of a v*
# tag (the trigger above) and on workflow_dispatch; everywhere else the job is
# skipped and sovereign-ci's gate prints "coverage: NOT MEASURED", never a
# green. On a v* tag the gate REQUIRES it. The first spelling,
# `skip_coverage: true`, was read by that gate as a mandatory job that did not
# succeed, so `ci / gate` went red on every PR (#3707). Every consumer of the
# number keeps a producer, asserted by scripts/check_coverage_has_producers.sh
# (R1-R5): the pre-publish dogfood's `make coverage-check`, coverage-nightly's
# schedule, and this job on each release tag.
coverage_on: tag
secrets: inherit

# APR-MONO: Workspace-wide test (all 75 crates)
Expand Down Expand Up @@ -1164,8 +1182,14 @@ jobs:
# unwiring the §4.9.1 signature arm drops it to 23 passed, 6 broken), so a
# gate that silently stops discriminating now fails here rather than
# certifying a release later.
- name: Perf gate can still discriminate (APR-PERF-GATE-001, case table)
run: bash scripts/perf_gate.sh --selftest
#
# #3676: PATH-SCOPED now. The table's verdict changes only when perf_gate.sh
# or a file it reads changes, and it cost 405 s on every PR, merge group and
# push (main run 35563537942). scripts/check_perf_gate_selftest_scoped.sh --
# dispatched by guard_tree.sh --no-cargo above, no step here -- runs it when
# the diff vs origin/main touches its DERIVED scope (every $ROOT/ path it
# reads, followed through the scripts it calls) and says so on a SUMMARY
# line when it does not; guards-nightly.yml runs the table whole.
# PERF-007, the HOST half of §4.9.1. `perf_gate.sh --selftest` already
# runs this table, but check_guards_are_wired.sh cannot see one level of
# indirection and its remedy for an unwired guard is to wire it, not to
Expand Down Expand Up @@ -1365,12 +1389,12 @@ jobs:
- name: "Receipt-wiring guard: every rule it states, mutated (15/15 kill)"
run: bash scripts/mutate_pr_review_wiring_guard.sh
# APR-RELEASE-001 §6 R-2, WIRED (#3200 shipped the guard; this is its
# caller). check_pr_closes_issue.sh is a check_*.sh, so guard_tree.sh
# auto-discovers it and runs it BARE -- and bare runs only its own
# self-test, "self-test OK: 9 case(s)", exit 0. Nine green rows about a
# regex, on every PR, judging NO PR body. The 0.67.0 reconcile found 48
# merged PRs since the previous tag of which only 9 closed anything; that
# is what this guard exists to stop, and until now it had never read one.
# caller). This step is its ONLY runner: guard_tree.sh skips it as
# wired-with-args (it needs a body), so its case table ran in NO job until
# this step called `--self-test` beside `--body` (found by aprender-f0,
# 2026-09-21; the comment here used to claim guard_tree ran it bare). The
# 0.67.0 reconcile found 48 merged PRs since the previous tag of which only
# 9 closed anything; that is what this guard exists to stop.
#
# THE BODY ARRIVES THROUGH `env:`, NEVER INTERPOLATED INTO THE SCRIPT.
# `${{ }}` is substituted textually BEFORE bash sees the line, so a body
Expand All @@ -1394,6 +1418,7 @@ jobs:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
set -euo pipefail
bash scripts/check_pr_closes_issue.sh --self-test
printf '%s' "$PR_BODY" > "$RUNNER_TEMP/pr-body.txt"
bash scripts/check_pr_closes_issue.sh --body "$RUNNER_TEMP/pr-body.txt"
# APR-RELEASE-001 §11.1, WIRED. The section shipped as prose in #3268 and
Expand Down Expand Up @@ -2178,9 +2203,13 @@ jobs:
# 3. the suites, judged against the measured ceiling
DR_ENV=(-e "SATD_BASELINE=$n")
dr "$GITHUB_WORKSPACE" cargo test -p aprender-core --features model-tests \
--test falsification_spec_v10_tests \
--test falsification_stress_tests \
--test falsification_gpu_state_tests
--test falsification_spec_v10_tests
# #3676: the PR path keeps ONLY falsification_spec_v10_tests -- it holds the
# SATD ratchet (F-CHECKLIST-005) measured against origin/main above, the one
# property here a diff can change, and the reason this step was KEPT at the
# 67-E3 merge (on the nightly HEAD == origin/main, so there the ratchet is
# vacuous). falsification_stress_tests and falsification_gpu_state_tests
# judge the whole tree, not the diff; guards-nightly.yml runs all three.
# 4. the satd class of the ratchet-semantics case table (rebuilds nothing)
DR_ENV=()
dr "$GITHUB_WORKSPACE" bash scripts/tests/ratchet_semantics_test.sh --class satd
Expand Down Expand Up @@ -3094,11 +3123,22 @@ jobs:
# main-branch pushes are not blocked by a job that intentionally
# did not run. Only an explicit `failure` blocks.
MUT="${{ needs.mutants.result }}"
if [ "$MUT" = "failure" ]; then
echo "mutants (diff-scoped mutation) failed: $MUT"
exit 1
fi
echo "mutants result: $MUT (success/skipped both pass)"
EVT="${{ github.event_name }}"
# --- GATE-MUTANTS-RULE-BEGIN (#3676; scripts/check_ci_gate_mutants_rule.sh runs this block) ---
# `skipped` is a pass ONLY when the skip is the job's own filter:
# mutants declares `if: github.event_name == 'pull_request'`, so on every
# other event it is skipped by design. On a pull_request it must have RUN
# and succeeded -- a diff with no .rs still succeeds (its steps skip, the
# job passes), so a pull_request `skipped` or `cancelled` means the job
# never ran, and the old rule ("success/skipped both pass") passed that.
case "$EVT:$MUT" in
pull_request:success) echo "mutants result: success on a pull_request" ;;
pull_request:*) echo "mutants on a pull_request must succeed; got '$MUT' -- a skip here is not the job's filter"; exit 1 ;;
*:skipped) echo "mutants result: skipped on $EVT (its filter: pull_request only)" ;;
*:success) echo "mutants result: success on $EVT" ;;
*) echo "mutants (diff-scoped mutation) on $EVT: $MUT"; exit 1 ;;
esac
# --- GATE-MUTANTS-RULE-END ---
# Receipt presence is NOT read here any more (PP-066 C0-5, PRQ-013,
# #2982). This job runs under the PR head's definition of ci.yml, so a
# receipt clause here was a check the PR under review could edit. The
Expand Down Expand Up @@ -3158,6 +3198,7 @@ jobs:
# Need history + base branch to compute the PR diff for --in-diff.
fetch-depth: 0
- name: Compute PR diff for mutation scoping
id: prdiff
# cargo-mutants --in-diff takes a unified diff and mutates ONLY the
# lines it adds/changes. We diff the PR head against the merge-base with
# the target branch so the scope is exactly "what this PR introduces".
Expand All @@ -3180,7 +3221,19 @@ jobs:
if [ ! -s pr.diff ]; then
echo "Empty diff — no code to mutate"
fi
# #3676: cargo-mutants mutates Rust. A diff with no .rs path has nothing to
# mutate, but used to pull the image and `cargo install cargo-mutants`
# anyway. --no-renames: a .rs file renamed away still counts.
git diff --no-renames --name-only "$MERGE_BASE"...HEAD > pr.files
if grep -qE '\.rs$' pr.files; then
echo "has_rs=true" >> "$GITHUB_OUTPUT"
echo "Rust paths in the diff: $(grep -cE '\.rs$' pr.files)"
else
echo "has_rs=false" >> "$GITHUB_OUTPUT"
echo "No .rs path in the diff ($(grep -c . pr.files || true) path(s)) -- nothing to mutate; the mutation steps skip and the job passes"
fi
- name: Pull sovereign-ci image (with retry + local-cache fallback)
if: steps.prdiff.outputs.has_rs == 'true'
# Same two-layer resilience as workspace-test — see that job for full context.
run: |
if docker image inspect "$IMAGE" > /dev/null 2>&1; then
Expand All @@ -3203,6 +3256,7 @@ jobs:
delay=$((delay + 6))
done
- name: Install cargo-mutants
if: steps.prdiff.outputs.has_rs == 'true'
run: |
docker run --rm \
-e CI -e GITHUB_ACTIONS -e GITHUB_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -e GITHUB_EVENT_NAME -e GITHUB_WORKFLOW \
Expand All @@ -3211,6 +3265,7 @@ jobs:
"$IMAGE" \
cargo install cargo-mutants --locked
- name: Run diff-scoped mutation testing (BLOCKING)
if: steps.prdiff.outputs.has_rs == 'true'
# No continue-on-error: a missed mutant on the PR diff fails the job,
# which fails `gate`, which blocks merge. --in-diff pr.diff restricts
# mutation to PR-touched lines. Empty diff → 0 mutants → clean pass.
Expand Down Expand Up @@ -3311,7 +3366,7 @@ jobs:
exit 0
'
- name: Upload mutation results
if: always()
if: always() && steps.prdiff.outputs.has_rs == 'true'
uses: actions/upload-artifact@v7
with:
name: mutation-results
Expand Down
7 changes: 6 additions & 1 deletion .github/workflows/coverage-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,18 @@ on:
# `gh workflow run` (#3292); until then, re-measure before trusting.
- cron: '0 22 * * *' # 22:00 UTC -> lands ~03:00 UTC
workflow_dispatch: {}
# #3676: no v* tag trigger here. The release tag's coverage is owned by ci.yml
# (`coverage_on: tag`, which sovereign-ci's gate requires on a tag push), so a tag
# is measured once. scripts/check_coverage_has_producers.sh R3 keeps it that way.

permissions:
contents: read
issues: write # open/update the single coverage tracking issue

concurrency:
group: coverage-nightly
# Per ref (#3676): a tag's run and the nightly on main must not cancel each
# other. A second nightly on the same ref still supersedes the first.
group: coverage-nightly-${{ github.ref }}
cancel-in-progress: true

jobs:
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/guards-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,8 @@ jobs:
run: bash scripts/check_hermetic_stdin_tests.sh
- name: Publish safety (binary/oversize files in published packages)
run: bash scripts/check_publish_safety.sh
- name: Perf gate can still discriminate (APR-PERF-GATE-001, case table)
run: bash scripts/perf_gate.sh --selftest
- name: Book rust examples compile
run: bash scripts/check_book_examples_compile.sh
- name: aprender-profile lib tests (was gated by nothing)
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/install-script.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ on:
- ".github/workflows/install-script.yml"
- ".github/workflows/binary-release.yml"
- ".github/workflows/nightly.yml"
# #3676 rule 3 (scripts/check_workflow_path_filters.sh): a path filter is a
# claim that nothing outside these paths can break this gate; the nightly run
# re-checks the claim every day. Set ~5h early for the dispatch delay (#3292).
schedule:
- cron: '0 23 * * *'

permissions:
contents: read
Expand Down
67 changes: 67 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ trybuild = "1"
# apr-cli; hoisted here for the normalized content hash (`nfc-trim-ws-v1`).
# Hoisting does not change either consumer's resolution.
unicode-normalization = "0.1"
# #3726: exact Unicode general categories (\p{L}/\p{N}/\p{M}) for the byte-level BPE
# pre-tokenizer. Already in the lock through rustybuzz; no new crate.
unicode-properties = { version = "0.1.4", default-features = false, features = ["general-category"] }

# HuggingFace tokenizers (SetFit / MiniLM conformance, Phase 1 ENC-02).
# `default-features = false` is load-bearing, not tidiness: the default set is
Expand Down Expand Up @@ -632,6 +635,13 @@ gates = [
# runs this entry. The PR-time half, the comparison helpers' case table, is
# scripts/check_float16_greedy_parity.sh, which guard_tree.sh dispatches.
"scripts/float16_greedy_parity.sh",
# #3726: apr's token ids against the pinned llama-tokenize, for every GGUF on the
# release host and every file in evidence/tokenizer-parity/corpus/. A mismatch, a greedy
# fallback on a byte-level vocabulary, a failed round trip or a non-byte-level model is
# RED. `apr parity` cannot see a tokenizer defect: both of its sides share the tokenizer.
# Release time only, like the entry above; the PR-time half (the helpers' case table) is
# scripts/check_tokenizer_parity.sh, which guard_tree.sh dispatches.
"scripts/tokenizer_parity.sh",
]

# The interfaces this release SHIPS, each paired with the e2e target that proves
Expand Down
Loading
Loading