Skip to content

release(0.67): train A — 17 row PRs of the 0.67.0 train in one build graph (PMAT-1098) - #3127

Open
noahgift wants to merge 190 commits into
mainfrom
PMAT-1098-067-train-A
Open

release(0.67): train A — 17 row PRs of the 0.67.0 train in one build graph (PMAT-1098)#3127
noahgift wants to merge 190 commits into
mainfrom
PMAT-1098-067-train-A

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

The 0.67.0 train, batch A — one build graph for 17 row PRs (PMAT-1098, epic #3078)

After #3115 squash-merged (16:43Z) every open PR went DIRTY on docs/roadmaps/roadmap.yaml and 15 single-row runs sat queued behind a 166-job X64 backlog while gx10 idled. This PR replaces those 15 PR runs + 15 merge-group runs with ONE PR run + ONE merge-group run. Every row was merged with the roadmap 3-way-by-id driver (scripts/lib/roadmap_merge.py, PMAT-3118); the roadmap parses with 844 unique ids.

Row PR Branch
aarch64 lint + 2 dark test targets (gx10 gate) #3112 PMAT-1102-aarch64-lint
arch-neutral routing: 8 jobs drop X64 #3104 PMAT-1098-gx10-arch-neutral-routing
67-C2 self-hosted preflight + fleet toolset (P0-2 #3083) #3088 PMAT-1098-67-C2-self-hosted-preflight
67-E3 guards under the PR budget #3094 PMAT-1098-67-E3-guards-under-budget
67-C1/D1 advisory gpu-quick (gx10) + cuda-unit (yoga) #3095 PMAT-1098-67-C1-D1-gpu-pr-jobs
67-A1 four apr assets per tag (P0-1 #3082) #3092 PMAT-1098-67-A1-four-apr-assets
06x release schedule spec (PMAT-1097) #3087 PMAT-1097-06x-release-schedule
CUDA asset target mountpoint (PMAT-1096) #3098 PMAT-1096-cuda-asset-target-mountpoint
PMAT-1100 triage receipt #3102 PMAT-1100-triage-release-trains
spec-conformance fixtures are bytes #3109 PMAT-1098-spec-conformance-locale
Q5_K ggml layout (PMAT-1101) #3110 PMAT-1101-q5k-ggml-layout
CUDA Q5_K GEMV (PMAT-1104) #3113 PMAT-1104-cuda-q5k-gemv
examples dogfood + cookbook/release-notes rows (PMAT-3121) #3122 PMAT-3121-examples-dogfood
coverage-nightly on the yoga pool #3123 PMAT-1098-coverage-nightly-on-yoga
PMAT-3124 triage labels #3125 PMAT-3124-triage-labels
NVIDIA CUDA Rust integration spec #3061 docs/nvidia-cuda-rust-integration-spec
Qwen3.5 honest refusal #3099 PMAT-1098-qwen35-honest-refusal
ci_resolve_dirty.sh --apply pushed nothing (it removed the worktree holding the merge) agy goal lane a372b45

Hand-resolved conflicts (the only non-driver merges)

.github/workflows/ci.yml, 67-E3 vs #3115 and vs 67-C2/#3104:

After this merges

The row PRs above are closed with landed via train #<this>; #3116 closes as superseded by #3112. gx10 pool1/build get clean-room (pool2 is the canary on this PR's own run).

🤖 Generated with Claude Code

Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

noahgift and others added 30 commits September 9, 2026 13:18
…n (0.67)

Research + two-pass review (agy grillme, agy /teamwork-preview) of NVIDIA's
CUDA Rust announcement against aprender's GPU surface.

Recommendation: 0.67 ships T0 + O2, neither of which needs an NVIDIA
dependency. Everything requiring cuda-core/cutile defers to 0.68 behind a
driver/toolkit prerequisite no fleet host meets today.

Load-bearing findings, all measured on 2026-09-09 (HEAD 1faf090):

- G2/G3: aprender-gpu holds 2,620 tests and is excluded from every required
  check (ci.yml:417). 444 of them need no GPU and run in 0.10s.
- G18: contracts/trueno/ptx-codegen-safety-v1.yaml has asserted a register/
  occupancy budget since 2026-04-06, and it is vacuous — the generated macro
  contract_register_budget! is invoked NOWHERE in the tree, its postcondition
  names an unbound symbol, its falsifier is prose, and it carries
  registry: true. Neither review lane found this; it is why the scope is not
  reduced to T0 alone.
- G7/G8/G9: cuda-core 0.3.1 builds on stable Rust with CUDA 12.x but refuses
  at runtime on driver 570.207, and passes end-to-end on gx10 (sm_121, CUDA
  13.0, driver 590.48.01) through load_module_from_ptx_src -> launch.
- G12: cutile needs CUDA 13.1+/13.2+; no fleet host qualifies. The draft's
  "upgrade gx10" step is withdrawn — gx10 is the only Blackwell host and the
  only cuda-nightly host. Evaluation moves to yoga.
- G16/G20: an oracle crate must live in experiments/ with its own [workspace];
  --all-features (Makefile:659,994,1010) would otherwise hard-fail
  make coverage and make mutants for contributors without a CUDA 13 toolkit.

Every citation re-verified by script; two line numbers taken from a subagent
report were wrong (206/293 vs the measured 207/294) and are corrected, with
the lesson recorded in the review record.

Refs: https://developer.nvidia.com/blog/introducing-cuda-rust-two-tracks-for-writing-gpu-kernels/

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J9cSQynVPYeUkQ2i7ccvrs
…3 unblocked

Operator ruling 2026-09-09, verbatim: "false YOU WILL UPGRADE". This overrules
the grill's RANK3 and the spec's own §7 recommendation. Per repo doctrine a
review lane may not reopen an operator decision.

Executed on gx10-a5b5: cuda-toolkit-13-3 (13.3.1-1, sbsa/arm64, 66 packages).
No kernel-driver package (asserted driver-free before apt ran); driver
unchanged at 590.48.01; CUDA 13.0 left on disk and intact.

Result — the T3 blocker is gone (G21): cutile-rs 0.3.1 BUILDS AND RUNS on
GB10 sm_121, stable rustc 1.95, 18.13s, JIT through CUDA Tile IR,
len=1024 mismatches=0. Before the upgrade the fleet max was 13.0, below
cutile's 13.1 floor, and this was untestable. T3 therefore moves into 0.67.

Corrections this commit also carries:

- G22 / §9.4: the upgrade was FIRST REPORTED HERE as "side-by-side, CI lane
  untouched". That was WRONG. /usr/local/cuda is a Debian ALTERNATIVES link,
  not a plain symlink; cuda-toolkit-13-3 registers priority 133 vs 13.0's 130,
  so the default flipped to 13.3 at 11:32:57 (/var/log/alternatives.log).
  The check that produced the false green was
      [ "$(readlink -f ...)" = "$(cat ...)" ]; chk "msg $(cat ...)" $?
  where the command substitution in the MESSAGE argument consumes $? before it
  is expanded, so $? carried cat's 0, not the test's 1. Reproduced both ways.
  Generalises the CLAUDE.md "never read $? through a pipe" rule: capture the
  status into a variable before any other substitution on the line.

- §9.5: the post-upgrade regression gate was RUN, with a control.
  2568 passed / 2 failed. Rolling the alternative back to 13.0 and re-running
  just those two shows 13.3 caused NEITHER:
    * test_alloc_oversize_100gb  — FAILS on 13.0 AND 13.3 (pre-existing)
    * test_cublas_gemm_f16_...   — PASSES alone on both; failed only inside
      the full suite (load-contended wall-clock assertion)
  Two pre-existing defects surfaced, both wrong-host assumptions:
  adversarial.rs:36 hard-codes "impossible on RTX 4090" (gx10 is a GB10 with
  unified memory, so the 100GB alloc legitimately succeeds), and
  cublas_tests.rs:174 asserts >50 TFLOP/s — a wall-clock assertion, the class
  already burned four times. Neither was visible because cuda-nightly.yml:242
  runs only the perf053 filter, so the --features cuda suite has never been
  green on the Blackwell host and nothing said so.

Rollback remains one command, no download:
  sudo update-alternatives --set cuda /usr/local/cuda-13.0

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J9cSQynVPYeUkQ2i7ccvrs
Operator direction: this spec ships in 0.68, not 0.67, and gets a GitHub
ticket linked to the document.

- Release targets shifted: the three shipping tiers (T0 un-dark the GPU crate,
  O2 arm the vacuous register_budget contract, T3 cutile A/B on gx10) move
  0.67 -> 0.68; the two deferred tiers (T1 cuda-core loader differential,
  T2 cuda-oxide sanitizer + schedule-fuzzing) move 0.68 -> 0.69. Shifted in
  that order so the deferred tier did not collide with the shipping one.
- Header now carries the bidirectional link: tracking issue #3062
  (milestone 0.68.0) and spec PR #3061. Issue #3062 cites this document as
  the spec of record and carries the acceptance checklist.
- Milestone 0.68.0 created (repo had 0.66.0 and 0.67.0 only).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J9cSQynVPYeUkQ2i7ccvrs
Operator direction: the CUDA Rust work is the 0.67 release, and everything
previously targeted at 0.67 moves to 0.68.

Spec:
- Shipping tiers (T0 un-dark the GPU crate, O2 arm the vacuous register_budget
  contract, T3 cutile A/B on gx10) target 0.67.
- Deferred tiers (T1 cuda-core loader differential, T2 cuda-oxide sanitizer +
  schedule-fuzzing) target 0.68.
- Shifted 0.68->0.67 first, then 0.69->0.68, so the deferred tier could not
  collide with the shipping one.

GitHub, every mutation read back from the API rather than assumed:
- 16 open issues moved 0.67.0 -> 0.68.0 (#3045 #3024 #3019 #3018 #3013 #3002
  #2910 #2909 #2908 #2906 #2905 #2904 #2893 #2891 #2890 #2869). The milestone
  held 0 closed issues, so no completed work was retargeted.
- EPIC #3062 and this PR now sit on 0.67.0. Counts read back: 0.67.0 open=2,
  0.68.0 open=16.
- Milestone descriptions corrected: 0.67.0 is the CUDA Rust release; 0.68.0 is
  the PP-066 carry-over plus the deferred T1/T2 tiers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J9cSQynVPYeUkQ2i7ccvrs
…ne epic per train, priorities A–G as rows with acceptance commands; contract + drift gate (PMAT-1097)

Every figure in §0 carries the command that measured it; comparator ratios sit beside their evidence/ receipt (the claim guards pass). The drift gate FALSIFY-DOCS-CLAUDE-001 now names the schedule (observed RED on a bogus path, exit 101; GREEN after revert). contracts/release-schedule-06x-v1.yaml validates; falsifiers 001-008 pass at this HEAD (003 was RED until the four epics #3078-#3081 existed).

Epics: #3078 0.67.0 · #3079 0.68.0 · #3080 0.69.0 · #3081 0.70.0. P0 five-whys: #3082 #3083 #3084. Milestones 0.69.0 (#6) and 0.70.0 (#7) created.

Operator 2026-09-10: 'override "kind:docs" block if needed' — filed kind:code (contract + test ride with the spec).

Pmat-Ticket: PMAT-1097

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01JZjEDVTFkFv71yCPD1dmUJ
…s re-run, five accepted, one premise refuted (PMAT-1097)

F1 runner group gpu-x86 re-measured (allows public repos, no workflow restriction) — 67-D0 tightened. F2 milestones 0.69.0/0.70.0 created by this ticket. F3 premise refuted against crates/apr-cli/Cargo.toml line 75/89 (cuda is opt-in); smoke-cpu remedy taken. F4 accepted with a bounded remedy: the queue mirrors the PR tier, over-cap PRs add cargo check --workspace, root-manifest PRs keep FULL, residual named in R2. F5 rescoping of 'default' stated at the point of use. F6 near-tie vs defect rule for the PP-26 witness. §10 records provenance: one lane, fan-out unmeasured, --sandbox deviation declared, isolation byte-identical.

Pmat-Ticket: PMAT-1097

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01JZjEDVTFkFv71yCPD1dmUJ
Pmat-Ticket: PMAT-1097

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01JZjEDVTFkFv71yCPD1dmUJ
…500) and the containerised CUDA asset build (#3086) enter G7, 67-A1, §2 C and 67-D0 (PMAT-1097)

Pmat-Ticket: PMAT-1097

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Claude-Session: https://claude.ai/code/session_01JZjEDVTFkFv71yCPD1dmUJ
Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BjhtNUSensCYpQb3mCYLod
…ier does not do yet

The quick tier turns 41 tree-reader targets into a 26-invocation `&&` chain
(one cargo per crate, serial, 26 compiles of the shared deps): 55 min on a
one-file YAML PR, timed out at 60 under fleet load (#3070). The replacement is
ONE build graph filtered by a nextest filterset, so the translation from the
registry tokens to that expression is the new load-bearing step.

These rows fail now (--filterset is not a flag yet) and pin BOTH polarities:
each recognised token becomes exactly one clause, and an unrecognised token is
ENV (exit 2) rather than a silently dropped target — a dropped token is a
tree-reader test that stops running while the step stays green, which is the
failure mode the registry exists to prevent. Row 22 counts clauses against
registry lines so nothing can be dropped in bulk either.

Row 21 was written fail-open first (`grep -q ":--" && LEFTOVER || NONE-LEFT`
passes on EMPTY output) and is hardened here before it was ever green.

Refs #3084

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
GREEN for the rows added in the previous commit.

`scripts/ci_test_tier.sh --filterset` turns the tree-reader registry's tokens
into a cargo-nextest filterset — `(package(c) & kind(lib))`, `(package(c) &
kind(bin))`, `binary_id(c::name)`, UNIONed with `|`. ci.yml's part-2 quick-tier
step now runs ONE `cargo nextest run --profile ci --workspace --lib --tests
--exclude aprender-gpu --exclude aprender-cuda-edge --exclude aprender-compute
-E "$EXPR"` instead of a `&&` chain of one cargo per crate.

The binary-id forms are nextest's own and were VERIFIED on this workspace with
cargo-nextest 0.9.132 (`cargo nextest list --message-format json`), not assumed:
a lib suite's id is the bare package name, an integration target's is
`package::target`, a bin's is `package::bin/name`.

MEASURED on lambda, warm target dir (both listings from the same tree):

  one graph   65263 tests, 41 binaries, 39 suites with >=1 test
              build+list 96s, execution 220.2s, 316s wall, rc=0, 65263 passed
  20-crate    65204 tests, 40 suites
  chain       (20 distinct crates, not 26 — the 41 tokens group into 20)

The two sets are NOT identical and the difference is entirely FEATURE
UNIFICATION, never target selection:

  * A\B = 258 tests. Features the workspace resolve unifies ON and a
    per-package resolve leaves OFF (aprender-core hf_hub / inspect::safetensors
    / format::homomorphic / format::quantize, aprender-orchestrate mcp_json,
    aprender-test-lib async driver).
  * B\A = 199 tests, and ZERO of them exist under the workspace resolve at all —
    they are cfg(feature)-gated out. 197 are aprender-test-lib's browser mock
    suites, 2 are aprender-present-cli::gate_can_fail. So the FULL tier, which
    is `--workspace --lib`, never ran them either: the old chain was compiling a
    DIFFERENT aprender-test-lib than the tier it is supposed to approximate.
    Aligning the quick tier with the full tier's resolve is the fix, not a loss.
  * Suite selection is otherwise exact: 41 clauses -> nextest reports "Starting
    65263 tests across 41 binaries". The two suites with no tests are
    aprender-core::setfit_conformance and ::falsification_spec_v10_tests, built
    and selected in BOTH but empty under default features (they are the full
    tier's --features setfit targets).
  * `--bins` maps to `kind(bin)`, not to the whole package. The old chain ran
    `cargo nextest run -p aprender-present-cli` with NO flags, so it also swept
    up `gate_can_fail` — an integration target that is in neither the registry
    nor the unwired ledger, i.e. not a tree reader at all. `kind(bin)` selects
    exactly what the token claims: the cfg(test) unit tests inside the bins of a
    crate that has no src/lib.rs (which is the only reason the token exists —
    `--lib` there is `error: no library targets found`).

Both quick-tier steps drop to `timeout-minutes: 20`. 60 is the number that let
this step burn 55 minutes on a one-file YAML PR (run 34449608126) and then die
at the cap under fleet load on #3063 (#3070); the budget is the assertion.

check_tree_reader_tests.sh is untouched and still derives the same 41 targets:
its `full_tier_excludes` regex requires `--workspace --lib` followed IMMEDIATELY
by ` --exclude`, and the new line has `--tests` in between, so it still reads the
full tier's line and only that one (verified by running the regex).

Refs #3084
Closes #3070

Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…RED at row 0

Ten rows, both polarities: a scratch PATH with every default tool is GREEN and
the same PATH minus jq is RED naming MISSING jq; the JSON side-channel parses and
records the missing tool; a usage error is exit 2 and a missing tool is exit 1;
and the wiring itself is checked — every self-hosted job in fleet-toolset.yml,
binary-release.yml and cuda-nightly.yml must run the preflight immediately after
checkout, mutation-verified by deleting the step from a workflow copy.

Run 34448908554 built a 21 MB CUDA asset on gx10 and died on the upload with
`gh: command not found`. Nothing checked the toolset a workflow assumes.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…build

scripts/ci_self_hosted_preflight.sh — defaults jq curl git python3 tar sha256sum
rustup cargo; --cuda adds nvidia-smi AND asserts a device is actually visible;
--need takes the extras a job knows it wants. `gh` is deliberately NOT a default:
the CUDA lane moved to REST with curl+python3 because fleet boxes have no gh
(#3074), and defaulting it would re-assert the assumption that failed.

Exit 1 is a finding about the BOX, exit 2 a finding about the STEP that called
this — merged codes send the wrong person. Identity (runner/labels/arch/glibc,
driver under --cuda) is printed and, when PREFLIGHT_OUT or RUNNER_TEMP is set,
written as JSON: that file is the fleet probe output.

13-row hermetic case table, both polarities, every tool a stub in a scratch PATH
so the verdict does not depend on this box. Two rows were RED for the wrong
reason first and are recorded as comments: the script called dirname/basename
(now parameter expansion) and the nvidia-smi stub catted a fixture, so --cuda
reported zero devices because `cat` was not on the scratch PATH.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…spends an hour

The preflight is now the step immediately after checkout in all seven
self-hosted jobs: binary-release.yml build-apr-cuda (--cuda --need docker
objdump), smoke-cuda (same; both GPU boxes carry `docker` as a runner LABEL, so
a pool that stopped matching its own labels is worth one second), and the two
clean-room jobs verify-cuda-assets and summary, which had no checkout at all;
plus the gx10 lane in cuda-nightly.yml. Not before `decide` and not before the
checkout there: on a yield night the box has no working tree, and a step that
bashes a repo path would exit 127 and turn a deliberately-yielded night RED.

fleet-toolset.yml probes all three pools daily at 04:47 UTC and uploads
toolset-<label>/preflight.json, 90-day retention, plus one table in the run
summary. ARTIFACT + SUMMARY, NOT A PR: a PR per day against evidence/ is ~365
machine-written PRs a year through a queue that runs at ~1 PR/hour, so the cost
of the record would exceed the record. A zero-row roll-up exits 1 — no
preflight.json downloaded is a broken probe, not a clean fleet.

The falsifier built its universe from the wrong side and said so: `runs-on`
alone saw 3 jobs, missing build-apr-cuda and smoke-cuda, whose selector is
`${{ fromJSON(matrix.labels) }}` — the two GPU jobs this row exists for. It now
reads the strategy block too, and sees 7.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…of paying an hour for a moved main

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…r a moved main

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…0 is missing four

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d smoke it

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…h polarities in the table

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… SEC011)

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ur apr binaries

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s concurrently, deterministically and fail-closed

Row (e) is the discriminator and it reads no clock: two planted guards rendezvous through marker files, so a serial dispatcher fails because the peer never started. Rows (a)-(d),(f) pin the universe, the named failure, the count, byte-identical ordering across two runs, and a guard that dies without a verdict counting as FAILED.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… judge in 20

Measured on run 34449608126 (PR #3074): guard-cargo 43.8 min over 80 steps, guard-tree 27.3 min over 45, and 18.4 of guard-tree's minutes were ONE step running ~35 independent guards one at a time on a 48-core box. That step now dispatches through an xargs pool (bounded -P 8, the clean-room pool is 16 runners on one host): 289 s -> 96 s locally on the real universe, same 41 checks. Seven tree-universe steps (26.8 min: the tier case table, model-tests, book examples, aprender-profile, the fd-0 scan, publish safety, wasm32) move to guards-nightly.yml with their name, run block and docker/mount shape verbatim, so check_guards_are_wired.sh -- which greps every workflow file, now pinned by rows 5-7 of its own case table -- still finds them wired. Both jobs take timeout-minutes: 20, the operator's budget, which is SMALLER than BSE-05's answer and overrides it.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…dger, not a ratchet — the one line 67-E3's worker could not write (out of its scope)

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…nd two PR jobs no runner has ever seen

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d — 67-C1 gx10, 67-D1 yoga

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ted) so a GPU-labelled job on it may carry concurrency perf-yoga — the one out-of-scope entry 67-C1/D1's worker could not write

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
noahgift and others added 12 commits September 11, 2026 19:58
…ee that held the merge

Under --apply, resolve_one() merged origin/main into each DIRTY PR
branch inside a throwaway worktree, printed a push hint, and then
immediately ran git worktree remove -f. The merge commit became
unreachable and nothing was pushed, forcing operators to redo
merges by hand.

This changes --apply to push the merge commit directly. We also add
--no-push to preserve the old behaviour but keep the merge reachable
by creating a local branch 'resolve/<pr>' before removing the worktree.
Hermetic selftests are extended to prove these behaviours.

Pmat-Ticket: PMAT-1098
…#3104, measured 30-min timeout from 67-E3

Pmat-Ticket: PMAT-1098
…oga, ephemeral, docker, build, ARM64, gb10, ada, perf-solo)

Measured from gh api orgs/paiml/actions/runners 2026-09-11; the gpu-quick/cuda-unit jobs (67-C1/D1) ask for yoga/ephemeral/docker and actionlint flagged them unknown.

Pmat-Ticket: PMAT-1098
@noahgift noahgift added this to the 0.67.0 milestone Sep 11, 2026
@noahgift noahgift added the pp-066 PP-066 (0.66) DAG row label Sep 11, 2026
@noahgift
noahgift enabled auto-merge September 11, 2026 18:43
@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3127 head=340d6ef88b2dd0e499dabc987977d7f02b50ba76 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.

…r-gpu driver::memory::transfer); two triage-receipt rows quoted issue titles carrying throughput literals — elided (claim-literal ratchet)

Run 34634920736: workspace-test step 'Decide the test tier' exit 2 (registry drift: > aprender-gpu --lib driver::memory::transfer); guard-cargo step 'No claim literals on user-facing surfaces' exit 1 on docs/audits/triage-PMAT-3124-2026-09-11.md:76-77. Both are the train's own tree, not ENV.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ry — `printf | grep -q` under pipefail fails on EPIPE when grep matches first, so an excluded crate was not skipped

Run 34634920736 workspace-test step 'Decide the test tier': 'line 227: printf: write error: Broken pipe' then drift '> aprender-gpu --lib driver::memory::transfer' (derived only). Locally --update produced no change: the race depends on the box. wired_targets() skipped excluded crates with `printf '%s\n' "$ex" | grep -qxF "$c" && continue`; grep -q exits on its first match, printf gets EPIPE, pipefail makes the pipeline non-zero, `continue` never runs. Every producer|grep -q in the script is now a here-string (no producer process to kill): line 227 plus the self-test's row helper and fixture rows. The SIGPIPE+pipefail class (memory feedback_sigpipe_pipefail_false_red). --self-test 25 rows ok, --check 0, bashrs findings not grown.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…aNet — the batch compiled a target no row's quick tier did

Train run 34639757080 workspace-test (yoga-build2): error[E0004] non-exhaustive patterns at crates/aprender-core/tests/includes/falsify_iter7.rs:240 — #3099's 33c79fd added the variant to AttentionType and its own quick tier never compiled falsification_model_oracle_tests (aprender-core untouched by that row); the train touches aprender-core, so the batch did. The arm asserts the GQA-shaped bound (kv_heads <= heads) on every size; the unsupported-on-CPU/GPU contract stays with the refusal tests. Local: 116/116.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
noahgift and others added 2 commits September 11, 2026 22:47
…e crate dir (z10 dark on every box); guards-nightly derives the sccache host dir instead of shipping /home/<user>

Train run 34641537515: workspace-test (yoga-build3) z10_zero_overhead_serving 'Specification should exist: NotFound' at spec_checklist_19_inference.rs:250 — every let-bound path in the file now anchors on workspace_root() (CARGO_MANIFEST_DIR/../..), so the 12 'if let Ok(content) = read_to_string(..)' rows stop being vacuous too; local: the whole target under nextest. guard-tree (intel-clean-room-5) step 43: the hardcoded-path ratchet refused guards-nightly.yml for the literal /home/noah/data/sccache the 67-E3 move copied from ci.yml (baselined there, new here); the nightly now derives SCCACHE_HOST_DIR=$HOME/data/sccache and falls back to $RUNNER_TEMP/sccache (cold) inside an ephemeral container. The class is filed as #3130 (77 more vacuous sites in 8 checklist files, sweep in flight).

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…te dir -- 77 vacuous rows now read the tree (#3130)

Defect: integration tests under crates/aprender-core/tests/ bind repo-relative paths as bare string literals but cargo/nextest run a test binary with cwd = the CRATE dir, so the file is never found; most rows hid it behind if let Ok and were vacuous.
Anchor: Added workspace_root() helper to resolve paths correctly from the crate directory to the repo root.
Summary Lines:
- spec_checklist_f_wasm: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
- spec_checklist_q_qwen_coder: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 118.50s
- spec_checklist_r_model_import: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
- spec_checklist_t_realizar: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
- spec_checklist_u_performance: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
- spec_checklist_v_sovereign: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
- spec_checklist_w_advanced_perf: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
- spec_checklist_x_anti_stub: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ery aprender-core integration target, so all eight checklist files must be anchored on this train
noahgift and others added 2 commits September 12, 2026 01:36
…ark row, impossible since the type landed); pr-review-receipt pinned to X64 until reject-76-drop dies on arm64 (#3132)

Train run 34648948737: workspace-test (intel-6) test_chat_completion_request_n_multiple set ChoiceCount::ONE and asserted '"n":5' — the deserializer refuses n!=1 by design, so the row could never pass; it was dark because aprender-serve's integration targets run only when the crate is touched (#3130) and the train touches it (#3110/#3113/#3099). The row now asserts the contract both ways (ONE serialises as 1; n=5 is refused with the client-visible message); 269/270 locally, the one local-only red (test_completion_request_with_all_params, f32-narrowed temperature vs Some(0.7)) does not reproduce in CI's feature-unified build and is not touched here. pr-review-receipt (gx10-pool1): mutate-guard.sh 232/233 — reject-76-drop survived on arm64 exactly as memory recorded for gx10-pool2; the job goes back to X64 with the issue named in the comment. Not a required check (ruleset: gate, workspace-test).

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rrowing of temperature — a round trip of 0.7 is f64::from(0.7f32) by contract

Train run 34658698055: workspace-test (intel) test_completion_request_with_all_params: left Some(0.699999988079071) right Some(0.7). deserialize_temperature_f64 narrows through f32 on purpose (types.rs: 'the value still narrows to f32 before it reaches a sampler, so the narrowing is checked here too') and returns the narrowed value, so 0.7 can never round-trip exactly; the row was dark (#3130 class) and could never pass. It now asserts the contract. Local: api_coverage 270/270.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pp-066 PP-066 (0.66) DAG row

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant