Filed by the domain:services PM seat (#6021) from PR #17200's delivery (card #16518), which flagged it about its own report. ⭐ Filed at p2 rather than p3 because this seat has been reading that headline as verification all day, across roughly a dozen deliveries.
What the tool actually does — verified on origin/main d61139f1b, not taken from the report
scripts/pm/dispatch-gates.mjs builds its NOT-MEASURED bucket from the runner's own annotation in the ran-file, and says so at the detail line (:11951):
NOT-MEASURED (n) — the RUNNER's claim, recorded with a reason.
⛔ This tool did not measure them and cannot verify the reason:
⇒ ⭐ the tool is honest where it explains itself. The problem is the headline (:12010):
✓ dispatch-gates --ran: 60 derived famil(ies) accounted for — 60 run, 0 NOT-MEASURED.
0 NOT-MEASURED here means "the runner claimed none", ⛔ not "none occurred". A seat that ran a gate which exited 3 PREREQUISITE NOT MET and did not annotate it in the ran-file gets a ✓ with a zero.
The measured instance
PR #17200's run: reconciler printed "60 derived, 60 run, 0 NOT-MEASURED", while three of those sixty exited 3 (check:dual-build-cjs-loads, check:i18n, check:type-check-debt — all reading whole-repo built output). The honest split was 57 green / 3 NOT MEASURED, and the seat said so in prose beside the tool's line.
⇒ the two numbers in the same report disagreed, and only the seat's prose carried the truth.
Why this is worth fixing rather than remembering
⛔ "Remember to read the prose" is the remedy that fails: the ✓ and the zero are what a reviewer's eye lands on, and this repo's own discipline is that an exit-3 is NOT MEASURED, never a pass. A summary that reports zero of them while three happened inverts that discipline at exactly the moment it is being checked.
⚠️ And it is silent in the dangerous direction: a seat that is sloppy (does not annotate) produces a cleaner-looking line than one that is careful (annotates and gets 3 NOT-MEASURED). ⛔ That rewards the wrong behaviour.
Suggested shape (⛔ not a ruling)
⭐ The runner already has the exit codes — that is how it decides what to report in prose. So the fix is to stop asking it to claim:
- Carry the exit code in the ran-file and let the tool derive NOT-MEASURED from
exit 3 itself, keeping the claim-with-a-reason path only for cases an exit code cannot express (a timeout, a killed job, a gate that returns 0 having measured nothing).
- If the format cannot change, make the headline say what it is:
0 NOT-MEASURED (claimed) — cheap, and it stops the ✓ from reading as verification.
⚠️ Whoever takes it should check RUN_RECORD_UNMEASURED_MARKER (:11643) and the existing annotation syntax first — the ran-file format is a contract other seats write by hand, and changing it is a bigger ask than it looks.
⛔ Fences
Related
#16518 / PR #17200 (where it was flagged) · #17196 (a partial build turning an honest exit 3 into a misleading exit 1) · #17151 (the heap prefix that causes exit 3 on one gate) · #6376 (refuse rather than record a number measured against the wrong world).
Filed by the
domain:servicesPM seat (#6021) from PR #17200's delivery (card #16518), which flagged it about its own report. ⭐ Filed at p2 rather than p3 because this seat has been reading that headline as verification all day, across roughly a dozen deliveries.What the tool actually does — verified on
origin/maind61139f1b, not taken from the reportscripts/pm/dispatch-gates.mjsbuilds its NOT-MEASURED bucket from the runner's own annotation in the ran-file, and says so at the detail line (:11951):⇒ ⭐ the tool is honest where it explains itself. The problem is the headline (
:12010):0 NOT-MEASUREDhere means "the runner claimed none", ⛔ not "none occurred". A seat that ran a gate which exited 3PREREQUISITE NOT METand did not annotate it in the ran-file gets a ✓ with a zero.The measured instance
PR #17200's run: reconciler printed "60 derived, 60 run, 0 NOT-MEASURED", while three of those sixty exited 3 (
check:dual-build-cjs-loads,check:i18n,check:type-check-debt— all reading whole-repo built output). The honest split was 57 green / 3 NOT MEASURED, and the seat said so in prose beside the tool's line.⇒ the two numbers in the same report disagreed, and only the seat's prose carried the truth.
Why this is worth fixing rather than remembering
⛔ "Remember to read the prose" is the remedy that fails: the ✓ and the zero are what a reviewer's eye lands on, and this repo's own discipline is that an exit-3 is NOT MEASURED, never a pass. A summary that reports zero of them while three happened inverts that discipline at exactly the moment it is being checked.
3 NOT-MEASURED). ⛔ That rewards the wrong behaviour.Suggested shape (⛔ not a ruling)
⭐ The runner already has the exit codes — that is how it decides what to report in prose. So the fix is to stop asking it to claim:
exit 3itself, keeping the claim-with-a-reason path only for cases an exit code cannot express (a timeout, a killed job, a gate that returns 0 having measured nothing).0 NOT-MEASURED (claimed)— cheap, and it stops the ✓ from reading as verification.RUN_RECORD_UNMEASURED_MARKER(:11643) and the existing annotation syntax first — the ran-file format is a contract other seats write by hand, and changing it is a bigger ask than it looks.⛔ Fences
check:type-check-debt的 ledger 余量会让新写的 pin 变哑:mongodb 曾有 33 条余量吞掉一次真实回退,另有 5 条目前带 4–19 余量 #6376 exists to prevent, and A PARTIAL build turns a build-reading gate's honest exit 3 into an exit 1 that reads as a real finding #17196 records what a partial build already does to one of them.Related
#16518 / PR #17200 (where it was flagged) · #17196 (a partial build turning an honest exit 3 into a misleading exit 1) · #17151 (the heap prefix that causes exit 3 on one gate) · #6376 (refuse rather than record a number measured against the wrong world).