Skip to content

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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

  1. Reduce post-streak-break churn (the largest retention cliff in the funnel).
  2. Increase day-1 engagement of new users by establishing the freeze-token endowment from sign-up.
  3. 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

MetricTargetMeasurement
% of users who return within 48h of a broken streak+20pp vs. current cohortCohort 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 15–10%Starter token usage; reflects safety net being load-bearing
% of new users still active at D14+5pp vs. controlCohort holdout if we A/B; otherwise pre/post cohorts
"Comeback" badge unlock rate among returning lapsed users15%+Comeback events / lapsed-then-returned users
Net change in goal completion rate (north star)+0%, no regressionPer-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-voice skill) — 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

  1. 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.
  2. 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.
  3. 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.
  4. 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-coach user 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.md as 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

RiskMitigation
Repair feels like cheating; devalues streaks24-48h window + once-per-break + XP cost scaling preserves meaning
Starter freeze trains new users to skip daysOne token only; surface as "safety net," not "free skip"; downstream tokens still earned
Compassionate messaging reads as patronizingRun all copy through tightening-brand-voice skill before ship; A/B variations
XP economy inflation if repair is too cheapCalibrate cost; monitor average XP/day post-launch and adjust
Cannibalizes Supporter tier streak insuranceKeep 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.md Part 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.md value 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::RepairStreak interaction (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, publishes gamification.streak_repaired event.
  • Ai::Prompts::StreakBreak context 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."
  • repairStreak GraphQL mutation — accepts goalId, returns updated Goal + User.currentXp, requires SessionToken auth.
  • Gamification::StreakBrokenJob subscriber — listens to gamification.streak_broken event, generates compassionate break message via Ai::CoachService, sends push notification (kind: compassionate_break), deduped via UserNotification.
  • Extended Goal model: streak_repair_eligible_until column, streak_repaired_count counter.

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.ts composable — manages eligibility query, mutation submission, Apollo cache updates.
  • Updated Dashboard.vue — mounts StreakRepairCard conditionally 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 XP
  • FACTOR = 5 XP per day of streak
  • MAX = 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:

  1. Fetches user context (name, active goals, longest streak on profile)
  2. Calls Ai::CoachService.generate(context, preamble: Ai::Prompts::StreakBreak) to generate personalized copy
  3. 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: repairStreak mutation returns correct updated Goal and User, auth is enforced

Metrics to Watch

MetricTargetMeasurement
Repair acceptance rate≥ 25%gamification.streak_repaired events / streak-broken events with eligible window
Average XP cost per repair150–250 XPDistribution of costs by original streak length
Compassionate message impressions100% of broken-streak usersPush notification delivery rate
Return-within-24h after break (Phase 51 + 50 combined)+15ppDay-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

Last updated: 2026-07-16

Loading…