Block a user
Connector interface:
revoke() is mandatory; surface provider-side revocation
Monorepo tooling: pnpm workspaces + uv/poetry + turbo + pre-commit
Shared types package: OpenAPI source of truth
Secrets convention and
.env.example per service
integrations: Todoist connector (OAuth2, read tasks, complete task)
recommender: service skeleton with
POST /recommend and policy registry
integrations: Connector interface + encrypted token vault
Closed: token vault exists in integration_tokens table. Encryption (libsodium) deferred to M2 security hardening.
integrations: Connector interface + encrypted token vault
Connector interface:
revoke() is mandatory; surface provider-side revocation
Closed: revoke() implemented in services/api/src/routes/integrations.ts:106-139 — calls Todoist revocation endpoint + deletes local token.
admin: model registry panel — embed MLflow at /admin/models
admin: experiment dashboard — LinUCB per-arm stats and bandit reset
admin: recommendation log — per-tip explainability (features, policy, score, feedback)
admin: reward analytics — reaction distribution over time, per-policy compare
admin: data quality widget — missing-signal rate, stale-token rate, feature NaN heatmap
admin: ops actions — replay signal, disable/promote policy, force-retrain, revoke token
admin: read-only SQL runner against Postgres replica (sunsets to Superset in M4)
admin: health rollup — gateway, ml/serving, DB, event bus, MLflow, Grafana status
admin: event stream viewer — live tail of signals.* events