Block a user
feat: tip kind system — task, advice, insight, reminder
feat: feature registry + user profile builder
feat: signal source abstraction — generalize beyond Todoist
feat: AI tip generation via Ollama — contextual advice from user signals
refactor: generalize recommendation pipeline — candidate → rank → render stages
bug: reward updates to ml/serving silently swallowed on failure
bug: no data retention purge for tip_scores and tip_feedback (GDPR 30-day)
bug: port mismatch — config.ts defaults to 3078, docker-compose uses 3001
bug: Todoist access tokens never refreshed — silent failure after expiration
bug: TipFeedback type includes helpful/not_helpful but backend rejects them
Modular-monolith packaging + import-boundary lint
Moving to M4: import-boundary lint (eslint-plugin-boundaries) becomes important at scale. Low risk for now with single developer.
web: offline caching + reaction queue
Deferred: offline caching + reaction queue is a progressive enhancement. Moving to M3 (mobile) where offline-first becomes critical.
Monorepo tooling: pnpm workspaces + uv/poetry + turbo + pre-commit
integrations: Todoist connector (OAuth2, read tasks, complete task)
ML observability baseline (alongside first model)
Closed: ML observability shipped as part of M1 admin console — experiment dashboard, reward analytics, feature browser, health rollup, tip explainability log.
Shared types package: OpenAPI source of truth
ML observability baseline (alongside first model)