Streak Compassion — PRD (Penny-proposed)
Product: Objectuve (codename: Enkidu) Feature bundle: Starter freeze token + streak repair window + compassionate break messaging + "Comeback" badge Status: Shipped — April 2026 (v1.11, Phases 49–52, v3.9.34) Date: 2026-04-27 Proposer: Penny (Product Lead, autopilot run OBJ-56) PRD file: docs/product/completed/streak-compassion-prd.mdConfidence: High
1. Problem Statement
Streaks are Objectuve's most powerful retention mechanic — and also its highest-churn moment. The competitive analysis (docs/product/competitive/streak-science.md) and Duolingo's published data both converge on the same finding: the moment a user breaks a streak is the single highest predictor of app abandonment. Users who lose a streak are significantly less likely to return than users who never built one.
Objectuve already has earned freeze tokens (one per 7-day milestone). What it does not yet have:
A safety net on day 1. New users have no protection until they've earned their first freeze at day 7. The first week — when habit formation is most fragile — is exactly when the safety net is missing. Duolingo's data confirms: users who have a freeze in inventory check in more consistently than users who don't, even when they never use it. The endowment effect alone (Kahneman & Tversky, 1979) drives engagement.
A second chance after a break. Once a streak breaks, it's gone. Marlatt and Gordon's "Abstinence Violation Effect" predicts what happens next: many users abandon entirely rather than start a "ruined" streak at day 1.
Compassionate framing at the worst moment. Today, a broken streak surfaces as a system fact. There is no Coach voice to reframe it. Lally et al. (2010) showed that missing a single day has negligible effect on actual habit formation — the science says a single miss is fine. The product should say so too.
A reward for resilience. Rebuilding a streak after a break is one of the hardest things a user can do. Today, that effort earns no specific recognition.
The fix is a small, tightly-scoped bundle of mechanics — none individually large, but together addressing the highest-leverage retention moment in the product.
2. Goals & Success Metrics
Primary Goals
- Reduce post-streak-break churn (the largest retention cliff in the funnel).
- Increase day-1 engagement of new users by establishing the freeze-token endowment from sign-up.
- Reframe streak breaks as rest, not failure — aligning the product with the science of habit formation and with Objectuve's anti-shame brand voice.
Success Metrics
| Metric | Target | Measurement |
|---|---|---|
| % of users who return within 48h of a broken streak | +20pp vs. current cohort | Cohort comparison pre/post launch |
| % of users who repair a broken streak (when offered) | 25%+ | Repair acceptances / total broken-streak events with offer eligible |
| % of D1 users who use freeze in week 1 | 5–10% | Starter token usage; reflects safety net being load-bearing |
| % of new users still active at D14 | +5pp vs. control | Cohort holdout if we A/B; otherwise pre/post cohorts |
| "Comeback" badge unlock rate among returning lapsed users | 15%+ | Comeback events / lapsed-then-returned users |
| Net change in goal completion rate (north star) | +0%, no regression | Per-user goal completion conversion |
Guardrails
- No paywall. Every mechanic in this bundle must be free-tier. Streak repair is paid in earned XP, not cash — never gated behind Supporter tier. (See PBC commitments, MISSION.md value #3 and #5.)
- Repair window is bounded. A 24-48h window only — not "any time you want it back." Bounded scarcity preserves the meaning of the streak.
- No nagging. Compassionate break messaging fires once per break, not as a recurring prompt.
- Coach voice, not system voice. Break messaging follows brand tone (
tightening-brand-voiceskill) — coach-who's-also-a-friend, not corporate. - Honor the existing freeze economy. Starter token is one additional token granted on sign-up; the per-7-day earn cadence is unchanged.
3. User Stories
- As a brand-new user, I want a single freeze token in my inventory from day 1, so my streak has protection while my habit is still forming.
- As a user whose streak just broke, I want the Coach to reframe it kindly — not surface it as a system event — so I'm not pushed toward abandonment by shame.
- As a user whose streak just broke within the last 24-48 hours, I want to spend earned XP to repair it, so my investment in the streak isn't wiped out by a single rough day.
- As a user who rebuilt a streak after breaking one, I want a special badge for that resilience, so the act of starting over is celebrated as its own achievement.
4. Feature Design (high-level — full design after greenlight)
4a. Starter Freeze Token
Grant +1 to streak_freezes_available on a user's first sign-in (or as part of Gamification::CreateFirstGoalActionJob / equivalent first-run hook). One-time, no recurrence. Referenced explicitly in onboarding ("You've got a free freeze token — your safety net for week one.") so the endowment is felt, not hidden.
Open question: Grant on sign-up or on first-goal-creation? Sign-up is simpler; first-goal anchors the freeze to a real streak. Recommend sign-up for endowment-effect strength, surface mention on first-goal screen.
4b. Streak Repair Window
When a streak breaks, store a streak_repair_eligible_until timestamp = now + 48h. Until that timestamp:
- Surface a one-time, dismissible card on Dashboard: "Your 12-day streak just ended. Spend 200 XP to bring it back."
- Tap → confirmation modal → XP charged → streak restored to its prior length, marked with a small "repaired" indicator on the streak detail.
Repair is once per streak — you cannot repair the same broken streak twice, and you cannot repair multiple breaks in a chain.
XP cost should scale gently with streak length (proposal: base 100 XP + 5 XP per day of streak, capped at 500 XP). Deters trivial use, rewards earned investment.
4c. Compassionate Break Messaging
When the streak-broken event fires, the AI Coach generates a context-aware message via Ai::CoachService referencing the user's actual streak length and current goals. Tone follows the brand voice rules:
- Never "Your streak was broken." → Always something like "You missed yesterday — that's okay. Your 12-day run was real, and it's still in your history."
- Acknowledges the prior streak's value (longest streak preserved on profile already — reference it).
- Suggests one small, specific next action drawn from the user's active goals.
- Skipped entirely if
prefers-reduced-coachuser setting is on.
4d. "Comeback" Badge
New badge: rarity Rare, name TBD by Desi (working title: "Rebound" or "Back at It"). Triggered when a user rebuilds a streak of 7+ days after previously hitting 7+ days and breaking it. One-time per user.
Visible in the user's badge collection and used as a celebration push notification with a shareable card (ties into Phase 6 #39 sharing infrastructure when shipped).
5. Out of Scope (this PRD)
- Ally / friend streaks — separate mechanic; should be its own PRD if pursued. (Mutual streak count between accountability partners already shipped.)
- Custom-day rest days (e.g., M-F streaks for work habits) — listed in
streak-science.mdas Medium priority; defer. - Progressive badge tiers (90/180/365-day streak badges) — listed as High priority but a separate scope; defer to its own proposal.
- Streak Insurance for Supporters (Roadmap #48) — different mechanic, paid tier, deliberate post-launch. This PRD is free-tier safety net, not a paid perk.
6. Risks
| Risk | Mitigation |
|---|---|
| Repair feels like cheating; devalues streaks | 24-48h window + once-per-break + XP cost scaling preserves meaning |
| Starter freeze trains new users to skip days | One token only; surface as "safety net," not "free skip"; downstream tokens still earned |
| Compassionate messaging reads as patronizing | Run all copy through tightening-brand-voice skill before ship; A/B variations |
| XP economy inflation if repair is too cheap | Calibrate cost; monitor average XP/day post-launch and adjust |
| Cannibalizes Supporter tier streak insurance | Keep features distinct: free repair = once per break, 48h, XP cost; Supporter insurance = unbounded recovery, no XP cost (defer to Phase 7) |
7. PBC Check
- Free tier impact: ✅ Extends free tier (adds protection); zero paywall.
- Engagement vs. goals: ✅ Targets goals-completed (the north star) by reducing the abandonment that follows broken streaks. Does not increase session length or notification volume.
- Dark-pattern check: ✅ Confirmed clean. Compassionate messaging is the literal opposite of streak-anxiety dark patterns. Repair window is bounded and uses earned currency, not real money.
- Anti-addictive philosophy: ✅ Aligns. Removes a shame-driven engagement hook (broken-streak panic) and replaces it with a calm, science-backed safety net.
8. References & Evidence
docs/product/competitive/streak-science.mdPart 2.1 ("What-the-Hell Effect") and Part 4 (Streak System Improvements table) — all four bundle items rated High priority.docs/product/competitive/streak-science.md§3.1 — Duolingo data: streak freeze availability alone reduces anxiety and increases engagement; +14% Day-7 retention from streak experiments.- Marlatt, G. A., & Gordon, J. R. (1985) — Abstinence Violation Effect.
- Lally, P., et al. (2010), European Journal of Social Psychology — single missed day has negligible effect on habit formation.
MISSION.mdvalue 2 ("Progress is Earned, Never Manufactured") and value 5 ("Accountability, Not Entertainment") — supports a positive-reinforcement safety net over shame mechanics.
9. Suggested Routing (post-greenlight)
→ Orion to plan as a Phase 4 add-on (sits naturally alongside the in-backlog Welcome Back / Streak Mercy work in OBJ-25/26 — there may be implementation overlap worth bundling). Likely 4-6 task package: migration (starter token grant + repair-eligible-until column), interaction (Gamification::RepairStreak), GraphQL mutation, frontend repair card, AI Coach prompt for compassionate break copy, badge seed + trigger.
Estimated size: ~1 sprint (small-to-medium phase).
10. Implementation Notes — Phase 51
Overview
Phase 51 ships the Streak Repair Window + Compassionate Break Messaging, bundling the first three mechanics from this PRD (Starter Freeze is Phase 49, Comeback Badge is Phase 52). The implementation follows the UI-SPEC at .planning/milestones/v1.11/streak-repair-UI-SPEC.md.
What Shipped
Backend:
Gamification::RepairStreakinteraction (rails_api/app/interactions/gamification/repair_streak.rb) — encodes the XP cost formula, validates repair eligibility (24-48h window, not already repaired, sufficient XP), executes the repair via transaction, publishesgamification.streak_repairedevent.Ai::Prompts::StreakBreakcontext module — configures AI Coach message generation with fallback copy: "One missed day doesn't erase your real work. Your repair window is open — tap to bring it back."repairStreakGraphQL mutation — acceptsgoalId, returns updatedGoal+User.currentXp, requiresSessionTokenauth.Gamification::StreakBrokenJobsubscriber — listens togamification.streak_brokenevent, generates compassionate break message viaAi::CoachService, sends push notification (kind:compassionate_break), deduped viaUserNotification.- Extended
Goalmodel:streak_repair_eligible_untilcolumn,streak_repaired_countcounter.
Frontend:
StreakRepairCard.vue— inline Dashboard card surfacing within the repair window, displays streak count + remaining time, XP cost preview. Two states: eligible (CTA button) + insufficient-XP (disabled CTA with "earn more" copy). Dismissible via X button.RepairConfirmationModal.vue— full-screen sheet modal (mobile) / centered modal (desktop), shows XP cost breakdown, balance before/after, success celebration state post-repair.useStreakRepair.tscomposable — manages eligibility query, mutation submission, Apollo cache updates.- Updated
Dashboard.vue— mountsStreakRepairCardconditionally after Goals grid.
XP Cost Formula
The cost to repair a streak is calculated as:
cost = min(BASE + (FACTOR × streak_length), MAX)Default values:
BASE = 100 XPFACTOR = 5 XP per day of streakMAX = 500 XP
These are configurable via Rails credentials (see docs/operations/credentials.md for override path).
Examples:
- 5-day streak: 100 + (5 × 5) = 125 XP
- 20-day streak: 100 + (5 × 20) = 200 XP
- 80-day streak: 100 + (5 × 80) = 500 XP (capped)
Coach Messaging
When a streak breaks, the system publishes the gamification.streak_broken domain event. StreakBrokenJob subscribes and:
- Fetches user context (name, active goals, longest streak on profile)
- Calls
Ai::CoachService.generate(context, preamble: Ai::Prompts::StreakBreak)to generate personalized copy - Sends push notification (kind:
compassionate_break); if reduced-coach mode is on, skips this entirely
Fallback copy (when AI service is unavailable):
One missed day doesn't erase your real work. Your repair window is open — tap to bring it back.
Testing Coverage
- Interaction specs: Verify repair cost formula edge cases (exactly 24h / 48h / 48h+1m boundaries), per-streak cap, XP-balance failure paths, idempotency
- Component specs: Card renders correctly in both eligible + insufficient-XP states, modal shows cost breakdown + success state, dismissal hides card
- E2E tests: Full flow — user breaks a streak → card surfaces → opens modal → repairs → card hides + streak restored
- GraphQL specs:
repairStreakmutation returns correct updated Goal and User, auth is enforced
Metrics to Watch
| Metric | Target | Measurement |
|---|---|---|
| Repair acceptance rate | ≥ 25% | gamification.streak_repaired events / streak-broken events with eligible window |
| Average XP cost per repair | 150–250 XP | Distribution of costs by original streak length |
| Compassionate message impressions | 100% of broken-streak users | Push notification delivery rate |
| Return-within-24h after break (Phase 51 + 50 combined) | +15pp | Day-1 return for broken-streak cohort vs. prior control |
Deviations from PRD
None. This phase shipped the core streak repair mechanic exactly as proposed.
Phase 51 → Phase 52 Hand-off
Phase 52 will ship the Comeback Badge (triggered by rebuilding 7+ day streak after a prior 7+ day break) and completion of the onboarding surface mention of the starter freeze token. At that point, all four mechanics in the Streak Compassion bundle will be live.
11. Rollout & Operations
- Rollout playbook:
docs/operations/rollouts/v1.11-streak-compassion.md— full Phase 51 deployment notes, feature flags, monitoring thresholds, rollback procedures - Configuration:
docs/operations/game-balance.md— XP cost formula tuning guide and override path via Rails credentials
Related Documentation
- Habit Tracking — feature doc for the shipped implementation
Last updated: 2026-07-16