"The difference between good products and great products is how they behave in the edge cases."
This document catalogs every possible way a user can interact with LoopKit — happy paths, edge cases, error states, and recovery flows. Use this for QA, support, and onboarding design.
**Scenario ID:** SC-[COMMAND]-[NUMBER]
**Title:** [Short description]
**Persona:** [Who experiences this]
**Trigger:** [What the user does]
**Pre-conditions:** [What must be true]
**Flow:** Step-by-step
**Expected Outcome:** [What should happen]
**Edge Cases:** [What could go wrong]
Persona: Alex (First-Time Founder)
Trigger: Runs loopkit init for the very first time
Pre-conditions: No .loopkit/ directory exists
Flow:
- User runs
loopkit init - System detects no existing projects, creates
.loopkit/directory - Clack prompts appear one by one:
- "What are you building?" → "An AI tool for dentists"
- "What problem does it solve?" → "Dentists spend 2 hours/day on insurance claims"
- "Who is your ideal customer?" → "Solo dental practices with 1-3 staff"
- "Why hasn't this been solved?" → "Existing solutions are enterprise-only and expensive"
- "What's your MVP?" → "A web app that reads insurance forms and fills them automatically"
- AI analyzes answers (2-3 seconds, streaming progress shown)
- Scores displayed: ICP 9/10, Problem 8/10, MVP 7/10, Overall 8/10
- Brief rendered in terminal with bet, riskiest assumption, validation plan
- Files saved:
.loopkit/projects/ai-dentist/brief.mdand.loopkit/projects/ai-dentist/brief.json config.jsonupdated withactiveProject: "ai-dentist"tasks.mdscaffold created with AI-personalized tasks
Expected Outcome: User has a validated brief and a clear plan for Week 1
Edge Cases:
- SC-INIT-01a: User presses Ctrl+C at question 3 → draft.json saved, resume offered on next run
- SC-INIT-01b: AI service unavailable → answers saved without scores,
--analyzesuggested - SC-INIT-01c: User answers with < 5 words → soft warning shown, user can proceed anyway
- SC-INIT-01d: User's answer to Q2 contains "app that" or "platform that" → solution-in-disguise flag shown
Persona: Marcus (Indie Hacker)
Trigger: Runs loopkit init saas but project "saas" already exists
Pre-conditions: .loopkit/projects/saas/ exists
Flow:
- User runs
loopkit init saas - System detects existing project
- Prompt: "Project 'saas' already exists. What would you like to do?"
- Overwrite existing
- Create new version (saas-v2)
- Resume from draft
- User selects "Create new version"
- Project saved as "saas-v2"
Expected Outcome: No data loss, user has clear options
Edge Cases:
- SC-INIT-02a: User chooses "Overwrite" → old brief.md backed up with timestamp? (No — we warn but respect choice)
- SC-INIT-02b: 10 versions exist (saas-v1 through saas-v10) → suggest "saas-v11" automatically
Persona: Jordan (Side Project Shipper)
Trigger: Runs loopkit init without ANTHROPIC_API_KEY and without loopkit auth
Pre-conditions: No auth configured
Flow:
- User runs
loopkit init - System detects no API key and no auth token
- Prompts continue normally (all 5 questions)
- After last question: "AI analysis requires authentication. Run
loopkit author set ANTHROPIC_API_KEY. Your answers have been saved." - Brief saved without scores: "AI analysis unavailable. Scores pending."
Expected Outcome: User doesn't lose work, clear next step provided
Persona: Sarah (Solo Founder)
Trigger: Runs loopkit track on Wednesday afternoon
Pre-conditions: tasks.md exists with 5 tasks (2 done, 3 open)
Flow:
- User runs
loopkit track - System reads
tasks.md - Board displayed:
✓ #1 Set up landing page (2 days ago) ✓ #2 Configure Stripe (1 day ago) ○ #3 Implement auth flow ○ #4 Write privacy policy ○ #5 Set up analytics - Shipping score: 40% (2/5)
- One stale task detected (#3, open for 4 days)
- Prompt: "Task #3 'Implement auth flow' has been open for 4 days. Keep / Snooze / Cut?"
- User selects "Keep"
- Board re-renders
Expected Outcome: Clear visibility into progress, stale items surfaced
Edge Cases:
- SC-TRACK-01a: No tasks.md exists → "No tasks found. Run
loopkit track --addto create your first task." - SC-TRACK-01b: All tasks done → "All tasks complete! Shipping score: 100%. Time to ship?"
- SC-TRACK-01c: 0 tasks done, 5 open → "Shipping score: 0%. Tip: Start with the smallest task to build momentum."
- SC-TRACK-01d: User is not in a git repo → "Warning: Not a git repository. Git hook features disabled. Run
git initto enable auto-close."
Persona: Marcus (Indie Hacker)
Trigger: Commits with git commit -m "[#2] Fix OAuth redirect"
Pre-conditions: Git hook installed, task #2 exists and is open
Flow:
- User writes commit message with
[#2] - Git hook fires (commit-msg)
- Hook reads tasks.md, finds task #2
- Task #2 marked as done, closedVia set to commit SHA
- Commit proceeds normally
- User runs
loopkit track→ sees task #2 as done
Expected Outcome: Zero-friction task management
Edge Cases:
- SC-TRACK-02a: Task #2 already done → hook appends to closedVia (comma-separated SHAs), no error
- SC-TRACK-02b: Task #999 doesn't exist → hook warns but doesn't block commit: "Warning: Task #999 not found in tasks.md"
- SC-TRACK-03c: Multiple tasks:
[#2] [#4] Update both flows→ both tasks closed - SC-TRACK-02d: Hook takes > 50ms → optimize by reading COMMIT_EDITMSG directly instead of execSync
Persona: Marcus (Indie Hacker) Trigger: Has an idea while coding, wants to capture it
Flow (inline):
- User runs
loopkit track --add "Add dark mode toggle" - Task appended to tasks.md with next sequential ID and today's date
- Output: "✓ Task #6 added"
Flow (editor):
- User runs
loopkit track --add(no argument) - $EDITOR opens with a blank file
- User types multi-line task description
- Saves and exits
- Task added with next sequential ID
Expected Outcome: Ideas captured instantly without breaking flow
Edge Cases:
- SC-TRACK-03a: $EDITOR not set, nano not available → fallback to
vi, then prompt for text - SC-TRACK-03b: User saves empty file → "No task text provided. Task not added."
- SC-TRACK-03c: tasks.md has IDs [1,2,3,5] (missing #4) → next ID is 6 (doesn't reuse 4)
Persona: Marcus (Indie Hacker) Trigger: Wants to check status of a different project
Flow:
- User runs
loopkit track --project old-saas - System checks if project exists
- If yes: updates
config.activeProjectto "old-saas", shows that project's board - If no: "Project 'old-saas' not found. Run
loopkit init old-saasto create it."
Expected Outcome: Seamless context switching
Persona: Sarah (Solo Founder) Trigger: Just deployed v1.0, ready to announce Pre-conditions: brief.json exists, tasks.md has completed tasks
Flow:
- User runs
loopkit ship - System reads brief.json for context
- System reads tasks.md for completed tasks
- Prompt: "What's the main thing you shipped?" → "Launched the MVP with auth and core feature"
- Pre-launch checklist:
- README updated? [y/n] → y
- Landing page live? [y/n] → y
- Analytics set up? [y/n] → y
- Feedback channel ready? [y/n] → y
- AI generates drafts (streaming progress)
- Three drafts shown:
- HN: title + body
- Twitter: 3 tweets
- IH: narrative post
- Per-draft actions: [u]se / [e]dit / [r]egenerate / [s]kip
- User presses [u] for Twitter, [e] for HN (edits in $EDITOR), [s] for IH
- Ship log saved to
.loopkit/ships/2026-04-26.md
Expected Outcome: User launches on multiple platforms in < 15 minutes
Edge Cases:
- SC-SHIP-01a: No brief.json → fallback to 2 inline questions for context
- SC-SHIP-01b: AI fails mid-generation → saves log with what user manually entered, shows error message
- SC-SHIP-01c: Ship log already exists for today → prompt: "Ship log for today exists. Overwrite / Append / Skip?"
- SC-SHIP-01d: $EDITOR not set → falls back to nano, then vi, then inline prompt
Persona: Marcus (Indie Hacker) Trigger: Doesn't like the Twitter thread AI generated
Flow:
- User sees Twitter draft, presses
[r]egenerate - System re-calls AI with same context but slightly varied prompt
- New Twitter thread generated
- User sees new draft, chooses
[u]se
Expected Outcome: User gets alternatives without starting over
Persona: Alex (First-Time Founder) Trigger: Wants to start collecting feedback after landing page launch
Flow:
- User runs
loopkit pulse --share - System checks auth → verifies token
- Reads active project name and slug from config
- Calls
/api/pulse/share→ creates/gets project in Convex - Returns URL + QR code in terminal
- User shares URL in 3 relevant communities
- Responses start coming in
- User runs
loopkit pulse→ sees count, still < 5, shows raw
Expected Outcome: Feedback collection starts in < 2 minutes
Edge Cases:
- SC-PULSE-01a: Not authenticated → "Authentication required. Run
loopkit authfirst." - SC-PULSE-01b: No active project → "No active project. Run
loopkit initfirst." - SC-PULSE-01c: API call fails → shows error with URL to check status manually
Persona: Sarah (Solo Founder) Trigger: Has collected 12 responses, wants insights
Flow:
-
User runs
loopkit pulse -
System reads 12 responses from
.loopkit/pulse/responses.json -
Spinner: "Clustering feedback..."
-
AI generates clusters (streaming: "3 fields parsed")
-
Output:
● Fix now (3) Users confused by onboarding → "I couldn't figure out how to create my first project" → "The welcome screen is overwhelming" → "I clicked around for 5 minutes and gave up" ● Validate later (5) Requests for team features → "Can my co-founder see the dashboard too?" → "I need to share this with my team" ● Noise (4) Unrelated praise and complaints Confidence: 85% clearly clustered -
Prompt: "Tag 'Users confused by onboarding' to this week's sprint?"
-
User confirms → task added to tasks.md
Expected Outcome: 12 raw responses → 3 actionable insights in 10 seconds
Edge Cases:
- SC-PULSE-02a: AI clustering fails → shows raw responses with apology message
- SC-PULSE-02b: All responses are outliers → "Low confidence (30%). Consider collecting more targeted feedback."
- SC-PULSE-02c: User runs with
--rawflag → skips AI, shows numbered list
Persona: Marcus (Indie Hacker) Trigger: Gets a DM from a user with feedback
Flow:
- User runs
loopkit pulse --add "User said the pricing page is confusing" - Response appended to
.loopkit/pulse/responses.json - Output: "Response added (6 total). Need 4 more for AI clustering."
Expected Outcome: Feedback captured in 3 seconds
Persona: Jordan (Side Project Shipper) Trigger: Sunday 9 AM, weekly synthesis time Pre-conditions: 3 weeks of loop logs exist, tasks done this week
Flow:
- User runs
loopkit loop - System aggregates data locally (< 1 second):
- Tasks done: 4, Tasks total: 5, Shipping score: 80%
- Last ship: 3 days ago
- Pulse responses: 8
- 3-week streak active
- AI synthesis (2-3 seconds):
The One Thing: Fix the onboarding drop-off Rationale: 3/8 pulse responses mention onboarding confusion. Your shipping score is strong (80%). This is the highest-leverage fix before next ship. Tension: Your track plan focuses on "API docs" but pulse says "onboarding" is the blocker. Consider reprioritizing. - Prompt: "Accept / Change / Skip"
- User presses "Accept"
- BIP post generated (280-char check passes)
- Loop log saved to
.loopkit/logs/week-16.md - Output: "Next: loopkit init" (if no active project) or "Next: loopkit track"
Expected Outcome: Clear priority for next week, public accountability post ready
Edge Cases:
- SC-LOOP-01a: No tasks done this week → "Unstuck mode": AI offers 3 micro-tasks based on brief context
- SC-LOOP-01b: Override rate > 50% for 4 weeks → "You've overridden the AI recommendation 6 of the last 8 weeks. The system works best when you trust it. Consider why you disagree so often."
- SC-LOOP-01c: First week ever → asks 2 inline questions, no AI needed
- SC-LOOP-01d: Mid-week (Wednesday) → "Mid-week check-in. Full synthesis available on Sunday. Here's your progress so far..."
Persona: Marcus (Indie Hacker) Trigger: Disagrees with AI recommendation
Flow:
- AI recommends: "The One Thing: Fix onboarding"
- Marcus wants to work on API docs instead
- User selects "Change"
- Prompt: "What's your priority instead?"
- User enters: "Write API documentation"
- Prompt: "Why? (helps us improve recommendations)"
- User enters: "A potential enterprise customer is waiting for API docs"
- Override recorded with reason
- BIP post still generated based on actual week data
Expected Outcome: User maintains agency, system learns from overrides
Persona: Sarah (Solo Founder) Trigger: Wants to use AI features without managing an API key
Flow:
- User runs
loopkit auth - Spinner: "Generating authentication session"
- Code generated (e.g., "A7B9C2")
- User shown URL:
http://localhost:3000/cli-auth?code=A7B9C2 - User opens URL in browser, logs in with GitHub
- Web app completes flow, token sent to CLI session
- CLI receives token, saves encrypted to config.json
- Output: "✓ You are now logged in and ready to ship."
Expected Outcome: Seamless browser-to-CLI auth
Edge Cases:
- SC-AUTH-01a: User doesn't complete browser flow within 2 minutes → "Authentication timed out. Please try running loopkit auth again."
- SC-AUTH-01b: Browser auth fails → error propagated to CLI
- SC-AUTH-01c: Token expires (401 on next API call) → "Your session has expired. Please run
loopkit authto log in again."
Persona: Sarah (Solo Founder) Trigger: First week using LoopKit
Monday:
loopkit init my-saas→ brief created, tasks.md scaffolded with AI-personalized tasks- Adds 5 tasks to "This Week"
Tuesday-Thursday:
- Codes, commits with
[#1],[#2]→ tasks auto-close loopkit trackdaily to check progress
Friday:
- Ships feature
loopkit ship→ generates launch copy, posts to Twitter- Ship log saved
Saturday:
- Shares feedback form from
loopkit pulse --share - Gets 5 responses in Discord
Sunday:
loopkit loop→ synthesis recommends next week's focus- Accepts recommendation
- BIP post shared on Twitter
- 1-week streak started
Expected Outcome: Complete shipping loop closed in 7 days
Persona: Marcus (Indie Hacker) Trigger: Managing 2 active projects
Flow:
- Monday:
loopkit track --project ai-image-gen→ works on Project A - Wednesday:
loopkit ship→ ships Project A feature - Thursday:
loopkit track --project chrome-extension→ switches to Project B - Friday:
loopkit pulse --share→ creates feedback form for Project B - Sunday:
loopkit loop→ synthesis for Project B (the active project)
Expected Outcome: Clear separation of project contexts
Edge Cases:
- SC-CROSS-02a: Forgets which project is active →
loopkit trackshows project name in header - SC-CROSS-02b: Tries to pulse share for wrong project → always uses active project, user must switch first
Persona: Jordan (Side Project Shipper) Trigger: Using LoopKit on free tier
Flow:
loopkit init→ works fine (no AI needed, or brief saved without scores)loopkit track→ works fully (local only)loopkit ship→ AI generates drafts, uses 1 of 10 daily AI callsloopkit pulse→ 5 responses, AI clusters, uses 1 AI callloopkit loop→ AI synthesis, uses 1 AI call- Day 1 total: 3 AI calls used
- Day 2: Tries
loopkit init --analyze→ uses 1 call - Day 5: Has used 9 calls → next call shows warning: "1 AI call remaining today"
- Day 5 (later): Tries another call → "Rate limit exceeded: 10/10 AI calls today. Upgrade for unlimited."
Expected Outcome: Clear usage tracking, gentle upgrade prompts, no hard lockouts
Trigger: User runs loopkit init while offline
Flow:
- User answers all 5 questions (local, works offline)
- AI analysis attempted → network error
- System: "AI analysis unavailable while offline. Your answers have been saved. Run
loopkit init --analyze my-projectwhen you're back online." - Brief saved without scores
Recovery: User connects to internet, runs --analyze, gets full brief
Trigger: config.json is manually edited and malformed
Flow:
- Any command reads config
- JSON parse fails
- System: "Warning: Config file corrupted. Resetting to defaults. Your project data is safe."
- Config reset to
{version: 1} - Command continues with defaults
Recovery: User re-runs loopkit auth if needed, re-sets active project
Trigger: User accidentally deletes tasks.md
Flow:
- User runs
loopkit track - System: "No tasks found. Run
loopkit track --addto create your first task." - User can recreate tasks, but historical data is lost
Prevention: Git commits should include tasks.md
Trigger: User's commit-msg hook is corrupted by another tool
Flow:
- LoopKit's hook is append-only (never overwrites)
- If another tool overwrites the hook, LoopKit's pattern detection won't work
- User runs
loopkit track→ detects hook missing, offers to reinstall - User confirms → hook reinstalled (append-only, preserving other tool's logic)
Prevention: Append-only hook design respects existing hooks
Persona: Alex (First-Time Founder) Trigger: Just installed LoopKit, never used it
Flow:
npm install -g loopkitloopkit --help→ sees 5 commands, intriguedloopkit init→ guided through first brief- Sees score bar, feels relief (or motivation to improve)
- Reads brief.md → "I finally have a plan!"
loopkit track --add "Interview 5 potential users"- Week 1: tracks progress, feels accountability
- Sunday:
loopkit loop→ first synthesis, feels direction
Expected Outcome: From install to first loop closed in 7 days
Persona: Marcus (Indie Hacker) Trigger: Heard about LoopKit, thinks it's "just another tool"
Flow:
- Sees tweet about LoopKit
- Installs skeptically
loopkit init→ answers questions quickly, expects generic advice- Sees AI flag his solution-in-disguise answer → "Wait, that's actually helpful"
- Gets specific validation plan → "This is better than my Notion template"
loopkit ship→ AI generates Twitter thread → "This would have taken me 30 minutes"- Converts to daily user
Expected Outcome: Skeptic becomes advocate in 1 week
Persona: Alex (First-Time Founder) Trigger: Completes first loop (week 1) Pre-conditions: First loop log saved
Flow:
- User runs
loopkit loopon Sunday - Week number detected: 1
- Milestone detection logic identifies "first week completed"
- Encouraging message displayed: "🎉 First week complete! The hardest week is behind you."
- Milestone trigger synced to Convex (if authenticated)
- Email notification sent (if opted in)
Expected Outcome: User feels celebrated and motivated to continue
Edge Cases:
- SC-GROWTH-01a: Not authenticated → milestone still detected, no Convex sync, no email
- SC-GROWTH-01b: Week 1 but no loop log → milestone not triggered (requires actual loop completion)
Persona: Sarah (Solo Founder)
Trigger: Cron job runs loopkit remind:friday at 4 PM on Friday
Pre-conditions: Cron job installed via loopkit init --cron
Flow:
- Cron job executes at 4 PM Friday
- Command runs
loopkit remind:friday - System checks if user shipped this week (has ship log)
- If shipped: Terminal notification "🚀 You shipped this week! Great job!"
- If not shipped: Terminal notification "
⚠️ Haven't shipped yet this week. Time to ship?" with option to runloopkit ship - User can respond with [s] to run ship immediately or dismiss
Expected Outcome: Gentle nudge helps user remember to ship before weekend
Edge Cases:
- SC-GROWTH-02a: Terminal notifications not supported on platform → falls back to console output
- SC-GROWTH-02b: Cron job not installed → reminder never runs (user must install manually)
Persona: Marcus (Indie Hacker)
Trigger: Runs loopkit init --validate to stress-test brief
Pre-conditions: Brief exists (new or existing)
Flow:
- User runs
loopkit init my-saas --validate - Normal init flow completes (questions answered, brief generated)
- After brief saved, validation prompt appears: "Running devil's advocate validation..."
- AI generates 3 challenging questions based on brief
- Questions displayed in terminal box
- Encouragement message: "These questions are designed to strengthen your thinking, not discourage you."
- Prompt: "Want to iterate on your brief based on these questions?" [y/n]
- If yes: Suggestion to run
loopkit init --analyze my-saasto update
Expected Outcome: User catches potential weaknesses before building
Edge Cases:
- SC-GROWTH-03a: AI unavailable → validation skipped, warning shown
- SC-GROWTH-03b: User says no → validation complete, brief remains as-is
Persona: Jordan (Side Project Shipper)
Trigger: First-time user runs loopkit init
Pre-conditions: No aliases installed yet
Flow:
- User completes
loopkit init - After brief saved, prompt appears: "Install shell aliases for faster commands? (Recommended)"
- User selects yes
- System detects shell (zsh/bash/fish)
- Aliases appended to shell config file:
lk→loopkitlks→loopkit shiplkl→loopkit looplkt→loopkit track
- config.json updated with
aliasesInstalled: true - Output: "Shell aliases installed: lk, lks, lkl, lkt. Restart your shell to apply changes."
Expected Outcome: User can use shorter commands after shell restart
Edge Cases:
- SC-GROWTH-04a: User declines → aliases not installed, can run
loopkit aliaseslater - SC-GROWTH-04b: Shell not detected → message shown with manual instructions
- SC-GROWTH-04c: Config file not found → falls back to default locations
Persona: Sarah (Solo Founder) Trigger: Traveling on Wednesday, wants to run loop early Pre-conditions: Previous loop was 5 days ago
Flow:
- User runs
loopkit loop --async - System detects it's not Sunday
- Async mode enabled: skips mid-week check-in prompt
- Checks days since last loop: 5 days (within 7-day window)
- Proceeds with full AI synthesis
- Output shows "Week 7 Review (Async Mode)"
- Loop log saved normally
- Streak preserved (not broken by running early)
Expected Outcome: User can maintain streak despite scheduling constraints
Edge Cases:
- SC-GROWTH-05a: More than 7 days since last loop → warning: "It's been 8 days since your last loop. Your streak may be affected."
- SC-GROWTH-05b: No previous loop → proceeds normally (first loop)
Persona: Marcus (Indie Hacker)
Trigger: Running loopkit track on Thursday afternoon
Pre-conditions: Shipping score is 60%, 2 tasks remaining
Flow:
- User runs
loopkit track - System calculates shipping score: 60% (3/5 tasks done)
- Detects conditions: score 50-70% range, exactly 2 tasks open
- Nudge displayed: "Almost there — 2 tasks left to hit 80%."
- Suggested actions shown:
- "→ loopkit track #4 --done (if you finished it)"
- "→ loopkit track #4 --snooze tomorrow"
- User motivated to complete tasks before end of week
Expected Outcome: Small nudge helps user reach higher completion rate
Edge Cases:
- SC-GROWTH-06a: Score outside 50-70% range → no nudge shown
- SC-GROWTH-06b: Not exactly 2 tasks remaining → no nudge shown
Persona: Jordan (Side Project Shipper) Trigger: Completes 4-week streak Pre-conditions: User has streak ≥4, referral not yet shown
Flow:
- User runs
loopkit loop - Current streak calculated: 4 weeks
- System checks config:
referralShownis false - Prompt appears: "Share LoopKit with a founder friend and get 1 month of Solo free?"
- User selects yes
- System generates 8-character referral code (e.g., "a3b7c9d2")
- Referral link displayed: "loopkit.dev/r/a3b7c9d2"
- Encouragement: "Share this link — when a friend signs up, you both get 1 month free."
- config.json updated with
referralShown: trueandreferralCode: "a3b7c9d2"
Expected Outcome: User motivated to share, referral system activated
Edge Cases:
- SC-GROWTH-07a: User declines → referral not shown again (flag prevents repeat prompts)
- SC-GROWTH-07b: Streak < 4 → referral prompt not shown yet
Persona: Sarah (Solo Founder)
Trigger: Runs loopkit celebrate --share after shipping
Pre-conditions: User is authenticated, has shipping score
Flow:
- User runs
loopkit celebrate --share - Celebration card displayed with score, streak, rank
- System checks authentication status
- If authenticated:
- Reads pulse responses count
- Builds public win payload (product name, week, score, streak, tasks, feedback)
- Syncs to Convex via
/api/sync/win - Output: "Win posted to public feed at loopkit.dev/wins"
- If not authenticated:
- Warning: "Not authenticated — win not posted to public feed. Run
loopkit authto enable sharing." - Celebration still displays locally
- Warning: "Not authenticated — win not posted to public feed. Run
Expected Outcome: User's win shared to community for accountability and discovery
Edge Cases:
- SC-GROWTH-08a: API call fails → warning shown, celebration still completes
- SC-GROWTH-08b: Not authenticated → clear next step provided
Persona: Marcus (Indie Hacker) Trigger: Missed a week, streak broken after 8-week run Pre-conditions: Previous streak was 8 weeks
Flow:
- User runs
loopkit loopafter 2-week gap - System detects streak break (gap > 7 days)
- Milestone detection identifies "streak break after 8 weeks"
- Encouraging message: "You had an 8-week streak before! Life happens — what matters is you're back."
- Encouragement to restart: "Let's build a new streak together."
- Streak counter resets to 0, starts counting from this week
Expected Outcome: User feels supported rather than guilty about breaking streak
Edge Cases:
- SC-GROWTH-09a: First streak break after 4+ weeks → milestone triggered
- SC-GROWTH-09b: First week ever → no streak break milestone (no previous streak)
Persona: Alex (First-Time Founder)
Trigger: Logs first revenue via loopkit revenue or loopkit loop --revenue
Pre-conditions: Previous revenue was null or 0
Flow:
- User runs
loopkit revenue 100(orloopkit loop --revenue 100) - System detects first revenue (previous was 0)
- Milestone detection identifies "first revenue"
- Celebration message: "🎉 First dollar! This is a huge milestone. Many founders never make it here."
- Milestone synced to Convex
- Email notification sent (if opted in)
Expected Outcome: User feels celebrated for reaching first revenue milestone
Edge Cases:
- SC-GROWTH-10a: Revenue logged is $0 → not considered first revenue milestone
- SC-GROWTH-10b: Revenue already > 0 → milestone not triggered
Last updated: April 2026 · Phase 13 growth loops added