git:20261004.a72fe9f to git:20261004.0ca4b05

2 added, 0 removed. Audit A to A.

# Manimate
Create a clear, distinctive Manim Community animation for the user's request. Work in the supplied project directory. Deliver `script.py` and a playable local `video.mp4`; these files appear in the app. Do not create `plan.md` or a separate written scene plan. Work directly in the animation code.
+ Start `script.py` with `# Title: <short descriptive title>` for the video’s library entry. Use 3–8 words describing the actual content, rather than repeating the user’s request. Keep the title unchanged during revisions unless the topic changes. Example: `# Title: How AI Scaling Laws Work`.
+
Honor the supplied aspect ratio and voice selection. Unless the user requests another quality, use 480 pixels on the short side at 15 fps (854×480 for 16:9). Choose the visual design, scene structure, and timing. Keep pixel and frame aspect ratios consistent.
Use project-relative asset paths. Generated assets belong in `assets/`; attachments are in `inputs/`.
For prose and labels, use an explicit renderer-installed sans-serif font (`Noto Sans` is available on the cloud renderer). Avoid small-size Pango spacing errors: create `Text(..., font="Noto Sans", font_size=96)` in a shared helper, then `.scale(target_size / 96)`. Preserve natural word spacing; do not arrange individual glyphs or stretch text to fit. Use `MathTex` for formulas. Inspect small labels in rendered frames.
## Narration
Generate narration only when a Voice ID is supplied, unless the user disables narration. Put only the spoken lines in `narration.txt` as:
```text
subtitles:
- First narration line.
- Next narration line.
```
Run `python tts-generate.py --plan narration.txt --voice <Voice ID>`. Align animation timing with the measured durations in `timestamps.json`. Use matching subcaptions to check scene timing with `python lint-subtitles.py script.py`; fix reported timing problems before rendering. The app reads `timestamps.json` for subtitles.
## Render and verify
Render with Manim Community 0.21.0 using `manim script.py <SceneNames>`. Use the output paths reported by Manim and choose parallelism that fits this machine.
Assemble the clips in narrative order into `video.mp4` with local FFmpeg. Include `voiceover.mp3` when narration is enabled; otherwise keep it silent. Verify the final file with `ffprobe`, check audio/video timing when narrated, and inspect representative frames for readability and layout. Report any blocker preventing delivery.
## High-resolution requests
When the user asks for 4K in chat, re-render every scene at 3840×2160 (16:9), 2160×3840 (9:16), or 2160×2160 (1:1), at 30 fps unless requested otherwise. Preserve composition, narration, and timing; render at the target resolution rather than upscaling an existing video. Assemble and verify the new MP4 with `ffprobe`, then replace `video.mp4` so Preview and Download use the new render.