re: the paint-order tie-break costs 24 overlapping pairs, not one element

The port challenged HANDOFF's "costs one element's blend on one screen" with a
census of 105 elements sharing a layer key across 12 of 16 screens. The two
numbers count different things -- elements vs overlapping pairs -- so it is not
the contradiction it looked like, but the objection stands and the line was
wrong.

paint_order_audit already reports overlapping ties per entry, and over all 16
GP_TITLE entries: 5 use a measured order and carry no tie risk; of the 11 that
fall back to the derived order, 7 have overlapping ties, 24 pairs in total. The
Japanese title (entry 7) alone has 16, because it is the twin of the one build
whose measured order exists and has none of its own.

Overlap bounds where a wrong tie-break COULD show, not what it costs; nobody has
measured how many of the 24 change a pixel, and the port is right about that too.

The rule itself is unaffected: the layer key is still decoded and the derived
order still reproduces every measured order exactly except the title's eight
tied pairs.

Census committed at docs/re/data/paint-order-ties-gp_title.txt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nsxw1A9JseUw99Yw1ZRQzY
This commit is contained in:
sylph-decoder
2026-08-29 14:17:40 +00:00
parent 406517cc68
commit 6c05b72099
3 changed files with 112 additions and 1 deletions

View File

@@ -1180,7 +1180,7 @@ here until 2026-08-28 and is now settled.)
|---|---|---|
| 🟡 | **cue NAME → event binding** (Q8) | event→**wave** is measured for move/confirm/back; that the cursor's wave is the cue *named* `SE_UI_CURSOR` is still read off the authors' identifiers |
| ❔ | **the other ~319 SE cues** (Q8) | located one at a time by triggering them; only the three the menu needs have been done |
| 🟡 | **the paint-order tie-break** (Q3) | eight candidates refuted; costs one element's blend on one screen |
| 🟡 | **the paint-order tie-break** (Q3) | eight candidates refuted. 🔴 **The cost was understated and is corrected 2026-08-29** — the port challenged it and was right. Over all 16 `GP_TITLE` entries: 5 use a **measured** order and carry no tie risk; the other 11 fall back to the derived order and **7 of them have overlapping ties, 24 pairs in total** — 16 of those on the **Japanese title** (entry 7) alone, 2 each on `EXTRAS` EN/JP, 1 each on the four loading bundles. ⚠️ Overlap bounds *where* a wrong tie-break could show; nobody has measured how many actually change a pixel — [`ui-paint-order-derived-check.md`](../re/structures/ui-paint-order-derived-check.md) · [census](../re/data/paint-order-ties-gp_title.txt) |
| 🟡 | **GamePart ids behind the buttons** (Q4) | the *screens* are measured; the ids are a name match onto the executable's class names |
| 🟡 | **the boot transitions in code** (Q6) | both levels decoded — phase at `this+132` (`entry→2`, `2→0`, `2→3`, `3→4`, `4→2`) and state at `this+136` inside phase 4. Phase 0 = splash (`LOGO`), phase 2 = title + `PRESS Ⓐ`, phase 4 = menu. Unknown: what the event *numbers* mean |
| 🟡 | **Ⓑ leaving the main menu** (Q5) | **upgraded 2026-08-29 (later).** The idle half of this objection is **refuted**: the main menu does not self-return for **≥ 60 s** untouched, and the ~810 s idle belongs to the **title**. Ⓑ is delivered (Canary logs `vk=5801`) and is the only input in ≥ 100 s before the return, so the **ordering is measured**; the latency is not (a backlogged probe void). The footer point stands — the main menu is still the only screen not advertising Ⓑ — [`menu-navigation-semantics.md`](../re/menu-navigation-semantics.md#-refutation-attempt-2026-08-29--the-main-menus-own-footer-does-not-advertise-ⓑ) |

View File

@@ -0,0 +1,73 @@
warning: unused variable: `decl`
--> crates/sylpheed-formats/src/mesh.rs:1682:9
|
1682 | let decl = &decls[0];
| ^^^^ help: if this is intentional, prefix it with an underscore: `_decl`
|
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: variable does not need to be mutable
--> crates/sylpheed-formats/src/ship_capture.rs:290:9
|
290 | let mut flush = |base: u32,
| ----^^^^^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
entry 0 (no measured order) 7 elements, 2 tied pairs, 1 of them OVERLAPPING
overlapping tie: [5] pgloading_eff01.t32 x [6] pgloading_eff02.t32 key 49408 rect (202, 528, 332, 144) / (74, 518, 188, 186) overlap 60x144
entry 1 (no measured order) 7 elements, 2 tied pairs, 1 of them OVERLAPPING
overlapping tie: [5] pgloading_eff01.t32 x [6] pgloading_eff02.t32 key 49408 rect (202, 528, 332, 144) / (74, 518, 188, 186) overlap 60x144
entry 2 (no measured order) 1 elements, 0 tied pairs, 0 of them OVERLAPPING
entry 3 (no measured order) 1 elements, 0 tied pairs, 0 of them OVERLAPPING
entry 4 title 24 elements
derived == measured : NO
inverted pairs : 8 (of which same-layer-key ties: 8)
measured: [9, 11, 12, 10, 13, 6, 20, 19, 14, 15, 18, 16, 17, 0, 2, 4, 7, 1, 3, 5, 22, 23, 21, 8]
derived : [9, 11, 12, 10, 13, 6, 20, 19, 14, 15, 16, 17, 18, 0, 1, 2, 3, 4, 5, 7, 22, 23, 21, 8]
keys : [32928, 32928, 32928, 32928, 32928, 32928, 32832, 32928, 4294967295, 32768, 32800, 32784, 32784, 4294967295, 32899, 32899, 32899, 32899, 32899, 32898, 32897, 33024, 32936, 32937]
entry 5 main menu 16 elements
derived == measured : YES
inverted pairs : 0 (of which same-layer-key ties: 0)
entry 6 (no measured order) 18 elements, 15 tied pairs, 2 of them OVERLAPPING
overlapping tie: [0] ptframe3.t32 x [1] ptframe4.t32 key 32848 rect (440, 230, 246, 220) / (584, 318, 256, 210) overlap 102x132
overlapping tie: [14] ptloop01.rat x [15] ptloop02.rat key 32784 rect (441, 270, 400, 180) / (441, 270, 400, 180) overlap 400x180
entry 7 (no measured order) 30 elements, 37 tied pairs, 16 of them OVERLAPPING
overlapping tie: [1] ptlogo2.t32 x [11] ptlogo_tm.t32 key 32928 rect (193, 335, 898, 92) / (1073, 392, 44, 28) overlap 18x28
overlapping tie: [2] ptlogo1.t32 x [4] ptlogo1.t32 key 32928 rect (-65, 33, 902, 100) / (-65, 33, 902, 100) overlap 902x100
overlapping tie: [3] ptlogo2.t32 x [5] ptlogo2.t32 key 32928 rect (493, 535, 898, 92) / (493, 535, 898, 92) overlap 898x92
overlapping tie: [7] ptlogo_eff2.rat x [23] ptlogo_back2.t32 key 32898 rect (412, 96, 338, 338) / (134, 173, 1000, 234) overlap 338x234
overlapping tie: [8] ptlogo_eff3.t32 x [24] ptlogo_back2eff.t32 key 32897 rect (98, 42, 946, 386) / (127, 164, 1014, 252) overlap 917x252
overlapping tie: [15] ptloop01.rat x [16] ptloop02.rat key 32784 rect (441, 270, 400, 180) / (441, 270, 400, 180) overlap 400x180
overlapping tie: [18] ptlogo_back2eff1.t32 x [19] ptlogo_back2eff2.t32 key 32899 rect (910, 227, 156, 120) / (910, 164, 232, 182) overlap 156x119
overlapping tie: [18] ptlogo_back2eff1.t32 x [20] ptlogo_back2eff3.t32 key 32899 rect (910, 227, 156, 120) / (802, 164, 340, 182) overlap 156x119
overlapping tie: [18] ptlogo_back2eff1.t32 x [21] ptlogo_back2eff4.t32 key 32899 rect (910, 227, 156, 120) / (483, 164, 658, 182) overlap 156x119
overlapping tie: [18] ptlogo_back2eff1.t32 x [22] ptlogo_back2eff5.t32 key 32899 rect (910, 227, 156, 120) / (127, 164, 1014, 252) overlap 156x120
overlapping tie: [19] ptlogo_back2eff2.t32 x [20] ptlogo_back2eff3.t32 key 32899 rect (910, 164, 232, 182) / (802, 164, 340, 182) overlap 232x182
overlapping tie: [19] ptlogo_back2eff2.t32 x [21] ptlogo_back2eff4.t32 key 32899 rect (910, 164, 232, 182) / (483, 164, 658, 182) overlap 231x182
overlapping tie: [19] ptlogo_back2eff2.t32 x [22] ptlogo_back2eff5.t32 key 32899 rect (910, 164, 232, 182) / (127, 164, 1014, 252) overlap 231x182
overlapping tie: [20] ptlogo_back2eff3.t32 x [21] ptlogo_back2eff4.t32 key 32899 rect (802, 164, 340, 182) / (483, 164, 658, 182) overlap 339x182
overlapping tie: [20] ptlogo_back2eff3.t32 x [22] ptlogo_back2eff5.t32 key 32899 rect (802, 164, 340, 182) / (127, 164, 1014, 252) overlap 339x182
overlapping tie: [21] ptlogo_back2eff4.t32 x [22] ptlogo_back2eff5.t32 key 32899 rect (483, 164, 658, 182) / (127, 164, 1014, 252) overlap 658x182
entry 8 main menu 16 elements
derived == measured : YES
inverted pairs : 0 (of which same-layer-key ties: 0)
entry 9 (no measured order) 18 elements, 15 tied pairs, 2 of them OVERLAPPING
overlapping tie: [0] ptframe3.t32 x [1] ptframe4.t32 key 32848 rect (440, 230, 246, 220) / (584, 318, 256, 210) overlap 102x132
overlapping tie: [14] ptloop01.rat x [15] ptloop02.rat key 32784 rect (441, 270, 400, 180) / (441, 270, 400, 180) overlap 400x180
entry 10 (no measured order) 3 elements, 0 tied pairs, 0 of them OVERLAPPING
entry 11 splash 7 elements
derived == measured : YES
inverted pairs : 0 (of which same-layer-key ties: 0)
entry 12 (no measured order) 10 elements, 2 tied pairs, 1 of them OVERLAPPING
overlapping tie: [8] pgloading_eff01.t32 x [9] pgloading_eff02.t32 key 49408 rect (202, 528, 332, 144) / (74, 518, 188, 186) overlap 60x144
entry 13 (no measured order) 3 elements, 0 tied pairs, 0 of them OVERLAPPING
entry 14 splash 7 elements
derived == measured : YES
inverted pairs : 0 (of which same-layer-key ties: 0)
entry 15 (no measured order) 10 elements, 2 tied pairs, 1 of them OVERLAPPING
overlapping tie: [8] pgloading_eff01.t32 x [9] pgloading_eff02.t32 key 49408 rect (202, 528, 332, 144) / (74, 518, 188, 186) overlap 60x144
5 build(s) with a measured order were checked

View File

@@ -10,6 +10,44 @@ there are **three** measured orders now, not two.
Tool: `cargo run -p sylpheed-formats --example paint_order_audit -- dat/GP_TITLE.pak`.
Output committed at [`data/paint-order-audit.txt`](../data/paint-order-audit.txt).
## 🔴 Refutation, 2026-08-29 — the published COST of the tie-break was understated
The port challenged HANDOFF's line *"eight candidates refuted; costs one
element's blend on one screen"* against its own census of 105 elements sharing a
key across 12 of 16 screens. Those two numbers are not comparable — the port
counts *elements*, this page counts overlapping *pairs*, and "one screen" was
scoped to five English menu screens without saying so. **So the objection is not
the contradiction it looked like. It is still right, and the line is corrected.**
`paint_order_audit` already reports overlapping ties per entry. Run over all 16
`GP_TITLE` entries — committed at
[`data/paint-order-ties-gp_title.txt`](../data/paint-order-ties-gp_title.txt):
| entry | screen | tied pairs | **overlapping** |
|---|---|---|---|
| 4, 5, 8, 11, 14 | title EN, main menu ×2, splash ×2 | — | **measured order is used; no tie risk** |
| 0, 1 | loading, plain | 2 | **1** each |
| 12, 15 | loading, dressed | 2 | **1** each |
| 6, 9 | `EXTRAS` EN / JP | 15 | **2** each |
| **7** | **title, Japanese** | **37** | **16** |
| 2, 3, 10, 13 | `PRESS Ⓐ` plate, `palogo_sqex` | 0 | 0 |
**24 overlapping tied pairs across 7 of the 11 entries that fall back to the
derived order** — not one element on one screen. The Japanese title alone carries
16, because it is the twin of the one build whose measured order exists and it
has no measured order of its own.
⚠️ **Overlap is an upper bound on the cost, not the cost.** Two elements that
overlap still show nothing if either is transparent at rest or one is opaque
where they meet. What the pair count bounds is *where a wrong tie-break could
show*, and the port is right that nobody has measured how many of those actually
change a pixel.
⚠️ This does not weaken the **rule**. The layer key is decoded and the derived
order reproduces every measured order it can be checked against, exactly, except
the title's eight tied pairs. What is corrected is only the advertised blast
radius of the unknown tie-break.
## The claim holds, and the exception is all ties
| build | derived == measured | inverted pairs | of which same-key ties |