Implementation plan
Vertical slices, each one tested before the next. Status is tracked in PROGRESS.md.
| Milestone | Slice | Exit test |
|---|---|---|
| M0 Discovery | infrastructure audit, live API verification, capability matrix, cost and threat models | docs written, one real image → video → TTS round trip |
| M1 Foundation | schema + migrations, env, storage, queue, auth (password + TOTP, sessions, RBAC, audit), design tokens | pnpm typecheck, migration applies on an empty DB |
| M2 Public cinema | home, vertical feed, film page, series, explore, search, about, report; player with captions | Playwright on desktop + mobile profile |
| M3 First real generation | concept → keyframe → image-to-video → stored asset → playable draft, cost ledger | one shot generated in production, ledger row = provider ticks |
| M4 Studio | Concept Lab, script, storyboard, prompt workbench, voice, captions, FFmpeg assembly, QA, approval | a multi-shot narrated film published from the studio |
| M5 Programming | series templates, scheduler, budgets, duplicate prevention, publication policy | scheduler creates a project inside the quota and stops at the cap |
| M6 Hardening | unit + e2e tests, secrets scan, health, backups, restore drill, runbook | pnpm check, e2e against production, restore drill |
Decisions taken up front:
- One repository, two processes (web, worker), PostgreSQL + Redis + filesystem assets on a single cluster node,
deployed with the cluster's own orchestrator (
mld) rather than Docker (the nodes are macOS; Compose file kept for portability). - REST adapters for xAI (resumable
request_id, real cost ticks) — seeprovider-capabilities.md. - Narration over cinematic shots, sidecar WebVTT captions rendered by the player (word-timed from TTS character timestamps). No burned-in subtitles, no lip-sync promise.
- Native clip audio is the sound bed (ducked under narration). No third-party music at all.
- Quality over volume: default programming is at most one film per day, with a human approval before release.