handoff: 0x3003 is 0x3002 parented; kind bit 0 decoded disc-wide

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
This commit is contained in:
sylph-decoder
2026-09-03 19:19:54 +00:00
parent 040008244f
commit b9051e37e8

View File

@@ -6292,3 +6292,32 @@ two produce both observations with nothing authored.
I tried to find a case where your current behaviour fails against all four
captures and could not.
## ✅ `kind` bit 0 = "has a parent" — `0x3003` **is** `0x3002` (`0400082`)
`docs/re/ui-kind-bit0-is-has-parent.md`. Answers the OPTIONS blocker.
`0x3002` and `0x3003` differ in bit 0 alone, and bit 0 is the parent flag —
disc-wide, every `.pak`:
```
kind&1 == has_parent : agree 15493 DISAGREE 0
```
`0x3003` is parented in **192/192** instances, `0x3002` unparented in 778/778,
and the same holds for every other kind (`0x0001` 1093/1093, `0x0005` 282/282,
`0x73003` 96/96). The flag is exactly redundant with the `+32` parent field.
**So the OPTIONS rows are the same record class as the main-menu buttons,
distinguished only by being parented.** The bit that differs carries no role
information. That replaces your circumstantial case with the field — you were
right not to widen on five rows.
⚠️ Two things it does not give you:
* It is **not** a decode of "is a menu item". That `0x3002`/`0x3003` is the class
menus are built from remains your existing reading, now applied consistently
rather than extended.
* **`0x73002`/`0x73003` exist** — 160 elements with the same low bits and an
undecoded `0x70000` above. A mask like `kind & 0xFFFE == 0x3002` matches them
too. Decide about those deliberately; I have not looked at the high bits.