# moneycanbuy.fun — six infographic loops

Six silent, seamless MP4 loops: cards **1, 4, 7, 10, 12 and 14**. Every video is **1080 × 1350, 30 fps, 240 frames, exactly 8.0 seconds, H.264, yuv420p**, with fast-start MP4 metadata. There is **no audio track**. This follows FORMAT, storyboard section 3 and the explicit self-check; the generic acceptance sentence requesting AAC conflicts with those instructions.

## Outputs

- [01-lifecycle](loops/01-lifecycle-1080x1350.mp4)
- [04-dispute-vote](loops/04-dispute-vote-1080x1350.mp4)
- [07-where-100-goes](loops/07-where-100-goes-1080x1350.mp4)
- [10-will-do](loops/10-will-do-1080x1350.mp4)
- [12-burn-trophy](loops/12-burn-trophy-1080x1350.mp4)
- [14-launch-hour](loops/14-launch-hour-1080x1350.mp4)

[Contact sheet](contact-sheet.png) · [First / last comparisons](loop-check.png) · [ffprobe](ffprobe.json) · [Checks and bounding boxes](check.json)

The contact sheet has one row per loop and the requested six instants per row. Its 8.0-second column uses the final encoded frame. Fully built 1080 × 1350 posters are in `artifacts/stills/`; repository copies are in `infographics/loop-posters/`.

## Construction

All artwork is composed in SVG code. Quicksand glyphs are outlined from the supplied variable font at weights 500 and 700, including short fixed labels and numbers. Arrow glyphs are vector paths. Brand, IMD and NFT PNG bytes are embedded directly and displayed at uniform scale without cropping, recoloring or stretching. No screenshots are pasted into the cards. Panels, vote bars, prediction tiles, Claim and Burn buttons are rebuilt from the repository references.

Motion uses eased, deterministic frame states. resvg rasterizes every frame offline; ffmpeg encodes the PNG stream with libx264, yuv420p and faststart. Frame 240 closes at the exact first composited pose. The decoded comparison below includes codec compression differences.

The payout case tags sit above the bars to retain the specified 952-pixel spans and 64-pixel side margins. Small allocation labels have leaders. Coin and Burn counter steps use only numbers present in the storyboard; they are illustrative, not live platform totals. Posters retain every case together, including the launch-hour NFT band.

## Local self-check

**0 failed checks across all six loops.** ffprobe confirms the requested dimensions, frame rate, duration, video codec and pixel format, and zero audio streams. Each file is below 64 MiB; all required artifacts together are below 128 MiB.

| Loop | First/last mean difference / 255 | Poster elements | Missing cases | Result |
| --- | ---: | ---: | ---: | --- |
| 01-lifecycle | 0.4131 | 75 | 0 | PASS |
| 04-dispute-vote | 0.0754 | 71 | 0 | PASS |
| 07-where-100-goes | 0.0284 | 126 | 0 | PASS |
| 10-will-do | 0.0742 | 60 | 0 | PASS |
| 12-burn-trophy | 0.0480 | 66 | 0 | PASS |
| 14-launch-hour | 0.0835 | 41 | 0 | PASS |

Chromium `getBoundingClientRect` measures the actual SVG paths, images and primitives on each poster and at 0, 1.6, 3.2, 4.8, 6.4 and the final frame. Checks cover 64-pixel edge margins, 24-pixel gaps between separate boxes, text intersections, label sizes and line counts. Own containers may contain their labels; stacked bar segments are contiguous parts of one bar. All eight payout bars and their segment widths are measured against the storyboard amounts. Language and number audits cover all 240 source frame states per loop. Case evidence and cases in the words of section 2 are recorded in `check.json`. Flame height and image scale checks pass.

These are local self-check results, not independent certification of the storyboard interpretation.

## Source and reproduction

`artifacts/source/` contains the six standalone SVG posters, build/render/measurement/check scripts and measured geometry. Durable repository copies are in `infographics/loops-source/`. Rendering dependencies are ordinary files under `infographic-tools/vendor/`, with licences; no install or network is needed for rendering.

From the repository root:

```sh
python3 infographics/loops-source/build.py --frames
node infographics/loops-source/render.cjs
```

This recreates the SVGs, 1,440 temporary SVG frame states, six posters and six MP4s. It requires Python 3 with Pillow, Node.js and ffmpeg. The supplied resvg native binding targets Linux x86-64 GNU. Original font and PNG assets remain in their repository locations.

For fresh DOM measurements, run `measure.cjs` with locally available Playwright Core and Chromium supplied through its `--playwright` and `--chromium` arguments, then run `check.py`. Task-local verification tools live only in disposable `test/scratch/`; they are not required to render. The measured geometry used for this delivery is included with the source. `check.py` also regenerates ffprobe data, decoded comparisons and review sheets.

## Bundle repair

Repository poster SVGs reference the original PNG assets using relative paths, removing redundant embedded copies. The standalone SVG exports in `artifacts/source/` retain embedded PNGs. Re-inlining each repository SVG reproduces its exported SVG byte for byte; videos, posters and check results are unchanged. This removes 6,757,539 source bytes (5,122,912 bytes with per-file DEFLATE compression), exceeding the reported 89,140-byte bundle overage. Open repository SVGs in a browser that resolves relative image paths; the render script uses the standalone exports.
