feat(api): add structured schedule plan with topics, problems, gate, sweep and reserved problem handling

This commit is contained in:
Prad Nukala committed 2026-09-21 12:14:25 -04:00
1 parent 00f44a1c47
commit 86107d5ef7
7 files changed
+344 -113

No files matched your search

+10 -3
View File
@@ -14,8 +14,12 @@ Live at `https://srs-api.prdlk.workers.dev`.
labels, milestones. `catalog.ts` reconciles them into D1 nightly (and via
`/admin/reconcile`); it recomputes from scratch, never invents rows, and
never overwrites SRS-owned columns (`stage`, `next_review`).
- **The repo owns the schedule** — `data/schedule.json`, human-edited,
bundled at deploy. Git history is its audit log.
- **The repo owns the plan** — `data/schedule.json`, human-edited,
bundled at deploy. Git history is its audit log. Each date is a
`ScheduledDay`: `topics` (one or more topic issues), `problems` (a set day,
fixed numbers), `gate` (Saturday's blind set, verbatim), or `sweep` (redo
every miss, nothing new). Numbers a `gate` or `problems` entry names are
`RESERVED`: the drill and gate samplers never draw them.
- The GitHub Project mirror writes `Target Date` and nothing else: it is
best-effort, so failures log warnings and never block a D1 write, and topic
rows are never written. SRS stage and first-attempt result stay in D1 only —
@@ -47,7 +51,10 @@ raw `Date` math.
Blind drills draw only from topics **already learned**: scheduled in an
earlier week (the current week's optional pool is reserved for Saturday's
gate) and with at least one core problem on the ladder — a skipped learning
day never feeds drills just because its calendar week lapsed.
day never feeds drills just because its calendar week lapsed. A Saturday
whose plan fixes the `gate` set uses that list as-is; every number must be a
catalog row (a `set:optional` sub-issue of its topic), or the review issue is
not created — a `/done` on an uncatalogued number could never be logged.
## Routes