chore: scaffold oO monorepo with architecture, roadmap, and module stubs

This commit is contained in:
2026-04-13 14:19:56 +00:00
commit cf4c7a0eb4
36 changed files with 494 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
# ADR-0002: Recommender as the stable contract, policy as a plugin
## Status
Accepted — 2026-04-13
## Context
v0 picks a random Todoist task. v1+ will use a contextual bandit, then learned rankers, then collaborative signals. If the HTTP contract and the candidate-generation path are coupled to today's "random", every change is a migration.
## Decision
`recommender` exposes `POST /recommend` as the one stable contract. Internally it has three seams:
1. **Candidate sources** — async functions that yield `TipCandidate`s from integrations, advice libraries, etc.
2. **Context assembler** — pulls features (today: inline; later: feature store).
3. **Policy**`Policy.pick(candidates, context) → tip`. Registered by name; selected per-request by the experiments framework (Phase 4) or a static config (now).
Swapping a policy never changes the contract or the client.
## Consequences
- v0 policy is `RandomPolicy`, trivially 50 lines.
- v1 moves scoring to `ml/serving` behind the same `Policy` interface (`RemotePolicy` wrapper).
- A/B is introduced without touching clients.