Spaced Repetition + Feed Blending (WI-3)

Context

Implement SM-2 spaced repetition scheduling, blended feed algorithm, and per-card interaction indicators in the feed.

Challenges

Challenge 4.1: Spaced Repetition Module

Requirement: Pure calculateNextReview() function with SM-2 variant. Acceptance Criteria:

  • packages/shared/src/spaced-repetition.ts exists
  • Interval schedule: [4h, 1d, 3d, 7d, 14d, 30d] based on streak
  • Exported from packages/shared/src/index.ts Evaluation: PASS

Challenge 4.2: Interact Route Wiring

Requirement: Card interactions compute spaced repetition fields. Acceptance Criteria:

  • /api/cards/[slug]/interact computes nextReviewAt, streak, reviewCount
  • Uses calculateNextReview from shared package Evaluation: PASS

Challenge 4.3: Review API Endpoint

Requirement: Endpoint for fetching facts due for review. Acceptance Criteria:

  • apps/web/app/api/review/route.ts exists
  • GET returns facts where next_review_at <= now() Evaluation: PASS

Challenge 4.4: Blended Feed Algorithm

Requirement: Feed mixes content types with weighted blend. Acceptance Criteria:

  • /api/feed uses: 40% recent validated, 30% review-due, 20% evergreen, 10% exploration
  • Round-robin interleave
  • Per-card userStatus field
  • New DB queries: getEvergreenFacts, getRandomFacts, getUserFactStatuses, getLatestAnswerInteraction Evaluation: PASS

Challenge 4.5: Interaction Indicator Badges

Requirement: Feed cards show color-coded completion status. Acceptance Criteria:

  • Yellow badge = in progress
  • Orange badge = review due
  • Green badge = mastered
  • Renders in fact-card.tsx Evaluation: PASS

Evaluation Summary

ChallengeResult
4.1 Spaced Repetition ModulePASS
4.2 Interact Route WiringPASS
4.3 Review API EndpointPASS
4.4 Blended Feed AlgorithmPASS
4.5 Interaction BadgesPASS

Score: 5/5 PASS