Mission Control Test Cases
Mission Control β Test & Validation Cases
Use this document to manually walk through every feature and confirm the app behaves correctly. Each case has an expected outcome. Mark Pass/Fail as you go.
Legend
- P = Priority: π΄ Critical (app is broken without this), π‘ Important (feature incomplete), π’ Nice-to-have (polish)
- Status = β Pass / β Fail / βοΈ Skipped / π² Not tested
Core Systems
1. Mission Management
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 1.1 | π΄ | Create a new mission | POST to create-mission with name, dates, categories | Mission created, returns missionId. Config table updated with active missionId. | π² |
| 1.2 | π΄ | Load active mission on app open | Open the app fresh | Dashboard loads with correct mission name, date range, and days remaining | π² |
| 1.3 | π‘ | Mission date range display | Check dashboard header | Start/end dates correct. Days remaining counts down accurately. Progress bar reflects position between start and end. | π² |
| 1.4 | π‘ | Mission with no quests/habits | Create a brand new empty mission | Dashboard shows zeros gracefully. No crashes, no NaN. Empty states on all pages. | π² |
| 1.5 | π‘ | Success criteria display | Navigate to Character page | Principles and success criteria from mission definition render correctly | π² |
| 1.6 | π’ | Mission theme badge | Check dashboard header | Theme (e.g., βFoundationβ) shown as a badge/label | π² |
Quest Engine
2. Quests β CRUD
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 2.1 | π΄ | Add a quest (minimal) | Type βBuy milkβ in add quest field, click Add | Quest created as active, no category/size yet, appears on quest board | π² |
| 2.2 | π΄ | Add a quest with all fields | Add quest, then manually set category=home, size=tiny, points=1 | All fields saved and displayed correctly on the card | π² |
| 2.3 | π΄ | View quest detail | Click on a quest card | Detail panel/modal opens showing name, category, size, points, steps, status, notes, creation date | π² |
| 2.4 | π΄ | Complete a quest | Click complete on an active quest | Status β complete. Points added to ledger. Balance updated. Quest moves to completed section. Timestamp recorded. | π² |
| 2.5 | π΄ | Quest board grouping | View /quests with quests in multiple categories | Quests grouped by category (Home, Kids, Laura, Work, Personal). Each group labeled. | π² |
| 2.6 | π‘ | Block a quest | Mark a quest as blocked | Status β blocked. Visual indicator changes. Quest remains visible but distinct. | π² |
| 2.7 | π‘ | Drop a quest | Drop a quest | Status β dropped. No points awarded. Quest moves to completed/archived section. | π² |
| 2.8 | π‘ | Edit quest name/notes | Modify name or notes on existing quest | Changes persist after page refresh | π² |
| 2.9 | π‘ | Completed quests section | Scroll to bottom of /quests | Collapsible section with all completed quests. Collapsed by default. | π² |
| 2.10 | π’ | Empty category | Have zero quests in βWorkβ | Category either hidden or shows graceful empty state, not a broken empty column | π² |
3. Quests β Steps & Progress
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 3.1 | π΄ | Quest with steps displays progress | View a quest with 4 steps, currentStep=2 | Shows β2/4β on the card. Detail view highlights step 2 as current, steps 0-1 as done. | π² |
| 3.2 | π΄ | Advance a step | Click βAdvance Stepβ on a quest at step 1/3 | currentStep increments to 2. lastAdvancedAt updated. UI reflects immediately. | π² |
| 3.3 | π‘ | Advance past final step | Advance a quest thatβs on its last step | Either auto-completes the quest OR prompts βAll steps done β mark as complete?β | π² |
| 3.4 | π‘ | Quest with no steps | Add a quest without steps | Card shows no step indicator (not β0/0β). Complete button works directly. | π² |
| 3.5 | π‘ | Quest with steps at -1 (not started) | Seed data has Potty training at step -1 | Shows βNot startedβ or β0/3β. First advance moves to step 0. | π² |
| 3.6 | π’ | Step names visible in detail | Open quest with named steps | Each step name visible, with done/current/pending styling | π² |
4. Quests β Signal Decay
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 4.1 | π‘ | Fresh quest is bright | Complete a step just now | Quest card has full opacity/brightness. Visually stands out. | π² |
| 4.2 | π‘ | Stale quest is dim | Quest with lastAdvancedAt 14+ days ago | Card is visually dimmer (lower opacity on border or background). Still readable. | π² |
| 4.3 | π‘ | Decay is gradual | Compare quests at 0, 3, 7, 14 days stale | Visible gradient of brightness. Not a binary switch. | π² |
| 4.4 | π’ | New quest (no lastAdvancedAt) | Just-added quest with no steps advanced | Uses createdAt as the freshness anchor. Starts bright. | π² |
| 4.5 | π’ | Blocked quest decay | Quest blocked for 3 weeks | Still shows decay. Being blocked doesnβt freeze the visual β itβs honest about staleness. | π² |
Habits & Economy
5. Habits β Tracking
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 5.1 | π΄ | Toggle a habit day ON | Click the Monday dot for βWritingβ | Dot fills with amber. HabitLog entry created. | π² |
| 5.2 | π΄ | Toggle a habit day OFF | Click a filled dot | Dot empties. HabitLog entry deleted or marked undone. | π² |
| 5.3 | π΄ | Weekly progress calculation | Mark 3/4 Writing days | Row shows β3/4β. Footer recalculates total checks and percentage. | π² |
| 5.4 | π΄ | Habit points calculation | Achieve 80% across all habits in a week | Footer shows 7pts (75-90% bracket). | π² |
| 5.5 | π΄ | Habit points edge cases | Test exactly 90%, 75%, 50%, 25%, 10%, 9% | Points: 10, 7, 5, 3, 1, 0 respectively. Boundary correctness matters. | π² |
| 5.6 | π‘ | Bonus dot (exceeded target) | Mark 5/4 days for Writing | 5th dot renders in gold/amber to indicate exceeding target | π² |
| 5.7 | π‘ | View past week | Use week selector to view Week 3 | Shows correct habit data for that week. Current weekβs dots are editable, past weeks are read-only (or editable with warning). | π² |
| 5.8 | π‘ | Add a new habit definition | Add βStretchingβ with target 3/week | New row appears in the grid. No existing data for it. | π² |
| 5.9 | π‘ | Remove a habit definition | Remove βNo sugarβ | Row disappears. Historical logs preserved (visible in past weeks). | π² |
| 5.10 | π’ | Habit with 7/7 target (daily) | View βNo alcoholβ or βFriendsβ (7/week) | Shows 7 dots for the week. All must be filled to hit 100%. | π² |
| 5.11 | π’ | Week with zero data | Navigate to a future week with no logs | All dots empty, 0/0, 0%. No crashes. | π² |
6. Point Economy & Ledger
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 6.1 | π΄ | Quest completion adds points | Complete a 5pt quest | Ledger entry: earn_quest, +5. Mission balance increases by 5. | π² |
| 6.2 | π΄ | Spending deducts points | Quick spend βComicsβ for 76pts | Ledger entry: spend, -76. Balance decreases. Can go negative. | π² |
| 6.3 | π΄ | Balance reflects all activity | Check dashboard after multiple earn/spend events | Balance = sum of all ledger entries. Matches displayed number exactly. | π² |
| 6.4 | π΄ | Negative balance display | Spend more than earned | Balance shows as red negative number (e.g., β-29β). Not zero-clamped. | π² |
| 6.5 | π‘ | Hobby points via ledger | Log a βBook readβ hobby | Ledger entry: earn_hobby, +5. Balance increases. | π² |
| 6.6 | π‘ | Habit points end-of-week | Complete a week with 85% habits | Ledger entry: earn_habit, +7. One entry per week (not per habit). | π² |
| 6.7 | π‘ | Ledger shows in activity feed | Complete a quest, spend points, log hobby | All three appear in dashboard activity feed in chronological order | π² |
| 6.8 | π’ | Ledger filtering | On log page or Quartermaster, filter by type | Can view only spends, only earns, etc. | π² |
| 6.9 | π’ | 1pt = 1β¬ consistency | All point values match expected euro equivalents | Tiny=1, Small=3, Medium=5, Big=7, Huge=10. Book=5, Game=3, Audiobook=2, Boardgame=1. | π² |
7. Weekly Log
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 7.1 | π΄ | View a completed week | Navigate to /log, select Week 3 | Shows: quests completed that week, habit summary with percentages, hobbies logged, points spent, weekly totals, running balance | π² |
| 7.2 | π΄ | Running balance accuracy | View multiple weeks in sequence | Balance at end of Week N = balance at end of Week N-1 + earned - spent. Chain is consistent. | π² |
| 7.3 | π‘ | Current (incomplete) week | View the current week | Shows partial data. Habits that havenβt happened yet are empty, not zero. | π² |
| 7.4 | π‘ | Week with no activity | View a week where nothing was logged | Graceful empty state. Shows βββ or equivalent. Balance carries forward unchanged. | π² |
| 7.5 | π‘ | Week selector navigation | Navigate between weeks | Smooth, no loading flicker for cached data. Week number and date range displayed correctly. | π² |
AI Features
8. AI β Quest Enrichment
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 8.1 | π΄ | Enrich a simple quest | Create βBuy milkβ, click Enrich | AI returns: category, size (tiny/1pt), steps (1-2 steps), reasoning. All shown for review. | π² |
| 8.2 | π΄ | Enrich a complex quest | Create βSet up home labβ, click Enrich | AI returns: huge/10pt, 4-5 steps, correct category (personal). Reasoning references complexity. | π² |
| 8.3 | π΄ | Accept AI enrichment | After enrichment, click Accept/Save | Quest updated with AI-suggested values. aiEnriched set to true. | π² |
| 8.4 | π΄ | Modify AI enrichment before saving | After enrichment, change category from AI suggestion | Modified values saved, not the AI originals. User has final say. | π² |
| 8.5 | π‘ | AI returns valid JSON | Trigger enrichment | Response is valid JSON matching expected schema. No markdown fences leaking into UI. | π² |
| 8.6 | π‘ | AI error handling | Disconnect network or use invalid API key | Graceful error message. No crash. Quest remains in its pre-enrichment state. | π² |
| 8.7 | π‘ | AI uses personality | Check the reasoning field | Tone matches COMMS personality. Uses βCommander.β Not generic/corporate. | π² |
| 8.8 | π’ | Enrich quest with ambiguous name | Create βthe thingβ and enrich | AI makes a reasonable guess or the reasoning explains its uncertainty. Doesnβt crash. | π² |
| 8.9 | π’ | Enrichment loading state | Click Enrich | Button shows loading/spinner. UI not blocked. Other actions still possible. | π² |
9. AI β Commanderβs Debrief
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 9.1 | π΄ | Generate debrief for a past week | Go to Log, select Week 3, click Generate Debrief | AI returns narrative, suggested traits, title events. Narrative references actual data (quest names, habit %, spend). | π² |
| 9.2 | π΄ | Debrief is cached | Generate debrief, navigate away, come back | Same debrief shown. No re-generation. Stored in Debriefs table. | π² |
| 9.3 | π‘ | Debrief personality | Read the narrative | COMMS voice: direct, dry, uses βCommanderβ, references patterns. Not generic. | π² |
| 9.4 | π‘ | Debrief for a bad week | Generate for a week with 0 quests, low habits, high spend | Narrative is honest but not cruel. Acknowledges the dip. Suggests next steps. | π² |
| 9.5 | π‘ | Debrief for a great week | Generate for Week 3 (17 quest points, 6 hobbies) | Narrative acknowledges wins. Still notes weaknesses (sugar at 0). Not sycophantic. | π² |
| 9.6 | π‘ | Trait suggestion | AI suggests βBinge Readerβ after 2 books in one week | Trait appears in debrief response. If accepted, added to CharacterStats. | π² |
| 9.7 | π‘ | Title event in debrief | Week where balance goes negative for 3rd consecutive time | Debrief includes title event: debt_walker earned. | π² |
| 9.8 | π’ | Debrief for current (incomplete) week | Try to generate for current week | Either blocked (βWeek not completeβ) or generates with caveat (βWeek still in progress, Commander.β) | π² |
10. AI β Salvage Runs
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 10.1 | π΄ | Request 15-minute salvage run | On /quests, click salvage run, select 15 min | AI suggests ONE specific micro-action from active quests. Includes quest name, step, actionable instruction. | π² |
| 10.2 | π‘ | Request 60-minute salvage run | Select 60 min | AI suggests a bigger action, possibly a full step completion. Different from 15-min suggestion. | π² |
| 10.3 | π‘ | Salvage with no active quests | Remove all active quests, request salvage | Graceful response: βNo active quests to salvage, Commander. Time to hit the Tavern Board.β | π² |
| 10.4 | π‘ | Salvage prioritizes stale quests | Have one quest advanced today and one stale for 3 weeks | AI should prefer suggesting the stale quest (higher impact). | π² |
| 10.5 | π’ | Salvage response is actionable | Read the suggestion | Itβs specific (βopen camera roll and star 20 photosβ) not vague (βwork on the photo albumβ). | π² |
Character & Progression
11. Character Sheet
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 11.1 | π΄ | Character page loads | Navigate to /character | Shows level, stats, titles, traits. No crash on first load with seed data. | π² |
| 11.2 | π΄ | Stats are derived from real data | Check STR, INT, CHA, CON, WIS values | Values reflect actual quest completions, habit consistency, spending patterns. Not all zeros, not all 20s. | π² |
| 11.3 | π΄ | Level calculation | Check level and XP bar | Level matches formula: floor(sqrt(totalLifetimePoints / 10)). XP bar shows progress to next level. | π² |
| 11.4 | π΄ | Radar/pentagon chart renders | View stats section | Five-axis chart renders correctly. Shape reflects stat distribution (not a perfect pentagon unless all stats equal). | π² |
| 11.5 | π‘ | Title earned automatically | Complete 10th quest in the mission | βQuestbreakerβ title appears in titles section. Notification or visual indication of new title. | π² |
| 11.6 | π‘ | Set active title | Click on an earned title | Title becomes active. Displayed next to name on sidebar and character page. | π² |
| 11.7 | π‘ | Locked titles visible | View titles section | Unearned titles shown as muted silhouettes with β???β and a hint about the trigger. | π² |
| 11.8 | π‘ | Traits display | Check traits section | AI-detected traits shown as tags. At least the seeded traits visible. | π² |
| 11.9 | π‘ | Stats recompute on stale data | lastComputedAt is >1 hour old, load character page | Stats recomputed from source data. Updated values shown. | π² |
| 11.10 | π’ | Mission archive | View with seed data from one mission | Current mission shown with live stats. Format ready for multiple missions. | π² |
| 11.11 | π’ | Stat tooltips or explanations | Hover/tap on a stat name | Shows what the stat is derived from (e.g., βSTR: Physical/home quest completionsβ) | π² |
12. Character β Title Triggers
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 12.1 | π‘ | Questbreaker | Complete 10 quests in one mission | Title awarded | π² |
| 12.2 | π‘ | The Disciplined | Achieve 90%+ habits for 4 consecutive weeks | Title awarded | π² |
| 12.3 | π‘ | The Indulgent | Spend 50+ points in a single week | Title awarded (Week 3: comics 76pts should trigger) | π² |
| 12.4 | π‘ | Debt Walker | Negative balance for 3+ consecutive weeks | Title awarded (Weeks 4-7 in seed data) | π² |
| 12.5 | π‘ | Streak Runner | Complete a Tavern Board streak bounty | Title awarded | π² |
| 12.6 | π‘ | Zero Dark | Hit 0% on any habit for a full week | Title awarded (No sugar at 0 in Week 4) | π² |
| 12.7 | π‘ | Marathon | Complete a huge (10pt) quest | Title awarded | π² |
| 12.8 | π‘ | Social Butterfly | Contact every crew member in a single week | Title awarded | π² |
| 12.9 | π’ | The Constant | Log activity 30 days in a row | Title awarded (hard to test manually, verify logic) | π² |
| 12.10 | π’ | Penny Pincher | End a mission with 100+ surplus | Title awarded (check at mission close) | π² |
| 12.11 | π‘ | No duplicate titles | Trigger Questbreaker conditions twice | Title appears only once. earnedAt is first occurrence. | π² |
Quartermaster & Social
13. Quartermaster
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 13.1 | π΄ | View balance on Quartermaster | Navigate to /quartermaster | Balance displayed prominently. Matches dashboard balance exactly. Shows total earned and total spent. | π² |
| 13.2 | π΄ | Add wishlist item | Add βLOTR expansionβ at 35pts, category=boardgame | Item appears in wishlist. Status: wanted. | π² |
| 13.3 | π΄ | Purchase wishlist item (affordable) | With balance >= 35, purchase the item | Balance deducts 35. Ledger entry: spend_wishlist. Item status β purchased. | π² |
| 13.4 | π΄ | Purchase wishlist item (not affordable) | With balance < item cost, attempt purchase | Purchase allowed (can go negative, matching existing economy). Balance goes negative. Red display. | π² |
| 13.5 | π‘ | Affordable badge | Balance is 40, item costs 35 | βAFFORDABLEβ green badge on the item. | π² |
| 13.6 | π‘ | Progress bar for unaffordable | Balance is 15, item costs 35 | Progress bar at ~43%. Text: β20 points awayβ. | π² |
| 13.7 | π‘ | Affordability projection | Average earning 15pts/week, item costs 35, balance is 15 | Shows β~1.3 weeksβ or β~2 weeksβ estimate. | π² |
| 13.8 | π‘ | Quick spend (ad-hoc) | Spend 10pts on βBraceletβ via quick spend | Ledger entry: spend (not spend_wishlist). Balance deducts. Appears in purchase history. | π² |
| 13.9 | π‘ | Purchase history | After multiple purchases | Chronological list showing wishlist and ad-hoc purchases with dates and amounts | π² |
| 13.10 | π’ | Wishlist sorting | Mix of affordable and unaffordable items | Affordable items sorted to top. Within groups, sorted by creation date. | π² |
| 13.11 | π’ | Wishlist category icons | Items with different categories | Each shows a relevant icon (game, book, boardgame, etc.) | π² |
14. Crew Manifest
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 14.1 | π΄ | View crew list | Navigate to /crew | All crew members displayed as cards with names, relationship, last contact time. | π² |
| 14.2 | π΄ | Ping a crew member | Click Ping on βMamΓ‘β | lastContactAt updated to now. Timer resets. Contact log entry created. Visual feedback (pulse animation). | π² |
| 14.3 | π΄ | Last contact in natural language | View a crew member pinged 3 days ago | Shows β3 days agoβ (via date-fns), not a raw timestamp. | π² |
| 14.4 | π‘ | Freshness color coding | Crew members with varying last contact times | Recently pinged = green border. Overdue = yellow. Very overdue = red. Gradient, not binary. | π² |
| 14.5 | π‘ | Sorted by neediest first | View /crew | Person with lowest freshness (most overdue relative to their pattern) at top. | π² |
| 14.6 | π‘ | Average frequency computation | Ping βMamΓ‘β 5 times over 20 days | averageFrequencyDays computes to ~4 days. Freshness decay calibrated to that rhythm. | π² |
| 14.7 | π‘ | New crew member (no history) | Add a new person, no pings yet | Shows βNever contactedβ or uses creation date. Falls back to 7-day flat decay. | π² |
| 14.8 | π‘ | Add crew member | Click Add, fill name/relationship/method | New card appears in the grid. | π² |
| 14.9 | π‘ | Delete crew member | Remove a crew member | Card removed. Contact history cleaned up (or retained for stats). | π² |
| 14.10 | π’ | Crew Pulse on dashboard | View dashboard with overdue crew | Small widget showing 2-3 most overdue names with βX days agoβ | π² |
| 14.11 | π’ | Contact log note | Ping with a note: βCalled about birthday plansβ | Note stored in contact log. Visible somewhere (crew detail or log). | π² |
| 14.12 | π’ | CHA stat reflects crew health | High crew contact frequency | CHA stat on character sheet is higher than with poor contact patterns | π² |
15. Tavern Board
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 15.1 | π΄ | Generate bounties | On /tavern, click βPost New Bountiesβ | 3-5 bounties generated by AI. Mix of types and sources. Each has description, reward, type. | π² |
| 15.2 | π΄ | Accept a bounty | Click Accept on an available bounty | Status β accepted. acceptedAt set. Visual change (highlighted border). | π² |
| 15.3 | π΄ | Complete a bounty | Click Complete on an accepted bounty | Status β completed. Points awarded via ledger. Balance increases. | π² |
| 15.4 | π‘ | Bounties are context-aware | Generate bounties when habits are weak | At least one bounty targets the weakest habit. AI references actual data. | π² |
| 15.5 | π‘ | Streak bounty display | Generate a streak bounty | Shows streak progress dots (e.g., βββ for 1/3 weeks). | π² |
| 15.6 | π‘ | Streak bounty completion bonus | Complete week 3/3 of a streak | Normal reward + streak bonus points both credited. Two ledger entries. | π² |
| 15.7 | π‘ | Bounty expiration | Wait for bounty to pass expiresAt | Status β expired on next load. Not shown as available. | π² |
| 15.8 | π‘ | No duplicate generation | Generate bounties twice in one week | Second generation either blocked (βBounties already posted this weekβ) or confirms replacement. | π² |
| 15.9 | π‘ | Bounty sources are varied | Inspect generated bounties | Not all same source. Mix of: hobby_inertia, habit_support, quest_nudge, crew_nudge, etc. | π² |
| 15.10 | π’ | Bounty AI personality | Read bounty descriptions | Written in COMMS voice. Not generic task descriptions. Has personality. | π² |
| 15.11 | π’ | Active bounties on dashboard | Accept a bounty, check dashboard | Active Bounties widget shows the accepted bounty with progress. | π² |
| 15.12 | π’ | Bounty history | View past weeksβ bounties | Collapsible section showing completed/expired bounties from previous weeks. | π² |
| 15.13 | π’ | Streak Runner title | Complete a full streak bounty | βStreak Runnerβ title triggers on character sheet. | π² |
Dashboard & Navigation
16. Dashboard β Aggregate View
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 16.1 | π΄ | Dashboard loads with all widgets | Navigate to / | All widgets render: mission header, character mini-card, quest status, habit pulse, activity feed. No crashes. | π² |
| 16.2 | π΄ | Character mini-card | Check sidebar or dashboard | Shows level, active title, balance. Clickable β navigates to /character. | π² |
| 16.3 | π΄ | Quest status counts | Check quest panel | Correct counts: active, complete, blocked. Matches actual data. | π² |
| 16.4 | π΄ | Habit pulse shows current week | Check habit widget | Dot grid for current week. Filled/empty matches actual habit logs. Percentage correct. | π² |
| 16.5 | π‘ | Activity feed | Check feed after various actions | Shows last 5-8 ledger entries. Most recent first. Descriptions are readable. | π² |
| 16.6 | π‘ | Crew pulse widget | Check with overdue crew members | Shows 2-3 most overdue crew with βX days agoβ text. | π² |
| 16.7 | π‘ | Active bounties widget | Accept a bounty, check dashboard | Shows accepted bounties with progress indicators. | π² |
| 16.8 | π’ | Dashboard data freshness | Complete a quest on /quests, return to / | Dashboard reflects the new data immediately (React Query invalidation) or on refresh. | π² |
17. Layout & Navigation
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 17.1 | π΄ | Desktop sidebar navigation | Click each nav link on desktop | All pages load correctly. Active page highlighted in sidebar. | π² |
| 17.2 | π΄ | Mobile bottom tab bar | View on 375px width | Bottom tabs visible: Dashboard, Quests, Habits, Character, More. Tapping works. | π² |
| 17.3 | π΄ | Mobile βMoreβ menu | Tap More on mobile | Sheet/menu opens with: Log, Quartermaster, Crew, Tavern links. | π² |
| 17.4 | π‘ | Sidebar mission info | Check desktop sidebar | Shows mission name, character mini-card (level, title, balance), nav links with icons. | π² |
| 17.5 | π‘ | Responsive breakpoints | Resize from 375px to 1440px | Layout transitions smoothly. No broken layouts at any width. | π² |
| 17.6 | π’ | Page transition animations | Navigate between pages | Subtle transitions (framer-motion). Not jarring. Not slow. | π² |
Design & Infrastructure
18. Design β Wayfarer Cockpit Aesthetic
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 18.1 | π΄ | Color scheme correct | Visual inspection | Dark navy hull, warm cream text, amber accents. NOT white backgrounds, NOT blue accents. | π² |
| 18.2 | π΄ | Typography correct | Check fonts loaded | JetBrains Mono for data/numbers. Space Grotesk for labels/body. Both loaded from Google Fonts. | π² |
| 18.3 | π‘ | Panel styling | Inspect cards/panels | Rounded corners, 1px border, mc-panel background. NO drop shadows. | π² |
| 18.4 | π‘ | Section headers | Check any section header | Left amber border bar (4px), uppercase muted label, small text. | π² |
| 18.5 | π‘ | Data readouts | Check point balance, stats | Monospace font. Muted uppercase labels above. Dense, cockpit-like. | π² |
| 18.6 | π‘ | Status colors | Check positive/negative/warning elements | Green for earned/complete, red for spent/negative, amber for warnings, blue for info. Consistent. | π² |
| 18.7 | π’ | Information density | Overall feel | Feels like a cockpit β dense, functional, warm. NOT like a blog (too much whitespace) or a corporate dashboard (too sterile). | π² |
| 18.8 | π’ | Interactive feedback | Hover over buttons, toggle habits | Amber hover states, 150ms transitions. Point changes have brief scale pulse. | π² |
19. Offline & PWA
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 19.1 | π‘ | Zustand persistence | Load app, navigate around, hard refresh | State restored from localStorage. Last-viewed data shown. | π² |
| 19.2 | π‘ | Offline display | Disconnect network, open app | Shows last-known data from Zustand cache. No blank screen. Error indicator that data may be stale. | π² |
| 19.3 | π‘ | PWA installable | Open in Chrome mobile, check install prompt | App can be added to home screen. Opens in standalone mode. | π² |
| 19.4 | π’ | Service worker caching | Install PWA, go offline, open app | App shell loads from SW cache. Static assets available. | π² |
| 19.5 | π’ | Manifest correct | Check /manifest.json | App name βMission Controlβ, correct theme colors (mc-hull), icon present. | π² |
20. Error Handling & Edge Cases
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 20.1 | π΄ | API error on page load | Break API key, load any page | Error state shown (not blank, not crash). Message like βComms down, Commander.β | π² |
| 20.2 | π΄ | Loading states | Throttle network, load each page | Every page shows loading indicator while fetching. Not blank. | π² |
| 20.3 | π΄ | Empty states | New mission with zero data on every page | Each page has a meaningful empty state. Not blank, not broken. | π² |
| 20.4 | π‘ | AI timeout | Slow network, trigger enrichment | Loading state shown. After timeout, error message. Quest unchanged. | π² |
| 20.5 | π‘ | Invalid AI response | AI returns malformed JSON (simulate) | Error handled gracefully. User informed. No crash. Original data preserved. | π² |
| 20.6 | π‘ | Concurrent mutations | Complete a quest while viewing dashboard | No stale data. React Query invalidation ensures both views update. | π² |
| 20.7 | π’ | Very long quest name | Add quest with 200-character name | Card truncates gracefully. Detail view shows full name. No layout break. | π² |
| 20.8 | π’ | Rapid clicking | Double-click Complete on a quest | Only one completion processed. No duplicate ledger entries. | π² |
| 20.9 | π’ | Deep link to page | Navigate directly to /quests or /character via URL | Page loads correctly with all data, not just from root route. | π² |
Seed Data & New Features
21. Seed Data Validation
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 21.1 | π΄ | All seed quests present | View /quests | All 14 active quests visible in correct categories. Correct sizes and points. | π² |
| 21.2 | π΄ | Quest steps match seed | Click Garage protections (step 2/3) | Shows step 2 of 3 highlighted. Steps match: Find existing β Buy if needed β Install. | π² |
| 21.3 | π΄ | All 6 habits present | View /habits | Writing (4/wk), Sports (3/wk), Friends (7/wk), Meditate (5/wk), No alcohol (7/wk), No sugar (7/wk). | π² |
| 21.4 | π‘ | Crew seeded | View /crew | Laura, family members, and friends present with placeholder contact dates. | π² |
| 21.5 | π‘ | Wishlist seeded | View /quartermaster | 2-3 wishlist items with realistic prices. | π² |
| 21.6 | π‘ | Blocked quest visible | Check Homelab quest | Shows as blocked with distinct visual. | π² |
| 21.7 | π’ | Categories correct | Each quest is in the right category column/group | Home quests in Home, Kids in Kids, etc. None miscategorized. | π² |
| 21.8 | π‘ | Last Pings seeded | View /pings | 4 pings present: Kiraβs litter, Watered plants, Changed bed sheets, Backed up phone. | π² |
| 21.9 | π‘ | Media Log seeded | View /media | 4 entries: Severance S2 (watching), Nosferatu (want_to_watch), White Lotus S3 (want_to_watch), Andor S1 (completed, 5 stars). | π² |
22. Last Ping
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 22.1 | π΄ | View pings list | Navigate to /pings | All pings displayed as cards with names, icons, last ping time. | π² |
| 22.2 | π΄ | Ping an item | Click Ping on βKiraβs litterβ | lastPingedAt updated to now. Timer resets to βjust nowβ. Log entry created. Pulse animation. | π² |
| 22.3 | π΄ | Last ping in natural language | View a ping done 3 days ago | Shows β3 days agoβ (via date-fns), not a raw timestamp. | π² |
| 22.4 | π‘ | Freshness color coding | Pings with varying last-ping times | Recently pinged = green border. Overdue = yellow. Very overdue = red. Gradient, not binary. | π² |
| 22.5 | π‘ | Sorted by neediest first | View /pings | Ping with lowest freshness (most overdue relative to its pattern) at top. | π² |
| 22.6 | π‘ | Average frequency computation | Ping βKiraβs litterβ 5 times over 15 days | averageFrequencyDays computes to ~3 days. Freshness decay calibrated accordingly. | π² |
| 22.7 | π‘ | New ping (no history) | Create a new ping, no prior pings | Shows βjust nowβ (created with lastPingedAt = now). Falls back to 7-day flat decay. | π² |
| 22.8 | π‘ | Add a ping | Click Add, fill name and pick icon | New card appears in the grid. | π² |
| 22.9 | π‘ | Delete a ping | Remove a ping | Card removed. Log entries cleaned up. | π² |
| 22.10 | π‘ | Ping history view | Tap/expand a ping card | Shows last 5-10 log entries with dates. Frequency pattern visible. | π² |
| 22.11 | π‘ | Ping with note | Ping with note: βUsed the new brandβ | Note stored in log entry. Visible in history. | π² |
| 22.12 | π’ | Last Ping Pulse on dashboard | View dashboard with overdue pings | Small widget showing 2-3 most overdue pings with βX days agoβ. | π² |
| 22.13 | π’ | Icon picker on creation | Add a new ping | Subset of Lucide icons available to pick from (cat, droplets, car, bed, etc.). Selected icon displays on card. | π² |
| 22.14 | π’ | Pings persist across missions | Create new mission, check /pings | Same pings visible. Not mission-scoped. | π² |
| 22.15 | π’ | Signal decay matches crew formula | Compare visually to crew cards | Same freshness formula: `1.0 - clamp(days / (avg * 1.5 |
23. Shipβs Log β Media Tracker
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 23.1 | π΄ | View media list | Navigate to /media | All media entries displayed. Grouped or filtered by status. | π² |
| 23.2 | π΄ | Add media entry | Add βDune Part 3β as movie, want_to_watch | Entry created. Appears in βWant to Watchβ view. | π² |
| 23.3 | π΄ | Start watching | Click βStart Watchingβ on a want_to_watch entry | Status β watching. startedAt set to now. Card moves to Watching section. | π² |
| 23.4 | π΄ | Complete media | Click βCompleteβ on a watching entry | Prompted for 1-5 star rating. After rating: status β completed, completedAt set, rating saved. | π² |
| 23.5 | π΄ | Hobby points on completion | Complete a TV show season | Ledger entry created: earn_hobby, +3 pts. Mission balance increases. | π² |
| 23.6 | π‘ | Different media type points | Complete a movie (1pt), documentary (2pt), TV season (3pt) | Each creates correct ledger entry with correct point value. | π² |
| 23.7 | π‘ | Drop media | Click βDropβ on a watching entry | Status β dropped. No points awarded. Card moves to dropped/completed section. | π² |
| 23.8 | π‘ | Filter by status | Click βWatchingβ tab/filter | Only watching entries shown. Other tabs work similarly. | π² |
| 23.9 | π‘ | Filter by type | Filter to only tv_show entries | Only TV shows displayed. | π² |
| 23.10 | π‘ | Rating display | View completed entry with rating 4 | Shows 4/5 stars or equivalent visual. | π² |
| 23.11 | π‘ | Season number | Add βSeverance S2β with seasonNumber=2 | Season number displayed on card: βSeason 2β. | π² |
| 23.12 | π‘ | Quick stats | View stats section on /media | Shows total watched this mission, breakdown by type, total points earned from media. | π² |
| 23.13 | π‘ | Edit media entry | Change notes or type on existing entry | Changes persist after refresh. | π² |
| 23.14 | π‘ | Delete media entry | Remove an entry | Entry deleted. If it was completed, ledger entry remains (history intact). | π² |
| 23.15 | π’ | Media persists across missions | Create new mission, check /media | Same entries visible. Not mission-scoped. Points earned go to active mission. | π² |
| 23.16 | π’ | Tavern Board references media backlog | Generate bounties with want_to_watch entries | At least one bounty source is media_backlog referencing a want_to_watch item. | π² |
| 23.17 | π’ | Notes on media card | Add entry with notes | Notes preview visible on card. Full notes in detail view. | π² |
24. Habit Mutations
| # | P | Test Case | Steps | Expected Outcome | Status |
|---|---|---|---|---|---|
| 24.1 | π‘ | Debrief includes mutation field | Generate a debrief for any week | Response JSON includes habitMutations array (may be empty). No crash if empty. | π² |
| 24.2 | π‘ | Evolve mutation suggested | Generate debrief for a week where Writing has been 90%+ for 4+ consecutive weeks | habitMutations contains an evolve suggestion for Writing (e.g., increase to 5/week). | π² |
| 24.3 | π‘ | Simplify mutation suggested | Generate debrief for a week where No sugar has been <25% for 3+ weeks | habitMutations contains a simplify suggestion for No sugar (e.g., reduce to 3/week). | π² |
| 24.4 | π‘ | Mutation card UI β evolve | View debrief with evolve mutation | Green-bordered card with upward arrow, shows currentβproposed change, Accept and Dismiss buttons. | π² |
| 24.5 | π‘ | Mutation card UI β simplify | View debrief with simplify mutation | Amber-bordered card with adjustment icon, shows currentβproposed change, Accept and Dismiss buttons. | π² |
| 24.6 | π΄ | Accept mutation | Click Accept on a mutation card | HabitDefinition updated with proposed change (e.g., daysPerWeek 4β5). Change reflected on /habits page. | π² |
| 24.7 | π‘ | Dismiss mutation | Click Dismiss on a mutation card | Card hidden/removed. No changes to HabitDefinition. Debrief still shows the narrative. | π² |
| 24.8 | π‘ | Mutation personality | Read the mutation suggestion text | Written in COMMS voice. Evolve: encouraging but not sycophantic. Simplify: honest, pragmatic. | π² |
| 24.9 | π’ | No mutation when not warranted | Generate debrief for a normal week (no extreme patterns) | habitMutations array is empty. No mutation cards shown. | π² |
| 24.10 | π’ | Mutation doesnβt double-fire | Generate debrief twice for same week | Same cached debrief returned. Accepting mutation twice doesnβt apply change twice. | π² |
| 24.11 | π’ | Accepted mutation visible next week | Accept evolve (4β5/week), navigate to /habits next week | Habit grid shows 5 target. New target in effect. | π² |
Summary
| Section | π΄ Critical | π‘ Important | π’ Nice-to-have | Total |
|---|---|---|---|---|
| 1. Missions | 2 | 3 | 1 | 6 |
| 2. Quests CRUD | 5 | 4 | 1 | 10 |
| 3. Quest Steps | 2 | 3 | 1 | 6 |
| 4. Signal Decay | 0 | 3 | 2 | 5 |
| 5. Habits | 5 | 4 | 2 | 11 |
| 6. Point Economy | 4 | 3 | 2 | 9 |
| 7. Weekly Log | 2 | 3 | 0 | 5 |
| 8. AI Enrichment | 4 | 3 | 2 | 9 |
| 9. AI Debrief | 2 | 5 | 1 | 8 |
| 10. AI Salvage | 1 | 3 | 1 | 5 |
| 11. Character | 4 | 5 | 2 | 11 |
| 12. Title Triggers | 0 | 9 | 2 | 11 |
| 13. Quartermaster | 4 | 5 | 2 | 11 |
| 14. Crew Manifest | 3 | 6 | 3 | 12 |
| 15. Tavern Board | 3 | 6 | 4 | 13 |
| 16. Dashboard | 4 | 3 | 1 | 8 |
| 17. Navigation | 3 | 2 | 1 | 6 |
| 18. Design | 2 | 4 | 2 | 8 |
| 19. PWA/Offline | 0 | 3 | 2 | 5 |
| 20. Error Handling | 3 | 3 | 3 | 9 |
| 21. Seed Data | 3 | 5 | 1 | 9 |
| 22. Last Ping | 3 | 8 | 4 | 15 |
| 23. Shipβs Log | 5 | 9 | 3 | 17 |
| 24. Habit Mutations | 1 | 7 | 3 | 11 |
| TOTAL | 65 | 113 | 46 | 224 |
Testing Strategy
Clear all π΄ Critical first β these are the βapp is fundamentally brokenβ cases. Then sweep π‘ Important for feature completeness. π’ Nice-to-have is polish for when the core works.