At five members I hand-directed five portraits. At a hundred that is not a slower version of the same job — it is a different job. So the deliverable stops being pictures and becomes a generation template: a parameter block driven by each grammar’s own measured visual statistics, so the pipeline renders every member’s portrait from their fingerprint. The five I drew by hand are now the reference outputs that prove it.
Five visual parameters. Each is derived from measurement; none is picked by hand. The whole art direction is in the middle column — that is the part I own, and it is the part that stops a hundred portraits looking like a hundred different products.
| Parameter | Art direction — the rule | Measured input | In the fingerprint today |
|---|---|---|---|
| Grain | Coarseness from camera motion, density from cut rate. A handheld grammar is shot fast and hot; a locked master is shot clean. Grain is not texture — it is the stock the grammar would have forced. | motion index, cuts/min | held |
| Palette | The grammar’s own colour world, unmodified. Ground first, figure derived from it — never two independently chosen colours. | hue centroid, saturation, luma | to add |
| Light | Contrast sets falloff depth, key angle sets its direction. A flat documentary grammar lands near 90° and barely ramps; a high-contrast one rakes. | contrast ratio, key angle | to add |
| Figure | Shot-size mix decides how much frame the subject owns. A master-shot grammar puts a person small in a room; a compression grammar fills the frame with them. This is the parameter that makes two portraits read as different films rather than different colours. | shot-size mix | held |
| Frame | The portrait is a 4:5 crop from the source frame, not the source fitted inside a box. Above the 1.85 baseline the frame wears cue bars — not decoration, but the shape the material was composed in. Fitting instead of cropping was my first implementation and it put 57% black bars on a 1.85 grammar; the references caught it. | source aspect | to add |
Two of the five resolve from statistics the fingerprint index already holds. Three do not — colour statistics, contrast and key, and source aspect. All three are cheap frame statistics computable on the same pass the shot detector already walks, so this is a small addition to an existing job rather than new measurement infrastructure. It is stated here because a recipe that silently depends on fields nobody is producing is a drawing, not a spec.
The same argument retires the other manual guarantee. Portraits are original characters rendered as lit masses, never faces — not because each one was drawn carefully, but because the renderer is given a subject scale and a palette and has nothing with which to describe a person. The abstraction is structural.
fan.verite-hand.v1 renders the same portrait on every machine, forever. This is what makes the recipe safe to run at scale rather than a source of drift:
Colour and size statistics computed over a handful of scenes are noise, not a grammar. The recipe therefore refuses below and renders the developing state instead — frame and grain only, with the parameters that have not resolved named on the portrait.
Left, what I drew. Right, what the recipe renders from that member’s parameter block, via portrait.js — the same file the crew room loads.
Move a measurement and watch the portrait follow. This is the art direction being executable rather than described — and it is the fastest way to see whether the mapping is right, because a wrong rule looks wrong immediately.
| # | Requirement | Why it is here rather than in a ticket |
|---|---|---|
| 1 | Add three frame statistics to the measurement pass: colour centroid and saturation/luma, contrast ratio and key angle, source aspect. | Three of the five parameters cannot resolve without them. Cheap on a pass that already walks every frame. |
| 2 | The generator’s input type has no string fields. | This is the no-likeness guarantee. If a title or a director can be passed, review is back to being the guarantee, and review does not scale. |
| 3 | Seed from the immutable id; never re-render an existing id. | A portrait that changes under a finished film is a provenance bug, not a visual one. |
| 4 | Enforce the floor server-side and return the developing state. | If the client decides when a fingerprint is thin, a thin one eventually renders confidently somewhere. |
| 5 | Bios stay generated from the fingerprint index, never authored. | Unchanged by this ruling and now mandatory: at a hundred members nobody proofreads a bio for truth, so it must not be possible to write one that is not. |
Design only; no build authorised by this page. QA risk tier: T3 — non-executable mocks and spec. Portraits are original characters rendered as lit masses in each grammar’s visual world. No real person is depicted and no likeness is referenced. Fingerprint values for the five reference members are read from my own reference artwork so the mapping is a faithful formalisation of what I drew; coverage figures are illustrative.