scrap / mission-control-test-cases

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

#PTest CaseStepsExpected OutcomeStatus
1.1πŸ”΄Create a new missionPOST to create-mission with name, dates, categoriesMission created, returns missionId. Config table updated with active missionId.πŸ”²
1.2πŸ”΄Load active mission on app openOpen the app freshDashboard loads with correct mission name, date range, and days remainingπŸ”²
1.3🟑Mission date range displayCheck dashboard headerStart/end dates correct. Days remaining counts down accurately. Progress bar reflects position between start and end.πŸ”²
1.4🟑Mission with no quests/habitsCreate a brand new empty missionDashboard shows zeros gracefully. No crashes, no NaN. Empty states on all pages.πŸ”²
1.5🟑Success criteria displayNavigate to Character pagePrinciples and success criteria from mission definition render correctlyπŸ”²
1.6🟒Mission theme badgeCheck dashboard headerTheme (e.g., β€œFoundation”) shown as a badge/labelπŸ”²

Quest Engine

2. Quests β€” CRUD

#PTest CaseStepsExpected OutcomeStatus
2.1πŸ”΄Add a quest (minimal)Type β€œBuy milk” in add quest field, click AddQuest created as active, no category/size yet, appears on quest boardπŸ”²
2.2πŸ”΄Add a quest with all fieldsAdd quest, then manually set category=home, size=tiny, points=1All fields saved and displayed correctly on the cardπŸ”²
2.3πŸ”΄View quest detailClick on a quest cardDetail panel/modal opens showing name, category, size, points, steps, status, notes, creation dateπŸ”²
2.4πŸ”΄Complete a questClick complete on an active questStatus β†’ complete. Points added to ledger. Balance updated. Quest moves to completed section. Timestamp recorded.πŸ”²
2.5πŸ”΄Quest board groupingView /quests with quests in multiple categoriesQuests grouped by category (Home, Kids, Laura, Work, Personal). Each group labeled.πŸ”²
2.6🟑Block a questMark a quest as blockedStatus β†’ blocked. Visual indicator changes. Quest remains visible but distinct.πŸ”²
2.7🟑Drop a questDrop a questStatus β†’ dropped. No points awarded. Quest moves to completed/archived section.πŸ”²
2.8🟑Edit quest name/notesModify name or notes on existing questChanges persist after page refreshπŸ”²
2.9🟑Completed quests sectionScroll to bottom of /questsCollapsible section with all completed quests. Collapsed by default.πŸ”²
2.10🟒Empty categoryHave zero quests in β€œWork”Category either hidden or shows graceful empty state, not a broken empty columnπŸ”²

3. Quests β€” Steps & Progress

#PTest CaseStepsExpected OutcomeStatus
3.1πŸ”΄Quest with steps displays progressView a quest with 4 steps, currentStep=2Shows β€œ2/4” on the card. Detail view highlights step 2 as current, steps 0-1 as done.πŸ”²
3.2πŸ”΄Advance a stepClick β€œAdvance Step” on a quest at step 1/3currentStep increments to 2. lastAdvancedAt updated. UI reflects immediately.πŸ”²
3.3🟑Advance past final stepAdvance a quest that’s on its last stepEither auto-completes the quest OR prompts β€œAll steps done β€” mark as complete?β€πŸ”²
3.4🟑Quest with no stepsAdd a quest without stepsCard 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 -1Shows β€œNot started” or β€œ0/3”. First advance moves to step 0.πŸ”²
3.6🟒Step names visible in detailOpen quest with named stepsEach step name visible, with done/current/pending stylingπŸ”²

4. Quests β€” Signal Decay

#PTest CaseStepsExpected OutcomeStatus
4.1🟑Fresh quest is brightComplete a step just nowQuest card has full opacity/brightness. Visually stands out.πŸ”²
4.2🟑Stale quest is dimQuest with lastAdvancedAt 14+ days agoCard is visually dimmer (lower opacity on border or background). Still readable.πŸ”²
4.3🟑Decay is gradualCompare quests at 0, 3, 7, 14 days staleVisible gradient of brightness. Not a binary switch.πŸ”²
4.4🟒New quest (no lastAdvancedAt)Just-added quest with no steps advancedUses createdAt as the freshness anchor. Starts bright.πŸ”²
4.5🟒Blocked quest decayQuest blocked for 3 weeksStill shows decay. Being blocked doesn’t freeze the visual β€” it’s honest about staleness.πŸ”²

Habits & Economy

5. Habits β€” Tracking

#PTest CaseStepsExpected OutcomeStatus
5.1πŸ”΄Toggle a habit day ONClick the Monday dot for β€œWriting”Dot fills with amber. HabitLog entry created.πŸ”²
5.2πŸ”΄Toggle a habit day OFFClick a filled dotDot empties. HabitLog entry deleted or marked undone.πŸ”²
5.3πŸ”΄Weekly progress calculationMark 3/4 Writing daysRow shows β€œ3/4”. Footer recalculates total checks and percentage.πŸ”²
5.4πŸ”΄Habit points calculationAchieve 80% across all habits in a weekFooter shows 7pts (75-90% bracket).πŸ”²
5.5πŸ”΄Habit points edge casesTest 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 Writing5th dot renders in gold/amber to indicate exceeding targetπŸ”²
5.7🟑View past weekUse week selector to view Week 3Shows 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 definitionAdd β€œStretching” with target 3/weekNew row appears in the grid. No existing data for it.πŸ”²
5.9🟑Remove a habit definitionRemove β€œ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 dataNavigate to a future week with no logsAll dots empty, 0/0, 0%. No crashes.πŸ”²

6. Point Economy & Ledger

#PTest CaseStepsExpected OutcomeStatus
6.1πŸ”΄Quest completion adds pointsComplete a 5pt questLedger entry: earn_quest, +5. Mission balance increases by 5.πŸ”²
6.2πŸ”΄Spending deducts pointsQuick spend β€œComics” for 76ptsLedger entry: spend, -76. Balance decreases. Can go negative.πŸ”²
6.3πŸ”΄Balance reflects all activityCheck dashboard after multiple earn/spend eventsBalance = sum of all ledger entries. Matches displayed number exactly.πŸ”²
6.4πŸ”΄Negative balance displaySpend more than earnedBalance shows as red negative number (e.g., β€œ-29”). Not zero-clamped.πŸ”²
6.5🟑Hobby points via ledgerLog a β€œBook read” hobbyLedger entry: earn_hobby, +5. Balance increases.πŸ”²
6.6🟑Habit points end-of-weekComplete a week with 85% habitsLedger entry: earn_habit, +7. One entry per week (not per habit).πŸ”²
6.7🟑Ledger shows in activity feedComplete a quest, spend points, log hobbyAll three appear in dashboard activity feed in chronological orderπŸ”²
6.8🟒Ledger filteringOn log page or Quartermaster, filter by typeCan view only spends, only earns, etc.πŸ”²
6.9🟒1pt = 1€ consistencyAll point values match expected euro equivalentsTiny=1, Small=3, Medium=5, Big=7, Huge=10. Book=5, Game=3, Audiobook=2, Boardgame=1.πŸ”²

7. Weekly Log

#PTest CaseStepsExpected OutcomeStatus
7.1πŸ”΄View a completed weekNavigate to /log, select Week 3Shows: quests completed that week, habit summary with percentages, hobbies logged, points spent, weekly totals, running balanceπŸ”²
7.2πŸ”΄Running balance accuracyView multiple weeks in sequenceBalance at end of Week N = balance at end of Week N-1 + earned - spent. Chain is consistent.πŸ”²
7.3🟑Current (incomplete) weekView the current weekShows partial data. Habits that haven’t happened yet are empty, not zero.πŸ”²
7.4🟑Week with no activityView a week where nothing was loggedGraceful empty state. Shows ”—” or equivalent. Balance carries forward unchanged.πŸ”²
7.5🟑Week selector navigationNavigate between weeksSmooth, no loading flicker for cached data. Week number and date range displayed correctly.πŸ”²

AI Features

8. AI β€” Quest Enrichment

#PTest CaseStepsExpected OutcomeStatus
8.1πŸ”΄Enrich a simple questCreate β€œBuy milk”, click EnrichAI returns: category, size (tiny/1pt), steps (1-2 steps), reasoning. All shown for review.πŸ”²
8.2πŸ”΄Enrich a complex questCreate β€œSet up home lab”, click EnrichAI returns: huge/10pt, 4-5 steps, correct category (personal). Reasoning references complexity.πŸ”²
8.3πŸ”΄Accept AI enrichmentAfter enrichment, click Accept/SaveQuest updated with AI-suggested values. aiEnriched set to true.πŸ”²
8.4πŸ”΄Modify AI enrichment before savingAfter enrichment, change category from AI suggestionModified values saved, not the AI originals. User has final say.πŸ”²
8.5🟑AI returns valid JSONTrigger enrichmentResponse is valid JSON matching expected schema. No markdown fences leaking into UI.πŸ”²
8.6🟑AI error handlingDisconnect network or use invalid API keyGraceful error message. No crash. Quest remains in its pre-enrichment state.πŸ”²
8.7🟑AI uses personalityCheck the reasoning fieldTone matches COMMS personality. Uses β€œCommander.” Not generic/corporate.πŸ”²
8.8🟒Enrich quest with ambiguous nameCreate β€œthe thing” and enrichAI makes a reasonable guess or the reasoning explains its uncertainty. Doesn’t crash.πŸ”²
8.9🟒Enrichment loading stateClick EnrichButton shows loading/spinner. UI not blocked. Other actions still possible.πŸ”²

9. AI β€” Commander’s Debrief

#PTest CaseStepsExpected OutcomeStatus
9.1πŸ”΄Generate debrief for a past weekGo to Log, select Week 3, click Generate DebriefAI returns narrative, suggested traits, title events. Narrative references actual data (quest names, habit %, spend).πŸ”²
9.2πŸ”΄Debrief is cachedGenerate debrief, navigate away, come backSame debrief shown. No re-generation. Stored in Debriefs table.πŸ”²
9.3🟑Debrief personalityRead the narrativeCOMMS voice: direct, dry, uses β€œCommander”, references patterns. Not generic.πŸ”²
9.4🟑Debrief for a bad weekGenerate for a week with 0 quests, low habits, high spendNarrative is honest but not cruel. Acknowledges the dip. Suggests next steps.πŸ”²
9.5🟑Debrief for a great weekGenerate for Week 3 (17 quest points, 6 hobbies)Narrative acknowledges wins. Still notes weaknesses (sugar at 0). Not sycophantic.πŸ”²
9.6🟑Trait suggestionAI suggests β€œBinge Reader” after 2 books in one weekTrait appears in debrief response. If accepted, added to CharacterStats.πŸ”²
9.7🟑Title event in debriefWeek where balance goes negative for 3rd consecutive timeDebrief includes title event: debt_walker earned.πŸ”²
9.8🟒Debrief for current (incomplete) weekTry to generate for current weekEither blocked (β€œWeek not complete”) or generates with caveat (β€œWeek still in progress, Commander.”)πŸ”²

10. AI β€” Salvage Runs

#PTest CaseStepsExpected OutcomeStatus
10.1πŸ”΄Request 15-minute salvage runOn /quests, click salvage run, select 15 minAI suggests ONE specific micro-action from active quests. Includes quest name, step, actionable instruction.πŸ”²
10.2🟑Request 60-minute salvage runSelect 60 minAI suggests a bigger action, possibly a full step completion. Different from 15-min suggestion.πŸ”²
10.3🟑Salvage with no active questsRemove all active quests, request salvageGraceful response: β€œNo active quests to salvage, Commander. Time to hit the Tavern Board.β€πŸ”²
10.4🟑Salvage prioritizes stale questsHave one quest advanced today and one stale for 3 weeksAI should prefer suggesting the stale quest (higher impact).πŸ”²
10.5🟒Salvage response is actionableRead the suggestionIt’s specific (β€œopen camera roll and star 20 photos”) not vague (β€œwork on the photo album”).πŸ”²

Character & Progression

11. Character Sheet

#PTest CaseStepsExpected OutcomeStatus
11.1πŸ”΄Character page loadsNavigate to /characterShows level, stats, titles, traits. No crash on first load with seed data.πŸ”²
11.2πŸ”΄Stats are derived from real dataCheck STR, INT, CHA, CON, WIS valuesValues reflect actual quest completions, habit consistency, spending patterns. Not all zeros, not all 20s.πŸ”²
11.3πŸ”΄Level calculationCheck level and XP barLevel matches formula: floor(sqrt(totalLifetimePoints / 10)). XP bar shows progress to next level.πŸ”²
11.4πŸ”΄Radar/pentagon chart rendersView stats sectionFive-axis chart renders correctly. Shape reflects stat distribution (not a perfect pentagon unless all stats equal).πŸ”²
11.5🟑Title earned automaticallyComplete 10th quest in the mission”Questbreaker” title appears in titles section. Notification or visual indication of new title.πŸ”²
11.6🟑Set active titleClick on an earned titleTitle becomes active. Displayed next to name on sidebar and character page.πŸ”²
11.7🟑Locked titles visibleView titles sectionUnearned titles shown as muted silhouettes with ”???” and a hint about the trigger.πŸ”²
11.8🟑Traits displayCheck traits sectionAI-detected traits shown as tags. At least the seeded traits visible.πŸ”²
11.9🟑Stats recompute on stale datalastComputedAt is >1 hour old, load character pageStats recomputed from source data. Updated values shown.πŸ”²
11.10🟒Mission archiveView with seed data from one missionCurrent mission shown with live stats. Format ready for multiple missions.πŸ”²
11.11🟒Stat tooltips or explanationsHover/tap on a stat nameShows what the stat is derived from (e.g., β€œSTR: Physical/home quest completions”)πŸ”²

12. Character β€” Title Triggers

#PTest CaseStepsExpected OutcomeStatus
12.1🟑QuestbreakerComplete 10 quests in one missionTitle awardedπŸ”²
12.2🟑The DisciplinedAchieve 90%+ habits for 4 consecutive weeksTitle awardedπŸ”²
12.3🟑The IndulgentSpend 50+ points in a single weekTitle awarded (Week 3: comics 76pts should trigger)πŸ”²
12.4🟑Debt WalkerNegative balance for 3+ consecutive weeksTitle awarded (Weeks 4-7 in seed data)πŸ”²
12.5🟑Streak RunnerComplete a Tavern Board streak bountyTitle awardedπŸ”²
12.6🟑Zero DarkHit 0% on any habit for a full weekTitle awarded (No sugar at 0 in Week 4)πŸ”²
12.7🟑MarathonComplete a huge (10pt) questTitle awardedπŸ”²
12.8🟑Social ButterflyContact every crew member in a single weekTitle awardedπŸ”²
12.9🟒The ConstantLog activity 30 days in a rowTitle awarded (hard to test manually, verify logic)πŸ”²
12.10🟒Penny PincherEnd a mission with 100+ surplusTitle awarded (check at mission close)πŸ”²
12.11🟑No duplicate titlesTrigger Questbreaker conditions twiceTitle appears only once. earnedAt is first occurrence.πŸ”²

Quartermaster & Social

13. Quartermaster

#PTest CaseStepsExpected OutcomeStatus
13.1πŸ”΄View balance on QuartermasterNavigate to /quartermasterBalance displayed prominently. Matches dashboard balance exactly. Shows total earned and total spent.πŸ”²
13.2πŸ”΄Add wishlist itemAdd β€œLOTR expansion” at 35pts, category=boardgameItem appears in wishlist. Status: wanted.πŸ”²
13.3πŸ”΄Purchase wishlist item (affordable)With balance >= 35, purchase the itemBalance deducts 35. Ledger entry: spend_wishlist. Item status β†’ purchased.πŸ”²
13.4πŸ”΄Purchase wishlist item (not affordable)With balance < item cost, attempt purchasePurchase allowed (can go negative, matching existing economy). Balance goes negative. Red display.πŸ”²
13.5🟑Affordable badgeBalance is 40, item costs 35”AFFORDABLE” green badge on the item.πŸ”²
13.6🟑Progress bar for unaffordableBalance is 15, item costs 35Progress bar at ~43%. Text: β€œ20 points away”.πŸ”²
13.7🟑Affordability projectionAverage earning 15pts/week, item costs 35, balance is 15Shows β€œ~1.3 weeks” or β€œ~2 weeks” estimate.πŸ”²
13.8🟑Quick spend (ad-hoc)Spend 10pts on β€œBracelet” via quick spendLedger entry: spend (not spend_wishlist). Balance deducts. Appears in purchase history.πŸ”²
13.9🟑Purchase historyAfter multiple purchasesChronological list showing wishlist and ad-hoc purchases with dates and amountsπŸ”²
13.10🟒Wishlist sortingMix of affordable and unaffordable itemsAffordable items sorted to top. Within groups, sorted by creation date.πŸ”²
13.11🟒Wishlist category iconsItems with different categoriesEach shows a relevant icon (game, book, boardgame, etc.)πŸ”²

14. Crew Manifest

#PTest CaseStepsExpected OutcomeStatus
14.1πŸ”΄View crew listNavigate to /crewAll crew members displayed as cards with names, relationship, last contact time.πŸ”²
14.2πŸ”΄Ping a crew memberClick Ping on β€œMamÑ”lastContactAt updated to now. Timer resets. Contact log entry created. Visual feedback (pulse animation).πŸ”²
14.3πŸ”΄Last contact in natural languageView a crew member pinged 3 days agoShows β€œ3 days ago” (via date-fns), not a raw timestamp.πŸ”²
14.4🟑Freshness color codingCrew members with varying last contact timesRecently pinged = green border. Overdue = yellow. Very overdue = red. Gradient, not binary.πŸ”²
14.5🟑Sorted by neediest firstView /crewPerson with lowest freshness (most overdue relative to their pattern) at top.πŸ”²
14.6🟑Average frequency computationPing β€œMamÑ” 5 times over 20 daysaverageFrequencyDays computes to ~4 days. Freshness decay calibrated to that rhythm.πŸ”²
14.7🟑New crew member (no history)Add a new person, no pings yetShows β€œNever contacted” or uses creation date. Falls back to 7-day flat decay.πŸ”²
14.8🟑Add crew memberClick Add, fill name/relationship/methodNew card appears in the grid.πŸ”²
14.9🟑Delete crew memberRemove a crew memberCard removed. Contact history cleaned up (or retained for stats).πŸ”²
14.10🟒Crew Pulse on dashboardView dashboard with overdue crewSmall widget showing 2-3 most overdue names with β€œX days agoβ€πŸ”²
14.11🟒Contact log notePing with a note: β€œCalled about birthday plans”Note stored in contact log. Visible somewhere (crew detail or log).πŸ”²
14.12🟒CHA stat reflects crew healthHigh crew contact frequencyCHA stat on character sheet is higher than with poor contact patternsπŸ”²

15. Tavern Board

#PTest CaseStepsExpected OutcomeStatus
15.1πŸ”΄Generate bountiesOn /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 bountyClick Accept on an available bountyStatus β†’ accepted. acceptedAt set. Visual change (highlighted border).πŸ”²
15.3πŸ”΄Complete a bountyClick Complete on an accepted bountyStatus β†’ completed. Points awarded via ledger. Balance increases.πŸ”²
15.4🟑Bounties are context-awareGenerate bounties when habits are weakAt least one bounty targets the weakest habit. AI references actual data.πŸ”²
15.5🟑Streak bounty displayGenerate a streak bountyShows streak progress dots (e.g., ●○○ for 1/3 weeks).πŸ”²
15.6🟑Streak bounty completion bonusComplete week 3/3 of a streakNormal reward + streak bonus points both credited. Two ledger entries.πŸ”²
15.7🟑Bounty expirationWait for bounty to pass expiresAtStatus β†’ expired on next load. Not shown as available.πŸ”²
15.8🟑No duplicate generationGenerate bounties twice in one weekSecond generation either blocked (β€œBounties already posted this week”) or confirms replacement.πŸ”²
15.9🟑Bounty sources are variedInspect generated bountiesNot all same source. Mix of: hobby_inertia, habit_support, quest_nudge, crew_nudge, etc.πŸ”²
15.10🟒Bounty AI personalityRead bounty descriptionsWritten in COMMS voice. Not generic task descriptions. Has personality.πŸ”²
15.11🟒Active bounties on dashboardAccept a bounty, check dashboardActive Bounties widget shows the accepted bounty with progress.πŸ”²
15.12🟒Bounty historyView past weeks’ bountiesCollapsible section showing completed/expired bounties from previous weeks.πŸ”²
15.13🟒Streak Runner titleComplete a full streak bounty”Streak Runner” title triggers on character sheet.πŸ”²

Dashboard & Navigation

16. Dashboard β€” Aggregate View

#PTest CaseStepsExpected OutcomeStatus
16.1πŸ”΄Dashboard loads with all widgetsNavigate to /All widgets render: mission header, character mini-card, quest status, habit pulse, activity feed. No crashes.πŸ”²
16.2πŸ”΄Character mini-cardCheck sidebar or dashboardShows level, active title, balance. Clickable β†’ navigates to /character.πŸ”²
16.3πŸ”΄Quest status countsCheck quest panelCorrect counts: active, complete, blocked. Matches actual data.πŸ”²
16.4πŸ”΄Habit pulse shows current weekCheck habit widgetDot grid for current week. Filled/empty matches actual habit logs. Percentage correct.πŸ”²
16.5🟑Activity feedCheck feed after various actionsShows last 5-8 ledger entries. Most recent first. Descriptions are readable.πŸ”²
16.6🟑Crew pulse widgetCheck with overdue crew membersShows 2-3 most overdue crew with β€œX days ago” text.πŸ”²
16.7🟑Active bounties widgetAccept a bounty, check dashboardShows accepted bounties with progress indicators.πŸ”²
16.8🟒Dashboard data freshnessComplete a quest on /quests, return to /Dashboard reflects the new data immediately (React Query invalidation) or on refresh.πŸ”²

17. Layout & Navigation

#PTest CaseStepsExpected OutcomeStatus
17.1πŸ”΄Desktop sidebar navigationClick each nav link on desktopAll pages load correctly. Active page highlighted in sidebar.πŸ”²
17.2πŸ”΄Mobile bottom tab barView on 375px widthBottom tabs visible: Dashboard, Quests, Habits, Character, More. Tapping works.πŸ”²
17.3πŸ”΄Mobile β€œMore” menuTap More on mobileSheet/menu opens with: Log, Quartermaster, Crew, Tavern links.πŸ”²
17.4🟑Sidebar mission infoCheck desktop sidebarShows mission name, character mini-card (level, title, balance), nav links with icons.πŸ”²
17.5🟑Responsive breakpointsResize from 375px to 1440pxLayout transitions smoothly. No broken layouts at any width.πŸ”²
17.6🟒Page transition animationsNavigate between pagesSubtle transitions (framer-motion). Not jarring. Not slow.πŸ”²

Design & Infrastructure

18. Design β€” Wayfarer Cockpit Aesthetic

#PTest CaseStepsExpected OutcomeStatus
18.1πŸ”΄Color scheme correctVisual inspectionDark navy hull, warm cream text, amber accents. NOT white backgrounds, NOT blue accents.πŸ”²
18.2πŸ”΄Typography correctCheck fonts loadedJetBrains Mono for data/numbers. Space Grotesk for labels/body. Both loaded from Google Fonts.πŸ”²
18.3🟑Panel stylingInspect cards/panelsRounded corners, 1px border, mc-panel background. NO drop shadows.πŸ”²
18.4🟑Section headersCheck any section headerLeft amber border bar (4px), uppercase muted label, small text.πŸ”²
18.5🟑Data readoutsCheck point balance, statsMonospace font. Muted uppercase labels above. Dense, cockpit-like.πŸ”²
18.6🟑Status colorsCheck positive/negative/warning elementsGreen for earned/complete, red for spent/negative, amber for warnings, blue for info. Consistent.πŸ”²
18.7🟒Information densityOverall feelFeels like a cockpit β€” dense, functional, warm. NOT like a blog (too much whitespace) or a corporate dashboard (too sterile).πŸ”²
18.8🟒Interactive feedbackHover over buttons, toggle habitsAmber hover states, 150ms transitions. Point changes have brief scale pulse.πŸ”²

19. Offline & PWA

#PTest CaseStepsExpected OutcomeStatus
19.1🟑Zustand persistenceLoad app, navigate around, hard refreshState restored from localStorage. Last-viewed data shown.πŸ”²
19.2🟑Offline displayDisconnect network, open appShows last-known data from Zustand cache. No blank screen. Error indicator that data may be stale.πŸ”²
19.3🟑PWA installableOpen in Chrome mobile, check install promptApp can be added to home screen. Opens in standalone mode.πŸ”²
19.4🟒Service worker cachingInstall PWA, go offline, open appApp shell loads from SW cache. Static assets available.πŸ”²
19.5🟒Manifest correctCheck /manifest.jsonApp name β€œMission Control”, correct theme colors (mc-hull), icon present.πŸ”²

20. Error Handling & Edge Cases

#PTest CaseStepsExpected OutcomeStatus
20.1πŸ”΄API error on page loadBreak API key, load any pageError state shown (not blank, not crash). Message like β€œComms down, Commander.β€πŸ”²
20.2πŸ”΄Loading statesThrottle network, load each pageEvery page shows loading indicator while fetching. Not blank.πŸ”²
20.3πŸ”΄Empty statesNew mission with zero data on every pageEach page has a meaningful empty state. Not blank, not broken.πŸ”²
20.4🟑AI timeoutSlow network, trigger enrichmentLoading state shown. After timeout, error message. Quest unchanged.πŸ”²
20.5🟑Invalid AI responseAI returns malformed JSON (simulate)Error handled gracefully. User informed. No crash. Original data preserved.πŸ”²
20.6🟑Concurrent mutationsComplete a quest while viewing dashboardNo stale data. React Query invalidation ensures both views update.πŸ”²
20.7🟒Very long quest nameAdd quest with 200-character nameCard truncates gracefully. Detail view shows full name. No layout break.πŸ”²
20.8🟒Rapid clickingDouble-click Complete on a questOnly one completion processed. No duplicate ledger entries.πŸ”²
20.9🟒Deep link to pageNavigate directly to /quests or /character via URLPage loads correctly with all data, not just from root route.πŸ”²

Seed Data & New Features

21. Seed Data Validation

#PTest CaseStepsExpected OutcomeStatus
21.1πŸ”΄All seed quests presentView /questsAll 14 active quests visible in correct categories. Correct sizes and points.πŸ”²
21.2πŸ”΄Quest steps match seedClick Garage protections (step 2/3)Shows step 2 of 3 highlighted. Steps match: Find existing β†’ Buy if needed β†’ Install.πŸ”²
21.3πŸ”΄All 6 habits presentView /habitsWriting (4/wk), Sports (3/wk), Friends (7/wk), Meditate (5/wk), No alcohol (7/wk), No sugar (7/wk).πŸ”²
21.4🟑Crew seededView /crewLaura, family members, and friends present with placeholder contact dates.πŸ”²
21.5🟑Wishlist seededView /quartermaster2-3 wishlist items with realistic prices.πŸ”²
21.6🟑Blocked quest visibleCheck Homelab questShows as blocked with distinct visual.πŸ”²
21.7🟒Categories correctEach quest is in the right category column/groupHome quests in Home, Kids in Kids, etc. None miscategorized.πŸ”²
21.8🟑Last Pings seededView /pings4 pings present: Kira’s litter, Watered plants, Changed bed sheets, Backed up phone.πŸ”²
21.9🟑Media Log seededView /media4 entries: Severance S2 (watching), Nosferatu (want_to_watch), White Lotus S3 (want_to_watch), Andor S1 (completed, 5 stars).πŸ”²

22. Last Ping

#PTest CaseStepsExpected OutcomeStatus
22.1πŸ”΄View pings listNavigate to /pingsAll pings displayed as cards with names, icons, last ping time.πŸ”²
22.2πŸ”΄Ping an itemClick 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 languageView a ping done 3 days agoShows β€œ3 days ago” (via date-fns), not a raw timestamp.πŸ”²
22.4🟑Freshness color codingPings with varying last-ping timesRecently pinged = green border. Overdue = yellow. Very overdue = red. Gradient, not binary.πŸ”²
22.5🟑Sorted by neediest firstView /pingsPing with lowest freshness (most overdue relative to its pattern) at top.πŸ”²
22.6🟑Average frequency computationPing β€œKira’s litter” 5 times over 15 daysaverageFrequencyDays computes to ~3 days. Freshness decay calibrated accordingly.πŸ”²
22.7🟑New ping (no history)Create a new ping, no prior pingsShows β€œjust now” (created with lastPingedAt = now). Falls back to 7-day flat decay.πŸ”²
22.8🟑Add a pingClick Add, fill name and pick iconNew card appears in the grid.πŸ”²
22.9🟑Delete a pingRemove a pingCard removed. Log entries cleaned up.πŸ”²
22.10🟑Ping history viewTap/expand a ping cardShows last 5-10 log entries with dates. Frequency pattern visible.πŸ”²
22.11🟑Ping with notePing with note: β€œUsed the new brand”Note stored in log entry. Visible in history.πŸ”²
22.12🟒Last Ping Pulse on dashboardView dashboard with overdue pingsSmall widget showing 2-3 most overdue pings with β€œX days ago”.πŸ”²
22.13🟒Icon picker on creationAdd a new pingSubset of Lucide icons available to pick from (cat, droplets, car, bed, etc.). Selected icon displays on card.πŸ”²
22.14🟒Pings persist across missionsCreate new mission, check /pingsSame pings visible. Not mission-scoped.πŸ”²
22.15🟒Signal decay matches crew formulaCompare visually to crew cardsSame freshness formula: `1.0 - clamp(days / (avg * 1.5

23. Ship’s Log β€” Media Tracker

#PTest CaseStepsExpected OutcomeStatus
23.1πŸ”΄View media listNavigate to /mediaAll media entries displayed. Grouped or filtered by status.πŸ”²
23.2πŸ”΄Add media entryAdd β€œDune Part 3” as movie, want_to_watchEntry created. Appears in β€œWant to Watch” view.πŸ”²
23.3πŸ”΄Start watchingClick β€œStart Watching” on a want_to_watch entryStatus β†’ watching. startedAt set to now. Card moves to Watching section.πŸ”²
23.4πŸ”΄Complete mediaClick β€œComplete” on a watching entryPrompted for 1-5 star rating. After rating: status β†’ completed, completedAt set, rating saved.πŸ”²
23.5πŸ”΄Hobby points on completionComplete a TV show seasonLedger entry created: earn_hobby, +3 pts. Mission balance increases.πŸ”²
23.6🟑Different media type pointsComplete a movie (1pt), documentary (2pt), TV season (3pt)Each creates correct ledger entry with correct point value.πŸ”²
23.7🟑Drop mediaClick β€œDrop” on a watching entryStatus β†’ dropped. No points awarded. Card moves to dropped/completed section.πŸ”²
23.8🟑Filter by statusClick β€œWatching” tab/filterOnly watching entries shown. Other tabs work similarly.πŸ”²
23.9🟑Filter by typeFilter to only tv_show entriesOnly TV shows displayed.πŸ”²
23.10🟑Rating displayView completed entry with rating 4Shows 4/5 stars or equivalent visual.πŸ”²
23.11🟑Season numberAdd β€œSeverance S2” with seasonNumber=2Season number displayed on card: β€œSeason 2”.πŸ”²
23.12🟑Quick statsView stats section on /mediaShows total watched this mission, breakdown by type, total points earned from media.πŸ”²
23.13🟑Edit media entryChange notes or type on existing entryChanges persist after refresh.πŸ”²
23.14🟑Delete media entryRemove an entryEntry deleted. If it was completed, ledger entry remains (history intact).πŸ”²
23.15🟒Media persists across missionsCreate new mission, check /mediaSame entries visible. Not mission-scoped. Points earned go to active mission.πŸ”²
23.16🟒Tavern Board references media backlogGenerate bounties with want_to_watch entriesAt least one bounty source is media_backlog referencing a want_to_watch item.πŸ”²
23.17🟒Notes on media cardAdd entry with notesNotes preview visible on card. Full notes in detail view.πŸ”²

24. Habit Mutations

#PTest CaseStepsExpected OutcomeStatus
24.1🟑Debrief includes mutation fieldGenerate a debrief for any weekResponse JSON includes habitMutations array (may be empty). No crash if empty.πŸ”²
24.2🟑Evolve mutation suggestedGenerate debrief for a week where Writing has been 90%+ for 4+ consecutive weekshabitMutations contains an evolve suggestion for Writing (e.g., increase to 5/week).πŸ”²
24.3🟑Simplify mutation suggestedGenerate debrief for a week where No sugar has been <25% for 3+ weekshabitMutations contains a simplify suggestion for No sugar (e.g., reduce to 3/week).πŸ”²
24.4🟑Mutation card UI β€” evolveView debrief with evolve mutationGreen-bordered card with upward arrow, shows currentβ†’proposed change, Accept and Dismiss buttons.πŸ”²
24.5🟑Mutation card UI β€” simplifyView debrief with simplify mutationAmber-bordered card with adjustment icon, shows currentβ†’proposed change, Accept and Dismiss buttons.πŸ”²
24.6πŸ”΄Accept mutationClick Accept on a mutation cardHabitDefinition updated with proposed change (e.g., daysPerWeek 4β†’5). Change reflected on /habits page.πŸ”²
24.7🟑Dismiss mutationClick Dismiss on a mutation cardCard hidden/removed. No changes to HabitDefinition. Debrief still shows the narrative.πŸ”²
24.8🟑Mutation personalityRead the mutation suggestion textWritten in COMMS voice. Evolve: encouraging but not sycophantic. Simplify: honest, pragmatic.πŸ”²
24.9🟒No mutation when not warrantedGenerate debrief for a normal week (no extreme patterns)habitMutations array is empty. No mutation cards shown.πŸ”²
24.10🟒Mutation doesn’t double-fireGenerate debrief twice for same weekSame cached debrief returned. Accepting mutation twice doesn’t apply change twice.πŸ”²
24.11🟒Accepted mutation visible next weekAccept evolve (4β†’5/week), navigate to /habits next weekHabit grid shows 5 target. New target in effect.πŸ”²

Summary

SectionπŸ”΄ Critical🟑 Important🟒 Nice-to-haveTotal
1. Missions2316
2. Quests CRUD54110
3. Quest Steps2316
4. Signal Decay0325
5. Habits54211
6. Point Economy4329
7. Weekly Log2305
8. AI Enrichment4329
9. AI Debrief2518
10. AI Salvage1315
11. Character45211
12. Title Triggers09211
13. Quartermaster45211
14. Crew Manifest36312
15. Tavern Board36413
16. Dashboard4318
17. Navigation3216
18. Design2428
19. PWA/Offline0325
20. Error Handling3339
21. Seed Data3519
22. Last Ping38415
23. Ship’s Log59317
24. Habit Mutations17311
TOTAL6511346224
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.