diff --git a/docs/plans/2026-08-14-launcher-campaign.md b/docs/plans/2026-08-14-launcher-campaign.md index 7362ee4b..b362f863 100644 --- a/docs/plans/2026-08-14-launcher-campaign.md +++ b/docs/plans/2026-08-14-launcher-campaign.md @@ -312,6 +312,15 @@ delete/restore/error. selector-carrying/headless sessions. Selection feeds the existing `EnterWorld` path unchanged. +LA7b hazards carried from the LA7a review (2026-08-14): ACE's restore +handler has a SILENT no-reply path (unknown guid → `return;`, no 0xF643, +no 0xF659) — selection state must never block awaiting a restore reply; +outbound routing is delete via retail's SendToLogon, restore via +SendToControl, ACE replies on UIQueue; `charError.NumErrors` (0x19) is an +enum-range sentinel and must never render as a user-facing message. +Register row AD-97 (guid-only restore request, an adaptation) rides the +LA7a branch. + **Acceptance:** message round-trip tests against ACE's serializer shapes; selection-state tests (greyed transitions, delete→list-refresh, restore, error surfacing); no-selector stop + enter flow tests; suites green. diff --git a/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md b/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md index a68527c5..42360f1d 100644 --- a/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md +++ b/docs/superpowers/specs/2026-08-14-launcher-campaign-design.md @@ -334,14 +334,18 @@ preview would be a deliberate divergence we are NOT taking. behavior symbols are in §7; the DataID hides behind `GetDIDByEnum` enum-table 5 (enum `0x10000005`) — dump the table from installed DATs in the screen slice. -4. RESOLVED by recon: delete = 0xF655 account+slot (ack opcode-only, then - fresh CharacterList); restore = 0xF7D9 guid → 0xF643 response; ACE's +4. RESOLVED by recon, CORRECTED by the LA7a Opus review (2026-08-14): + delete = 0xF655 account+slot (ack opcode-only, then fresh + CharacterList); restore = 0xF7D9 → 0xF643 response; ACE's `secondsSincePendingDelete` computes to a constant 1 during the grace window (ACE quirk — treat any non-zero as "pending delete", don't - display it as a countdown). One decomp ambiguity (whether retail's - restore carries two extra strings) is noted as a likely decompiler - artifact — ACE + holtburger agree on guid-only; follow them and note - the register row is NOT needed (wire consensus, no behavior change). + display it as a countdown). The restore "two extra strings" question + resolved AGAINST the earlier reading: the PDB-paired binary shows two + REAL constant-string arguments (the decompiler mangled their + rendering, not their existence), so retail's request is ≥16 bytes and + our guid-only 8-byte form is an ADAPTATION — register row AD-97, + filed with the LA7a fix round. ACE reads only the guid; holtburger + ships guid-only successfully. 5. Whether retail rendered a render-loop-level background scene behind the character-management UI — pseudo-C only proves the UI class owns no viewport. Resolve in the screen slice (user memory of retail + the