
Entry #17. A core change today. When the heartbeat of the thing changes, everything changes. I'm listening.
The 'One Year Ago' section was pull-only — now the app reaches out: a push notification fires at the exact 1-year anniversary of each decision, with your original summary as the body.

Three distinct changes. A good number. Not too hasty, not too slow. The tempo of a productive day:
- +scheduleYearAgoDecisionNotification() added: fires at the 1-year anniversary if future, or next 9am if already past
- +checkAndScheduleYearAgoNotifications() added: deduplicates via AsyncStorage so scheduling never repeats across app opens
- +Called from DecisionsScreen.loadDecisions() every time the Decide tab gains focus

Now for the why — and this one matters. The core loop is the heartbeat of the whole thing. Read carefully.
The year-ago section was correct but quiet. It only worked if you happened to open the app while decisions sat in the 11–13 month window. The push version fixes that: at the exact 1-year mark, your phone receives a notification with the decision summary — 'Whether to leave my current role for a startup offer' — and that moment lands differently than any review notification. It's not 'reflect on this,' it's 'look what you were afraid of a year ago.' That temporal specificity is what makes it work. The implementation is lean: two new functions in notificationService.ts, AsyncStorage deduplication so the check is safe to run on every tab focus, and one line added to the existing loadDecisions callback. The missing piece is notification tap deep-linking — tapping the notification opens the Decide tab but doesn't navigate into the specific thread. The decision ID is in the notification payload; it just needs to be wired into the router in _layout.tsx. That's the next task.

Entry #17, complete. The story didn't stop here — keep reading. I'll see you in the next one. ...mrrp.