fix(chat): consolidated-review fixes — retail /help Detail extraction, seam wiring test

SHOULD-FIX 1: RetailClientCommandCatalog's ~45 catalog leaf verbs were
showing acdream-authored Summary text for /help <verb> instead of
retail's own Detail_HelpType(2) text. Byte-swept every Help* handler
against the PDB-paired acclient.exe (verified MATCH), confirmed each
Detail/Summary branch by reading the actual decompiled if/else shape
(address order and string length both proved unreliable alone), and
fixed a sweep_weenie_strings.py 800-char truncation bug that silently
dropped several longer Detail branches. Resolved every ambiguous
CmdHashData-registered verb (hor/hr/hom/hoa/alh/ah/friends_add/
friends_remove/squelch/unsquelch) by reading for Binary Ninja's
nullptr-4th-arg decompiler artifact instead of trusting it. Coverage:
42 of 47 distinct catalog Definitions verbatim-extracted, 4
confirmed-null (index/clist/on/off register with a genuinely null help
pointer — DoHelp falls to UnknownCommand for these, now reproduced),
1 honest UNVERIFIED (messagetypes builds its text from a runtime enum
table, not a static string). ChatCommandRouter now prefers retail
Detail text over the catalog summary; RetailCommandHelpTable's class
doc no longer overclaims its own scope.

SHOULD-FIX 2: extracted the a5a7eb4f-class OnInterfaceText wiring into
a testable CreateChatViewModel method and added
ComposedChatViewModelWiresOnInterfaceTextToSpewBox, which the prior
FakeFactory-based test suite could never exercise.

SHOULD-FIX 3: retires register row AP-113. DoLifestone/DoMarketplace
print their own 0x1A refusal text (byte-recovered, UTF-16LE) instead
of falling through to the generic 0x26 fallback; ChatCommandRouter's
comment corrected to state the fallback's real scope.

SHOULD-FIX 4: corrected the divergence register's stale AP section
header sentence about AP-190's opacity default (refuted by cc582899).

NITs: (a) HeadlessStaticStateAudit routes through the injected
HeadlessDiagnosticWriter instead of Console.WriteLine; (b) a bounded
300-pump liveness diagnostic on the IsQuiescent conductor gate (no
retry, no behavior change); (c) fixed the #365 hydration test's doc
comment contradiction against diagnosis §8; (d) the 0x26 fallback
dispatches on WeenieErrorMessages' own Type instead of hardcoding
ClientLocal.

Full Release suite: 12,553 passed / 4 skipped / 0 failed (baseline
03404b71: 12,542/4/0; net +11 tests, zero regressions).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-10 16:22:36 +02:00
parent 03404b7121
commit f7a6f46ba0
15 changed files with 947 additions and 85 deletions

View file

@ -1558,14 +1558,32 @@ public sealed class HeadlessSessionHostTests
/// a DIFFERENT landblock, the same shape as one of the OTHER eight
/// landblocks in production's real 3x3 publication plan — proving Step
/// 3a's gate covers "an admission is open ANYWHERE in the plan", not
/// just the center. Must FAIL on the pre-Step-3a tree — verified by
/// temporarily reverting the three <c>IsQuiescent</c> gates in
/// <c>HeadlessSessionWorldProjection.ProjectSpawn</c>/
/// <c>ProjectPosition</c>/<c>PumpFirstEntry</c> and confirming this test
/// fails (the conductor reaches <c>PublicationCommitted</c> — a non-null
/// dormant controller — while the unrelated admission is still held
/// open, since driving is unconditional pre-fix).
/// just the center.
/// </summary>
/// <remarks>
/// Consolidated-review round (2026-08-10), NIT (c): what THIS bounded
/// xunit test proves is the GATE, not the #365 hydration stall's
/// closure — that broader claim's evidence is the separate live-ACE
/// end-to-end run recorded in
/// <c>docs/research/2026-08-10-365-headless-hydration-diagnosis.md</c>
/// §8 ("hydration now succeeds ... entityCount reaches 136"). This
/// test's own scope is narrower and fully mechanical: the conductor
/// stays undriven (<c>runtime.MovementOwner.Controller</c> stays null)
/// for as long as the unrelated admission is held open, and drives and
/// reaches <c>IsRuntimePublished</c> within a bounded tick budget once
/// it releases. Temporarily reverting the three <c>IsQuiescent</c>
/// gates in <c>HeadlessSessionWorldProjection.ProjectSpawn</c>/
/// <c>ProjectPosition</c>/<c>PumpFirstEntry</c> (never committed — see
/// §8's "Verification that the new test... actually discriminates")
/// makes this test fail the SAME way §8 itself observed: the
/// <c>Assert.Null(runtime.MovementOwner.Controller)</c> checks below
/// fail because the controller is ALREADY built AND published
/// (<c>CanExecuteLiveMovement = True</c>) while the unrelated admission
/// is still open — not merely "reached <c>PublicationCommitted</c>,
/// still dormant" as an earlier draft of this comment claimed; that
/// wording described a weaker intermediate state than what reverting
/// the gate actually produces.
/// </remarks>
[Fact]
public void RealAdmissionNeverDrivesTheConductorWhileOpenAndHydratesOnceReleased()
{