# TASKS.md — Midnight Static Execution Tracker Deadline: **June 15, 2026**. Target submit: **June 14 evening**. Status legend: - `[x]` done - `[~]` partially done / usable but not final - `[ ]` not started - `[>]` next / current focus - `[D]` deferred or cut unless time allows ## Current Position We have a live Hugging Face Space with a working Gradio fallback, one instant showcase rerun, a schema-valid fixture writer, Kokoro TTS, and a crude mixer. Live Space: https://huggingface.co/spaces/build-small-hackathon/midnight-static Current recommended focus: 1. Build the custom radio UI. 2. Post social update #1 after the UI is visually credible. 3. Run real Nemotron smoke on GPU infra. ## Phase 1 — Foundation And Repo 1.1. `[x]` Initialize repo via Codex with project skeleton. 1.2. `[x]` Add `AGENTS.md`, docs, `uv` project metadata, tests. 1.3. `[x]` Set repo-local Git author to `Codex `. 1.4. `[x]` Add `.env` protection and `.env.example`. 1.5. `[x]` Keep `uv run pytest` green before pushes. Current evidence: - First commit: `8c16939 Initialize Midnight Static scaffold` - Latest test count: 14 passing ## Phase 2 — Script Schema And Writer Boundary 2.1. `[x]` Define shared script schema in `midnight_static.schema`. 2.2. `[x]` Add deterministic fixture writer. 2.3. `[x]` Add writer contract and `--writer fixture` pipeline option. 2.4. `[x]` Add five-premise writer smoke test. 2.5. `[~]` Add `NemotronWriter` implementation boundary. Notes: - `NemotronWriter` targets `nvidia/NVIDIA-Nemotron-3-Nano-4B-BF16`. - Local macOS BF16 smoke failed because the model requires `mamba-ssm`. - Llama-Nemotron fallback avoided that import path but checkpoint fetch was interrupted after 3m47s. - Real Nemotron smoke should move to GPU infra. 2.6. `[>]` Run real Nemotron smoke on deployment GPU path. 2.7. `[ ]` Add one retry on invalid model JSON, then fixture fallback. ## Phase 3 — Voice And Audio Pipeline 3.1. `[x]` Verify Kokoro voice IDs from `hexgrad/Kokoro-82M`. 3.2. `[x]` Lock `VoiceID` enum. 3.3. `[x]` Render full fixture scene with multi-voice Kokoro. 3.4. `[x]` Add crude mixer: dialogue + hardcoded bed + SFX. 3.5. `[x]` One-command typed premise → mixed WAV: ```bash uv run python -m midnight_static.pipeline --mode crude "a phone booth that rings under the sea" ``` 3.6. `[ ]` Add production mixer chain: - AM radio band-pass / saturation - vinyl crackle - ducking under dialogue - LUFS normalization - MP3 export 3.7. `[ ]` Add SFX retrieval/generation trace interface. 3.8. `[ ]` Add music bed/sting library interface. ## Phase 4 — Live Space 4.1. `[x]` Add Gradio app entrypoint. 4.2. `[x]` Fix Space build packaging. 4.3. `[x]` Fix Space runtime launch. 4.4. `[x]` Publish Space under hackathon org. 4.5. `[x]` Add README Space metadata/frontmatter. 4.6. `[x]` Add model inventory table. 4.7. `[x]` Add Codex and Modal sections to README. 4.8. `[x]` Add three instant showcase reruns. 4.9. `[x]` Add showcase selector in Gradio UI. 4.10. `[ ]` Add README links for demo video, social post, blog, dataset, adapter, and traces as they become available. ## Phase 5 — Showcase And Demo Quality 5.1. `[x]` Showcase 1: `a phone booth that rings under the sea`. 5.2. `[x]` Showcase 2: `two rival lighthouse keepers, one light`. 5.3. `[x]` Showcase 3: `a wedding where every guest recognizes the wrong bride`. 5.4. `[x]` Add showcase selector in Gradio UI. 5.5. `[x]` Manual listen test for all showcase broadcasts. - First listen found the three reruns too similar. - Fixed by adding hand-authored showcase scripts with distinct genres, casts, voices, and scene structures. 5.6. `[ ]` Tune levels if showcases are harsh, too quiet, or unclear. Never cut: - showcase broadcasts - listen test - README tags/model table - demo video ## Phase 6 — Custom Radio UI 6.1. `[x]` Build static radio visual shell. 6.2. `[x]` Genre dial interaction. 6.3. `[x]` Premise input as telegram slip. 6.4. `[x]` ON AIR loading/state sequence. 6.5. `[>]` Playback with script display. 6.6. `[ ]` Keep Gradio fallback available. 6.7. `[D]` Call-in microphone / ASR mode. 6.8. `[D]` FLUX poster generation. Notes: - Off-Brand score depends heavily on this phase. - Do not block the live Space on this phase; the plain app is already live. ## Phase 7 — Modal, Dataset, And Fine-Tune 7.1. `[ ]` Add `modal/gen_dataset.py`. 7.2. `[ ]` Generate 400 validated examples. 7.3. `[ ]` Human skim pass, 45 minute cap. 7.4. `[ ]` Publish dataset to HF Hub. 7.5. `[ ]` Add `modal/finetune.py`. 7.6. `[ ]` Train LoRA and publish adapter. 7.7. `[ ]` Evaluate base vs LoRA. 7.8. `[ ]` Add `modal/batch_audio.py`. 7.9. `[ ]` Generate SFX/music library and manifest. Notes: - This phase needs Modal credentials. - This phase is high prize evidence but not required for the app to be live. ## Phase 8 — Social, Blog, And Submission 8.1. `[>]` Social post #1: build-in-public with live Space link. 8.2. `[ ]` Add social post link to README. 8.3. `[ ]` Social post #2: radio UI reveal. 8.4. `[ ]` Demo video, 60-90 seconds. 8.5. `[ ]` Add demo video link to README. 8.6. `[ ]` Blog / Field Notes post. 8.7. `[ ]` Publish traces dataset. 8.8. `[ ]` Run `docs/SUBMISSION.md` checklist. 8.9. `[ ]` Final fresh-browser test on desktop and mobile. 8.10. `[ ]` Submit. ## Deferred / Cut Unless Ahead 9.1. `[D]` VoxCPM2 G1 gate. Reason: Kokoro is working, and OpenBMB/MiniCPM evidence is not core to the current path. 9.2. `[D]` BillShield-lite side project. Reason: Midnight Static still needs showcase, UI, social, and submission work. 9.3. `[D]` FLUX posters. Reason: only after custom radio UI and demo basics are done. ## Standing Rules - Commit small via Codex throughout. - Keep `uv run pytest` green before every push. - If a task takes more than 2x estimate, cut scope or downgrade it. - Never commit `.env` or tokens. - Prefer live, audible, demonstrable progress over deeper model work that is invisible to judges.