From 1834ad1f4060cbb0d2c90c4cb7a9f4e3d83a6ad1 Mon Sep 17 00:00:00 2001 From: Sylpheed port agent Date: Sun, 30 Aug 2026 06:48:42 +0000 Subject: [PATCH] port: the forced-backdrop pass decides two screens and confirms four, not six I have said 'six forced elements' since implementing it and verified after every change that no verdict moved -- which measured stability, not necessity. Removing the pass entirely: the four splashes are BYTE-IDENTICAL, because palogo_eff0's implied key 0x00000000 is lower than the lowest sprite key and the crate already sorts it first. Only build_12/15 change, and they go black again. Those two are the port's strongest dependency on an undecoded rule: pgloading_eff00 there has layer: null, layer_source: none -- the only elements in the export with neither a read nor an implied key. Their position rests entirely on the occlusion constraint with nothing to fall back on, and that was hiding inside a count of six. Census: 160 layer keys read from sprites, 16 implied (every layerless primitive), 2 absent. FORMAT.md requires a consumer to tell which, and layer_source does. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01N7FiFFFwbvG2uxdcEh8HyF --- docs/port/DECISIONS.md | 51 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/docs/port/DECISIONS.md b/docs/port/DECISIONS.md index 84145a64..cd31b8e3 100644 --- a/docs/port/DECISIONS.md +++ b/docs/port/DECISIONS.md @@ -9,7 +9,7 @@ dies, which is what this file is for. -113 sections. Search this before re-deriving anything. +114 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) @@ -124,6 +124,7 @@ dies, which is what this file is for. * [Auditing `BLOCKED.md` found three stale rows, and the undated ones were all three](#auditing-blockedmd-found-three-stale-rows-and-the-undated-ones-were-all-three) * [The record already answered last iteration's question, under headings that name it](#the-record-already-answered-last-iterations-question-under-headings-that-name-it) * [🔴 Twenty-one messages to a dead address, each one warning me it was dead](#twenty-one-messages-to-a-dead-address-each-one-warning-me-it-was-dead) +* [The forced-backdrop pass is load-bearing on two screens, not six](#the-forced-backdrop-pass-is-load-bearing-on-two-screens-not-six) ## P0 — the exporter, 2026-08-28 @@ -6722,3 +6723,51 @@ because it converts into evidence that the situation is understood. The fix is n "read the warnings" — I read them all. It is that a warning repeating unchanged across attempts is a *state*, not a footnote, and the second identical one should have been treated as a failure rather than a fact about the world. + +## The forced-backdrop pass is load-bearing on two screens, not six + +I have said "six forced elements" since implementing the rule, and checked after +every change that **no verdict moved**. That measured the pass's *stability*, never +its *necessity*. Removing it entirely answers the other question: + +| screens | order without the pass | +|---|---| +| `publisher_logo`, `publisher_logo_r`, `developer_logos`, `developer_logos_r` | **byte-identical** | +| `build_12`, `build_15` | first element becomes `pgloading_loop5` — the black screen returns | + +**Four of the six are redundant.** `palogo_eff0`'s layer key is `0x00000000`, +`layer_source: implied` — lower than the lowest sprite key on those screens +(`0x0000a100`) — so the crate already sorts it first and the occlusion rule merely +agrees. + +🔴 **The two that matter have no key at all.** On `build_12`/`build_15`, +`pgloading_eff00` carries `layer: null`, `layer_source: none` — the only two +elements in the export with neither a read nor an implied key. Their position rests +**entirely** on the occlusion constraint, with nothing to fall back on. That is the +port's single strongest dependency on a rule it did not decode, and it was hiding +inside a count of six. + +### Which is also what makes the rule worth having + +An agreement on four screens where a key already existed is not evidence — it is +the rule reproducing the crate. The two screens where it is load-bearing are the +two the rule was found on, and the argument for it there is not the key (there is +none) but that a permanently black screen is impossible on its face. + +⚠️ So the honest statement, replacing the one I have been repeating: the rule +**decides** two screens and **confirms** four. I will not describe it as six again. + +### The layer-key census this came out of + +| `layer_source` | count | which | +|---|---|---| +| `sprite` — read from the file | 160 | everything with a texture | +| `implied` — the crate's, measured per name | 16 | `pteff00`, `pteff02`, `palogo_eff0`, `pgloading_eff00` | +| `none` — no key exists | **2** | `pgloading_eff00` on the two loading screens | + +✅ Every layerless primitive's position is `implied` or absent, never read — and +`FORMAT.md` requires a consumer to be able to tell, which `layer_source` delivers. +The Decoder's own page says `pteff00`'s place on top *"is still a **measured** +per-name entry, not a decoded one"*; the port inherits that through +`layer: 0xfffffffe, layer_source: implied` and declares it. Nothing is being +passed off as decoded that is not.