From 0bcc7ba3a3bb3e94794f0d2735bb5e9a7b06780a Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 14 Aug 2026 16:02:20 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20Campaign=20LA=20=E2=80=94=20spec=20?= =?UTF-8?q?=C2=A711.4=20corrected=20per=20LA7a=20review;=20LA7b=20hazards?= =?UTF-8?q?=20recorded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The spec seeded the wrong claim (restore extra strings = decompiler artifact, no register row needed); the LA7a Opus review decoded the PDB-paired binary and showed the two constant-string arguments are real, making our guid-only request an adaptation — AD-97 filed on the LA7a branch. Plan LA7 now carries the review-surfaced LA7b hazards (ACE silent no-reply restore path, SendToLogon/SendToControl routing, NumErrors sentinel). Co-Authored-By: Claude Fable 5 --- docs/plans/2026-08-14-launcher-campaign.md | 9 +++++++++ .../specs/2026-08-14-launcher-campaign-design.md | 16 ++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) 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