← Both skills · wildhorn-static-ads · 2-make/qc-checklist.md
Built from every failure seen in run 1 (79 ads, 9 Looms + QC logs) and the Sam batch (83 ads, 4 Looms + QC round 3, which caught 13 defects before review). Open each image at full resolution (never a thumbnail — small text becomes unreadable at 768 px), next to its template. QC is done in the main context, never by a subagent: a summary loses exactly the details this list checks.
Fail any line → fix (redo with CHANGE + PRESERVE, recomposite, or masked swap), re-QC, and log the defect in the QC log of the round.
why names the scroll-stop trick; dna lists everything of their product world; scene says why the scene is there (A1 A2 A3).tpl == sorted(templates)[num-1] unless tpl_abs on purpose) (D13 — six Sam specs pointed at another ad's template).compliance): no fake testimonial presented as real, no forbidden claim number, no doctors/celebrities, no before/after body presented as a real customer.Look at it for one second as the avatar, never having heard of the brand: problem? promise? product? If any is missing → fail (B14, protocol 4).
| Ad | Problem found | Fix applied | Rule |
|---|---|---|---|
| S35 | logo misspelled WILLDHORN on the sign | redo with icon-only sentence | D8 |
| S74 | Seedream wrote "crossed" + headline on the label | scene only + composite | D7 |
A defect seen twice in a QC log becomes a rule (and a lint check if it can be). A defect the reviewer catches that QC should have caught → add the check here.
| Where | Defect | Fix that worked | Rule |
|---|---|---|---|
| B2 #2 | model drew the template's arm while the text says belly | say what NOT to draw; draw our body part | F1, A2 |
| B2 #4 | photoreal output on a Pixar template | name the style: "Pixar-style 3D, NOT photoreal" | F2, C5 |
| B2 #10 | template's young man copied | describe our avatar + "do NOT copy the template's person" | F3, A11 |
| B2 #13 | before/after barely different | concrete cues: belt holes, shirt tucked | C12, F4 |
| B2 #16 | jar squashed into the template's slot | real proportions; shrink the slot, not the jar | C6 |
| B2 #123/#262, B7 #62, c0123, c0262 | OpenAI blocked bare/soft male chest close-ups (even without the template) | show it through clothes/objects; or Seedream scene + composite | F5, D1 |
| B3 #22 | jar placed in front of the hero (split belly) | hero fully visible, jar small in its slot | C6, F6 |
| B4 #33 #35 | jar added where the template has no product | write "NO jar / NO product" explicitly | C7, F7 |
| B4 #38 | template's cow kept under the jar | "a bison, NOT a cow, no spots" | F8, C16 |
| B4 #26 | measuring tape hid the wordmark | wrapping elements stay off the label | F9 |
| B4 #35 | "WIILDHORN" | spell the wordmark letter by letter | F10 |
| B5 #35 | small wordmark "WILLDHORN" twice | small logo slot → icon only | D8, C7 |
| B7 #35 #61 | organs raw and glossy | (then) freeze-dried wording → (now) fresh, clean, appetizing, no veins | C2 |
| B8 #57 | text added at the bottom; jar not in her hand | nothing added; copy the gesture | B13, A8 |
| B8 #73 | text not centred on the eggplant | composite cx on the anchor |
C9 |
| B9 #73 | small text glued to the headline | template's spacing between blocks | C9 |
| B9 #65 | flat text instead of sunscreen letters; product not 3D on the lounger | Nano Banana Pro letters; real 3D product with contact shadow | A10, C10 |
| c0232 (blueprint batch 01) | guarantee written twice | each fact once | B20 |
| c0245 (blueprint batch 01) | "Not reindeer" = implicit competitor reference | "Not farmed organs" | brand banned |
| Sam R2 S29 | apostrophe broke the text | re-render; check punctuation in quotes | QC |
| Sam R2 S38 | avatar too young | re-render with OLD |
A11 |
| Sam R3 S8 S18 S35 S43 | "WILLDHORN" on signs/logos outside the label | icon-only sentence in every prompt; lint bare wordmark lines | D8 |
| Sam R3 S71 | cowboy still holding THEIR bottle | inventory SWAP every prop | C5, F11 |
| Sam R3 S47 | Barbie sequin skirts left on our man | inventory SWAP every prop | C5, F11 |
| Sam R3 S55 | typo "beer bell belly"; man too young | text by script; avatar age | D7, A11 |
| Sam R3 S58 S74 S79 | Seedream full ad: garbled label, "crossed" written, headline on the label | Seedream scene only + composite | D7 |
| Sam R3 S58 | emoji rendered as boxes in composited text | no emoji in composite | D9 |
| Sam R3 (2 ads) | crossed-price strike misplaced; text shadow too heavy | adjust strikes / shadow and re-render (free) |
composite |
| Sam R3 S42 redo | pipeline printed "OK" 3× with no image (template .png vs real .jpg) | template exists check + count new files | D10 |
| Sam R3 S29 S33 S35, QC S55 S79, R4 S80 | spec pointed at another ad's template (found by the 2026-10-02 audit) | tpl == sorted(templates)[num-1] |
D13 |