Code-review feedback from Task A1:
- Drop unused `import math` (nothing in the file references it).
- Thread `fps` into synthesize_audio() instead of hardcoding 30 — keeps
audio.fps and shared_params.fps drift-free if either ever changes.
- Add startup assert that audio.fps == shared_params.fps so a manifest
edit-mistake fails fast instead of silently relocating onset spikes.
- Document why np.random.RandomState (not default_rng) is required.
- Document the kwarg-contract fragility on render_frames.
- Add JSON-comment keys explaining the two tolerance fields — the
pre_refactor=0.0 is deferred-use (A3-A6), the python_release=1.0
intentionally covers PyTorch float-precision drift across releases.
Diff still passes 64/64 OK, exit 0.