# Money loop

Original code-rendered phone explainer. No generated imagery, stock, voice, or external media. Only the supplied toad, wordmark, Quicksand and IBM Plex Mono assets are used. Background, cards, icons, cursor, tap ripples, chart, transfers and captions are drawn with Pillow. Supplied marks retain their original pixels and proportions.

## Rebuild offline

From the repository root run:

```sh
./rebuild.sh
```

Requires Python 3.12 on Linux x86-64, pip, FFmpeg and ffprobe. The Pillow wheel is included in `tools/`; installation uses `--no-index`. No network is needed. Canonical code is in `src/`, also copied into `artifacts/src/`. Brand assets remain in `explainers/brand/`. The included Mono TTF files are lossless font-container conversions of the supplied WOFF2 fonts; their supplied SIL licence applies. All UI and caption text uses Quicksand weight 700, with numeric runs in IBM Plex Mono 600.

The rebuild writes the video, SRT, decoded contact sheet, overlay log and intermediate audio. Intermediate WAVs and diagnostic frames stay in `test/scratch/`.

## Music and motion

The original score is synthesized sample by sample at 48 kHz stereo, on a constant 120 BPM grid. It contains a programmed kick, noise percussion, bass, chord voices and bell melody. The entire arrangement is scheduled from the start; no recorded segment is looped or retimed. Typing clicks, taps, payout ticks and burn whooshes are synthesized in the same code. A final chord and kick land at 54.5 seconds and decay into silence before 55 seconds. Compression and two-pass loudness normalization precede AAC encoding.

Motion uses scene-local timestamps and smoothstep easing at the final 24 fps. Cuts follow the supplied times. The opening types at a steady pace, completing at 1.4 seconds so its full caption is present at the midpoint. A declining deadline bar avoids inventing a deadline. The payout counter shows the permitted endpoints rather than unsupported intermediate amounts. The final brand hold is confined to the closing scene.

## Self-check

Caption checking uses the renderer's text overlay log and decoded midpoint frames, with the exact two display lines joined by a space and compared against each supplied caption. The contact sheet is decoded from the deliverable MP4, with scene and midpoint labels outside the video frames.

| Check | Final result |
| --- | --- |
| Container and duration | MP4, exactly 55.000000 s |
| Video | H.264 High, yuv420p, 1080 × 1920 |
| Frame count and rate | 1,320 frames, constant 24/1 fps |
| Audio | AAC LC, 48 kHz, stereo, exactly 55.000000 s |
| File size | 2,333,479 bytes, below 60 MB |
| Faststart | Verified: moov precedes mdat |
| Final AAC integrated loudness | −14.39 LUFS |
| Final AAC true peak | −1.48 dBTP; below −1 dBTP, no clipping |
| Repeated decoded frames before 51 s | Longest identical run: 4 frames; below 24 |
| First frame at 3 s | Decoded and confirmed nonblack |
| Captions | All 14 exact strings and scene times pass overlay-log comparison; 64 px, at most two lines, within safe width |
| Midpoint frames | All 14 decoded, labelled and visually reviewed; captions present and unobstructed |
| Numbers | Source and decoded screens reviewed against supplied scene values; no additional numeric values introduced |
| Offline dependency | Included Pillow wheel installed successfully with no index or network |

Number review includes the required 24h notification, the scene's $6 remainder, minute labels on the launch-tax chart, and the specified burn address. The deadline is a decreasing bar and the stake amount remains an input prompt, so neither introduces an invented value. Caption wrapping preserves all characters, including punctuation and the ordinary hyphen in 1-52.

The master uses an oversampled limiter and a 40 ms onset envelope to prevent the AAC encoder's initial transient from overshooting. No motion, score event or video timeline is stretched or retimed.

Limitations: the packaged offline Python wheel targets Python 3.12 on Linux x86-64. FFmpeg and ffprobe must already be installed. The visuals explain the supplied rules; they do not query contracts or display live data.
