docs: Campaign CH plan skeleton — chat & interface-text retail parity

First track of the alpha-release program. Four deliverables: exact
BuildChatColorLookupTable colors, working side channels vs ACE, retail's
on-screen interface text, complete / and @ command registry. Model split
per user direction: Opus research, Fable planning, Sonnet implementation,
dual-lens Opus review per slice. Slices finalize when the four research
lanes land.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-09 14:38:43 +02:00
parent dad38320fb
commit 8df35d1e18

View file

@ -0,0 +1,106 @@
# Campaign CH — chat & interface-text retail parity
**Status:** ACTIVE 2026-08-09 — research lanes running; slices finalize when
they land.
**Why now:** first track of the alpha-release program (chat is the most
visible daily surface for the friend-alpha). User-directed 2026-08-09.
## Scope
Four deliverables, one campaign:
1. **Exact chat colors.** The 2026-06-16 cdb session pinned the retail
`RGBAColor` constants (0x81c4a8+), but only 4 of ~13 kinds were mapped
with confidence; the type→color lookup table
(`ChatInterface::BuildChatColorLookupTable @ 0x4f31c0`) was never
decompiled. This campaign pins the COMPLETE table and conforms
`ChatWindowController.RetailChatColor` to it.
2. **Working side channels vs local ACE.** Turbine rooms (General / Trade /
LFG / Roleplay / Society) and the legacy family (/f /a /m /p /v /cv),
inbound and outbound. The 26-day-old "ACE doesn't run a TurbineChat
server" claim is under verification — the research lane reads current
ACE source rather than trusting it.
3. **Retail's on-screen interface text.** The transient yellow
top-of-viewport messages (jump-while-airborne being the canonical
example) that retail does NOT put in the chat window. Routing table
(on-screen vs chat vs both), presentation (color/duration/fade as far
as acclient-side data allows — the draw itself lives in keystone.dll),
and the client-raised local errors.
4. **Complete `/` and `@` command registry.** Every command the retail
client parses, audited against `RetailClientCommandCatalog` (the
2026-07-13 family port is the baseline, not a restart). Missing
commands implemented; non-retail verbs remain ACE server-passthrough
per the command ownership rule (2026-07-13).
**Out of scope:** retail's secondary/floating chat windows and per-window
filter masks (post-alpha polish unless a slice lands it for free); chat
color user-configurability (we ship retail defaults); TurbineChat server
emulation (ACE-side).
## Method
Per CLAUDE.md: grep `docs/research/named-retail/` first; cdb only where
static decomp is insufficient; cross-check ACE + holtburger; conformance
tests pin every table (colors, routing, command catalog); divergence
register rows land in the same commits; build + full Release suite green
per commit.
**Model split (user-directed 2026-08-09):** research on Opus; planning by
the main loop (Fable); implementation slices on Sonnet; every slice gets a
dual-lens Opus review — retail faithfulness AND architecture — before its
gate.
## Research lanes (all Opus, parallel, read-only)
| Lane | Output doc | Question |
|---|---|---|
| R1 command registry | `docs/research/2026-08-09-chat-retail-command-registry.md` | Complete retail verb/alias/handler table + acdream audit |
| R2 interface text | `docs/research/2026-08-09-chat-retail-interface-text.md` | What draws the yellow text, the routing table, client-raised errors |
| R3 color table | `docs/research/2026-08-09-chat-retail-color-table.md` | Full BuildChatColorLookupTable decompile + wire→type→color trace |
| R4 side channels | `docs/research/2026-08-09-chat-side-channels-vs-ace.md` | Per-family defect diagnosis vs current ACE source |
## Slices (provisional — finalized when research lands)
Ordering rationale: colors first (small, immediately visible, zero wire
risk), then interface text (new presentation subsystem), then side
channels (wire work, needs the connected gate), then command breadth,
then closeout. Slices touching shared chat files run serially — one
implementer per slice against a pinned contract (per
`feedback_dont_parallelize_coupled_plan_slices`).
- **CH1 — exact color table.** Conformance test pins every enum entry to
its retail RGBA; `RetailChatColor` corrected; register rows for any kind
we cannot yet receive on the wire.
- **CH2 — on-screen interface text.** New presentation owner (App layer,
retained-UI or TextRenderer HUD path per research recommendation);
routing per retail's table; client-raised local errors ported at their
retail raise sites; keystone-owned presentation unknowns get register
rows.
- **CH3 — side channels.** Fix list from R4; connected two-way gate
against local ACE (send + receive per family); self-echo semantics per
`ChatChannelInfo.IsSelfEchoChannel`.
- **CH4 — command registry completion.** Catalog conformance test pins
acdream's table against the retail registry enumeration; missing
commands implemented family-by-family.
- **CH5 — closeout.** Register sweep, ledger flip, ISSUES updates,
in-client test script for the user gate.
## Gates
- Per slice: `dotnet build` green, full Release suite green, conformance
tests, register rows same-commit, Opus dual review resolved.
- Campaign: user in-client gate — colors side-by-side vs the retail
client, each side channel spoken + heard, on-screen text provoked live
(jump in air), command spot-checks. Test script delivered at CH5.
## Ledger
| Slice | Commit | Suite | Review | User gate |
|---|---|---|---|---|
| R1R4 research | — | — | — | — |
| CH1 colors | — | — | — | — |
| CH2 interface text | — | — | — | — |
| CH3 side channels | — | — | — | — |
| CH4 commands | — | — | — | — |
| CH5 closeout | — | — | — | — |