Skip to content

batch(B2): CI/infra/scripts/workflow fold — replayed onto main (REPLACES #4315) - #4427

Merged
noahgift merged 17 commits into
mainfrom
replace/b2-ci-infra-on-main
Sep 27, 2026
Merged

noahgift merged 17 commits into
mainfrom
replace/b2-ci-infra-on-main

Conversation

@noahgift

@noahgift noahgift commented Sep 25, 2026 •

Copy link
Copy Markdown
Member

REPLACES #4315. Operator ruling 16:15 Madrid, relayed by the cop: no main-merges into PRs; cut fresh from main.

  • Commit 1 is batch/b2-ci-infra's tree at ffafeca, replayed onto main a5efa14. merge-base(main, B2) == main, so the tree is identical. A linear cherry-pick of the 141 commits stopped at 4/141 on Makefile and coverage-skips.txt, whose resolutions live in B2's 30 internal merges. The commit message lists all 141 source commits.
  • Commit 2 fixes batch(B2): emergency fold of 12 CI/infra/scripts/workflow PRs #4315's red checks. Shards 1-3 REFUSEd on ordinal 455, which two commands shared, so golden-fixtures moves to 457. The claim-literal ratchet failed on a line shift in llama_370m.rs, so the doc now cites the const, and the baseline shrinks by 22.

owner: aprender-fb
Touches .github/workflows (16 files), so it needs the standing-yes 3/3 quorum.

--- original #4315 body (truncated) ---

Emergency fold, batch B2 (CI / infra / scripts / workflows). Operator 2026-09-24: "We FIRST RIGHT NOW, emergency merge all 80 into 4 batches., the enforce 10 max rule going forward." Manifest: /mnt/nvme-raid0/cop-inbox/evidence/fold-manifest.md.

Each source head was merged with git merge --no-ff, so every source commit is still in history. Roadmap conflicts were resolved as a union and the aggregate regenerated; aggregate --check passes.

Folded sources

PR Issue Change
folds #4023 Refs #3839 coverage-nightly: exact skips + --ignore-run-fail
folds #4109 Closes #4016 llama.cpp fit is the placement gate for every ladder cell
folds #4167 Closes #4133 guards called directly by workflow steps run under setsid --wait
folds #4172 Closes #4142 the mutants gate mutates the workspace and caps the diff; a nightly judges the rest
folds #4174 Closes #4168 make contracts propagates pv's exit status
folds #4180 Closes #4059 wire the KEPT binaries' dark CLI tests (capped)
folds #4185 Refs #4151 include!d .rs files enter the fmt gate as a shrink-only ratchet
folds #4206 Refs #4189 nightly: per-arch publish, pv, CI-green gate, SHA manifest
folds #4208 Closes #4186 fleet hosts run ONLY the manifest nightly apr/pv, fail closed
folds #4210 Closes #4190 the v2 writer golden, pinned by derivation and wired into CI
folds #4257 Closes #4256 release binaries embed their commit (APR_GIT_SHA_OVERRIDE)
folds #4284 Closes #4283 install.sh --channel rc installs the newest -rc prerelease

Parked (reverted out, or never merged; each branch kept; each re-enters via the next like-batch)

Batch-only fixes (commit 81f3419)

  • check_nightly_pin.sh: a case string contained "no cargo build". That put the guard in guard_tree's cargo-only universe, so CI's --no-cargo step skipped it and check_guards_are_wired reported it as NEW unwired.
  • check_bin_cli_tests_wired.sh: fixed bashrs SEC011 by changing rm -rf "$T" to "${T:?}", which keeps the shell-lint ratchet at baseline.
  • Dropped the stale PMAT-4252 roadmap entry that was left after feat(dogfood): #4252 advisory apr-serve lane (gx10 CUDA → lambda CPU yield) + 3-way serve bench #4282 was parked.

Verification (at 81f3419)

  • bash scripts/guard_tree.sh --no-cargo: 102 checks, 0 failed.
  • cargo fmt --all -- --check: clean.
  • cargo deny check advisories: clean.
  • cargo test -p aprender-contracts --lib: 1700 passed, 1 failed (lint::tests::lint_empty_dir). The same failure occurs on main @ aa7c6ef, and th

🤖 Generated with Claude Code

keep-open: this is a CI-infra replay of B2 (#4315); #3839 #4151 #4189 #4219 are cited for context and close with their own owners' PRs
ont-delta: none CI-infra replay of batch B2 (#4315) onto main; no ontology type, shape or resolves change

noahgift and others added 2 commits September 25, 2026 16:12
… (REPLACES #4315)

Operator ruling 16:15 (via cop): no main-merges into PRs; cut fresh from main.
merge-base(main, B2) == main a5efa14, so this tree is exactly B2 tip ffafeca.
A linear cherry-pick stopped at commit 4/141 (Makefile, coverage-skips.txt):
B2's 30 internal merges carry those resolutions, so the tree is replayed whole.

Source commits (141, oldest first):
- 2fc52a4 ONT-4c: the plan a quorum can read — five decisions, and the measured baseline they are taken ag
- a13eb0f ONT-4c: the grill refused the plan, and the measurement refuses the grills own fix for D4
- 24e9465 ONT-4c: the roadmap entry, after its ONT family (Refs PMAT-3847)
- 8e3bbea fix(coverage): skip by EXACT test path from a reasoned list, not 19 substrings (#3839)
- edff015 fix(coverage): never mv ~/.cargo/config.toml; exact-skip the zram timing test that blanked the nig
- cbcec70 fix(coverage): --ignore-run-fail, failing tests LISTED, and "did not measure" is never a verdict (
- 09030be fix(coverage): no verdict when a test binary was KILLED — --ignore-run-fail swallowed it (#3839)
- 02fe2e0 fix(coverage): run aprender-serve's lib tests as per-module processes so none is OOM-killed (#4023
- 8509d07 feat(ladder): #4016 — llama.cpp fit is the placement gate for every ladder cell; no verdict = RE
- 71e0224 feat(ladder): #4016 — the fit ctx floor is min(4096, the model's trained context) (cop ruling)
- 4a266eb fix(coverage): cap the gpu shard at 4 threads; run named heavy tests solo with measured peak RSS (
- 7c5ffda fix(coverage): chunk the gpu module into <=200-test processes; solos first; run everything before
- 082df3c fix(coverage): the merged report must be --workspace; an unqualified report covers only the root f
- 6236df8 fix(coverage): scope EVERY llvm-cov report by a derived -p list, plus a guard (#4023)
- 8dfaff5 chore(coverage): COV_FLOOR 88 -> 89 after the first complete measurement, 90.26% (#4023)
- fed0b56 chore(roadmap): file PMAT-4023 for the coverage-nightly port (#4023)
- 96a28d3 fix(coverage): classify the coverage lists; the scope guard refuses a vacuous scan (#4023 quorum l
- ee81968 fix(coverage): wire both new guards through guard_tree.sh --no-cargo, with no workflow edit (#4023
- 54157e6 chore(roadmap): regenerate the aggregate for the new fragment (make roadmap-aggregate)
- 384ad49 chore(roadmap): PMAT-4016 ticket entry (pmat work add --github-issue 4016)
- 526e898 fix(package): four crates no longer ship tests that cannot compile from their .crate (#4130)
- 6cd6f36 ci: every guard a workflow step calls directly runs under setsid --wait (#4133)
- da71f44 fix(#4130): aprender-core unit tests read repo-root contracts at run time — the #4129/#4048 patt
- d1f3c58 fix(#4130): check in aprender-db's generated_contracts.rs like the 25 other crates — a build no
- 8868086 PMAT-4016: regenerate the roadmap aggregate (quorum round 1 lane 3, measured) + round-1 artifact
- 9cf59b2 docs(audit): #4130 implementation receipt + roadmap entry
- c8c7643 ci: setsid --wait for guard calls in EVERY workflow; the guard scans all workflows and the sh/./ f
- 10fa952 docs(audit): quorum-PMAT-4130 — 3/3 PASS at 9cf59b2 (gemini-3.1-pro-high, 3.8-flash-high, 3.7-
- d5932e5 PMAT-4016: quorum receipt round 2 — 3/3 PASS (gemini 3.1-pro/3.8-flash/3.7-flash), not armed
- 7e564b1 evidence(quorum): PMAT-4023 round at 54157e6 (3/3 gemini PASS, agreed) + cop ruling
- 517edff ci(guard): check_guard_steps_isolated also refuses the bare form and scans .yaml workflows and com
- dcf4823 fix(guard): include!d .rs files enter the formatting gate as a shrink-only ratchet — cargo fmt n
- bc08f69 ci(mutants): mutate the WORKSPACE -- the blocking gate never mutated crate code; RED cap + nightly
- 514e718 test(mutants gate): a row on the REAL cargo-mutants 27 outcomes.json shape; correct a claim in bc0
- 51b0485 ci(guard): run the mutants gate's case table on every PR via guard-tree
- c759952 fix(mutants gate): keep the crates workspace-test excludes out of mutation -- aprender-compute wou
- 2fadfd1 fix(mutants-nightly): diff from the last SUCCESSFUL nightly, not "24 hours ago"; anchor the exclud
- 29641c0 docs(audit): PMAT-4133 receipt + quorum 3/3 at 517edff (2 agy + 1 haiku)
- c5991aa fix(mutants-nightly): read the last successful run over REST, not gh -- the fleet has no gh (#4142
- c5cf8d5 docs(audit): PMAT-4133 ph round lane 1 voided by cop ruling — 2/3, not armable
- 0a5eafd docs(audit): degraded quorum receipt for #4142 -- 3/3 PASS at c5991aa
- 5743fb4 PVL-001 EV-4: make contracts propagates pv's exit — a failing pv lint | tail exited 0
- 739d80f fix(ci): the KEPT binaries' CLI tests ran nowhere — wire 82 targets capped, refuse a spawning ta
- 0bff759 fix(roadmap): regenerate roadmap.yaml for the PMAT-4059 fragment; receipt claimed rc 0 from a pre-
- aa0f702 fix(guard): a bare guard chained mid-line is refused too (#4133 ph6 review)
- 943cced docs(audit): PMAT-4133 round at the prior head recorded — superseded by the review fix, not coun
- 354631a PVL-001 EV-4: the case table reads make's output by here-string, not a pipe into grep -q
- 71b62fd audit(PMAT-4059): quorum r2 3/3 PASS at 0bff759 — gemini-3.1-pro-high, claude-sonnet-5, claude
- 75f6b6b feat(pin): fleet hosts run ONLY the manifest nightly apr/pv — apr_bin.sh + pv_bin.sh refuse anyt
- e6cce2a fix(nightly): per-arch publish, pv, CI-green gate and a SHA manifest (Refs #4189)
- f1c6803 PMAT-4186: roadmap entry carries kind:code (the rail's kind-gate refused without it)
- b3690ca fix(apr-format): the v2 writer golden was stale since #2254; pin the new one to the old by derivat
- 8b15f91 docs(roadmap): GH-4190 work entry
- 52be02a fix(nightly): quorum findings — reused night crashed publish; upload-then-swap with retries; no-
- 64cd17d chore(GH-4190): the roadmap entry carries kind: code (the kind-gate reads it)
- a909632 PMAT-4186: the nightly-pin case table is hermetic — scrub every knob once, pin the marker baseli
- d0098f8 fix(nightly): a cancelled build was a permanent verdict; --version must print the crate version (#
- 5c6fa5a fix(guard): check_guard_steps_isolated missed a bare guard after elif or in a case arm
- 398a362 PMAT-4186: the Actions exemption needs a real run id and is never silent; any non-0/1 mode rc refu
- e57562f PMAT-4186: a broken mode rule refuses with a reason, not silently
- 30d14f4 docs(nightly): a NIGHTLY_BINS/--bin drift is build-failed, not missing-artifact (quorum r3 note)
- 7d7af48 chore(GH-4190): regenerate roadmap.yaml from its fragments (make roadmap-aggregate)
- c88a6a7 docs(audit): PMAT-4133 ph8 quorum: 3/3 PASS at 5c6fa5a (degraded: same-family)
- 94aa3f4 PMAT-4186: the denylist matches a binary's own sha256 and every object field; a relative override
- 56ae4d3 fix(pin): a null generated_at read as fresh, and the rule came from the cwd's checkout
- 50abde4 fix(GH-4190): the PROVENANCE const precedes the test's statements (clippy::items_after_statements)
- 89884bb fix(pin): zsh named a PATH-found resolver by its bare name; the leak guard never saw nightly_pin.s
- 60f4810 fix(GH-4190): the tree-reader ledger lists apr-format --test golden_fixtures (check_tree_reader_te
- d87e43c fix(pin): a bare-name rule lookup searched PATH before the cwd
- 7e6e08d fix(pin): an unset HOME read as "no fleet marker" and silently meant HEAD mode
- 720759b test(pin): zsh rows for an empty HOME; guard $HOME in apr_bin.sh CARGO_HOME defaults
- f4fc84c PMAT-4186: quorum receipt — AGREED 3/3 PASS on 720759b
- 6adfc02 release: apr binaries embed their commit — APR_GIT_SHA_OVERRIDE from the host checkout (Refs #42
- 519c541 feat(dogfood): #4252 advisory apr-serve lane (gx10 CUDA -> lambda CPU yield) + 3-way serve bench
- 0f83b9a fix(dogfood): #4252 lane — one-line state protocol, used_gpu probe (#4146), NO-VERDICT receipt
- 92e3c9c fix(dogfood): #4252 lane — one hard budget per ask (default 120 s), 'unavailable' on expiry
- 803d335 docs(roadmap): PMAT-4252 entry + implementation receipt (#4252)
- 6205968 install.sh: --channel rc installs the newest -rc prerelease (closes #4283)
- a0f072f fix(dogfood): budget proven on the yield path; server identity by argv tokens (#4252)
- 62eee9c fix(dogfood): yield during model load, bounded probes, gx10-side state dir (#4252)
- 8f46a2b docs(receipt): round-2 fixes, watcher test, live yield re-proof on v0.69.3-rc.1; trace grep catche
- 5d17cc3 fix(lane): killpg race and --timeout 0 cancelling the alarm (quorum R3, PMAT-4252)
- af759e9 fix(lane): an alarm spent in the gx10 leg left lambda unbounded (quorum R4, PMAT-4252)
- f1ff895 feat(release): aarch64-apple-darwin apr CPU asset, required by the asset checker (#4292)
- f5c28b1 fix(lane): budget alarm as BaseException, reap yielded servers, malformed 200 is a receipt (quorum
- f2743de feat(release): darwin lane runs on the self-hosted mini-builder, not hosted macos-14 (#4292)
- be8bf8c ci: re-run with the keep-open body line (R-2 reads the event payload, so a rerun cannot see an edi
- 8cccb57 ci: re-run with the keep-open body line (R-2 reads the event payload, so a rerun cannot see an edi
- cf4a31c fix(lane): reap the killed server even when pid_alive answers 'dead' mid-exit (PMAT-4252)
- 7a34570 feat(bins): every [[bin]] --version prints the build SHA via shared aprender-build-sha (Refs #4219
- 69c3b5b Revert "fold #4219 build-sha (feat/4219-build-sha) into B2 batch"
- 66beb4d Revert "fold #4282 (feat/4252-apr-dogfood-lane) into B2 batch"
- 104c91b Revert "fold #4294 (feat/4292-darwin-arm64-asset) into B2 batch"
- c53bb80 chore(roadmap): regenerate aggregate after parking #4282/#4294/#4219 out of B2
- 81f3419 fix(b2): clear the three guard reds the batch introduced
- e69d400 chore(roadmap): PMAT-4219 kind:code, in progress (Refs #4219)
- c261e8e chore(audit): re-audit --version rows for the build-SHA bins (Refs #4219)
- eac1bc4 chore(dogfood): denominator 838 -> 864 after the 26 --version rows (Refs #4219)
- 3df7681 Revert "Revert "fold #4219 build-sha (feat/4219-build-sha) into B2 batch""
- 6cc8033 feat(nightly): ship every workspace [[bin]], derived from cargo metadata (#4189)
- 2518199 fix(nightly): record probed every bin through a relative path from an empty cwd
- b8158df docs(nightly): quorum NITs — stale self-test comment; why --bins none is never probed
- e4623ad feat(release): every workspace [[bin]] builds and smokes at the release commit (#4189)
- 997e010 fix(binary-debt): run the qwen3-moe live `apr run` falsifier nightly on gx10, fail closed (#4179)
- 1385d34 chore(roadmap): PMAT-4179 fragment, kind:code (#4179)
- 478a0a0 ONT-4c: README.md, CLAUDE.md, one .apr and one CSV as graded contracts, with their extractors and
- ebe54f6 ONT-4c: Σ entity_type_target_class is cross-checked against entity_types, not hand-kept; the spec
- e0572d8 ONT-4c: restore the receipt's frontmatter fence and put the test tally in its table row (Refs PMAT
- a27844f ONT-4c: receipt status is `complete`, the only value check_receipt_complete accepts for finished w
- 8b1577f fix(ci): B2 reds after the #4320 merge — py3.10 TOML reader, build.rs crate docs, tree-reader re
- 674ce8e fix(guard): fallback TOML reader skips multi-line strings; parity row says skip, not silence (#431
- 219af85 feat(nightly): ship apr --features cuda as apr-<target>-cuda, judged like every bin plus its libcu
- e877e43 fix(lint): backtick APR_GIT_SHA in the three build.rs crate docs (clippy::doc_markdown) (#4315)
- 9c5acd0 fix(dogfood): re-derive per_binary/band/cluster baselines after the 26 --version rows (#4315)
- c560caa fix(paths): take the 6 shipped /home/noah paths B2 added back out — hardcoded-path ratchet +6 ->
- c5b6f9c PMAT-3847: roadmap entry as a fragment + regenerated aggregate (guard-tree: fragment-required, sor
- dc1e832 PMAT-3847: CI — shapes ratchet names ONT-4c's four shapes; CLAUDE.md tok/s literals removed
- c4fd00a qwen-story-daily builds apr in place instead of cargo-installing into the host's ~/.cargo/bin —
- a458e37 docs(audits): PMAT-4346 quorum receipt for c4fd00a -- 3/3 PASS, degraded same-family (agy lane e
- 7fadb39 regen: roadmap aggregate after #4346 fold
- 7774007 fix(guard): include_fmt.py died on the runners' python 3.10 — no tomllib (#4315)
- b2f70a5 ONT-4c: explicit targetClass on the three new shapes; entity-props-ok maps `study`
- 366c9bf test(build-sha): kill the 8 mutants B2's mutants job MISSED (#4315)
- fa35f3d fix(guard): include_fmt fallback refuses what it cannot read; case table in CI (#4315 quorum)
- 5e4bf6b fix(guard,build-sha): quorum round 2 — a stray triple quote refuses; the sha sources are injecte
- 3912313 fix(guard): include_fmt fallback refuses an ambiguous multi-line string end (#4315 quorum r3)
- 079232a fix(guard): include_fmt fallback reads a line from its opener's delimiter only (#4315 quorum r4)
- ea58604 ci(cuda-nightly): run the #4250 G0 serve batched-prefill test where the model exists
- 47c4a58 fix(fold): B2 x main guard interactions — fit arg, setsid, no silent truncation
- ae8566e PMAT-3847: re-arm ONT-4c's four shapes the v0.69.3 merge-back dropped
- 5caa960 fix(fold): B2 x main — duplicate cmd ordinals, and the truncation baseline must not grow
- 485940a fix(tests): four crates read their out-of-crate test fixtures at run time, so their published tarb
- b07666f roadmap: GH-4129 fragment (kind: code, measured in-tree and tarball proofs)
- 74011c7 fix(ptop): the seven ENFORCE include_str!s of tests/ become one run-time test, so `--features ptop
- aab7e20 fix(contracts): design_by_contract example reads contracts/ at run time, so `cargo test` builds fr
- d6f9f91 fix(contracts): design_by_contract panics in tree on a missing contract, exits 2 only without the
- 157ba6d fix(contracts): under .ONESHELL the lint line's `exit $$rc` ended `make contracts` green after lin
- 6957787 fold(B2): regenerate roadmap aggregate for the #4129/#4130 fragments
- d26f6fa fix(fold): B2 x ONT-4c — two claims name the command CI runs (setsid --wait), graph + ratchet re
- 5511ee7 fix(fold): valid-under fixtures carry the merged Σ — B2's D-T1 rule refused main's copy
- ffafeca fix(fold): regenerate tree_reader_tests.txt for the merged tree — guard-cargo + shard 2/3 red on

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…loor const instead of tok/s literals

Shards 1-3 REFUSEd: ordinal 455 was taken by main's ont7-valid-under-gate
and by B2's apr-format-golden-fixtures. check_no_claim_literals: B2's #4129
edit shifted five baselined doc lines in llama_370m.rs by 37, and the ratchet
refuses re-keyed entries. The doc now names AC_SHIP2_010_MIN_DECODE_TPS_RTX4090
instead of repeating the numbers. The baseline is pruned by 22 stale entries
(shrink only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@noahgift
noahgift enabled auto-merge September 25, 2026 14:16
noahgift added a commit that referenced this pull request Sep 25, 2026
…rge (< #4427) and only 24h (#4421, FLOW-04)

Operator ruling relayed by the cop (2026-09-25 16:14 Madrid): legacy receipts,
which carry no diff_patch_id, are grandfathered, bounded to PRs open when FLOW-04
merges and expiring 24h after. Encoded as two constants, PR_REVIEW_LEGACY_BELOW=4427
and PR_REVIEW_LEGACY_UNTIL=2026-09-26T16:00:00Z. The signature is still verified.

Self-test 16 -> 20 rows: in-window -> 0, expiry second -> 1, PR after the ceiling -> 1,
bad signature in the window -> 1. row() pins LEGACY_BELOW=0 so no other row can reach
the exemption.

Pmat-Ticket: PMAT-4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=4427 head=8f05036935e5e244eedce30f175e085fce7bdcae verdict=REFUSE class=Q1 arm_rc=1

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

noahgift and others added 2 commits September 25, 2026 18:49
…ratchet was cut

guard-cargo's include_fmt_ratchet REFUSEd 17 include!d files (+2 test submodules
rustfmt follows) that main gained since B2 and that are not in the baseline this PR
introduces. Formatted rather than baselined: the baseline may only shrink.
Refs #4427

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…asure it — extract worst_normalised

check_complexity_ratchet RED NEW: iq4_nl_device_ab_tests.rs::real_model_iq_ab
cyclomatic 17 cognitive 28 after 71d0b2a reformatted the file. The
normalised-error closure moves to a helper; pmat now reads 9/10 and 9/18.
Behaviour unchanged (same loop, same NaN->inf and zero-denominator rules).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift and others added 5 commits September 25, 2026 21:31
…f; regenerated from the kernel headers

Fragment 490 wires sprint9_filtering_tests for the first time, and on the
gx10 aarch64 runner three of them failed: `echo` never showed brk. It did
call it. ld.so's first syscall, brk(NULL), printed as
`recvmsg(0x0, 0x0, 0x0) = <heap address>`, because socket..mremap sat two
numbers high (brk 216, not 214). 34 aarch64 rows were wrong, with
sched_yield and getrandom each listed twice. The x86_64 table had setgid..setsid
one high and pkey_mprotect at 302 (prlimit64).

Both tables are now regenerated from asm-generic/unistd.h and
x86_64 asm/unistd_64.h with the same name set, and they compile on every
host. The new abi_numbers tests pin every corrected row against the kernel
numbers. They require strictly ascending numbers and unique names, because
binary_search depends on both. Run against the old tables, all three fail.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…46 + PMAT-4421)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… — setsid as PID 1 reaps an orphan and exits 1

#4427 wraps guard steps in `setsid --wait`. In the 4 steps that run it inside
`docker run`, setsid is the container's PID 1: orphaned grandchildren (the
nextest probe's cargo/rustc) reparent to it, its wait() returns one of THEIR
pids instead of bash's, and util-linux errs "setsid: wait: Success", rc 1,
before the guard prints a verdict. guard-cargo failed this way on gx10-build
and yoga-build3 (runs 36182568927 a1/a2); main has no setsid, so it never did.

Measured on gx10, image sha256:0569673d, same script + config as main:
  without --init  3/3 rc=1 'setsid: wait: Success'
  with    --init  3/3 rc=0 'PASS: every key is understood.'
  without setsid  rc=0 PASS
--init makes tini PID 1, so orphans are reaped there, not by setsid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nreachable)

Unsigned; the CI signer signs. Guard accepts a throwaway-key-signed copy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@noahgift noahgift closed this Sep 25, 2026
auto-merge was automatically disabled September 25, 2026 22:59

Pull request was closed

@noahgift noahgift reopened this Sep 25, 2026
@noahgift
noahgift enabled auto-merge September 25, 2026 22:59
@noahgift
noahgift disabled auto-merge September 25, 2026 23:10
noahgift and others added 5 commits September 26, 2026 03:17
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
HEAD added PMAT-4179/4186/4219, main added PMAT-4215 in the same span;
all four kept in id order. 1091 ids = union of both sides, 0 duplicates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tions.yml (#4441 moved the jobs there)

#4441 cut ci.yml to 5 fat jobs and moved every old job into ci/sections.yml,
run by scripts/ci/fat_driver.py. ci.yml takes main's side whole; B2's 60 ci.yml
hunks (setsid --wait wrappers, docker run --init, MUTANTS_CAP/JOBS, the
mutants outcome block) apply to ci/sections.yml unchanged (fuzz ≤2, 0 rejects).

Refs #4427

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…point them at ci/sections.yml

After the merge with #4441 (5 fat jobs), every old ci.yml job lives in
ci/sections.yml, run by scripts/ci/fat_driver.py.

- mutants: the step took its --exclude list from the workspace-test nextest
  line in .github/workflows/ci.yml; that line is now ci/sections.yml:446 only,
  so the step would exit 'no --exclude list found'. Read it from sections.yml.
- check_guard_steps_isolated.sh (#4133): scanned .github/workflows only, so it
  was blind to every guard step #4441 moved; its self-test mutant found no
  wrapper to remove in ci.yml (FAIL). Scan ci/*.yml + ci/vendor/*.yml too and
  mutate ci/sections.yml (absent = FAIL, not a skip). Re-proven in the new
  scope: a bare invocation planted in ci/sections.yml -> rc=1; self-test 0 failed.
- deploy-apr-install.yml (#4460, landed after B2 was cut) called
  check_tool_versions.sh without setsid --wait; the guard refused it. Wrapped.

Refs #4427

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… B2 — it lands via #4431

Cop ruling on #4427: split. The replay commit 2dcf2ee carried ONT row 4c,
and that row put 324 of B2's 342 PR-diff mutants over the on-PR cap of 60
(#4142; the cap is unchanged). This reverts only the ONT-4c paths:
aprender-contracts ontology/ + lint/, the pv lint measured-set ratchet
(lint.rs, lint_arming.rs), the ont4b/ont4c tests and cmd 530,
tests/fixtures/ont, and the ONT-4c corpus rows (claude-md, csv-train,
readme-root, model-setfit-slice, shapes.ttl, contracts.nt, ontology.yaml,
lint-baseline.json, census.json, ont-model-receipts). The #4219 build-sha
and #4129 out-of-tree changes in the same crates stay.

aprender-contracts --lib: 1721 passed. aprender-contracts-cli: all green.

Refs #4427

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@noahgift
noahgift enabled auto-merge September 26, 2026 15:24
…ADME claim fences

321baaa left three derived surfaces still pointing at ONT-4c:
- scripts/tree_reader_tests.txt listed ontology::extract::{llm_context,readme}
  and ont4c_doc_contracts, so guard-cargo and workspace-test step 7 went RED
  on drift (regenerated with check_tree_reader_tests.sh --update).
- CLAUDE.md cited contracts/claude-md.yaml (FALSIFY-DOCS-CLAUDE-001) and
  carried the ONT-4c bash/text claim-fence split; README.md the same plus the
  ONT frontmatter and a contract count of 1841. Both revert to the
  2dcf2ee^ text; README keeps B2's own workspace-crate count (81, measured
  with cargo metadata).

readme_contract 16/16; check_tree_reader_tests, check_readme_claims,
check_readme_numeric_claims, check_ont_ratchet, check_pr_ont_delta green.

Refs #4427

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…e tests read as owed-not-executed

libtest prints a #[should_panic] test as `test X - should panic ... ok`; cargo_ids()
required `test X ... ok`, so x86-main's full-tier Compute step went RED on six tests
that passed (tiling, blis::prepacked, brick::buffer, partition_view). Main is latent:
its push tier never runs Σ compute. New self-test row; reverting the regex turns it RED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift added a commit that referenced this pull request Sep 26, 2026
…point them at ci/sections.yml

After the merge with #4441 (5 fat jobs), every old ci.yml job lives in
ci/sections.yml, run by scripts/ci/fat_driver.py.

- mutants: the step took its --exclude list from the workspace-test nextest
  line in .github/workflows/ci.yml; that line is now ci/sections.yml:446 only,
  so the step would exit 'no --exclude list found'. Read it from sections.yml.
- check_guard_steps_isolated.sh (#4133): scanned .github/workflows only, so it
  was blind to every guard step #4441 moved; its self-test mutant found no
  wrapper to remove in ci.yml (FAIL). Scan ci/*.yml + ci/vendor/*.yml too and
  mutate ci/sections.yml (absent = FAIL, not a skip). Re-proven in the new
  scope: a bare invocation planted in ci/sections.yml -> rc=1; self-test 0 failed.
- deploy-apr-install.yml (#4460, landed after B2 was cut) called
  check_tool_versions.sh without setsid --wait; the guard refused it. Wrapped.

Refs #4427

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 46169b0)
…ml, kill build-sha emit/git_rerun_triggers mutants

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@noahgift
noahgift added this pull request to the merge queue Sep 27, 2026
Merged via the queue into main with commit d326bc1 Sep 27, 2026
20 of 22 checks passed
@noahgift
noahgift deleted the replace/b2-ci-infra-on-main branch September 27, 2026 07:36
noahgift added a commit that referenced this pull request Sep 27, 2026
…nstall docs taken

Resolution (captain aprender-36's rules): the car wins on its rc.1 fixes; main's
side is taken only where the car lacks it. The net change vs car@219367a391 is 5 files:
- README.md + book/src/{introduction,getting-started/installation}.md: #4467 curl|sh install docs
- evidence/models/supported.yaml: regenerated (derive_model_manifest.sh --check PASS)
- .github/workflows/nightly.yml: car's file (it already carries main's #4326 cuda step
  AND build-darwin/publish-darwin); cuda step APR_SHA uses --short=9, as binary-release.yml does
Every other conflict resolved to the car's content: #4427 is the B2 fold the car already
carries, reworked. Includes the aprender-* bin renames, workspace_file_or_skip!, the
coverage_serve_shards .py->.sh port (the re-added .py is removed), the 457/480 cmd
duplicates of 458/481 (removed), and a union roadmap (the car's is a superset of main's).
Two clean-hunk duplicates were dropped: a second [build-dependencies] in aprender-explain
and a repeated include_fmt_ratchet case in check_package_includes.sh.

Conflicted files:
  .github/workflows/binary-release.yml
  .github/workflows/nightly.yml
  Cargo.lock
  Cargo.toml
  Makefile
  README.md
  ci/sections.yml
  contracts/apr-dogfood-coverage-v1.yaml
  crates/apr-cli/build.rs
  crates/apr-cli/src/bin/apr-corpus-ingest.rs
  crates/aprender-build-sha/Cargo.toml
  crates/aprender-build-sha/src/lib.rs
  crates/aprender-core/src/format/ship_001.rs
  crates/aprender-core/src/format/ship_003.rs
  crates/aprender-core/src/format/ship_004.rs
  crates/aprender-core/src/format/ship_010.rs
  crates/aprender-core/src/format/tests/provenance_tests.rs
  crates/aprender-data/src/cli/mod.rs
  crates/aprender-db/Cargo.toml
  crates/aprender-db/build.rs
  crates/aprender-orchestrate/Cargo.toml
  crates/aprender-orchestrate/build.rs
  crates/aprender-orchestrate/src/main_cli.rs
  crates/aprender-present-cli/Cargo.toml
  crates/aprender-present-terminal/src/bin/ptop.rs
  crates/aprender-present-terminal/src/bin/score.rs
  crates/aprender-qa-certify/src/main.rs
  crates/aprender-simulate/Cargo.toml
  crates/aprender-simulate/src/cli/args.rs
  crates/aprender-verify-ml/src/bin/verificar.rs
  crates/aprender-zram-cli/src/lib.rs
  docs/audits/surface_audit.csv
  docs/roadmaps/roadmap.yaml
  evidence/models/supported.yaml
  scripts/check_guard_steps_isolated.sh
  scripts/check_model_ladder.sh
  scripts/check_ont_ratchet.sh
  scripts/ci/sigma_executed.py
  scripts/claim_literal_baseline.txt
  scripts/install.sh
  scripts/tests/make_contracts_propagates.sh
  scripts/tree_reader_tests.txt
  scripts/tree_reader_unwired_baseline.txt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift added a commit that referenced this pull request Sep 27, 2026
…4427 wraps ci/sections.yml runs in `setsid --wait`

lint_passes_on_real_contracts failed 3/3 on shard 3: README's `bash scripts/check_readme_claims.sh` and
CLAUDE.md's `bash scripts/check_package_includes.sh` no longer matched a CI line verbatim. normalise now
drops a leading `setsid [--wait|-w]`; case table covers the non-prefix and bare forms.

Refs #4431

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift added a commit that referenced this pull request Sep 29, 2026
…4427 wraps ci/sections.yml runs in `setsid --wait`

lint_passes_on_real_contracts failed 3/3 on shard 3: README's `bash scripts/check_readme_claims.sh` and
CLAUDE.md's `bash scripts/check_package_includes.sh` no longer matched a CI line verbatim. normalise now
drops a leading `setsid [--wait|-w]`; case table covers the non-prefix and bare forms.

Refs #4431

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 7a8088d)
Agent: aprender-66
guyernest pushed a commit to guyernest/aprender that referenced this pull request Sep 29, 2026
…fies merge-queue squashes (paiml#4421, FLOW-04) (paiml#4426)

* feat(pr-review): bind the receipt to the diff's git patch-id --verbatim, fail closed (paiml#4421)

The merge queue lands a PR as a one-parent squash, so Arm 4's head_sha/ancestor
binding verified 0 of 6 queue merges (merge-queue evaluation, 2026-09-25); the
diff patch-id matched 6 of 6.

- scripts/lib/pr_review_patch_id.sh: pinned `git diff` (algorithm, renames,
  orderFile, prefixes, textconv, ext-diff, context all overridden), excluding
  evidence/pr-review/<pr>/, hashed with `git patch-id --verbatim`. Fails closed
  on an empty diff, an unresolvable commit, or more than one id.
- scripts/lib/git_patch_id.py: a line-for-line port of git v2.53
  get_one_patchid(), used where git < 2.40 has no --verbatim (lambda and intel
  run 2.34.1). Matches native 120/120 on lambda (--stable/--unstable, history),
  189/189 on yoga 2.53 and on gx10 2.43 (all three modes, including
  whitespace/CRLF/binary/no-EOL). git 2.34's legacy --stable is NOT an oracle
  for binary or no-EOL diffs, so the self-test asserts golden ids from yoga.
- pr_review_sign_receipt.sh stamps predicate.diff_patch_id (+ _algo) from the
  signed base_sha..head_sha before signing; refuses a receipt with no
  base/head, an unresolvable commit, an empty diff, or an author-supplied id
  that disagrees. Self-test 8 -> 14 rows.
- check_pr_review_arm4.sh A2 selects the receipt by patch-id: the subject's
  diff is <sha>^1..<sha> on merge_group, merge-base(origin/main)..<sha>
  otherwise. Self-test 10 -> 16 rows: queue squash onto a moved main -> 0,
  one byte changed -> 1, one trailing space -> 1, two-parent queue commit -> 1,
  legacy receipt with no id -> 1.

Refs ASL-00a (pi-21): the signer runs as the admin identity, the shared root.

Pmat-Ticket: PMAT-4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(spec): §13.3.a — the pr-review receipt binds by diff patch-id, not ancestry (paiml#4421)

Pmat-Ticket: PMAT-4421
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* roadmap: PMAT-4421 entry (paiml#4421)

Pmat-Ticket: PMAT-4421
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pr-review): pre-paiml#4421 receipts are exempt only for PRs open at merge (< paiml#4427) and only 24h (paiml#4421, FLOW-04)

Operator ruling relayed by the cop (2026-09-25 16:14 Madrid): legacy receipts,
which carry no diff_patch_id, are grandfathered, bounded to PRs open when FLOW-04
merges and expiring 24h after. Encoded as two constants, PR_REVIEW_LEGACY_BELOW=4427
and PR_REVIEW_LEGACY_UNTIL=2026-09-26T16:00:00Z. The signature is still verified.

Self-test 16 -> 20 rows: in-window -> 0, expiry second -> 1, PR after the ceiling -> 1,
bad signature in the window -> 1. row() pins LEGACY_BELOW=0 so no other row can reach
the exemption.

Pmat-Ticket: PMAT-4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pr-review): a legacy receipt keeps the pre-paiml#4421 ancestor rule on branch events; ruling recorded in spec + ticket (paiml#4421)

Quorum round 1 (lane 2, gemini-3.8-flash-high) FAILed the exemption on two grounds:
the ticket and spec did not record it, and a legacy receipt was accepted without the
ancestor check it needed before paiml#4421. Both fixed:
- A2: on a branch event a legacy receipt must still have its head_sha as an ancestor
  of the subject; only the queue squash, which that rule could never bind, relies on
  the signature and the two bounds alone.
- spec §13.3.a and PMAT-4421's acceptance criteria record the ruling and its bounds.
Self-test 20 -> 22: legacy-exempt-not-ancestor -> 1, legacy-exempt-queue -> 0.

Pmat-Ticket: PMAT-4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pr-review): the legacy exemption tried only the last-listed legacy receipt; try every one (paiml#4421)

Quorum round 2, lane 1: with two pre-paiml#4421 receipts, a stale head listed last hid
a legacy receipt whose head IS an ancestor, and the branch event went RED. A2 now
collects every legacy receipt and binds the first whose head is an ancestor (queue:
the first, as before). New self-test row legacy-two-last-stale (23/23).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pr-review): bashrs DET002/SEC010 on the paiml#4421 legacy lines, suppressed with the reason (guard-cargo)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pr-review): state the grown Arm 4 (23) and signer (13) case-table counts; rename a row the derive regex could not see (guard-tree)

check_pr_review_counts.sh derives rows with [a-z-]+, so legacy-expired-at-24h
was invisible to it and the tree read 22 against a 23-row table.

Refs paiml#4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(guard): anchor the shadow-row needle to its own step — 'case table: 13 rows' also matched the signer step

Once the signer table reached 13 rows, growing the shadow table to 13
found the signer's step name and the tree-grew-a-shadow-row mutant survived.

Refs paiml#4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(guard): derive the signer table from every hand-rolled check, not a fixed +1 — it runs 14, not 13

paiml#4421 added a second hand-rolled check (the patch-id assertion); the derive
still assumed one and agreed with a step name that understated the table.
Caught by quorum r5 lane 1.

Refs paiml#4421

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

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