Reading notes
The short version
If you only take three lines:
- Open the instruction with the deletion — name the occluding object as something to remove — before describing the object you want.
- Encode an uncertain detail as a ceiling ("show nothing beyond X"), never as an instruction ("add X"). The first degrades into a plainer object, the second into a fabricated one.
- Name what must be absent. No lapel, no hood, no logo, no second fabric through the gap. An unmentioned zipper is a zipper the model may add.
Where to slow down
The section on the reader. It is tempting to skip to the extraction prompt,
but the extraction step can only delete an occluder it was told about. The
covered_by / covers asymmetry — models fill the outer garment's covers
reliably and the inner garment's covered_by only sometimes — is the kind of
detail that silently removes your best clause on a third of inputs.
Hardware as a ceiling. This is the single most portable idea in the article and the easiest to get backwards. Read it twice.
The final list of thirteen clauses. The order is not decorative. The deletion is first because it wins that way, and the exclusions are last because they are a check on everything above them.
What this is not
Not a benchmark. There are no numbers, no ablations and no held-out set — the evidence is which phrasings survived contact with real photographs and which specific wrong answer each clause was written against. Treat it as a field report from one pipeline, not as a measured comparison.
Not model-agnostic in its specifics. The reading pass is an OpenAI vision call
with a strict JSON schema; extraction is Pruna p-image-edit. The clauses are
tuned to how those two behave. The failure modes — surviving occluders,
invented details, upgraded finishes, drifting silhouettes — are likely to be
universal; the exact wording that defeats them may not be.
Not a tutorial. It assumes you already know how to call an image editing model and are asking why your isolated objects come back subtly wrong.
Read it with the code open
src/domains.js holds the reading prompts and the JSON schemas for every
subject. src/pruna.js holds prunaPiecePrompt, the fashion extraction
instruction, with a comment above each clause naming the failure it prevents —
those comments are the primary source this article was written from.
src/domains.js also holds genericPiecePrompt, the same argument with the
garment vocabulary removed, which is the clearest way to see which parts were
about clothes and which were about photographs.
Published by Inspired. Fictional brand, working prototype.