Files
mission-control/FOLLOWUP.md
teernisse f5ce8a9091 feat(followup): implement PLAN-FOLLOWUP.md gap fixes
Complete implementation of 7 slices addressing E2E testing gaps:

Slice 0+1: Wire Actions + ReasonPrompt
- FocusView now uses useActions hook instead of direct act() calls
- Added pendingAction state pattern for skip/defer/complete actions
- ReasonPrompt integration with proper confirm/cancel flow
- Tags support in DecisionEntry interface

Slice 2: Drag Reorder UI
- Installed @dnd-kit (core, sortable, utilities)
- QueueView with DndContext, SortableContext, verticalListSortingStrategy
- SortableQueueItem wrapper component using useSortable hook
- pendingReorder state with ReasonPrompt for reorder reasons
- Cmd+Up/Down keyboard shortcuts for accessibility
- Fixed: Store item ID in PendingReorder to avoid stale queue reference

Slice 3: System Tray Integration
- tray.rs with TrayState, setup_tray, toggle_window_visibility
- Menu with Show/Quit items
- Left-click toggles window visibility
- update_tray_badge command updates tooltip with item count
- Frontend wiring in AppShell

Slice 4: E2E Test Updates
- Fixed test selectors for InboxView, Queue badge
- Exposed inbox store for test seeding

Slice 5: Staleness Visualization
- Already implemented in computeStaleness() with tests

Slice 6: Quick Wiring
- onStartBatch callback wired to QueueView
- SyncStatus rendered in nav area
- SettingsView renders Settings component

Slice 7: State Persistence
- settings-store with hydrate/update methods
- Tauri backend integration via read_settings/write_settings
- AppShell hydrates settings on mount

Bug fixes from code review:
- close_bead now has error isolation (try/catch) so decision logging
  and queue advancement continue even if bead close fails
- PendingReorder stores item ID to avoid stale queue reference

E2E tests for all ACs (tests/e2e/followup-acs.spec.ts):
- AC-F1: Drag reorder (4 tests)
- AC-F2: ReasonPrompt integration (7 tests)
- AC-F5: Staleness visualization (3 tests)
- AC-F6: Batch mode (2 tests)
- AC-F7: SyncStatus (2 tests)
- ReasonPrompt behavior (3 tests)

Tests: 388 frontend + 119 Rust + 32 E2E all passing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 17:28:28 -05:00

3.6 KiB

Mission Control - Followup Implementation Plan

Created: 2026-02-26 Status: Gaps identified from E2E testing pass

Overview

E2E testing against PLAN.md Acceptance Criteria revealed ~85% feature completeness. This document tracks the remaining gaps to reach full feature parity.


Gap 1: Drag Reorder UI (AC-004)

Current State:

  • reorderQueue(fromIndex, toIndex) exists in focus-store.ts
  • Tests pass for store logic
  • No drag-and-drop UI in QueueView

Required:

  • Install DnD library (recommend @dnd-kit/core + @dnd-kit/sortable)
  • Wrap QueueView sections with DndContext
  • Make QueueItem components draggable
  • Wire drag end handler to call reorderQueue
  • Log reorder decision via log_decision command

Acceptance Criteria (from PLAN.md):

AC-004: Given user is in Queue View, when user drags an item to new position, then order is persisted AND decision is logged with context AND user is prompted for optional reason.


Gap 2: System Tray Integration (AC-007)

Current State:

  • TrayPopover component fully implemented
  • Shows THE ONE THING, queue/inbox counts, quick actions
  • Not wired to Tauri system tray

Required:

  • Add tauri-plugin-system-tray dependency (if not present)
  • Create tray icon in src-tauri/src/lib.rs
  • Wire tray click to show popover window
  • Update badge count on tray icon

Acceptance Criteria (from PLAN.md):

AC-007: Given MC is running, when there are pending items, then menu bar icon shows badge with count AND clicking icon opens popover AND popover shows THE ONE THING and queue summary.


Gap 3: ReasonPrompt Integration

Current State:

  • ReasonPrompt component fully implemented with quick tags
  • Supports: Blocking, Urgent, Context switch, Energy, Flow tags
  • Not wired to any actions

Required:

  • Wire ReasonPrompt to show before significant actions (set_focus, skip, defer)
  • Pass reason and tags to log_decision command
  • Make prompt optional (user can skip)

Acceptance Criteria (from PLAN.md):

AC-005: Given user performs any significant action (set_focus, reorder, defer, skip, complete), when action is executed, then decision_log.jsonl is appended with: timestamp, action, bead_id, reason (if provided), tags, full context snapshot.


Gap 4: E2E Test Updates

Current State:

  • 2 Playwright tests failing due to outdated expectations
  • Tests expect old placeholder text / selectors are too broad

Required:

  • Update "shows Inbox placeholder" test to verify InboxView content
  • Update "Queue tab shows item count badge" test with specific selector

Priority Order

  1. Drag Reorder UI - Core AC, frequently used interaction
  2. ReasonPrompt Integration - Enables learning from user decisions
  3. System Tray Integration - Polish feature, improves UX
  4. E2E Test Updates - Maintenance, not blocking

Technical Notes

DnD Library Choice

@dnd-kit is recommended over react-beautiful-dnd because:

  • Active maintenance (rbd is deprecated)
  • Better TypeScript support
  • Works with React 18/19 concurrent features
  • Smaller bundle size

System Tray Considerations

  • macOS: Native menu bar item with badge
  • Windows: System tray icon
  • Linux: Varies by DE, may need fallback

Decision Log Schema

Existing schema from src-tauri/src/data/state.rs:

pub struct Decision {
    pub timestamp: String,
    pub action: DecisionAction,
    pub bead_id: String,
    pub reason: Option<String>,
    pub tags: Vec<String>,
    pub context: DecisionContext,
}

The backend is ready to receive tags - just need frontend to send them.