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 |
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.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