diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 99563d1d..fb837bf6 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -1209,3 +1209,38 @@ that disagree announce nothing at all, and a reader takes whichever they opened. The port fixed its case by deleting the duplicate rather than picking a winner, which is right: with the evidence gone, choosing between 53.2 and 53.3 would have been authoring a measurement. + +## A pixel figure without its region and its threshold is not checkable + +`plate-pulse-measured.md` published 159 / 714 / 1520 as the plate-absent floor and +the pulse's two levels. The port agent holds the same capture, tried to reproduce +the floor, and got 3–5× at every threshold it tried — because the page named +neither the **region** (whole 1280×720 frame, not a plate crop) nor the +**predicate** (`(g>130) & (g−r>45) & (g−b>45)`, a three-channel test, not +`green > N`). + +⚠️ **This is worse than an obviously incomplete number.** A figure with no stated +method reads as checkable, so a reader spends real effort failing to reproduce it +and then has to decide whether the disagreement is theirs or yours. + +And writing the method down immediately exposed a defect the prose had hidden: the +floor came from a **1279×675** capture while the pulse came from **1280×720** +frames — different crops, silently compared. The fix was a same-run, same-geometry +floor that was in the series all along. + +**So:** every pixel count states its region and its predicate, and a comparison +between two counts states that they share a geometry. If they do not, that is a +finding about the comparison, not a detail. + +## A fix that overshoots leaves no symptom until something else needs the part it disabled + +From the port agent, and it generalises past its own case. Its static-overlay path +was **frozen at the overlay's arrival** — a fix for a different bug that reached too +far and stopped the overlay's clock entirely. Nothing noticed for a week, because +nothing needed that clock to advance. The plate pulse is what finally gave it +something to be wrong about. + +⚠️ **An over-broad fix does not fail; it goes quiet.** The class of bug to look for +is not "this is broken" but "this has been correct-by-inactivity since the day +somebody disabled it". When a fix works by *stopping* something rather than +correcting it, that is the moment to write down what has been stopped. diff --git a/docs/re/structures/plate-pulse-measured.md b/docs/re/structures/plate-pulse-measured.md index a611d78e..7c987887 100644 --- a/docs/re/structures/plate-pulse-measured.md +++ b/docs/re/structures/plate-pulse-measured.md @@ -30,6 +30,45 @@ Two windows of one boot, agreeing to **0.4 %**. Evidence: [peak frame](../captures/title-builds/live-title-plate-pulse-peak.png) (1520) · [trough frame](../captures/title-builds/live-title-plate-pulse-trough.png) (714). +## 🔴 What exactly is being counted — the port could not check this page, and was right to say so + +This page quoted 159 / 714 / 1520 without naming either the **region** or the +**threshold**. The port agent has `live-title-build4-no-plate.png` and still could +not reproduce any of them: counting `green > 150…200` over a 513×48 plate box it +got 528 / 4 908, 3–5× these numbers at every threshold. **A published figure that +looks checkable and is not is worse than one that is obviously incomplete.** + +Stated properly, so it can be checked: + +* **Region: the whole 1280×720 frame.** Not a plate crop. +* **Predicate: `is_title.py`'s**, byte-identical — + `(g > 130) & (g − r > 45) & (g − b > 45)` — a *three-channel* test, which is why + it counts far fewer pixels than a bare `green > N`. + +Re-run against the committed frames, this reproduces 1520 / 714 / 159 exactly. + +### 🔴 And fixing that exposed a real weakness in the floor + +The **159** came from `live-title-build4-no-plate.png`, which is **1279×675** — the +game surface — while the pulse frames are **1280×720**, the whole display. Those are +not the same crop, so the floor was being compared across geometries. + +✅ **Replaced with a same-run, same-geometry floor.** In run 1 the counter sits flat +at **154** for ~2 s (t = 253.0…254.8) immediately before the plate ramps in at +t = 255.0 — the title art alone, in the very frames the pulse was measured in. + +| | count | provenance | +|---|---|---| +| title, plate absent | **154** | same run, same geometry, 2 s before the ramp | +| pulse floor | **714** | 4.6× the plate-absent level | +| pulse peak | **1520** | | + +**"It never goes off" now rests on one run in one geometry**, which is what it +should have rested on from the start. ⚠️ The port's independent ratio — about +**1 : 10.4–10.9** between plate-absent and plate-present over its own crop, stable +across a wide threshold band — brackets this page's 1 : 9.6 and is the part that is +robust to how anyone counts. + ## The instrument, and its controls `tools/re-capture/plate_timeseries.py` counts the green Ⓐ-glyph pixels — the same @@ -40,10 +79,10 @@ anything unknown**, on committed captures: |---|---|---| | `live-title-press-a.png` | **753** | 753 ✅ | | `live-main-menu.png` | **327** | 327 ✅ | -| `live-title-build4-no-plate.png` | **159** | — | +| `live-title-build4-no-plate.png` | **159** | — (⚠️ 1279×675, a different crop — see above) | ⚠️ That third one is the reason the result is readable at all: **the plate-absent -floor is 159, not 0** — the title art carries green pixels of its own. During the +floor is non-zero, not 0** — 154 in-run, 159 on the differently-cropped capture — the title art carries green pixels of its own. During the pulse the count never goes below **714**, four and a half times the floor, so *the plate is never absent*. It dims and brightens; it does not blink off.