CC2 review fix round: latch scope narrowed, AD-100, creationFailed reason key
F1 (MEDIUM): the correlation-latch docs claimed replies are never misattributed; in truth an overlapping send OVERWRITES the latch and the first reply routes to the newest request's event. Narrowed all three doc sites to the exact contract (single outstanding request; overlap refusal is CC3's Runtime verification gate, retail's DoFinish UNDEF-state rule) and pinned the overwrite behavior with OverlappingSend_OverwritesTheLatch_ReplyRoutesToNewestRequest. F2 (LOW): filed register AD-100 for the drop-unless-armed deviation — retail's Handle_CharGenVerificationResponse@0x0055E8B0 has no armed gate and processes whatever arrives against its persistent verification state. F3 (LOW): doc note in CharacterCreate.cs — ACE double-sends NameInUse (IsCharacterNameAvailable runs twice; the first callback's return exits only the lambda), so the second reply hitting the drop path during a connected gate is EXPECTED, not a defect. F4 (LOW): creationFailed's enum-member key renamed name -> reason and the ATTEMPTED character name added as name, before any consumer shipped — one status vocabulary must not give the same key two meanings (characterCreated.name is a character name). Contract, writer, tailer, and shape-pinning tests updated in lockstep. F5 (LOW): the thread-id probe-note pointer now cites ProbeNetLogOutbound's doc comment, where the note actually lives. Fidelity fold (reviewer's positive note): the latch is retail's OWN discriminator one layer down — 0x0055E8B0 case 1 branches on GetVerificationState()==PENDING (create) vs not (restore) — now cited in both the latch doc and CharGenVerificationResponse.cs. Core.Net 994, Runtime 1667, Launcher.Core 324, all green Release. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
5eaad2c88c
commit
e77ebf100f
12 changed files with 143 additions and 32 deletions
|
|
@ -170,7 +170,7 @@ line, writer opens `FileShare.Read`, tailer opens
|
|||
`enteredWorld{characterId,characterName}`, `pluginLoaded{plugin}`,
|
||||
`pluginFailed{plugin,error}`,
|
||||
`loginCommandFailed{commandIndex,command,error}`,
|
||||
`characterCreated{guid,name}`, `creationFailed{code,name}`,
|
||||
`characterCreated{guid,name}`, `creationFailed{code,reason,name}`,
|
||||
`disconnected{reason}`,
|
||||
`exited{code,reason}` — every line carries `"v":1`, `"e"`, `"t"`
|
||||
(ISO-8601 UTC), `"sessionId"`. `secondsGreyedOut` is a uint on BOTH
|
||||
|
|
@ -189,11 +189,14 @@ that payload's own field names and to read distinctly from
|
|||
`enteredWorld` — a freshly created character is logged straight in by
|
||||
retail without a fresh `characterList` (see that type's doc comment), so
|
||||
`characterCreated` can precede an `enteredWorld` for the same character
|
||||
rather than replacing it. `creationFailed{code,name}` fires on any non-Ok
|
||||
reply: `code` is the raw wire `CharGenVerificationResponse.Code` value,
|
||||
`name` is that code's enum member name (e.g. `"NameInUse"`) so a reader
|
||||
gets a stable readable reason without hard-coding the numeric mapping
|
||||
itself.
|
||||
rather than replacing it. `creationFailed{code,reason,name}` fires on any
|
||||
non-Ok reply: `code` is the raw wire `CharGenVerificationResponse.Code`
|
||||
value, `reason` is that code's enum member name (e.g. `"NameInUse"`) so a
|
||||
reader gets a stable readable reason without hard-coding the numeric
|
||||
mapping itself, and `name` is the ATTEMPTED character name so a launcher
|
||||
can render "the name Bob is taken". (CC2 review F4: the enum member
|
||||
originally rode the `name` key, colliding in meaning with
|
||||
`characterCreated.name`; renamed before any consumer shipped.)
|
||||
|
||||
`loginCommandFailed.commandIndex` is the zero-based index in the configured
|
||||
`loginCommands` array. `command` is the exact configured line and `error` is
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue