diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index bba8906..d8d8a4a 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -120,7 +120,7 @@ authored version can be deleted. ⚠️ **Correlation only — untested.** Nothing yet shows it *means* additive; the test is to blend bit-`0x02` sprites additively and re-correlate the title against the capture. Note `ptlogo_back2eff` is `0x8830` despite its name, so - this is a field and not a naming pattern. ❔ Not diagnosed. + this is a field and not a naming pattern. ❔ Not diagnosed — but two candidate meanings are now dead: **not** "the name contains `eff`" (`ptlogo_back2eff` is an `eff` name with the bit clear — confirmed by a validated name→header pairing, not a size guess) and **not** "the element is transient" (`pteff03`/`pteff03a` carry the bit and persist to `t=250`). ⚠️ Practical note for an asset pipeline: `T8aD` headers appear in **RATC child order** (18/18 verified on build 4 against decoded dimensions), which is the only sound way to attribute a header to a name when two sprites share a size — and two here do. ⚠️ **The rotated draw is NOT the swoosh.** It was identified as the swoosh by elimination; that is **refuted** — its quads span y −209…925 in screen space, the swoosh is a band at y 126…360. ✅ **It is the two `ptloop` sweeps** diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 730496b..a7b31c1 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -675,3 +675,15 @@ agent's loop prompt, i.e. nowhere durable. See [`README.md`](README.md) for the 0 occurrences in the release binary, **1** in the debug binary. The debug build is the control that proves the test can find the string when it is there — without it, "0 occurrences" is just as consistent with a bad grep. +* **`T8aD` headers sit in RATC child order — use that, not the size, to name + one.** Attributing a sprite header to a sprite name by matching decoded + dimensions fails whenever two sprites share a size, and `GP_TITLE` build 4 has + such a pair (`ptlogo_back2eff` / `ptlogo_back2eff5`, both 1133×280) that differ + in exactly the flag being studied. Header order matches child order — verified + 18/18 on that build against the dimensions as an independent check — so + ordering resolves what size cannot. +* **Identical summary statistics are not identical data.** Two same-sized sprites + reported the same %opaque, %clear and mean alpha to one decimal, which reads as + "the bundle stores this texture twice". Pixel-comparing them gives max abs diff + **21**: two different renditions of one image. Three matching summaries over + 300 000 pixels is weak evidence of identity; the comparison costs one line. diff --git a/docs/re/REFUTED.md b/docs/re/REFUTED.md index 2f80169..387fb0f 100644 --- a/docs/re/REFUTED.md +++ b/docs/re/REFUTED.md @@ -496,3 +496,12 @@ neighbourhood, not just the line. `_stream.xtr` appears **once** in the Debug binary and **zero** times in the Release binary `run-canary` actually uses. [`capture-harness-status.md`](capture-harness-status.md) +* "the `T8aD` `+0x04` bit `0x02` means the sprite's name contains `eff`" → + **refuted, now on evidence.** `ptlogo_back2eff` is an `eff` name with the bit + clear; the attribution is confirmed by header-order pairing (18/18 on build 4) + rather than by a size match, which cannot separate it from the same-sized + `ptlogo_back2eff5`. All 10 bit-set sprites *are* `eff` names, so the + implication runs one way only. +* "the bit `0x02` marks a transient element" → **refuted.** `pteff03` and + `pteff03a` carry the bit and run to `t=250`, ramping to `a=255` and holding. + [`ui-paint-order-key.md`](structures/ui-paint-order-key.md) diff --git a/docs/re/structures/ui-paint-order-key.md b/docs/re/structures/ui-paint-order-key.md index cd86488..4f990ea 100644 --- a/docs/re/structures/ui-paint-order-key.md +++ b/docs/re/structures/ui-paint-order-key.md @@ -496,3 +496,56 @@ carries the word as `flags`, documented and *not* acted on. Worth noting `ptlogo_back2eff` carries `0x8830` **despite** having `eff` in its name — so the split is the field's, not a naming pattern's. What the bit *does* mean is still unknown. + +--- + +## 🟡 The `+0x04` bit `0x02`: two candidate meanings killed, attribution now sound + +**2026-08-29.** This page recorded the bit as a real independent field +(set in 27.1 % of 19 216 sprites) with its "additive blend" reading refuted and +its meaning ❔ *not diagnosed*, noting that `ptlogo_back2eff` is `0x8830` +"despite its name". Two things here: that note rested on a **size match**, and +the size is ambiguous. + +### ✅ First, a sound way to attribute a header to a name + +`T8aD` headers appear in the bundle **in RATC child order**. Verified on +`GP_TITLE` build 4 by an independent property — each header's decoded +dimensions against the dimensions the named child should have: + +**18 of 18 match, 0 mismatches.** + +That matters because two of the eighteen share a size (`ptlogo_back2eff` and +`ptlogo_back2eff5`, both 1133×280), so a size-keyed lookup cannot tell them +apart — the trap [METHOD.md](../METHOD.md) already records for this corpus. +Ordering resolves them: index 12 is `ptlogo_back2eff5` (`0x8832`, bit **set**), +index 14 is `ptlogo_back2eff` (`0x8830`, bit **clear**). + +So the documented counterexample is **real and correctly attributed** — now on +evidence rather than on a guess between two same-sized sprites. + +### 🔴 Two candidate meanings, both refuted + +| hypothesis | verdict | +|---|---| +| bit ⟺ the name contains `eff` | **refuted** — `ptlogo_back2eff` is an `eff` name with the bit clear. All 10 bit-set sprites *are* `eff` names, so the implication holds one way only | +| bit ⟺ the element is transient (gone before the screen settles) | **refuted** — `pteff03`/`pteff03a` carry the bit and run to `t=250`, ramping to `a=255` and holding, i.e. they persist | + +### 🟡 What the exception looks like up close + +`ptlogo_back2eff` and `ptlogo_back2eff5` are the same size and the same artwork, +and differ in **two** header words: + +``` +ptlogo_back2eff5 +0x04 00008832 +0x08 00008083 (layer key 32899, bit SET) +ptlogo_back2eff +0x04 00008830 +0x08 00008081 (layer key 32897, bit clear) +``` + +⚠️ They are **not** duplicates: pixel-compared, `max abs diff 21`. Their alpha +summaries are identical to one decimal (4.5 % opaque, 86.7 % clear, mean 19.3), +which is precisely why the summaries were not trusted — two different renditions +of one image at one size. + +So the bit tracks something that also distinguishes two versions of the same +artwork, alongside a different layer key. ❔ **Still not diagnosed**, but the +search space is smaller by two and the attribution underneath it is now sound.