git:20260928.4a52fbd to git:20260929.750d6aa
15 added, 2 removed. Audit A to A.
# Design: <film>
The spec the film is built from. Numbers here and in the FILM config agree; when one changes, change both.
## Canvas, drawings and loop
- 1080 x 1080, 60 fps, 10.000 s = 600 frames, cycle loop.
- 12 drawings a second, each held 5 frames: 120 drawings per loop (a multiple of 3, for the boil).
- Tempo 120 BPM: beat 0.5 s, 16th 0.125 s, bar 2 s. Acts start on 16ths; landings fall on beats.
- Line 9 px, boil 1.6 px. No motion blur.
- Live area 104 to 976 on both axes; the character at rest and every title stay inside it.
## The character
What it is like, in three words: <curious, bouncy, helpful>. Original: <new design / the user's mascot, source>.
| Part | Size (px) | Colour roles |
|---|---|---|
| body | w, h, shape, taper | fill / shade / light |
| eyes | rx, ry, gap, pupil, height | white, ink |
| mouth | w, height | ink, tongue |
| arms | length, width, hand, shoulder height | body fill |
| legs | length, gap, foot | ink |
| antenna / detail | | |
| outline | line width | ink |
## Palette
| Role | Hex | Used for | Contrast |
|---|---|---|---|
| bg | | the stage | |
| rays | | sunburst rays (a close tint of bg) | |
| shadow | | floor shadow | |
| ink | | every outline, pupils, lettering | vs sign, bubble, bg |
| | | | |
## The stage
- - Ground line at y = <848>. Sunburst centred at (<540>, <500>), <16> rays, turning <1> ray width per loop.
- - Titles: <DEMO COPY, FICTIONAL PRODUCT> at baseline <960>.
+ - Ground line at y = <848>, pinned to the bottom. Sunburst centred at (<540>, <500>), <16> rays, turning <1> ray width per loop.
+ - Titles: <DEMO COPY, FICTIONAL PRODUCT> at baseline <960>, pinned <'g'>.
+
+ ## Formats
+
+ Every number above is 1080 x 1080 px. Each other delivered format has a patch in `FILM.formats`; the pins map the rest (engine.md, Formats).
+
+ | Format | Canvas | Patch | Staging |
+ |---|---|---|---|
+ | 1:1 | 1080 x 1080 | none: the base | <as above> |
+ | 9:16 | 1080 x 1920 | <stage.raise 280; PIP scale 1.4, bubble over the shoulder, JOY hop h 280> | <the ground at 1408; the performance fills the middle; hops rise into the tall frame> |
+ | 16:9 | 1920 x 1080 | <PIP x 330, sunburst x 330; bubble and sign (one hand) to the right> | <Pip left of centre, the sign and bubble in the open space> |
+
+ - Pins: the ground `'b'` (its distance from the bottom); titles <`'g'`: their height above the ground>; characters centred.
+ - Composition at each format (from `render.mjs stills --format`): <1:1 x %, 9:16 x %, 16:9 x %>.
## The performance
| Beat | Time (s) | Act | What the viewer should feel |
|---|---|---|---|
| 1 | 0.25 | look at camera | it noticed me |
| 2 | 0.50 | blink | alive |
| 3 | 0.75 | face: o, brow up; emote ! | surprise |
| 4 | 1.375 | hop, 210 px, 0.75 s air | joy |
| ... | | | |
| last | 9.25 | blink; back to the start face | the loop closes |
## Loop seam
- Frame 0: <pose, face, look>. The last act that moves each value brings it back by <t>.
- Springs still settling at the end: <the last landing's BOUNCY settle>, which carries over the seam.
- Cycles: boil 3 drawings, rays <1> per loop, breath <10> per loop, sway <5> per loop.
## Review stills
Written by `render.mjs stills`: every hop's anticipation, stretch and impact, each bubble, sign and emote, each accent, frame 0 and the last frame, plus `stills/contact.png`.