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 bycc582899). 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 (baseline03404b71: 12,542/4/0; net +11 tests, zero regressions). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
03404b7121
commit
f7a6f46ba0
15 changed files with 947 additions and 85 deletions
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using AcDream.Core.Physics;
|
||||
using AcDream.Headless.Configuration;
|
||||
using AcDream.Headless.Diagnostics;
|
||||
using AcDream.Headless.Hosting;
|
||||
|
||||
namespace AcDream.Headless.Tests;
|
||||
|
|
@ -8,9 +9,13 @@ namespace AcDream.Headless.Tests;
|
|||
/// #365 Step 1: the audit's refusal rationale is multi-root attribution
|
||||
/// ambiguity, which does not hold for a process that owns exactly one
|
||||
/// session. These tests mutate <see cref="PhysicsDiagnostics"/> process-
|
||||
/// global probe flags and swap <see cref="Console.Out"/>, so they run in
|
||||
/// their own non-parallel collection — see
|
||||
/// <see cref="HeadlessStaticStateAuditCollection"/>.
|
||||
/// global probe flags, so they run in their own non-parallel collection —
|
||||
/// see <see cref="HeadlessStaticStateAuditCollection"/>. Consolidated-
|
||||
/// review round (2026-08-10), NIT (a): the single-session log line now
|
||||
/// routes through the injected <see cref="HeadlessDiagnosticWriter"/>
|
||||
/// instead of <see cref="Console.Out"/>, so these tests capture its
|
||||
/// backing <see cref="TextWriter"/> directly rather than swapping the
|
||||
/// process-global console.
|
||||
/// </summary>
|
||||
[CollectionDefinition(
|
||||
HeadlessStaticStateAuditCollection.Name,
|
||||
|
|
@ -31,17 +36,11 @@ public sealed class HeadlessStaticStateAuditTests : IDisposable
|
|||
public void SingleSessionWithProbeEnabledIsAllowedAndLoggedLoudly()
|
||||
{
|
||||
PhysicsDiagnostics.ProbeParkEnabled = true;
|
||||
var originalOut = Console.Out;
|
||||
using var captured = new StringWriter();
|
||||
Console.SetOut(captured);
|
||||
try
|
||||
{
|
||||
HeadlessStaticStateAudit.ValidateProcessIsolation(sessionCount: 1);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Console.SetOut(originalOut);
|
||||
}
|
||||
var diagnostics = new HeadlessDiagnosticWriter(captured);
|
||||
|
||||
HeadlessStaticStateAudit.ValidateProcessIsolation(
|
||||
sessionCount: 1, diagnostics);
|
||||
|
||||
Assert.Contains(
|
||||
nameof(PhysicsDiagnostics.ProbeParkEnabled),
|
||||
|
|
@ -52,17 +51,11 @@ public sealed class HeadlessStaticStateAuditTests : IDisposable
|
|||
[Fact]
|
||||
public void SingleSessionWithNoProbesEnabledIsSilent()
|
||||
{
|
||||
var originalOut = Console.Out;
|
||||
using var captured = new StringWriter();
|
||||
Console.SetOut(captured);
|
||||
try
|
||||
{
|
||||
HeadlessStaticStateAudit.ValidateProcessIsolation(sessionCount: 1);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Console.SetOut(originalOut);
|
||||
}
|
||||
var diagnostics = new HeadlessDiagnosticWriter(captured);
|
||||
|
||||
HeadlessStaticStateAudit.ValidateProcessIsolation(
|
||||
sessionCount: 1, diagnostics);
|
||||
|
||||
Assert.Equal(string.Empty, captured.ToString());
|
||||
}
|
||||
|
|
@ -71,11 +64,12 @@ public sealed class HeadlessStaticStateAuditTests : IDisposable
|
|||
public void MultiSessionWithProbeEnabledStillThrowsNamingTheProbe()
|
||||
{
|
||||
PhysicsDiagnostics.ProbeParkEnabled = true;
|
||||
var diagnostics = new HeadlessDiagnosticWriter(TextWriter.Null);
|
||||
|
||||
HeadlessConfigurationException exception = Assert.Throws<
|
||||
HeadlessConfigurationException>(
|
||||
() => HeadlessStaticStateAudit.ValidateProcessIsolation(
|
||||
sessionCount: 2));
|
||||
sessionCount: 2, diagnostics));
|
||||
|
||||
Assert.Contains(
|
||||
nameof(PhysicsDiagnostics.ProbeParkEnabled),
|
||||
|
|
@ -86,9 +80,11 @@ public sealed class HeadlessStaticStateAuditTests : IDisposable
|
|||
[Fact]
|
||||
public void MultiSessionWithNoProbesEnabledIsAllowed()
|
||||
{
|
||||
var diagnostics = new HeadlessDiagnosticWriter(TextWriter.Null);
|
||||
|
||||
Exception? exception = Record.Exception(
|
||||
() => HeadlessStaticStateAudit.ValidateProcessIsolation(
|
||||
sessionCount: 3));
|
||||
sessionCount: 3, diagnostics));
|
||||
|
||||
Assert.Null(exception);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue