re(ui): measure the paint-order hedge -- exact on 4 of 5, and bound the rest

`compose` claimed the derived paint order "reproduces both measured
orders up to ties". That sentence was never measured and was stale by
one: there are three measured orders, not two. examples/paint_order_audit.rs
checks it.

  main menu (entries 5, 8)      derived == measured   0 inverted pairs
  developer splash (11, 14)     derived == measured   0 inverted pairs
  title (entry 4)               DIFFERS               8, all same-key ties

So the claim holds and the exception is entirely ties -- but two of those
ties are total occlusions, not near-misses. The tied family is the five
ptlogo_back2eff glows (key 32899); back2eff5 is 1133x280 and FULLY
CONTAINS back2eff3 (82,824 px^2 = 100% of the smaller) and back2eff4
(152,047 px^2 = 100%). Derived paints it on top of two glows it entirely
covers; the game paints it underneath. A tie-break by declaration index
can therefore be wrong by a whole layer. The title itself is unaffected --
it has a measured order.

The port's actual exposure, per screen: title, main menu and developer
splash all use MEASURED orders; the publisher splash is derived but has
ZERO ties, so it is fully determined; EXTRAS is derived with 15 tied
pairs of which only 2 OVERLAP. Two element pairs on one screen is the
whole risk, and that is what HANDOFF now says -- not the raw 15, which
would have overstated it 7x.

Reach stated: this compares the derived order against orders measured
from the game, not an independent derivation, so where no measured order
exists only the tie exposure can be checked. Overlap uses pivot*2 as the
element size at its resting placement.

Stale comment in compose corrected. METHOD: a hedge in a code comment is
an unmeasured claim; and count the cases that can bite, not the ones that
match the pattern.
This commit is contained in:
Sylpheed RE agent
2026-08-29 02:22:01 +00:00
parent c3cf3c2e81
commit ba47bdebe8
6 changed files with 271 additions and 2 deletions

View File

@@ -256,6 +256,23 @@ authored version can be deleted.
addresses (the two differ in size).
[`structures/ui-8ax-fullres-background.md`](../re/structures/ui-8ax-fullres-background.md)
***Paint order: your exposure is two element pairs, on one screen.** We use
an order *measured from the running game* where one exists and a derived order
(a sort on each sprite's layer key) elsewhere. Checked, rather than assumed:
the derived order reproduces the measured one **exactly** on the main menu
(0 inverted pairs) and the developer splash (0). On the **title** it differs by
8 pairs — **all same-layer-key ties** — and two of those are total occlusions
(`back2eff5` is 1133×280 and *fully contains* `back2eff3` and `back2eff4`;
derived puts it on top, the game puts it underneath). The title is unaffected
in practice because it has a measured order.
Per screen: title **measured**, main menu **measured**, developer splash
**measured**, publisher splash derived but with **0 ties** (fully determined),
and **`EXTRAS` derived with 15 tied pairs of which only 2 overlap**. That pair
count is the whole risk — a tie-break by declaration index can be wrong by a
whole layer where it is wrong, so if `EXTRAS` ever looks off, those two pairs
are where to look.
[`structures/ui-paint-order-derived-check.md`](../re/structures/ui-paint-order-derived-check.md)
* **Menu order is geometric.** Buttons sorted top-to-bottom by resting Y. This is
✅ correct for a vertical menu and is **not** a decoded neighbour graph — the
disc's real navigation structure is unknown, and `opt ` is *not* a focus link