Owns
The request the generator actually receives — its structure, its exclusions, the canvas it asks for, and the set of variants that differ on purpose. It decides what is said, never whether the picture behind it was worth asking for.
Phases: CLASSIFY → STRUCTURE → CONSTRAIN → SIZE → VARY → RECORD.
Before starting
- Classify the request first. The backing skill keys its whole behaviour off a use-case slug, and a prompt written without one gets classified anyway — by the generator, silently, possibly differently each run
- Read the brief's exclusions. They become the
Avoidline verbatim; a prompt that restates the inclusions and drops the exclusions has kept the easy half - Decide what varies before writing variants. Four prompts differing in ways nobody chose produce four results nobody can compare
- Size it before anything else, first match wins.
T0— one skill owns it, reversible, one image or one value, the question fits in one sentence: answer in a line, no brief, no handoff.T1— aT0condition fails: settle the brief first.T2— two or more skills own parts of it: route it.T0drops the paperwork, never the evidence. Mis-sized mid-run means re-sizing and saying so - A dialogue comes first when the deliverable's shape is not uniquely determined, what counts as achieved does not fit in one sentence, a word has no achievement condition ("nicer", "cleaner", "more professional", "make it pop", "modern"), the work replaces a picture a person already chose, or doing it wrong would be expensive to undo (published, under someone's name, a real person or product). Looking at what exists is not executing
- Settle
standardin that dialogue — what the image is judged against. Without one, every candidate is arguable and the loop has no exit.excludesmay not be empty and execution waits on an emptyopen_questions(_image/SIZING.md) - A term with two meanings, or a concept with two names, is a question, never
a silent choice — one question with its default, the answer into the
brief's
termsand.agents/glossary.md, and the glossary's names only from then on (_image/SIZING.md§ Terms)
- Retained generated candidates carry a recipe:
engine, reportedmodel(orunreported),promptverbatim,excluded,sizerequested/on disk,inputs,output. Capture the request at invocation; persist for candidates shown, kept or passed onward, not immediate discards. References and text-only outputs need no invented generation fields.IRREPRODUCIBLElimits exact pixel regeneration, not reuse or editing the source (_image/RECIPE.md)
Decide first
| Situation | How to proceed |
|---|---|
| Writing the prompt body | structure — the order that survives: scene, subject, detail, constraint |
| Deciding what to forbid, and how | exclusions — a negative that names a thing beats one that names a feeling |
| Choosing dimensions, or being told a size is invalid | sizes — the four constraints a size must satisfy, and the ones that are known good |
| Checking a canvas before a run is paid for | imgfacts --check-size 1536x1024 — the four constraints, and the nearest legal size when one fails |
| Checking controls, including seed reuse | control-surface is a snapshot; confirm the selected installed tool/schema before promising a control. A seed routing signal is not seed support |
| Producing variants | Isolating an effect: one axis. Searching for a usable result: coupled axes may vary under one stated objective and budget; do not claim causal attribution |
| Exact text must appear in the image | Quote it verbatim, spell hard words letter by letter, and say where it sits. Then plan to check it against the file — rendered text is where these models fail most visibly |
| A claim here would be expensive to get wrong | refute — put it to the engines that did not make it, asked to break it rather than to agree. Unrefuted is n engines finding nothing, never proof |
| A transparent background is wanted | Check the selected tool's current controls. If a cutout is needed, it changes pixels and goes to refinement; a PNG conversion alone cannot remove a background |
- Ties break by
_image/VALUES.md, read top to bottom: looking over assuming · the brief over the best picture · one image well over four nearly · the cheapest run that answers the question · the existing set over the better picture · the human decides what, the agent decides how. Against all of them: a harness that is correct and avoided has failed — when the ceremony costs more than the decision, say so rather than performing it
Always / Never
- Always: write the prompt as a labelled spec, not a paragraph. The labels are what a later reader diffs when the result changes
- Always: keep the sent text verbatim in the record. A paraphrase is a different prompt, and the difference is invisible until someone tries to reuse it
- Always: state invariants for an edit — change only X, keep Y unchanged — in every iteration, not only the first
- Always: get permission first when the prompt names a living artist, a real person, or a brand
- Never: ask the built-in path for a pixel size and treat it as agreed. The canvas is a request; what comes back is measured off the file
- Never: pile on adjectives without a correction objective. Related changes can share a run; isolate one axis only when the question needs causal comparison
- Never: leave the exclusions to be inferred from the positive description
Verify with
The prompt is checked against the brief line by line: every axis present, every
exclusion carried, nothing added that the brief did not ask for (evidence:
inspected — the prompt is text, and nothing about it can be measured until a
file comes back).
- The size is checked before it is sent, not after a run fails:
measuredby imgfacts, which reads those four rules from the registry - The record is the recipe's
promptfield, verbatim, and the run that uses it statesIRREPRODUCIBLEwhen exact pixel regeneration is not supported; this does not prevent reusing the original file or editing it
- Grade every claim:
measurednames the measurement method or a located, repeatable visual observation, not aesthetic certainty.inspectedis reasoned judgement where measurement cannot settle the decision; say why. Header inspection is not viewing pixels.assertednever supports completion: the prompt asked for 3:2, it does not report what came back - The unit is the decision, not the batch. Each thing the deliverable
promised carries a grade or sits in the residuals as
UNSPECIFIED, and a decision in neither is what gets invented at export time by whoever hits it first - Report
status:DONE(every promised decision made, every measurable claim measured, zeroUNSPECIFIED) /PARTIAL/BLOCKED(say what was tried) - Every residual is
BLOCKED/OUT-OF-SCOPE/DEFERRED/UNSPECIFIEDand appears in the handoff'sopen; a run holdingWritealso leaves a#TODO(agent):marker carrying that class in the document it produced - Never omit the sweep — markers against
open, promised decisions against graded ones:swept, 0 markers / 0 in open; 6 decisions / 6 graded. While either pair disagrees the status is notDONE(_image/CONTRACT.md)
Done when
The use case is named, the spec is labelled, the exclusions are verbatim from the brief, the size satisfies the applicable constraints, variants name their objective and changed axes, and the exact text sent is written down.
- Say what the moment needs. Start: one line naming what will be made and what is excluded. Mid-run: write to the reader when the plan changes — a run that keeps missing the brief, a budget about to be spent, work that would grow the scope, a path found blocked — saying what changed, not that a tool ran. Asking counts as speaking: one question, the decision it unblocks, the default taken if nobody answers
- End with the answer in one line — status, what was produced and where it is; then the sweep line, then one line per residual a human must decide, then what is next. A reader who stops after the first line has the result
- The handoff and the recipe are the record, the report is the view. The brief, the grades and the exact run travel there and are shown when asked
- In proportion to the tier. A
T0answer is a line; aT1orT2run reports once, with the files linked rather than described shot by shot. Too long means content to leave out — the brief restated, the losing candidates — not structure to strip (_image/REPORT.md) - Not bigger than it is. The requested scope is the deliverable; thought
goes deeper into the one thing asked, never wider. A real problem is the
exception — something that would break, is unsafe, or rests on a false
premise is explained in full (
_image/REPORT.md)