---
name: figure-inspect
version: 1.0.0
description: Review a data panel figure by figure. Pen-style loops close around the numbers you pick, one after another, then a single large check stroke and a status tag confirm the review. 1920x1080 HyperFrames video with optional synthesised cue sounds.
---
# Figure Inspect
This is a parameterized renderer (HTML/SVG + GSAP rendered with HyperFrames), not an arbitrary prompt-to-film tool. You write a short JSON brief; `scripts/create.mjs` lays out an evidence panel and an editable project, and `scripts/render.mjs` renders it. A different layout (several panels, a moving camera) needs new authoring.
Read [direction](references/direction.md) for the beats, [input](references/input.md) for the brief contract and [sound](references/sound.md) for the audio. [third-party](references/third-party.md) lists bundled libraries and licenses.
## Use it
Requirements: Node 22+, ffmpeg/ffprobe, a Chrome that HyperFrames can drive. No API key and no network call except fetching the pinned renderer through `npx`.
```sh
node scripts/create.mjs --brief brief.json --out ./project [--palette pewter|night-desk|fig-leaf] [--palette-file tokens.json]
node scripts/render.mjs ./project ./project/film.mp4 [--silent]
```
`render.mjs` writes `film.mp4` (H.264 plus a 48 kHz stereo AAC cue track) and `film.video-only.mp4` (same picture, no audio stream). With `--silent`, `--audio off` at create time, or `"sound": {"enabled": false}` in the brief, only a picture-only file is written.
Brief fields: `heading`, `panelTitle`, `readouts` (3-6 of `{label, value, note?}`), optional `trendSeries` (4-60 numbers) with `trendLabel`, `inspectOrder` (labels to loop, in order; default all), `verdictText`, `demoNote`, `lang`, `palette`, `sound`. Screenshot mode: `screenshot` (a PNG or JPEG path) plus `marks` (1-6 of `{x, y, w, h}` in 0-1 image coordinates) replaces `readouts`.
Mark invented numbers with `demoNote` such as "Demo data"; never present them as measured facts.
## Keep
- Order: heading wipe, panel rise, loops in list order (each one drawn along its own path), one big check stroke, status tag, hold of at least 1.6 s. Motion starts after 0.16 s and the panel never moves again once it has arrived.
- Loops are fitted to the figure that they surround, so no hand calibration is needed. Only the chosen readouts get a loop; the others stay as context.
- The check is a stroke that is drawn, not a finished symbol that is scaled in.
- Sound comes from the visible events in `cues.json` (pencil scratch per loop, rising line while the check is drawn, a stamp for the tag). It contains no samples and no recordings. Say "synthesised cues", never "mixed soundtrack", and do not claim anyone listened unless a person did.
## Check before delivering
`render.mjs` runs `hyperframes check` first. Confirm 1920x1080, 30 fps and the expected duration, then look at frames while each loop is half drawn, at the end of the check stroke and in the final hold. Compare every number on screen with the brief and make sure nothing is clipped. Measure the audio (ffprobe, loudness, true peak) and compare each cue with the first frame where its element changes. Chinese briefs switch to Noto Sans SC automatically; check them as a separate case.
