feat: Receipts commitment tracker

OP
2mo ago
+1784-1

Summary

Automatically extracts commitments (promises, obligations) from conversation transcripts, tracks them through to fulfillment, and notifies the user about upcoming deadlines and missed commitments.

What's included

Data layer

  • CommitmentRecord (GRDB) + commitments table migration in RewindDatabase
  • CommitmentStorage actor — local CRUD, session dedup, backfill query (mirrors ActionItemStorage pattern)
  • Local-only MVP — no backend sync (future work)

Extraction (GeminiClient JSON schema)

  • CommitmentExtractor — scans finalized conversation transcripts for explicit commitments
  • Uses sendRequest(prompt:systemPrompt:responseSchema:) — guaranteed JSON output

Follow-through detection

  • CommitmentFollowThroughDetector — scans new conversations for evidence that prior pending commitments were fulfilled

Notifications

  • CommitmentNotificationScheduler — first use of UNTimeIntervalNotificationTrigger in the app for scheduled deadline reminders (2h lead time)

Orchestration

  • CommitmentService actor — runs the full pipeline: follow-through → extraction → overdue check
  • Hooks into 5 conversation completion paths
  • Backfill scan on app launch for up to 20 past conversations

UI

  • CommitmentsPage in sidebar with Overdue / Pending / Missed / Fulfilled sections
  • CommitmentsStore (ObservableObject) for reactive UI

Testing

  • Compiles cleanly
  • No new test failures — pre-existing Firebase Auth crash is identical on main