Conversation
…not exist APR-RELEASE-001 §5 P0·Instrument's Done test is "≥ 20 records; `make build-report` runs on a clean checkout". Measured on main: 1092 ledger records are committed under docs/build-ledger/ in exactly the P0·Instrument schema (321 of them `ci / gate`), and NOTHING in the tree reads them. So the first half passes 54× over and the second half has no mechanism at all — which is why §1's p95, §1's max-PRs-per-train and §7's whole `gate:` line are still [U] while the data sits in git. This is the sccache class: recorded 18,292 times, never compared. The guard asserts seven things, and fails on the first today: reader exists · has a make-target caller · the self-test has a caller in lint-scripts (a facility with a self-test and no caller is measured by nothing) · an empty ledger exits 2 with `decline:` and 19 records still do, because a report over a thin ledger that prints 0 reads exactly like a fast fleet · a malformed record exits 1 with `reject:`, never a silent skip · the committed ledger reports. RED: `bash scripts/check_build_report.sh` → exit 1, "scripts/build_report.sh is absent". Pmat-Ticket: PMAT-3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hing read APR-RELEASE-001 §5 P0·Instrument. scripts/build_report.sh streams docs/build-ledger/, and prints p50/p95 total_s and queue_wait_s per host_class, the 10 slowest jobs, and §1's PRs-per-train number. 0.27 s over 1092 records, byte-identical across runs. Contract, asserted by scripts/check_build_report.sh (16/16): - exit 2 + `decline:` below the §8 floor of 20 job records — a report over a thin ledger that prints 0 reads exactly like a fast fleet - exit 1 + `reject:` on a parse error, never a silent skip - a valid record with no total_s is SKIPPED as "not a job record" and the skip is printed (8 of 1092: 5 fleet-pack, 2 reconcile, 1 train) - nearest-rank percentiles, case-tabled in --self-test over 1..100 and [7] - `make lint-scripts` runs the guard, so the self-test has a caller The ledger is per JOB, not per test target; the output says so where §5 asks for "10 slowest test targets" rather than inventing per-target numbers. Verified independently: a separate python implementation reproduces valid=1092 job=1084 skipped=8 and every p50/p95 exactly. Pmat-Ticket: PMAT-3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…d check
The first run of `make build-report` against the committed ledger falsified
APR-RELEASE-001 §1's own equation.
§1 computes `max PRs/train ~= 3 x 72h / p95(ci / gate)`. The required checks
on `main` are `gate` AND `workspace-test`, and a PR merges when the SLOWEST
of them is green. Measured over 1092 records:
workspace-test n=147 p95 6451 s <- binds
ci / gate n=163 p95 1205 s
So §1 as written answers 645 PRs/train and the honest answer is 120 — an
overstatement of 5.4x, on the one number §8 uses to decide whether to stop
cutting trains ("measured max PRs/train < 10 [A]").
The report now computes the bound over the required-check set, prints the
per-check p95 table, names which check binds, and — when the binding check
is not `ci / gate` — prints the ratio by which §1's own form overstates.
The §7 `gate:` line keeps its specified shape; only the number is honest.
RED first: a fixture of 20 fast `ci / gate` (100 s) + 20 slow
`workspace-test` (1000 s) must answer 777, not 7776. The guard's first
extractor read the `3` out of "3 x 72h" and reported got=3 — a guard regex
wrong on its first outing, caught by its own case table, now anchored on the
pinned `gate:` line.
Pmat-Ticket: PMAT-3225
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`make gate` and a 3-lane review quorum ran against the first green
implementation. Between them they found four real defects; all four are
fixed here and each has a case-table row that goes RED without the fix.
1. A JSON value that is not an object aborted jq with exit 5, not the
contracted exit 1 + `reject:`. `has("total_s")` over an array, number,
string or boolean is a fatal jq error. Found by 3/3 lanes independently,
grounding=measured. The guard had only tried plain text, which jq rejects
cleanly — so the contract looked kept.
2. An empty or whitespace-only file parsed to nothing, emitted nothing, and
exited 0: silently dropped, never counted as reject or skip. With >= 20
other records the run reported success over a ledger it had quietly
discarded part of. Also 3/3 lanes.
3. `ceil(k/100.0 * n)` in floating point: (7/100.0)*100 is
7.000000000000001, so p7 of 1..100 answered 8. Integer `((k*n)+99)/100`
is exact. Found by 1/3 lanes, which also correctly judged that the
k=50/95/100 table could not reach it — the table was too coarse, not
wrong. It now carries k=1, 7, 29 and a 3-element vector, plus a
`--percentile-probe` mode the guard reads.
4. `build_report.sh` was named by no workflow — `make lint-scripts` runs its
guard, but Makefile-only means `make tier3`, which CI does not run.
check_guards_are_wired.sh caught it (unwired guards 3 -> 4) and is right:
that is the same gap toolchain-ceiling.yml documents for check_msrv.sh.
.github/workflows/build-report.yml gives it a real caller; the guard is
back to its 3-entry baseline.
Also: the required-check set now lists BOTH spellings of the gate. Branch
protection names `ci / gate`, ruleset 13878864 names a bare `gate`, and the
ledger carries both (n=163 p95 1205 s, and n=158 p95 255 s) —
scripts/pr_review_quorum_arm.sh accepts either for the same reason. The
binding check is unchanged (workspace-test, 6451 s) but the table is now
complete rather than missing a third of the gate population.
35/35 guard, 22/22 self-test, byte-identical across runs, bashrs 0 errors.
Pmat-Ticket: PMAT-3225
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…defects The §0 selector evaluation that picked this row (0: no intel pressure by the packer's own sample; 1: 31 h since v0.67.0, needs 48; 2: P0·Instrument, the first §5 row with a MISSING MECHANISM rather than a trailing-window Done test). Dispatch ledger: both subagents hit their turn limits, neither was resumed — the worker's claim was re-verified directly and the delegate's three lanes had already written their artifacts to out_dir. running_peak=1 of 3 slots; denied=1 (goal.sh set refused a second ticket in one session, by design — the statusline goal stays PMAT-1098). Gaps named rather than closed: lane-reduce.sh never ran so there is no reduced consensus artifact; estimate.sh cannot pool this repo because 38 of 43 rows in impl-estimates.jsonl carry no `unit`, which is why basis is first-run[U] by force and not by novelty; check_silicon_coverage's verdict moved with no commit between two runs 15 minutes apart. Verdict PARTIAL(escalate): the mechanism is landed and armed, every defect the gate and the quorum found is fixed, and two DoD parts stay open — the pv contract is NotRun behind ONT-1, and the PR is not merged green yet. Pmat-Ticket: PMAT-3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
This tool just answered a §5 row that the spec still lists as unstarted workDogfooding Measured over the committed ledger (1084 job records, 119 distinct shas):
So P2 is not pending work — the fleet has been sharding gates across hosts for 119 shas and nothing read the record that proves it. That is the same shape as the row this PR closes: the data was there, nothing compared it. Worth noting for whoever plans the next build row: §5's queue should be re-derived from the Done tests, not worked top-to-bottom. P0 · Instrument was two-thirds satisfied before this PR (321 gate records ≫ the floor of 20); P2 is two-thirds satisfied now. A row's position in the list is not evidence about its state. 🤖 Generated with Claude Code |
|
No activity since 2026-09-17 13:47Z; 2 release trains have been cut since (v0.68.2, v0.68.1). Age is the only input to this sweep — it is not a judgement on the work, and a train label such as What happens next: if one more train passes while this is still labelled To clear it: push, rebase, or say on the thread what it is waiting for. Any of the three removes the label at the next sweep. If it is blocked on something external, name that here — a blocker with an owner is not sprawl, and it stops the clock. |
…s branch) This branch added PMAT-3225 to docs/roadmaps/roadmap.yaml before fragments existed. Merging origin/main brought scripts/check_roadmap_fragment_required.sh into the tree, where it rejects the branch's own edit as a roadmap change with no fragment. `roadmap_fragments.py adopt PMAT-3225` + `make roadmap-aggregate`; roadmap.yaml is regenerated from 935 base + 47 fragments and is byte-identical to the merge result. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Arming auto-merge at |
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3225",
"head": "8271036ab5053fd437863389534c452c07dbfeb0",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 1
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "FAIL",
"findings": 3
}
]
} |
… `gate`, and the receipt counted a 16-row table that now has 35 Found by the AD-04 quorum on #3271 (lane 3, gemini-3.6-flash-high, measured check_build_report.sh:156): a chk label written as "…the bare `gate` spelling…" is a command substitution under double quotes, so every self-test run printed `line 156: gate: command not found` to stderr and labelled the row "the bare spelling". The row still passed, so nothing red pointed at it — the same class as the unquoted-heredoc backtick that once ran sudo apt-get from a receipt. Single quotes now. The receipt's verification table said 16/16 for this script; the self-test runs 35 rows today. Re-counted from the output, with the method named. Lane 1's finding (the lint-scripts recipe swallows bashrs's exit under .ONESHELL) was REFUTED by measurement: a scratch Makefile with the identical shape — .ONESHELL, .SHELLFLAGS=-o pipefail -c, `false || exit 1` inside the loop, then a second recipe line — stops with `Error 1` and never reaches the second line. `exit` ends the one shell. Recorded on the PR so the next reader does not re-derive it; not changed. Refs #3225, #3271 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Adopted (2026-09-21 sweep; branch cut 09-16, no live session). Quorum round 0: 2 FAIL / 1 PASS. One FAIL was real and is fixed in Lane 3 ( Lane 1 (
Earlier on this branch ( |
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3225",
"head": "9249cb8fd5a6505c59404f6ed865d21643ed038b",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 2
},
{
"lane": 2,
"verdict": "PASS",
"findings": 2
},
{
"lane": 3,
"verdict": "PASS",
"findings": 4
}
]
} |
|
Quorum round 1 on |
… the ruling on round 1, recorded where the spec and the receipt will be read Quorum round 1 (9249cb8): lane 1 refused the diff for reporting the 10 slowest JOBS where APR-RELEASE-001 §5 line 421 says the 10 slowest test TARGETS, without amending the spec; lanes 2 and 3 passed. Board ruling (a), 2026-09-21: amend §5 to per-job with a dated note — the build ledger is per job and cannot answer per target; per-target timing is nextest junit, which #3134 adds — keep build_report.sh printing that the ledger lacks target granularity, keep the case table on the job version. Instrument-first, the gap recorded, no requirement silently substituted. The receipt records the ruling. Its pv contract row was re-checked: no ledger-record contract exists under contracts/ (ONT-1 not landed), so the verdict stays PARTIAL with that reason and this PR does not close #3225. Refs #3225, #3134 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3225",
"head": "83f3f1a7d8551fff270a8334eb426281d294b383",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 4
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 5
}
]
} |
|
Round 2 on
Each is either a spec amendment (as §5 line 421 was, by ruling) or a script change back to the spec's word, and either way it is a decision about APR-RELEASE-001, which I do not own. Two lanes passed the same diff; lane 1 has been the only dissent on this PR across all three rounds and each of its findings has been checkable at file:line. Everything mechanical on this branch is green (real merge of main, 35/35 self-test, bashrs, roadmap guards, §5 amendment + receipt ruling recorded, body carries |
… PRs/train against the required-check SET derived at run time — round 2's three findings, ruled and applied Lane 1 on round 2 (83f3f1a) found three more places where the script and §5 disagreed. Board ruling 2026-09-21, all applied here: 1. host -> host class. The fleet is managed per class and the ledger has no per-host field worth grouping on. build_report.sh now derives host_class from the runner-name prefix when a record lacks it (intel|gx10|yoga| lambda|mini, else other, null -> other); 7 case-table rows cover every prefix, the unknown one, and the null host. §5 says host class. 2. ci / gate -> the required-check SET. Two mechanisms answer what is required on main and spell the gate differently; one name is the one-mechanism error. required_checks_on_main() derives the set from classic protection + ruleset 13878864 via gh at run time, the equation binds on its slowest member, and the report prints the set WITH its source: [derived], or [fallback (<reason>)] when gh cannot answer — proved by a case-table row that hides gh and expects the reason by name. On this box: ci / gate, gate, workspace-test [derived]; binding workspace-test. 3. Turns 26 vs 43+45: not a defect. impl-estimates.jsonl is K-hat; the receipt is actual; both labelled. Recorded, nothing changed. Case table 35 -> 42 rows, bashrs 0 errors on both scripts, real report rc 0. Refs #3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3225",
"head": "7748875cd3f941972bb32232f5c8fc1c515d091c",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "FAIL",
"findings": 3
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 6
}
]
} |
…avioural gate row, and the turns note that had misdescribed its own source Lane 1 on round 3 (7748875), all three verified before acting: (a) asserted, right: deriving the required set at run time made the binding-check case row depend on what branch protection says today. BUILD_REPORT_REQUIRED_CHECKS (JSON array) now pins it; the report prints [pinned (BUILD_REPORT_REQUIRED_CHECKS)]; the derive path keeps its own un-pinned row and the hidden-gh fallback row. (b) measured, right: the 'bare gate spelling' row grepped the script's OWN SOURCE for the literal "gate" — vacuous by construction, before and after this PR. Replaced by a ledger recording the gate under both spellings, asserting both are measured under the pinned set and the slower binds. (c) cited, right: impl-estimates.jsonl:43 is {est: 0, actual: 26} — an orchestrator turn total, not K-hat as the round-2 note claimed. The receipt's 43/45 are subagent tool-use counts, a different quantity. The note is corrected; the data was never wrong. Case table 42 -> 44, bashrs 0 errors on both scripts. Refs #3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Round 3 on |
|
quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3225",
"head": "53a84e9f1439a7383e82366fb05f1ab287f274e1",
"width": 3,
"executor": "agy",
"agreed": true,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 0
},
{
"lane": 2,
"verdict": "PASS",
"findings": 4
},
{
"lane": 3,
"verdict": "PASS",
"findings": 4
}
]
} |
Four rounds. Round 0: backticks in a chk label (fixed) + a ONESHELL claim refuted by measurement. Round 1: §5 per-target vs per-job — ruled, amended. Round 2: host class, required-check set, turns — ruled, amended. Round 3: hermetic binding row, behavioural gate row, the turns note corrected. Round 4 on 53a84e9: 3/3 PASS, gemini-3.1-pro-high / pro-low / 3.6-flash-high, each measured, no dissent. Pro-high was the sole dissent in every earlier round and every finding of its was checkable at file:line. The receipt stays PARTIAL and this PR does not close #3225: the pv contract row is NotRun until ONT-1 lands a ledger-record schema. Refs #3225 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Cross-inspection of
|
| lane | conversation | status | verdict | findings | refs to sibling lanes / receipts / $WORK | duration |
|---|---|---|---|---|---|---|
| lane 1 | 9965521a |
SUCCESS | PASS (structured_output) | 0 (0 cited, 0 with commands) | 0 | 240 s |
| lane 2 | 235b1e28 |
SUCCESS | PASS (structured_output) | 4 (1 cited, 2 with commands) | 0 | 104 s |
| lane 3 | 5acf14b5 |
SUCCESS | PASS (structured_output) | 4 (2 cited, 2 with commands) | 0 | 226 s |
Distinct agy conversation ids: 3/3; no lane references a sibling lane, another receipt or $WORK. Read from /tmp/claude-1000/-home-noah-src-aprender/51506a7a-265a-4e5c-bc53-50274de4a757/scratchpad/lanes-3225-round4 on this box. Note: round 4 after rounds 0–3 each drew a real finding (backtick command substitution in a chk label; §5 per-job amendment; host class / required-set / turns rulings applied; round 3: a live-protection dependency pinned, a vacuous self-grep row replaced, and the cop's turn-count ruling corrected from the file — impl-estimates.jsonl:43 holds the orchestrator's actual turns, not K̂); receipt stays PARTIAL (pv NotRun), PR does not close #3225; d4 armed via the rail, this inspection is confirmatory.
Verdict line: 3/3 PASS, independent. Arm confirmed.
|
Folded into the 0.69 release batch #3669 by the cop (08:05Z, operator: "most PRs can be batched"). One CI run and one queue slot for all of them, and the generated files ( |
The batch's CI went red on two guards, and both trace to single folded PRs: check_no_pipe_into_grep_q (77 sites vs ceiling 74, all three new sites in #3271's build_report.sh/check_build_report.sh) and check_complexity_ratchet (run_shapes_gate over its threshold). #3271 (0.70) and #3622 are dropped from this batch and go to the next one with the guard finding on each. The complexity finding persists without #3622 and comes from #3600's own edits to run_shapes_gate (cognitive 28); fix owed in the batch. Regenerated: census, contracts.nt, shapes.ttl, README count, roadmap aggregate (99 fragments). extract --check rc 0, readme --check rc 0. Refs #3669 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Taken back out of release batch #3669 (08:45Z). The batch's CI traced a red guard to this PR: `check_no_pipe_into_grep_q.sh` went from 74 to 77 sites (ceiling 74), and all three new sites are in `scripts/build_report.sh` / `scripts/check_build_report.sh` (`printf … | grep -q` under pipefail). Convert them to here-strings (`grep -q … <<<"$x"`) or `[[ =~ ]]`. The receipt stands. It rides the next batch once fixed. The owner's session is gone, so this is adoptable by selector. |
What
APR-RELEASE-001§5 P0·Instrument's Done test is "≥ 20 records;make build-reportruns on a clean checkout". Measured onmain: 1092 ledger records are committed underdocs/build-ledger/in exactly the P0·Instrument schema — 1084 of them job records — and nothing in the tree read one. So the first half passes 54× over and the second half had no mechanism, which is why §1's p95, §1's max-PRs-per-train and the whole of §7'sgate:line were still[U]while the data sat in git.This is the sccache class: recorded thousands of times, never compared.
scripts/build_report.shreads them in 0.27 s, byte-identical across runs.What it says — the numbers that were
[U]until nowTwo things fall out of that table that no occupancy average could show. gx10 carries more jobs than intel (509 vs 454) and has the worst queue p95 (1399 s vs 1066 s) — the box the packing rule treats as spare capacity is the busiest by count and the slowest to start. And intel is the slowest per job (p95 4994 s).
The correction §1 needs
The first run of the report falsified the spec's own equation. §1 computes
max PRs/train ≈ 3 × 72 h / p95(ci / gate). The required checks onmainaregateandworkspace-test, and a PR merges when the slowest one is green:So §1 as written answers 645 and the honest answer is 120 — a 5.4× overstatement, on the one number §8 uses to decide whether to stop cutting trains ("measured max PRs/train < 10
[A]"). The report computes the bound over the required-check set, names which check binds, and prints the ratio by which §1's own form overstates. Thegate:line keeps its specified shape; only the number is honest.Both spellings are listed because they are one check: branch protection names
ci / gate, ruleset 13878864 names a baregate, andscripts/pr_review_quorum_arm.shalready accepts either for that reason.Contract
scripts/check_build_report.sh, 35 assertions, run frommake lint-scriptsand from the new workflow:decline:below the §8 floor of 20 job records — a report over a thin ledger that prints 0 reads exactly like a fast fleetreject:on anything that is not a JSON object, never a silent skiptotal_sis skipped and the skip is printed (8 of 1092: 5 fleet-pack, 2 reconcile, 1 train)[7]and[1,2,3]The ledger is per job, not per test target; the output says so where §5 asks for "10 slowest test targets" rather than inventing per-target numbers.
peak_rss_mbandfree_disk_gbarenullon every record because the Actions REST API does not expose them — the report prints them as[U], it does not drop them.Review found four defects, and they are fixed
make gateand a 3-lane review quorum ran against the first green implementation.grounding=measuredceil(k/100.0 × n)in floating point:(7/100.0)*100is7.000000000000001, so p7 of 1..100 answered 8. The same lane correctly judged that a k=50/95/100 table cannot reach it — too coarse, not wrongcheck_guards_are_wired.shbuild_report.shwas named by no workflow.make lint-scriptsruns its guard, but Makefile-only meansmake tier3, which CI does not run — the same gaptoolchain-ceiling.ymldocuments forcheck_msrv.sh. Unwired guards grew 3 → 4Each has a case-table row that goes RED without its fix. Defect 4 is why
.github/workflows/build-report.ymlexists; the guard is back to its 3-entry baseline.Gate
make gatereports 4 failures on this branch. None is caused by this diff — each was run on this branch and on a branch without these changes, in the same minute:check_baseline_ratchetscheck_complexity_ratchetcheck_silicon_coveragecheck_guards_are_wiredHow it composes with #3207
#3207 is the writer —
scripts/collect_build_ledger.shplus the nightly that appends records. This is the reader. Disjoint files; neither blocks the other. #3207 is what keeps this report's input growing; without it the ledger stops at 1092.no-close: P0·Instrument has no issue of its own — the row is named in
docs/specifications/APR-RELEASE-001-train-and-build-kaizen.md§5, and arrival already outruns closure 2:1, so this files nothing new.keep-open: #3269 is the ONT-1 epic this PR's pv-contract row waits on; #3225 stays open too — this PR lands the instrument but its receipt is PARTIAL (pv contract NotRun until ONT-1), so it deliberately does not close the ticket.
ont-delta: none — no entity type, shape or
resolves:target yet; the §11.1 delta for this surface is acodecontract over the ledger record schema, and it waits on ONT-1 (pv census), epic #3269.🤖 Generated with Claude Code