From dfe21fda1f485f32bc5b55409ca669e1da0e5727 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Thu, 3 Sep 2026 19:19:54 +0000 Subject: [PATCH] handoff: 0x3003 is 0x3002 parented; kind bit 0 decoded disc-wide Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t --- docs/port/HANDOFF.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index ae5f1845..c2187342 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -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.