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
|
|
@ -288,6 +288,7 @@ implementer per slice against a pinned contract (per
|
|||
| User gate round 3 | `98de4f5a` | Debug (all projects): 12,329 passed / 4 skipped / 1 failed (pre-existing #351 Debug-only flake — reproduces identically on the pristine pre-round-3 commit, not a regression); Release (every project reachable while a live `AcDream.App.exe` client — PID 15064, must not be killed per project policy — holds its own Release binaries locked, blocking `AcDream.App`/`AcDream.App.Tests`/`AcDream.Core.Tests` specifically): `AcDream.UI.Abstractions.Tests` (the layer this round's `/help` fix lives in) 867/867, plus `Core.Net.Tests` 823/823, `Runtime.Tests` 1,323/1,323, `Content.Tests` 130/130, `Headless.Tests` 89/89, `Bake.Tests` 15/15, `Cli.Tests` 4/4 — all 0 failed | — | findings (a)-(c) fixed this commit — SpewBox flush-top + retail dat font, `/help`/`/help death` exact retail print sequence (see "User gate — round 3" below) |
|
||||
| CH6b floating windows 1–4 | `22020ef2`, reworked `1aa77099` | 12,420 passed / 4 skipped / 0 failed | REJECT (docs/research/2026-08-10-ch6ab-review-findings.md) → reworked `1aa77099` — SHOULD-FIXES 2/3/4/5 + NITs 1-5 applied | pending — no client launches this session (hard constraint); needs the next connected round for keybind/mirror/filter visual confirmation, plus the new 0x2100005B fixture's resolved-type assumptions |
|
||||
| CH6c opacity | `a819687c` | 12,459 passed / 4 skipped / 0 failed | APPROVE-WITH-FIXES; fixed this commit — BLOCKER (out-of-box `DefaultOpacity` 0.5→1.0), AP-190 reworded + two new decomp-verified clauses (retail's per-tick ease, retail's entry-field-specific focus predicate), NITs (`UiElement.cs` stale comment, `WindowUnregistered` detach, post-Dispose `Set*` guards, `DrawString`/outline-pass alpha tests) | pending — needs the next connected round for visual confirmation (window fade on focus change, Settings slider live-apply) |
|
||||
| Goal-window #363/#367 interface-text seam | `e822888a` | 12,542 passed / 4 skipped / 0 failed | implementer-only, no subagent review this session (hard constraint) | pending — needs the next connected round to confirm the SpewBox now flashes for the reclassified refusals (see "Goal-window follow-up" below) |
|
||||
|
||||
### CH4 closeout (2026-08-09)
|
||||
|
||||
|
|
@ -855,3 +856,87 @@ entirely against the FIX list, not the research.
|
|||
Full Release suite: 12,420 passed / 4 skipped / 0 failed (baseline
|
||||
12,392/4/0 at `22020ef2`; net +28 tests, all new coverage from this
|
||||
rework, zero regressions).
|
||||
|
||||
## Goal-window follow-up — #363/#367 interface-text seam (2026-08-10)
|
||||
|
||||
Closed issues #363 and #367 (register rows AP-183 and AP-186, both
|
||||
RETIRED) under the goal-window's hard constraints: no subagents, no
|
||||
client launches, one commit.
|
||||
|
||||
`ChatVM` (`AcDream.UI.Abstractions`) gained an `OnInterfaceText`
|
||||
(`Action<string>?`) init property and a `ShowInterfaceText(text)` method —
|
||||
the seam #367's own filing proposed as fix shape (a). The App-layer
|
||||
composition (`InteractionRetainedUiComposition.CreateRetainedUi`) wires it
|
||||
to `RuntimeCommunicationState.AddText(text, RetailLogTextType.ClientLocal)`,
|
||||
the same SpewBox chokepoint every other interface-text producer (item
|
||||
examine, magic feedback, the portal wait cue) already uses. Unwired hosts
|
||||
(headless has no `ChatVM` at all; plain test fixtures) fall back to the
|
||||
ordinary chat log tagged `ClientLocal`, so no text is ever silently
|
||||
dropped — only the SURFACE degrades, never the message.
|
||||
|
||||
Every site AP-183 named now routes through the seam at its correct retail
|
||||
type, cross-checked against the named-retail decomp (5 handlers spot-
|
||||
verified: `DoDie`, `DoChannelList`/`On`/`Off`, `DoAllegiance`,
|
||||
`DoHouseAvailableList` — all `0x1A`):
|
||||
|
||||
- `DoStupidChannelHack` ("You must specify the text you wish to say!") —
|
||||
**newly wired**, not merely reclassified: the six legacy channel verbs
|
||||
(Fellowship/Allegiance/AllegianceBroadcast/Vassals/Patron/CoVassals)
|
||||
previously fell through `ChatInputParser.Parse`'s pure `return null`
|
||||
shape with NO message shown at all. New `ChatInputParser
|
||||
.IsBareRegisteredChannelVerb` predicate (pure, no side effects) plus a
|
||||
`ChatCommandRouter.Submit` check ahead of `Parse`.
|
||||
- `DoChannelList`/`DoChannelOn`/`DoChannelOff` ("Please specify the
|
||||
channel name.") — reclassified (was already wired via
|
||||
`InvalidArgumentsText`, just typed `0x00`).
|
||||
- `DoAllegiance` ("Please see @help Allegiance...") — reclassified, same
|
||||
shape.
|
||||
- `DoHouseAvailableList` — reclassified AND corrected: retail's own
|
||||
bad-house-type text is "Please see @help hslist for more information on
|
||||
how to use this command" (`acclient_2013_pseudo_c.txt:381481`/`1029383`,
|
||||
`AddTextToScroll(..., 0x1a, ...)`), not the acdream-synthesized "Usage:
|
||||
/hslist <house type>" line the catalog fell back to.
|
||||
- `DoReply` ("Someone must @tell you first!") — **newly wired** for the
|
||||
message-but-no-last-teller branch only (`gmCCommunicationSystem
|
||||
::GetLastTeller() == 0`). New `ChatInputParser.IsReplyMissingLastTeller`
|
||||
predicate. Bare `/r` with no message at all is retail's OWN separate
|
||||
copy of the "you must specify text" string (a different call site) and
|
||||
is deliberately still unported — not named by AP-183, out of scope.
|
||||
- `DoSpeaker`/`DoEndurance`/`DoTitle` — untouched, confirmed still 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 resolves `WeenieErrorMessages.Resolve(0x026u, null)`
|
||||
("That is not a valid command.", the exact port of `DoCommand
|
||||
@0x0057E46D`'s `HandleFailureEvent(0x26)`) instead of synthesizing
|
||||
`"Usage: {Usage}"` — the row already carried the `0x026` template from
|
||||
CH2's `HandleFailureEvent` port, so no new retail text needed extracting.
|
||||
|
||||
This closes #367 too: `ChatCommandRouter`'s two other local-presentation
|
||||
fallbacks (`RetailCommandHelpTable.UnknownCommand` in `EmitVerbHelp`, and
|
||||
the degenerate-prefix "Unknown command: {verb}." refusal in `Submit`'s
|
||||
main body) now call `ShowInterfaceText` instead of `ShowSystemMessage`.
|
||||
The test-script doc (`docs/research/2026-08-09-campaign-ch-test-script.md`)
|
||||
is updated to drop the "known, tracked gap" notes for both — the next
|
||||
connected round should observe both fallbacks flash on the SpewBox instead
|
||||
of landing in the chat window.
|
||||
|
||||
Tests: per-site routing pinned both ways (seam wired → reaches the
|
||||
SpewBox capture; seam unwired → falls back to chat, tagged `ClientLocal`)
|
||||
for every reclassified/newly-wired site in
|
||||
`tests/AcDream.UI.Abstractions.Tests/Panels/Chat/ChatCommandRouterTests.cs`,
|
||||
plus a Turbine-only-channel negative case and a 0x00-site-stays-in-chat
|
||||
sanity check; pure-predicate coverage for `IsBareRegisteredChannelVerb`/
|
||||
`IsReplyMissingLastTeller` in `ChatInputParserTests.cs`; the seam itself
|
||||
in `ChatVMRetellAndProvidersTests.cs`.
|
||||
|
||||
Full Release suite: 12,542 passed / 4 skipped / 0 failed (baseline 12,466/4/0
|
||||
at `ff2784ea`; net +76 tests, all new coverage from this follow-up, zero
|
||||
regressions). No subagent review this session (hard constraint); no
|
||||
connected user gate (hard constraint — no client launches). The next
|
||||
connected round should confirm: bare `/g`/`/a`/etc. now flash the SpewBox
|
||||
red instead of doing nothing; `/hslist badtype` and a bad-args catalog
|
||||
command (e.g. `/ls now`) now flash red SpewBox text instead of showing a
|
||||
green "Usage:" line in chat; `/help nonsenseverb` and a bare `/`/`@` now
|
||||
flash on the SpewBox instead of appearing in the chat scroll.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue