⌂ Home ☷ Board

MC Chat-First v3 — Implemented-State User Test Plan

End-to-end real-tap test of the chat-first MC after Phases A–D + I (mobile overflow). Replaces v2 (which was the spec); this is what users should now see in the shipped implementation. Tessa or real human must tap, not script.

Reference: mc-chat-first-design.md, mc-chat-first-simplification.md, v2 test plan (kept for the original design intent).

Format: DO → EXPECT → SEE. Viewports tested: mobile 375×812 (iPhone), desktop 1280×720. Severity bar: Blocker / Major / Minor / Polish.


Segment 1 — Landing (chat-first home)

1.1 DO: open http://127.0.0.1:3001/ on a 375×812 iPhone viewport. EXPECT: chat shell loads directly — no H1 "Mission Control" title row, no kanban, no KPI dump. SEE: single-row compact status strip (greeting + time + "LUCI ONLINE" pill + open-tickets count + Threads chip + Settings ⚙). Composer row immediately below (textarea + paperclip + send icon). "Chat with Luci" mode chip. Then the conversation. Bottom nav: Overview / Board / Tasks / Apps / More. No horizontal scrollbar. Send button must render in-viewport at x≤375.

1.2 DO: scroll vertically in the conversation area. EXPECT: the chat-log scrolls internally — status bar + composer + bottom nav stay anchored. Touch scroll is smooth, no jank. SEE: messages move; UI chrome doesn't move.

1.3 DO: rotate the device / resize to 768px. EXPECT: thread sheet rail becomes a button (≡ Threads) — no rail on mobile. Bottom nav stays. Composer stays in view.

Segment 2 — Unified Threads (MC + Telegram)

2.1 DO: tap the ≡ Threads chip in the status bar. EXPECT: thread sheet slides up from the bottom (or right rail on desktop ≥1024px). List of threads with: title, last-message preview, relative time, MC-or-Telegram origin badge. SEE: no window.prompt dialogs anywhere (Phase F removed them). Last-item visible above the bottom nav (sheet padding accounts for it).

2.2 DO: double-tap a thread title to rename it inline. EXPECT: the title becomes contenteditable in place; Enter commits; Escape cancels. No prompt() dialog.

2.3 DO: swipe-left a thread row. EXPECT: archive action revealed under the row (mobile-native gesture, reuses style.css swipe pattern).

2.4 DO: tap "+ New thread" inside the sheet. EXPECT: fresh thread, focused composer.

2.5 KNOWN GAP — defer / file as MC-3819: Telegram-origin threads do not currently appear in this list because no Telegram→chat_threads bridge is wired. Originally a v2 segment expectation; v3 captures it as a deferred follow-up, not a Blocker for chat-first sign-off.

Segment 3 — Send + receive (real interaction, no DOM hacks)

3.1 DO: tap the textarea, type a plain question, tap the send icon. EXPECT: message renders as a blue accent bubble on the right (Phase C bubble unification). Textarea clears. An orchestrator "working" indicator appears (typically a clock chip / "1s" placeholder). SEE: within ~30s, an orchestrator reply lands as a cyan/surface bubble on the left.

3.2 DO: send a second message referencing the first. EXPECT: scroll snaps to the latest. Conversation continuity holds across turns in the same thread.

3.3 VERIFICATION RULE: A pass on 3.1–3.2 requires real tap/type via a coordinate click + key input — driving the form by el.click() or dispatchEvent('submit') does not count (per feedback_tessa_real_interaction).

Segment 4 — Action cards (orchestrator-owned WAT)

4.1 DO: state a multi-part intent ("fix the kitchen lights AND draft the briefing"). EXPECT: the reply renders rich mc-action / mc-proposal cards — Run-now / Make-a-ticket / Send-to-Larry / Answered. SEE: ≥44×44 tap targets on each action button. No raw fenced mc-action source leaks into the bubble (renderer must hide the fence and show the cards). Cards stay within the bubble width.

4.2 DO: tap "Create ticket" inside a proposal card. EXPECT: action fires inline; a confirmation message appears in the thread; no navigation.

Segment 5 — Workbench (chat-first, console fallback)

5.1 DO: open /runtime-workbench (or tap "open workbench" in a worker-in-progress card). EXPECT: the page header shows two toggles: [Chat] [Console] with Chat selected by default (Phase G). SEE: activity renders as chat bubbles using the same accent / surface colours as the dashboard. Tool calls collapse into glass-box rows. Session chips show in the workbench header (1–3 pill chips for active sessions).

5.2 DO: toggle to Console. EXPECT: falls back to the dense terminal-feel runtime feed (the detail-console view that already existed). SEE: mode persists in localStorage('wb-view-mode') — reload returns to last choice.

5.3 DO: on a mobile viewport, the wb-rail (260px sidebar) is hidden; activity occupies full width.

Segment 6 — Board / tickets (secondary)

6.1 DO: open /board from the bottom nav. EXPECT: kanban accessible but clearly secondary to chat. Filter tabs at top show inline counts (WS-E shipped this). SEE: per-column empty states are instructive, not a bare grey line. No FAB overlap on mobile.

6.2 DO: tap a ticket card. EXPECT: opens the ticket-detail view — runtime feed, comments, status controls. Cards remain ≥44×44 tap targets.

Segment 7 — Mobile touch (the original bug zone)

7.1 DO: on every page (home, threads sheet, board, workbench, tasks, reports), confirm: - send button + composer textarea are in-viewport (x≤375) - bottom nav tabs are tap-reachable (no clipping) - FAB / cloud icon doesn't overlap the send button - keyboard opens → composer stays sticky-visible (Phase E visualViewport listener fires; --vv-height shrinks the shell so the input remains above the keyboard)

7.2 DO: in the chat log, verify long URLs / code blocks wrap inside the bubble. EXPECT: no horizontal scroll appears on the chat-log itself or the page. This is the Phase I regression-prevention test.

7.3 Pinch / zoom: controlled — should not break the chat shell layout or push the composer off-screen.

Segment 8 — Settings sheet (Phase D gut)

8.1 DO: tap ⚙ Settings in the status bar. EXPECT: sheet opens to Appearance picker + Persistent Luci card only. SEE: no Plan-usage widget, no Larry provider section, no server-health bars, no Data Feeds, no Services grid, no recent-tickets list, no recent-activity feed, no stats grid. (All hidden via #mc-settings-sheet ... { display: none !important; } — markup intact for future /status + /settings lift.)

8.2 DO: tap "Close". EXPECT: returns to the chat home.

Segment 9 — Look & feel benchmark

9.1 DO: side-by-side mental compare with Claude Code mobile / Aion UI / Loveable / Replit AI Agent chat. EXPECT: MC's chat shell feels equivalent — accent blue user bubbles, surface-colour orchestrator bubbles, clean typography, 14px bubble font (Apple readability), sensible spacing, dark/light theme symmetric. SEE: the AI-agent vibe, not the "ops dashboard" vibe.

Segment 10 — Regression guards

10.1 DO: hard-reload /ticket/<id>. EXPECT: loads (no SW offline page; MC-3749 holds). 10.2 DO: confirm /board, /tasks, /reports, /runtime-workbench all still functional. 10.3 DO: confirm the persistent Luci session card still shows Start/Stop/Restart inside the Settings sheet (only ops control kept).


Verdict gate

APPROVED only on real user interaction at the listed viewports. Tap → observe → record. No DOM injection sign-off. Verdict written to tests/tessa-mc3841-chat-first-v3.md.

What this v3 changes vs v2

Concern v2 expectation v3 (implemented)
Composer mobile overflow not tested Phase I — must be in viewport
Chat-log scroll "smooth" internal scroll inside .session-chat-log
Settings sheet "minimal" Appearance + Persistent Luci ONLY
Thread rename / archive "swipe / inline" double-tap rename, no prompt() (Phase F)
Status bar "compact" single row on <768px, ops pills hidden
Workbench "chat-first" [Chat]/[Console] toggle, Chat default (Phase G)
User bubble fill "blue-accent" var(--accent) enforced (Phase C)
Telegram threads in list "unified" deferred — MC-3819