diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index d533f383..8ea77c16 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -192 sections. Search this before re-deriving anything. +193 sections. Search this before re-deriving anything. * [P0 — the exporter, 2026-08-28](#p0--the-exporter-2026-08-28) * [P1 — Godot draws the screen, 2026-08-28](#p1--godot-draws-the-screen-2026-08-28) @@ -203,6 +203,7 @@ dies, which is what this file is for. * [The boot verified as a *sequence*, not just at its endpoint](#the-boot-verified-as-a-sequence-not-just-at-its-endpoint) * [Refuting the "8.5 % systematic" in the splash dwells — it is the span, not the clock](#refuting-the-85--systematic-in-the-splash-dwells--it-is-the-span-not-the-clock) * [The fifth member of the family is mine: "drawn" is not "visible"](#the-fifth-member-of-the-family-is-mine-drawn-is-not-visible) +* [Auditing `--black`, and a rule that falls out of it](#auditing---black-and-a-rule-that-falls-out-of-it) ## P0 — the exporter, 2026-08-28 @@ -10865,3 +10866,42 @@ distortion of the record. ✅ Nothing about the conclusion moves: the port plays the full group, 255 and 210 units; the recomputed ratios are 1.011/1.083/1.028 and 1.002/1.001/0.962, mean 1.0146; **Q1 stands unqualified** and `keyframe_units_per_second` does not move. + +## Auditing `--black`, and a rule that falls out of it + +Their dividend — that `screen render --black`'s premise is **declared** on the +splash builds rather than assumed — is checkable across my whole export, and +`verify-screen` passes `--black` to all sixteen screens on exactly that premise. + +Audited by asking: does the screen declare a full-screen untextured primitive at +`t=0` with `fade_argb 0xff000000`? + +| | | +|---|---| +| **declared** — 12 screens | `pteff00` (both titles, both menus, both extras), `palogo_eff0` (all four splashes), `pgloading_eff00` (`build_12`, `build_15`) | +| **not declared** — 4 screens | `press_start`, `press_start_jp`, `build_00`, `build_01` | + +🔴 **All four exceptions are composited, not standalone.** `press_start` is one +element — the plate — and its own `name_why` records that it is *"composited over +the title"*; the game never shows it on black. `build_00`/`build_01` carry the +`pgloading_*` set **without** the `pgloading_eff00` backdrop that `build_12`/`15` +declare. + +✅ **Harmless where it is used**, and worth stating why rather than assuming: +`verify-screen` gives `--black` to *both* renderers, so the assumption cancels in +a consistency check. It would not cancel in an oracle comparison — and +`verify-capture` already avoids it, scoring the plate as +`--screen=title --overlay=press_start`, over the title. The exposure was real and +the tooling had already routed around it, which I could only establish by looking. + +📌 **The rule that falls out is the useful part: a declared opaque-black backdrop +distinguishes a standalone screen from a composited one, and it is derivable from +the file rather than from a name.** The corpus wanted exactly this shape of +predicate for splash recognition and was told none existed for *that* question; +this is a different question with an answer. 12 standalone, 4 composited, no +name-matching involved. + +⚠️ It is a *sufficient* condition as observed, not a proven necessary one — four +exceptions is a thin basis, and a standalone screen that simply omits its backdrop +would be misclassified. Recorded as a rule with its evidence, not as a decoded +fact. diff --git a/tools/port/verify-screen b/tools/port/verify-screen index c96ff790..9752222f 100755 --- a/tools/port/verify-screen +++ b/tools/port/verify-screen @@ -49,6 +49,27 @@ # * `--black` because Godot clears to black and the screen carries its own # background. The CLI's default dim slate stands in for a 3D scene behind an # in-mission screen, which is not this screen. +# +# ⚠️ THAT PREMISE IS DECLARED ON 12 OF 16 SCREENS AND ASSUMED ON 4. Audited +# 2026-08-30: a screen "carries its own background" when it declares a +# full-screen untextured primitive at `t=0` with `fade_argb 0xff000000` -- +# opaque black. Twelve do (`pteff00`, `palogo_eff0`, `pgloading_eff00`). +# Four do NOT, and all four are COMPOSITED rather than standalone: +# +# press_start / press_start_jp -- one element, the plate, drawn OVER the +# title; its own `name_why` says so. The game never shows it on black. +# build_00 / build_01 -- loading variants carrying the `pgloading_*` set +# WITHOUT the `pgloading_eff00` backdrop that build_12/15 declare. +# +# ✅ Harmless HERE, because both renderers are given `--black` and the +# assumption cancels in a consistency check. It would NOT be harmless in an +# oracle comparison, and `verify-capture` already avoids it: the plate is +# scored as `--screen=title --overlay=press_start`, over the title, not on +# black. +# +# 📌 The audit is also a rule worth having: **a declared opaque-black +# backdrop distinguishes a standalone screen from a composited one**, and it +# is derivable from the file rather than from a name. # * `--primitives --animated` because those are what make the CLI draw the same # element set. `--focus` is NOT passed: nothing is focused at rest (HANDOFF # Q5 measured initial focus as unstable boot to boot, so choosing one is