Full v3 content pipeline -- pick category, load prodref + sidecar, filter spec, randomize scene, validate, generate. Product-fidelity-first approach.
End-to-end pipeline: pick category → load prodref → filter spec → randomize scene → validate → generate. One image at a time, meticulous.
| Category | Description | Prodref | Aspect |
|---|---|---|---|
UGC_PRODUCT | Product resting on a surface | 01-hero kraft | 1:1 / 4:5 |
UGC_PERSON_WEARING | Person wearing sunglasses on face | 01-hero kraft | 9:14 |
UGC_PERSON_HOLDING | Person holding sunglasses up | 01-hero kraft | 9:14 |
UGC_SELFIE | Arm-length selfie, fit check | 01-hero kraft | 9:14 |
UGC_FLATLAY | Overhead flat lay with lifestyle items | 06-front kraft | 1:1 / 4:5 |
UGC_UNBOXING | Hands unboxing product from Dubery package | hero (full packaging) | 9:14 / 1:1 |
UGC_GIFTED | Gift reveal -- ribbon, greeting card, personal framing | hero (full packaging) | 1:1 / 4:5 |
UGC_WHAT_YOU_GET | Clean contents showcase (Shopee-listing style) | hero (full packaging) | 1:1 / 4:5 |
UGC_DELIVERY | Just-received moment, package on surface | hero (full packaging) | 1:1 / 4:5 / 9:14 |
UGC_OUTFIT_MATCH | Full OOTD body shot, sunglasses as accent | 01-hero kraft | 9:14 |
Prodref selection rules:
01-hero kraft01-hero kraft06-front krafthero -- the full packaging shot at contents/assets/hero/hero-{product}.png. Hero anchors all accessory details (box, pouch, cloth, warranty card) so Gemini does not hallucinate them..png based on category (see table above).json from the same folderframe_direction, visible_detailsKraft prodref location: contents/assets/prodref-kraft/{product_key}/ (01-hero, 06-front, 07-flat)
Hero shot location: contents/assets/hero/hero-{product_key}.png (complete packaging for hero-based categories)
Sidecar format:
{
"product": "outback-blue",
"angle": "3/4 view",
"frame_direction": "Product angled toward the left side of the frame",
"shows": ["left temple arm", "branding badge", "both lenses", "frame shape", "inner arm pattern"],
"visible_details": [0, 1, 2, 3]
}
Load product spec from contents/assets/product-specs.json.
Filter required_details by visible_details indices from sidecar:
[0, 1, 3] → only include indices 0, 1, 3[0, 1, 2, 3] → include all 4Outback Blue required_details:
[0] "Square-style matte polycarbonate frame with angular flat-top edge"
[1] "Vibrant mirrored polarized lenses"
[2] "Ensure Branding visible on the temple and spelling stays same as prod ref"
[3] "Keyhole bridge design"
Rules:
Run the randomizer -- it is the single source of truth for all scene banks.
python tools/image_gen/v3_randomizer.py --product {product_key}
python tools/image_gen/v3_randomizer.py --product {product_key} --category UGC_PERSON_WEARING
python tools/image_gen/v3_randomizer.py --product {product_key} --count 3
The randomizer outputs a complete scene assignment: category, prodref path, frame_direction (from sidecar), filtered required_details, location, lighting, camera, aspect_ratio, and (for person categories) a subject + pose + hand. Each bank item carries a numeric ID for layout_history dedup.
Rules the randomizer enforces:
Do NOT pick scene dimensions manually. If a value looks wrong in the randomizer output, edit tools/image_gen/v3_randomizer.py -- never override in the prompt.
Invoke /dubery-fidelity-prompt with the randomizer assignment from Step 3. That skill owns the schema, state templates (kraft + hero), category routing, mandatory prefix, and output format. Do NOT freelance the prompt structure here -- all of it lives in /dubery-fidelity-prompt so updates propagate to a single source of truth.
What the fidelity-prompt skill handles (so you don't have to):
product_fidelity block (identity + filtered required_details + proportions + state)interaction_physics locked template (blending_mode, reflection_logic, relight_instruction -- no lighting_logic, no contact_points, no objects_in_scene){frame_direction} from sidecar; hero categories use package-layout templates)scene_variables assembly from randomizer output (location, subject, subject_placement, lighting_atmosphere, camera_settings).tmp/{name}_prompt.txt + sibling .tmp/{name}_config.json (with image_input)What Step 4 here is responsible for:
{product}-{batch_index:02d}-{category_short}).txt + _config.jsonIf the fidelity-prompt skill fails to produce a valid prompt, STOP -- do not freelance a replacement.
If any check fails: STOP. Fix before generating.
python tools/image_gen/generate_vertex.py .tmp/{name}_prompt.txt contents/new/{name}.png
After RA scores the image:
contents/layout_history.jsonFor each image:
/dubery-fidelity-prompt with the randomizer assignment -- it writes .tmp/{name}_prompt.txt + _config.json/dubery-v3-validator on the prompt -- must PASS all 8 checks before spendinggenerate_vertex.py on the prompt (paid)layout_history.json for dedup. If FAIL: do NOT record.Process ONE image at a time. Do not batch-generate.
All 6 UGC categories tested and passing for Outback Blue:
Total: ~48 generations, ~$3 Vertex spend, all passing product fidelity.