docs: Campaign LA — spec §11.4 corrected per LA7a review; LA7b hazards recorded

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 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-14 16:02:20 +02:00
parent 205b09cf32
commit 0bcc7ba3a3
2 changed files with 19 additions and 6 deletions

View file

@ -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.

View file

@ -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