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.
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.
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.
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).
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.
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.
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.
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.
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.
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.
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).
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.
| 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 |