Khoa scale ruling · 31 Jul 2026 · art direction as a spec

The portrait recipe

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.

The product generating its own crew from its own measurements is the concept eating its own cooking. Wideshot’s claim is that it can measure a film’s grammar precisely enough to work in it. If that is true, the same measurements are enough to render the face of the member who holds that grammar — and if they are not, the claim was thinner than we said. The recipe is therefore a small, cheap, public test of the core product thesis, which is why it is worth building properly rather than treating as asset production.

1 · The parameter block

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.

ParameterArt direction — the ruleMeasured 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.

2 · The rule that matters most: numbers only

The generator takes numbers and cannot take names. There is no field in the parameter block that could carry a director or a title, so there is no code path by which the corpus can reach an image. That is deliberate and it is the scale argument in one line: at five members, “no likeness” was a promise kept by looking at every output. At a hundred, nobody looks at all of them. A guarantee that depends on human review does not survive contact with a pipeline — so it has to stop being a review step and become a property of the input contract. It now is.

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.

3 · The seed is the member id

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:

4 · The floor, and what it caught

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.

Writing the floor down caught something in my own set. Vera is measured from 29 scenes and 97 shots — under the floor. Her hand-directed portrait exists and reads perfectly well, because I made it by eye and by eye you can carry a thin member on craft. The recipe cannot, and should not: her colour centroid over 97 shots is not a measurement of a grammar, it is an average of an accident. So the honest position is that the hand-directed set quietly contained a member the pipeline would refuse, and only writing the generation rule down made that visible. She now wears in measurement in the crew room, which is true, and it is exactly the treatment Khoa asked to be designed for every future member.

This is also the degenerate-profile warning the design contract already promised admin clearance — it turns out to be the same rule, seen from the user side.

5 · The reference outputs

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.

What this proves, and what it does not. The reference renderer is a schematic: it draws the recipe’s geometry and colour decisions in a canvas. Production renders the same parameter block through an image model. What is contract is the block and the numbers-only rule; the renderer behind it is swappable. Claiming a canvas can replace a model would be overselling this — the narrower claim is the one that matters and it is fully demonstrated below: the parameters decide the look. Nothing in the right-hand column was touched by hand.

6 · The recipe, live

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.

Output

7 · What a build owes this

#RequirementWhy it is here rather than in a ticket
1Add 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.
2The 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.
3Seed 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.
4Enforce 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.
5Bios 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.