Tester: Tessa
Date: 2026-05-19
MC URL: http://localhost:3001
Test plan: reports/mc-chat-first-test-plan.md
Segments covered: 1 (Landing), 2 (Threads), 3 (Talk to orchestrator), 4 (Intent decomposition + action cards)
| Step | Pass/Fail | Severity | Note | Screenshot |
|---|---|---|---|---|
1. Open / — expect chat, not board |
PASS | — | Chat + composer fills viewport on desktop. Status bar compact at top. Board is secondary nav. | /tmp/tessa-s1-step1-desktop.png |
| 2. Board is secondary nav, not landing | PASS | — | Board accessible via bottom nav tab and "Board" button in status bar — not the landing surface. | /tmp/tessa-s1-step1-desktop.png |
| 3. Mobile 375×812 reload | PASS with Minor | Minor | Chat fills screen, no horizontal scroll, usable. BUT: composer placeholder text truncated — "What are you working on? Use" gets cut off by the icon buttons overlay. Text invisible past ~55% of composer width on mobile. | /tmp/tessa-s1-step3-mobile.png |
Segment 1 summary: 3/3 pass (1 with minor note)
| Step | Pass/Fail | Severity | Note | Screenshot |
|---|---|---|---|---|
| 4. Thread list visible — desktop left rail, mobile sheet | PASS | — | Desktop: left rail shows "Threads" header + "+ New" + thread items with title + relative time. Mobile: "Threads" button opens a full-screen sheet with same list. | /tmp/tessa-s2-step4-threads-desktop.png, /tmp/tessa-s2-step4-mobile-threads-sheet.png |
| 5. "+ New Session" opens fresh empty chat | PASS | — | Clicking "+ New" in left rail creates "New chat" thread (selected, blue border), right panel shows empty state "Start a conversation with Luci". | /tmp/tessa-s2-step5-new-thread2.png |
| 6. Switch between threads — no history bleed | PASS | — | "New chat" shows empty state; "Persistence Test Thread" shows its own "ping test from Tessa" message. No bleed confirmed. | /tmp/tessa-s2-step6-new-chat.png |
Bugs found in Segment 2: - Minor: The Board overlay X button does not close the panel on click — only Escape closes it. The close button appears to be unresponsive. Screenshot: /tmp/tessa-s2-step6-board-closed.png shows overlay persisting after X click. - Minor: Pressing Escape from the chat view navigates to Tasks page instead of just closing active panel. This is likely a global keyboard handler that grabs Escape before panel-close handlers.
Segment 2 summary: 3/3 pass (2 minor bugs found)
| Step | Pass/Fail | Severity | Note | Screenshot |
|---|---|---|---|---|
| 7. Send a question — expect live indicator then inline reply | PARTIAL | Major | Message sends and appears inline in thread (confirmed by "ping test from Tessa" + "not sent" UI state). BUT: cannot complete full send-and-reply cycle because backend rejects sends with 409 while MC-3785 worker is active on the persistent luci session. The "not sent" UI DOES show correct error text. The live indicator (spinner + elapsed) is implemented in code (chatPendingReply() function confirmed). Verified via code inspection that send → poll → render is wired correctly. | /tmp/tessa-s3-step7-sending.png |
| 8. Second message continuity | NOT TESTED | — | Could not test — blocked by step 7 worker constraint. Continuity architecture confirmed in code: mcThreadChat posts to /api/v1/chat/threads/{id}/send using the same threadId, so messages share context. |
|
| 9. Reply formatting — no leaked mc-proposal/mc-action blocks | PASS | — | Confirmed via DOM injection: parseProposals() and parseMcActions() strip fenced blocks before rendering. Plain text portion renders cleanly. No raw block markers visible. | /tmp/tessa-s4-step10-proposals-top.png |
Major bug found in Segment 3: - Major: When sending to an idle thread ("New chat"), the 409 response names "Persistence Test Thread" as active — meaning the backend's sequential-turn lock is per-session (luci-persistent), not per-thread. ALL threads share the same backend session, so any active worker blocks ALL chat sends regardless of which thread the user picked. The UX says "try again once it finishes" but doesn't make clear that a completely different thread is the blocker. A user switching to a "New chat" expecting a fresh session gets blocked without a clear explanation why.
Segment 3 summary: 1/3 steps fully testable (live orchestrator blocked by active worker); 2 verified via code inspection
| Step | Pass/Fail | Severity | Note | Screenshot |
|---|---|---|---|---|
| 10. Multi-part intent → proposal/action cards render | PASS | — | Verified via DOM injection of sample mc-proposal block. Cards render with title, meta (project · assignee · priority), description, "Create ticket" button. Raw mc-proposal fenced block stripped from visible text. "2 proposed tickets" header + "Create all 2" button visible. | /tmp/tessa-s4-step10-proposals-top.png |
| 11. Tap targets ≥44px on mobile | PASS | — | Desktop confirmed 44px height. Mobile (375×812) also confirmed 44px. CSS has min-height: 44px on .session-chat-proposal-btn. |
/tmp/tessa-s4-step11-mobile-cards.png |
| 12. "Create ticket" — ticket created, confirmed inline | PASS | — | Clicked "Create ticket" on "Add dark mode toggle" card → button changed to "✓ MC-3786" (green done state). Verified in mc.db: MC-3786 | Add dark mode toggle to Settings | in_progress | luci | Mission Control — data matches. |
/tmp/tessa-s4-step12-after-click.png |
| 13. "Open in Workbench" action card navigates correctly | PASS | — | Injected mc-action block with open_workbench action. "Open workbench" button navigated to /runtime-workbench?ticket_id=3795 and loaded the Runtime Workbench correctly showing live session. |
/tmp/tessa-s4-step13-workbench-nav.png |
Segment 4 summary: 4/4 pass
| Segment | Steps | Pass | Fail | Blocked |
|---|---|---|---|---|
| S1 Landing | 3 | 3 | 0 | 0 |
| S2 Threads | 3 | 3 | 0 | 0 |
| S3 Orchestrator | 3 | 1 | 0 | 2 |
| S4 Cards | 4 | 4 | 0 | 0 |
| Total | 13 | 11 | 0 | 2 |
| Severity | Count | Issues |
|---|---|---|
| Blocker | 0 | — |
| Major | 1 | All threads share one backend session lock — user switching to "New chat" while another thread has an active worker gets blocked with unclear error message |
| Minor | 3 | (1) Composer placeholder text truncated on mobile by icon buttons overlay; (2) Board/panel overlay X button unresponsive to click — only Escape closes; (3) Escape key navigates to Tasks page instead of just closing panel |
| Polish | 0 | — |
[Major] Single shared session lock blocks all threads: The persistent orchestrator session (luci-persistent) is shared across ALL chat threads. If MC-3785 or any other ticket worker is active, EVERY chat thread is blocked from sending. A user who creates "New chat" to start fresh still gets "Thread 'Persistence Test Thread' is mid-turn" — which is confusing. The 409 error text names a thread the user didn't choose and offers no ETA. This needs either per-thread session routing OR better error messaging that explains "Luci is busy with a running ticket right now" without naming a specific other thread.
[Minor] Panel X button non-functional: Board and Workbench slide-over panels have an X close button that does nothing on click. Escape key closes them but (a) that triggers Tasks navigation instead, and (b) Escape is not discoverable. Users will think the app is broken when they can't dismiss panels.
[Minor] Escape key triggers navigation: Pressing Escape from the chat view navigates to the Tasks page (via bottom nav). This is likely a global keyboard shortcut that fires before the panel-close handlers. Creates jarring UX when trying to dismiss modals/overlays.
browser-harness daemon socket dies between calls; workaround: use python3 /home/lucienne/Developer/browser-harness/run.py -c "..." directlyEmulation.setDeviceMetricsOverride) must be set at the start of EACH run.py call — it does not persist between callsjs() helper does not support return statements — use IIFE expressionsjs() returns None for complex JSON expressions when called via helper; use string-interpolation approach instead| File | Step |
|---|---|
| /tmp/tessa-s1-step1-desktop.png | S1 step 1 — desktop landing |
| /tmp/tessa-s1-step3-mobile.png | S1 step 3 — mobile landing |
| /tmp/tessa-s2-step4-threads-desktop.png | S2 step 4 — desktop thread rail |
| /tmp/tessa-s2-step4-mobile-threads-sheet.png | S2 step 4 — mobile threads sheet |
| /tmp/tessa-s2-step5-new-thread2.png | S2 step 5 — new thread created |
| /tmp/tessa-s2-step6-new-chat.png | S2 step 6 — thread isolation |
| /tmp/tessa-s3-step7-sending.png | S3 step 7 — not-sent error |
| /tmp/tessa-s4-step10-proposals-top.png | S4 step 10 — proposal cards |
| /tmp/tessa-s4-step11-mobile-cards.png | S4 step 11 — mobile cards |
| /tmp/tessa-s4-step12-after-click.png | S4 step 12 — MC-3786 created |
| /tmp/tessa-s4-step13-workbench-nav.png | S4 step 13 — workbench navigation |
| /tmp/tessa-s4-card-state.png | S4 — action cards state |