Block C · The asset compiler

The asset compiler

This is the block the rest of the plugin exists to make possible. Fourteen tuned constants found by hand at two minutes a sample is the single largest cost in making an asset — and the only reason it is paid by a person is that nothing anywhere states what the right answer would look like.

WHAT YOU DECLARE mascot.accept.toml silhouette_iou min = 0.97 delta_e max = 2.0 [search.light] 0.5-4.0 THE SEARCH propose values bake at the cheapest rung measure score the margin per predicate, 0 to 1 WHAT COMES BACK the winning values a contact sheet the best handful, side by side a trace every sample it rejected, and the predicate that rejected it cache key the inputs, the renderer and its version, the seed — a sweep revisits neighbourhoods, and a state already rendered is not paid for twice.

The margin is what makes it converge

Each predicate yields pass/fail and a value in [0, 1] for how comfortably it passed, normalised against its own bound. A pure boolean gives a search a cliff and nothing to climb. The overall score is the weighted mean of the margins.

The spec is the whole permission

A parameter not named in a [search.<param>] block is not searched, whatever the optimiser would like. That is what stops a search reaching a value that is wrong for reasons the spec does not capture: it can tune the exposure, and it cannot decide the asset should be twice as large.

And the spec is the thing being debugged

The expected case is a search that satisfies every predicate and returns a render a person rejects. The contact sheet is what makes that visible — the best handful side by side, so you see that the winner is not the one you would have chosen and now know the spec is incomplete rather than the renderer. Finding that out fast is the point.