diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index a13a8912..9b5c588a 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -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 ~8–10 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-β“‘) | diff --git a/docs/re/data/paint-order-ties-gp_title.txt b/docs/re/data/paint-order-ties-gp_title.txt new file mode 100644 index 00000000..59148b79 --- /dev/null +++ b/docs/re/data/paint-order-ties-gp_title.txt @@ -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 diff --git a/docs/re/structures/ui-paint-order-derived-check.md b/docs/re/structures/ui-paint-order-derived-check.md index ae7ef63f..623858d3 100644 --- a/docs/re/structures/ui-paint-order-derived-check.md +++ b/docs/re/structures/ui-paint-order-derived-check.md @@ -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 |