fix(chat): #363 — retail 0x1A typing for command refusals via the interface-text seam
ChatVM gains an OnInterfaceText hook + ShowInterfaceText(text), the
App-layer composition wires it to RuntimeCommunicationState.AddText,
and ChatCommandRouter routes every retail-0x1A command refusal through
it instead of the chat log's 0x00 sink. UI.Abstractions still never
references Runtime directly; unwired hosts (headless, tests) fall back
to the chat log tagged ClientLocal so no text is ever silently lost.
Reclassified per register row AP-183 (DoChannelList/On/Off, DoAllegiance,
DoHouseAvailableList — the last also corrected to retail's own bad-house-
type string instead of a synthesized "Usage:" line) and newly wired two
sites that previously showed nothing at all (DoStupidChannelHack's bare
legacy-channel-verb refusal, DoReply's message-but-no-last-teller
refusal). The generic bad-args fallback now resolves WeenieErrorMessages
0x026 ("That is not a valid command.", retail's HandleFailureEvent(0x26))
instead of synthesizing "Usage: {Usage}". DoSpeaker/DoEndurance/DoTitle
are untouched — already correct at 0x00.
Also closes #367 (DoHelp's "Unknown command" fallback and the degenerate-
prefix refusal now reach the SpewBox too) and retires register row
AP-186, whose own filing proposed exactly this seam shape.
Full Release suite: 12,542 passed / 4 skipped / 0 failed (baseline
12,466/4/0 at ff2784ea).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
ff2784eaa4
commit
09453ecae8
14 changed files with 702 additions and 106 deletions
116
docs/ISSUES.md
116
docs/ISSUES.md
|
|
@ -96,30 +96,53 @@ slice CH4).
|
|||
|
||||
## #363 — Chat refusal/usage call sites are typed ClientLocal 0x00 where retail types several 0x1A
|
||||
|
||||
**Status:** OPEN — filed 2026-08-09, CH4 REJECT-review, SHOULD-FIX 9.
|
||||
`ChatVM.ShowSystemMessage`'s single-typed sink (`LogTextType 0x00`,
|
||||
informational) is correct for most of `ClientCommandController`'s output,
|
||||
but Campaign CH slice CH4 added roughly 10 new refusal/usage call sites
|
||||
that retail types `0x1A` (bright red / ClientLocal), not `0x00`:
|
||||
`DoStupidChannelHack` (the "You must specify the text you wish to say!"
|
||||
family, registered channel verbs only), `DoChannelList`/`DoChannelOn`/
|
||||
`DoChannelOff` ("Please specify the channel name."), `DoAllegiance` (the
|
||||
"Please see @help Allegiance..." refusal this session's Blocker 1 fix
|
||||
added), `DoHouseAvailableList`, and `DoReply` ("Someone must @tell you
|
||||
first!"). Three CH4 sites are ALREADY correct because retail itself types
|
||||
them informational `0x00`: `DoSpeaker`, `DoEndurance`, `DoTitle`.
|
||||
Separately, retail's own bad-args fallback
|
||||
(`ClientCommunicationSystem::DoCommand @0x0057E46D`) answers a registered
|
||||
handler that returns 0 with `HandleFailureEvent(0x26)`, not a local
|
||||
"Usage: <usage>" line — `ChatCommandRouter.Submit` shows a synthesized
|
||||
`"Usage: {clientCommand.Usage}"` string instead whenever a catalog
|
||||
command's `InvalidArgumentsText` is null. Register row: AP-183.
|
||||
Deliberately NOT fixed this session — re-plumbing every call site to a
|
||||
typed sink (and porting `HandleFailureEvent(0x26)`'s real text) is larger
|
||||
than a REJECT-review fix batch; CH5-or-later.
|
||||
**Status:** CLOSED 2026-08-10. `ChatVM` gained a typed interface-text seam
|
||||
(`OnInterfaceText` init hook + `ShowInterfaceText(text)`) that the App-layer
|
||||
composition (`InteractionRetainedUiComposition.CreateRetainedUi`) wires to
|
||||
`RuntimeCommunicationState.AddText(text, RetailLogTextType.ClientLocal)` —
|
||||
the same SpewBox chokepoint every other interface-text producer uses.
|
||||
UI.Abstractions still never references Runtime directly (Code Structure
|
||||
Rules); the hook is the seam. Unwired callers (headless, the automation
|
||||
probe runner, plain test fixtures) fall back to the ordinary chat log
|
||||
tagged `ClientLocal`, so no text is ever silently dropped.
|
||||
|
||||
Every site AP-183 named now routes through the seam: `DoStupidChannelHack`
|
||||
("You must specify the text you wish to say!", newly wired — the six
|
||||
legacy channel verbs previously fell through `ChatInputParser.Parse`'s pure
|
||||
`return null` shape with NO message at all), `DoChannelList`/`DoChannelOn`/
|
||||
`DoChannelOff` ("Please specify the channel name.", reclassified),
|
||||
`DoAllegiance` ("Please see @help Allegiance...", reclassified),
|
||||
`DoHouseAvailableList` (reclassified AND corrected to retail's own
|
||||
"Please see @help hslist for more information on how to use this command"
|
||||
string — verified at `acclient_2013_pseudo_c.txt:381481`/`1029383`,
|
||||
replacing the acdream-synthesized "Usage: /hslist <house type>" fallback),
|
||||
and `DoReply` ("Someone must @tell you first!", newly wired for the
|
||||
"message but no last teller" branch — bare `/r` with no message at all is
|
||||
a separate retail branch, deliberately out of scope, not named by AP-183).
|
||||
`DoSpeaker`/`DoEndurance`/`DoTitle` are untouched — already correct at
|
||||
`0x00` (their text is produced by `ClientCommandController`, not
|
||||
`ChatCommandRouter`).
|
||||
|
||||
The generic bad-args fallback is also fixed: `ChatCommandRouter.Submit`'s
|
||||
catalog dispatch now falls to `WeenieErrorMessages.Resolve(0x026u, null)`
|
||||
("That is not a valid command.", the exact port of retail's
|
||||
`HandleFailureEvent(0x26)`) instead of synthesizing `"Usage: {Usage}"` —
|
||||
verified 5 decompiled handlers (`DoDie`, `DoChannelList`/`On`/`Off`,
|
||||
`DoAllegiance`, `DoHouseAvailableList`) are ALL `0x1A`, confirming the
|
||||
uniform routing decision. This also closes #367 (the "Unknown command"
|
||||
DoHelp fallback and the degenerate-prefix "Unknown command: {verb}."
|
||||
refusal both now use the same seam) and retires register row AP-186 —
|
||||
see that row's retirement note.
|
||||
|
||||
Tests: `tests/AcDream.UI.Abstractions.Tests/Panels/Chat/ChatVMRetellAndProvidersTests.cs`
|
||||
(seam wired / null-fallback), `ChatInputParserTests.cs`
|
||||
(`IsBareRegisteredChannelVerb`/`IsReplyMissingLastTeller` pure-predicate
|
||||
coverage), `ChatCommandRouterTests.cs` (per-site routing pinned both ways
|
||||
for every reclassified/newly-wired site, plus a Turbine-only-channel
|
||||
negative case and a 0x00-site-stays-in-chat sanity check).
|
||||
|
||||
**Campaign:** `docs/plans/2026-08-09-chat-parity-campaign.md` (Campaign CH,
|
||||
CH4 REJECT-review).
|
||||
CH4 REJECT-review; closed in the goal-window follow-up).
|
||||
|
||||
## #365 — Headless host cannot move at head: session quarantines on the first advance tick; world never hydrates
|
||||
|
||||
|
|
@ -343,46 +366,19 @@ click — not decoded by CH6a.
|
|||
|
||||
## #367 — ChatCommandRouter's local-presentation fallbacks type-0x1A text still lands in the chat scroll, never the SpewBox
|
||||
|
||||
**Status:** OPEN — filed 2026-08-10, Campaign CH user-gate round 3, while
|
||||
tracing `ClientCommunicationSystem::DoHelp @0x0057f9e0`'s complete print
|
||||
sequence for findings (b)/(c). Retail's DoHelp fallback for an unresolved
|
||||
`/help <verb>` is `AddTextToScroll(u"Unknown command", 0x1A, 1, 0)` — type
|
||||
`0x1A` (`ClientLocal`) is HARDCODED to the SpewBox, never the chat window
|
||||
(`docs/research/2026-08-09-chat-retail-interface-text.md` §2.1/§2.2, the
|
||||
same routing rule Campaign CH user-gate round 2 item 2 already ported for
|
||||
the portal-space notice). `RuntimeCommunicationState.AddText` (Runtime
|
||||
layer) implements this rule correctly — `type == ClientLocal` routes to
|
||||
`SpewBox` only. But `ChatCommandRouter`/`ChatVM` live in
|
||||
`AcDream.UI.Abstractions`, a layer beneath Runtime that must stay
|
||||
presentation/Runtime-independent (Code Structure Rules), so they have no
|
||||
path to the SpewBox at all — every local-presentation fallback
|
||||
(`RetailCommandHelpTable.UnknownCommand` now; also the pre-existing
|
||||
"Unknown command: {verb}." command-shaped-input refusal in
|
||||
`ChatCommandRouter.Submit`'s main body) still writes through
|
||||
`ChatVM.ShowSystemMessage`, which only ever reaches `ChatLog`. Not a
|
||||
regression this round — the fallback text was already wrong AND
|
||||
already routed to the chat window before this round's fix; this round
|
||||
corrected the TEXT ("Unknown command", byte-exact) and traced the
|
||||
routing divergence clearly enough to file it. Register row AP-186.
|
||||
|
||||
**Fix shape:** either (a) give `ChatVM` (or a sibling in UI.Abstractions)
|
||||
an optional `Action<string>? OnClientLocalText` hook the App-layer host
|
||||
wires to `RuntimeCommunicationState.AddText(text, RetailLogTextType.ClientLocal)`
|
||||
the same way `ChatWindowController`/other retained-UI controllers already
|
||||
receive delegates from the composition layer, or (b) accept the
|
||||
divergence permanently as an acdream simplification (all local-presentation
|
||||
refusals show in the chat window instead of splitting across two surfaces)
|
||||
and retire AP-186 as an accepted Intentional Architecture row instead. Needs
|
||||
a product decision, not just an implementation — small either way once
|
||||
decided.
|
||||
|
||||
**Where:** `src/AcDream.UI.Abstractions/Panels/Chat/ChatCommandRouter.cs`;
|
||||
`src/AcDream.UI.Abstractions/Panels/Chat/ChatVM.cs`;
|
||||
`src/AcDream.Runtime/Gameplay/RuntimeCommunicationState.cs` (`AddText`, the
|
||||
correctly-implemented Runtime-layer oracle this should eventually reach).
|
||||
**Status:** CLOSED 2026-08-10, closed as a side effect of #363's
|
||||
interface-text seam (fix shape (a) from this issue's own filing).
|
||||
`ChatVM.OnInterfaceText` is exactly the hook this issue asked for; both
|
||||
named fallbacks (`RetailCommandHelpTable.UnknownCommand` in
|
||||
`ChatCommandRouter.EmitVerbHelp`, and the degenerate-prefix "Unknown
|
||||
command: {verb}." refusal in `ChatCommandRouter.Submit`'s main body) now
|
||||
call `vm.ShowInterfaceText(...)` instead of `vm.ShowSystemMessage(...)`,
|
||||
reaching the SpewBox through `RuntimeCommunicationState.AddText` via the
|
||||
App-layer composition wiring. See #363's closure note for the full
|
||||
mechanism and test list. Register row AP-186 retired in the same commit.
|
||||
|
||||
**Campaign:** `docs/plans/2026-08-09-chat-parity-campaign.md` (Campaign CH,
|
||||
user gate round 3).
|
||||
user gate round 3; closed in the goal-window follow-up).
|
||||
|
||||
## #364 — Three `/help` group topics still partial: HelpStupidChannelHack unresolved
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue