WootBuild.

Studio/docade/Advisory 03

Advisory · advisory-03.md

Advisory 03 — transparency is a post-process, not a generation parameter

To: docade · From: WootBuild · Date: 2026-08-18 Status: open — docade decides Trigger: calibration run r-20260818-42e1 returned three opaque PNGs against a spec that requires a cutout.

Advisories are recommendations. docade owns the product and decides. What WootBuild owes you here is the price of each option, not a preference dressed as a constraint.


The finding

Six of your ten lanes — plush, prize, lyle, ui-art, world, crane — declare transparent: true in collectible-512 and scene-512. Two more (glyph, avatar) declare it on SVG specs, where it is free and fine.

No image model WootBuild can route to produces a transparent raster background. Verified 2026-08-18 against each endpoint's own OpenAPI schema, not inferred:

EndpointTransparency parameter
fal-ai/flux-2 (dev)none
fal-ai/flux-2-pronone
fal-ai/flux-2-flexnone
fal-ai/flux-2-max/editnone
fal-ai/ideogram-v4none
fal-ai/gpt-image-2 (+ /edit)none
Gemini image familynone
fal-ai/recraft/v4/text-to-imagebackground_color — sets a colour, not alpha

WootBuild's router previously claimed otherwise. That flag was wrong, was never verified, and is now corrected — a transparent raster request fails loudly rather than routing to a model that cannot do it.

This also blocks something you already designed. Your derived.silhouettes entry produces the 18 uncollected-state silhouettes by alpha-flatten — a deterministic transform of an alpha channel. No alpha, no silhouettes, and that was the one batch costing zero art budget.

What it costs to change

A. Cut out in normalize — recommended

Generate on a known flat ground the prompt controls, then remove it programmatically in the normalize step (sharp, already a dependency).

B. Route a matting model as a second pass

A dedicated background-removal endpoint after generation. These slugs resolve live on fal today (verified 2026-08-18; pricing not yet checked): fal-ai/birefnet, fal-ai/birefnet/v2, fal-ai/bria/background/remove, fal-ai/imageutils/rembg, fal-ai/ben/v2/image.

A and B compose. Try A first per asset, fall back to B when the mechanical alpha check fails. That keeps the common case free.

C. Ship opaque on #262c4a

D. Move the collectible register to vector

recraft-v4-svg produces true SVG, where transparency is free.

What WootBuild recommends

A, with B as the fallback for plush, and no change to your manifest or your specs. transparent: true stays the correct declaration — it describes what the asset must be, and it is now WootBuild's job to satisfy it in normalize rather than pretend a model does it.

What we need from you

Nothing blocking. This is WootBuild's problem to build. It is written down because it changes the delivery date on six lanes, and because it turned one of your zero-cost batches (the silhouettes) into a dependency.

One question, when convenient: are the 18 silhouettes still wanted as a derived alpha transform, or has the uncollected state moved on since 14-ASSET-MANIFEST.md §5 was written? If they are still wanted, that raises the priority of getting a genuinely clean cutout rather than a passable one.