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:
Erik 2026-08-10 15:20:57 +02:00
parent ff2784eaa4
commit 09453ecae8
14 changed files with 702 additions and 106 deletions

View file

@ -73,10 +73,33 @@ Side-by-side vs retail if possible:
- `/help death` → the SAME "Note:" line first, then a SECOND line starting
"For more information, type @help <command>." immediately followed by
the 8-line corpse/death command listing — not just the 8 lines alone.
- `/help somenonsenseverb` → "Unknown command" (no "Note:" line before it;
retail's fallback skips the wrapper). This still shows in the CHAT
window rather than the SpewBox — a known, tracked gap (#367/AP-186), not
a new bug to report.
- `/help somenonsenseverb` → **goal-window fix (2026-08-10, #367 closed):**
"Unknown command" now flashes on the SpewBox (top of viewport), NOT the
chat window — the SAME surface as section 1's "jump in the air" refusal.
Chat gets no line at all.
## 6. Goal-window fix — SpewBox refusal typing (2026-08-10, #363/#367)
- `/g` (or `/f`/`/a`/`/m`/`/p`/`/v`/`/c` etc.) with NO message → **"You
must specify the text you wish to say!"** flashes on the SpewBox.
Previously this silently did nothing.
- `/r hi there` (or `/reply`) with no prior incoming Tell → **"Someone
must @tell you first!"** flashes on the SpewBox. Previously silent.
- A bad-args catalog command, e.g. `/ls now` or `/marketplace foo`**"That
is not a valid command."** flashes on the SpewBox. Previously showed a
green "Usage: /lifestone" line in CHAT — both the color/surface AND the
wording changed.
- `/hslist badtype`**"Please see @help hslist for more information on
how to use this command"** flashes on the SpewBox. Previously showed a
green "Usage: /hslist <house type>" line in CHAT.
- `/clist`/`/on`/`/off` with no channel name, and `@allegiance boot Bob`
from section 4 above — SAME text as before, but now flash on the
SpewBox instead of showing in chat.
- A bare `/` or `@x` (no letter verb) and `/help somenonsenseverb` (section
5) both now flash "Unknown command[: x]" on the SpewBox too.
- Sanity: `/endurance`, `@version`, `@loc` and other informational command
output must STILL show in chat (green/default), not the SpewBox — only
genuine refusals moved.
## Known-open, do not report as new
@ -84,9 +107,6 @@ Side-by-side vs retail if possible:
- SpewBox line lifetime is still a placeholder (AP-177) pending a retail
measurement session; position/font are now best-available
approximations (AP-178), not confirmed retail pixel values.
- `/help <verb>` fallback ("Unknown command") shows in the chat window,
not the SpewBox — retail types it for the SpewBox exclusively, but
`ChatCommandRouter` has no path there yet (#367/AP-186).
- Allegiance management subcommands print the help refusal instead of
executing (#360); `@day`/`@log`/`@render` deferred (#361); four request
commands send but responses aren't rendered yet (#362).
commands send but responses aren't rendered yet (#362, already closed).