Ignore and untrack BMad directories
This commit is contained in:
@@ -1,295 +0,0 @@
|
||||
# Story 1.4: Fast Track Mode
|
||||
|
||||
Status: done
|
||||
|
||||
<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
|
||||
|
||||
## Story
|
||||
|
||||
As a Power User,
|
||||
I want to bypass the interview questions,
|
||||
So that I can generate a post immediately if I already have the insight.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
1. **Fast Track Toggle/Action**
|
||||
- Given a user is in the chat
|
||||
- When they toggle "Fast Track" or press a specific "Just Draft It" button
|
||||
- Then the system enters "Fast Track" mode
|
||||
- And the UI indicates that the next message will be used for drafting
|
||||
|
||||
2. **Skip Probing Phase**
|
||||
- Given "Fast Track" is active
|
||||
- When the user sends their input
|
||||
- Then the Teacher Agent skips the probing questions
|
||||
- And the input is treated as the final "Insight"
|
||||
- And the system automatically transitions to the drafting phase (Epic 2)
|
||||
|
||||
3. **Immediate Drafting Trigger**
|
||||
- Given the user sends a message in Fast Track mode
|
||||
- When the message is received
|
||||
- Then the system immediately triggers the Ghostwriter Agent (to be implemented in Epic 2)
|
||||
- OR (for MVP if Ghostwriter isn't ready) shows a "Drafting..." placeholder state
|
||||
- And provided feedback that drafting has started
|
||||
|
||||
4. **Exit Fast Track**
|
||||
- Given the user is in Fast Track mode
|
||||
- When they toggle it off
|
||||
- Then normal Teacher Agent flow resumes (intent detection > probing)
|
||||
|
||||
## Tasks / Subtasks
|
||||
|
||||
- [x] Implement Fast Track State in ChatStore
|
||||
- [x] Add `isFastTrackEnabled` boolean to store
|
||||
- [x] Add action to toggle fast track mode
|
||||
- [x] Add logic to `addMessage` to check for fast track
|
||||
|
||||
- [x] Update Chat Interface
|
||||
- [x] Add "Fast Track" toggle or button to UI (e.g., in header or input area)
|
||||
- [x] Add visual indicator when Fast Track is active (e.g., distinct input border or badge)
|
||||
|
||||
- [x] Implement Logic Bypass
|
||||
- [x] Modify ChatStore `addMessage` to skip Teacher Agent if fast track is on
|
||||
- [x] Trigger "Drafting" placeholder response (Ghostwriter to be implemented in Epic 2)
|
||||
- [x] For now (pre-Epic 2): System responds with "Understood. I'll draft a post based on this insight immediately."
|
||||
|
||||
- [x] Test Fast Track Logic
|
||||
- [x] Unit test: Fast track toggle in store
|
||||
- [x] Integration test: Message flow skips Teacher Agent logic when fast track is on
|
||||
- [x] Integration test: Normal flow resumes when toggled off
|
||||
|
||||
## Dev Notes
|
||||
|
||||
### Architecture Compliance (CRITICAL)
|
||||
|
||||
**Logic Sandwich Pattern - DO NOT VIOLATE:**
|
||||
- **UI Components** MUST NOT import `src/lib/llm` or `src/services/llm-service.ts` directly
|
||||
- All Fast Track logic MUST go through `ChatService` layer
|
||||
- ChatService then calls `LLMService` as needed
|
||||
- Components use Zustand store via atomic selectors only
|
||||
- Services return plain objects, not Dexie observables
|
||||
|
||||
**State Management - Atomic Selectors Required:**
|
||||
```typescript
|
||||
// BAD - Causes unnecessary re-renders
|
||||
const { isFastTrack, messages } = useChatStore();
|
||||
|
||||
// GOOD - Atomic selectors
|
||||
const isFastTrack = useChatStore(s => s.isFastTrack);
|
||||
const toggleFastTrack = useChatStore(s => s.toggleFastTrack);
|
||||
```
|
||||
|
||||
**Local-First Data Boundary:**
|
||||
- Fast Track mode state should be persisted in IndexedDB for session recovery
|
||||
- If user is in Fast Track mode and closes/reopens app, mode should be restored
|
||||
- All messages sent in Fast Track mode stored in `chatLogs` table with metadata
|
||||
|
||||
### Architecture Implementation Details
|
||||
|
||||
**State Management:**
|
||||
- Add `isFastTrackEnabled` boolean to `ChatStore` (use consistent naming)
|
||||
- Add `toggleFastTrack()` action to ChatStore
|
||||
- Add logic to `sendMessage` to check for fast track state
|
||||
- Store Fast Track preference in session state for persistence
|
||||
|
||||
**Logic Flow:**
|
||||
- The `ChatService.sendMessage()` function is the gatekeeper
|
||||
- IF `isFastTrack`: Skip `LLMService.getTeacherResponse()`, trigger drafting
|
||||
- ELSE: Proceed as normal (intent detection -> Teacher response)
|
||||
- Transition to Epic 2: Since Epic 2 (Ghostwriter) is not done, use placeholder response
|
||||
|
||||
**Files to Modify:**
|
||||
- `src/lib/store/chat-store.ts` - Add isFastTrackEnabled, toggleFastTrack action
|
||||
- `src/services/chat-service.ts` - Add Fast Track routing logic
|
||||
- `src/services/llm-service.ts` - Add placeholder for Ghostwriter trigger
|
||||
- `src/components/features/chat/ChatWindow.tsx` - Add Fast Track toggle UI
|
||||
- `src/components/features/chat/TypingIndicator.tsx` - Update text for "Drafting..."
|
||||
|
||||
**New Files to Create:**
|
||||
- `src/components/features/chat/FastTrackToggle.tsx` - Toggle UI component
|
||||
|
||||
### UX Design Specifications
|
||||
|
||||
**From UX Design Document:**
|
||||
- **Toggle Placement:** Options include header area (less intrusive), above input field (more discoverable), or as special send button mode
|
||||
- **Visual Indicators:** When active, show "Fast Track Active" badge; change send button icon (e.g., lightning bolt); show different loading state ("Drafting..." vs "Teacher is typing...")
|
||||
- **User Education:** First-time use: show tooltip or modal explaining Fast Track; help text: "Skip straight to draft generation when you already know what you want to say"
|
||||
|
||||
**Button Hierarchy:**
|
||||
- Fast Track toggle should be **Secondary** (Outline/Ghost) style to not compete with primary Send button
|
||||
- Or use an icon-only button with clear tooltip (lightning bolt icon suggested)
|
||||
|
||||
**Visual Feedback:**
|
||||
- Keep it subtle but accessible
|
||||
- Distinct input border or badge when Fast Track is active
|
||||
- For MVP, a header toggle is easiest to implement and test
|
||||
|
||||
### Testing Requirements
|
||||
|
||||
**Unit Tests:**
|
||||
- ChatStore: `toggleFastTrack()` toggles state correctly
|
||||
- ChatStore: `isFastTrackEnabled` defaults to false
|
||||
- ChatService: Routes to Fast Track path when `isFastTrackEnabled` is true
|
||||
- ChatService: Routes to normal path when `isFastTrackEnabled` is false
|
||||
- FastTrackToggle: Component renders and responds to clicks
|
||||
|
||||
**Integration Tests:**
|
||||
- Full flow: User toggles Fast Track -> sends message -> skips Teacher -> shows drafting state
|
||||
- Mode switch: User toggles Fast Track during active chat -> context preserved
|
||||
- Normal flow resumes when toggled off
|
||||
|
||||
**Edge Cases:**
|
||||
- User toggles Fast Track mid-conversation: Preserve existing chat history
|
||||
- User sends message, then toggles Fast Track: No effect on sent messages
|
||||
- Fast Track active, but Ghostwriter (Epic 2) not implemented: Show helpful message
|
||||
- Offline mode in Fast Track: Queue for Ghostwriter when connection restored (Epic 3)
|
||||
|
||||
### Previous Story Intelligence (from Story 1.3)
|
||||
|
||||
**Patterns Established:**
|
||||
- **Logic Sandwich Pattern:** UI -> Zustand -> Service -> LLM (strictly enforced)
|
||||
- **Atomic Selectors:** All state access uses `useChatStore(s => s.field)`
|
||||
- **Typing Indicator Pattern:** `isTyping` state shows "Teacher is typing..."
|
||||
- **LLM Service Pattern:** `LLMService` handles all LLM API calls with retry logic
|
||||
- **Intent Detection:** Teacher agent uses `IntentDetector` for classifying user input
|
||||
|
||||
**Files from 1.3 (Reference):**
|
||||
- `src/lib/llm/intent-detector.ts` - Intent classification (can be skipped in Fast Track)
|
||||
- `src/lib/llm/prompt-engine.ts` - Prompt generation (can be skipped in Fast Track)
|
||||
- `src/app/api/llm/route.ts` - Edge Function proxy (will be used by Ghostwriter in Epic 2)
|
||||
- `src/services/llm-service.ts` - LLM integration with retry/error handling
|
||||
- `src/lib/store/chat-store.ts` - Zustand store with currentIntent, isProcessing state
|
||||
|
||||
**Learnings to Apply:**
|
||||
- Fast Track mode state should follow the same pattern as `currentIntent` in ChatStore
|
||||
- Use `isProcessing` state for "Drafting..." indicator (reuse existing pattern)
|
||||
- Fast Track toggle should use Edge-safe state management (no server-side rendering issues)
|
||||
|
||||
**Testing Patterns:**
|
||||
- Story 1.3 established 98 passing tests
|
||||
- Follow same test structure: unit tests for each service, integration tests for full flow
|
||||
- Use mocked LLM responses for Fast Track tests (Ghostwriter not yet implemented)
|
||||
|
||||
### Data Schema Considerations
|
||||
|
||||
**Dexie schema - chatLogs table may need new field:**
|
||||
```typescript
|
||||
interface ChatLog {
|
||||
id: string;
|
||||
role: 'user' | 'assistant' | 'system';
|
||||
content: string;
|
||||
timestamp: number;
|
||||
intent?: 'venting' | 'insight'; // From Story 1.3
|
||||
isFastTrackInput?: boolean; // NEW: Mark Fast Track inputs
|
||||
sessionId: string;
|
||||
}
|
||||
```
|
||||
|
||||
**Session state should include Fast Track preference:**
|
||||
```typescript
|
||||
interface SessionState {
|
||||
id: string;
|
||||
createdAt: number;
|
||||
updatedAt: number;
|
||||
isFastTrackMode: boolean; // NEW: Persist Fast Track preference
|
||||
currentIntent?: 'venting' | 'insight';
|
||||
}
|
||||
```
|
||||
|
||||
### Performance Requirements
|
||||
|
||||
**NFR-01 Compliance (Chat Latency):**
|
||||
- Fast Track mode should be FASTER than normal mode (skips Teacher call)
|
||||
- "Drafting..." indicator should appear within 1 second of message send
|
||||
- Mode toggle should be instant (no network calls required)
|
||||
|
||||
**State Persistence:**
|
||||
- Fast Track mode preference saved to IndexedDB immediately on toggle
|
||||
- Mode restoration on app load should be <500ms
|
||||
|
||||
### References
|
||||
|
||||
**Architecture Documents:**
|
||||
- [Project Context: Logic Sandwich](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#1-the-logic-sandwich-pattern-service-layer)
|
||||
- [Project Context: State Management](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#2-state-management-zustand)
|
||||
- [Project Context: Local-First Boundary](file:///home/maximilienmao/Projects/Test01/_bmad-output/project-context.md#3-local-first-data-boundary)
|
||||
- [Architecture: Service Boundaries](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/architecture.md#architectural-boundaries)
|
||||
|
||||
**UX Design Specifications:**
|
||||
- [UX: Experience Mechanics - The Daily Vent](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#2-experience-mechanics)
|
||||
- [UX: Button Hierarchy](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#ux-consistency-patterns)
|
||||
- [UX: Journey Patterns](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/ux-design-specification.md#journey-patterns)
|
||||
|
||||
**Epic Reference:**
|
||||
- [Epic 1 Story 1.4: Fast Track Mode](file:///home/maximilienmao/Projects/Test01/_bmad-output/planning-artifacts/epics.md#story-14-fast-track-mode)
|
||||
- FR-05: "System provides a 'Fast Track' option to bypass the interview and go straight to generation"
|
||||
|
||||
**Previous Story:**
|
||||
- [Story 1.3: Teacher Agent Logic & Intent Detection](file:///home/maximilienmao/Projects/Test01/_bmad-output/implementation-artifacts/1-3-teacher-agent-logic-intent-detection.md)
|
||||
|
||||
## Dev Agent Record
|
||||
|
||||
### Agent Model Used
|
||||
|
||||
Claude Opus 4.5 (model ID: 'claude-opus-4-5-20251101')
|
||||
|
||||
### Debug Log References
|
||||
|
||||
Session file: `/tmp/claude/-home-maximilienmao-Projects-Test01/e9769bf5-0607-4356-a7cc-0b046e1f56f4/scratchpad`
|
||||
|
||||
### Completion Notes List
|
||||
|
||||
**Implementation Summary:**
|
||||
Story 1.4 (Fast Track Mode) was already implemented. Fixed test compatibility issue between streaming implementation and test mocks.
|
||||
|
||||
**Test Fix Applied (2026-01-22):**
|
||||
- Fixed `src/lib/store/chat-store.test.ts` to properly mock `getTeacherResponseStream` instead of deprecated `getTeacherResponse`
|
||||
- All 101 tests now passing (was 1 failure before fix)
|
||||
- Test now properly simulates streaming callbacks: onIntent, onToken, onComplete
|
||||
|
||||
**Story Analysis Completed:**
|
||||
- Extracted story requirements from Epic 1, Story 1.4
|
||||
- Analyzed previous story (1.3) for established patterns and learnings
|
||||
- Reviewed architecture for compliance requirements (Logic Sandwich, State Management, Local-First)
|
||||
- Reviewed UX specification for visual design and interaction patterns
|
||||
- Identified all files to create and modify
|
||||
|
||||
**Key Technical Decisions:**
|
||||
1. Fast Track mode state: Added `isFastTrack` to ChatStore with atomic selector pattern
|
||||
2. UI toggle: Integrated into ChatInput component with lightning bolt icon
|
||||
3. Service routing: Fast Track logic in ChatStore `addMessage` bypasses LLM streaming
|
||||
4. Ghostwriter trigger: Placeholder implementation for Epic 2 integration
|
||||
5. Visual indicators: Amber/gold theme when Fast Track is active
|
||||
|
||||
**Dependencies:**
|
||||
- No new dependencies required
|
||||
- Reuses existing Zustand, Dexie, LLM service infrastructure
|
||||
|
||||
**Integration Points:**
|
||||
- Connected to existing ChatStore state management
|
||||
- Fast Track bypass in ChatStore `addMessage` before LLM streaming call
|
||||
- Reuses `isProcessing` state for "Drafting..." indicator
|
||||
- Prepares for Epic 2 Ghostwriter integration
|
||||
|
||||
**Implementation Notes:**
|
||||
- Fast Track toggle integrated into ChatInput component (not separate FastTrackToggle as planned)
|
||||
- Visual feedback: amber/gold accent when active, lightning bolt icon
|
||||
- Placeholder response: "Understood. I'll draft a post based on this insight immediately."
|
||||
- All 101 tests passing including 3 new Fast Track integration tests
|
||||
|
||||
### File List
|
||||
|
||||
**Modified (implementation):**
|
||||
- `src/lib/store/chat-store.ts` - Added `isFastTrack`, `toggleFastTrack`, Fast Track bypass logic
|
||||
- `src/components/features/chat/ChatInput.tsx` - Integrated Fast Track toggle button with visual indicators
|
||||
- `src/components/features/chat/ChatWindow.tsx` - Passes Fast Track state to ChatInput
|
||||
|
||||
**Modified (tests):**
|
||||
- `src/lib/store/chat-store.test.ts` - Fixed streaming mock compatibility
|
||||
|
||||
**Created (tests):**
|
||||
- `src/integration/fast-track.test.ts` - 3 integration tests for Fast Track mode
|
||||
|
||||
**Implementation Variations from Plan:**
|
||||
- Fast Track toggle integrated into ChatInput component (not separate FastTrackToggle.tsx as originally planned)
|
||||
- This simplification reduces component count while maintaining all functionality
|
||||
Reference in New Issue
Block a user