Pipeline Hub

workflow-combo-loop

The standing creative feedback loop for every pipeline (format-* skills, cartoon-h3, ugc-omni, vo-broll, dawn-statics, Dawn natives): PLAN the next concepts as combos from what is winning (stakes x emotion x payoff x root cause x mechanism x authority/POV x angle x device), TAG each pack/job at creation with combo_* keys, LAUNCH under that ad-name prefix, READ Meta weekly (read-only), RECODE only new concepts against the fixed codebook, UPDATE the map, recipes and the diff (incl. song vs static frequency/decay).

Lane: strategy (feeds every format-* pack) · not built yet: 0 (see below) · source: /Users/ayden/.openclaw/workspace/skills/workflow-combo-loop

SKILL.mdprocedure.mdsources.mdEvals (6)Learnings (3)
1. Read first2. When to use / when not3. Inputs4. Outputs5. Process6. Tools & models7. Gates & QA checklist8. Failure modes9. Sources

workflow-combo-loop — PLAN → TAG → LAUNCH → READ → RECODE → UPDATE

The 10-05 Dawn combo map (output/dawn-combo-map-2026-10-05/MAP.md) was a one-off. This skill makes it a loop every creative pipeline runs through: concepts are planned as one-variable combos off a paying parent, tagged at birth so the read never has to guess, and the map refreshes itself weekly from Meta (read-only) so the next plan starts from the newest winners, not last week's.

1. Read first

2. When to use / when not

3. Inputs

4. Outputs

5. Process

  1. PLAN (free, no network). python3 scripts/combo_loop/plan.py --format <skill> --brand dawn [--n 4] → 3-5 combos, each = a named paying parent (spend, ROAS, CPA) + ONE changed dimension: exploit (move toward the recipe winner), stake swap (a stake-bank row that lands on her), explore (a winner from another family never tried here). Thin families (video today) plan from the song recipe (story formats) or the static recipe (callouts) and say so. Pick with Fish; never stack two variables.
  2. TAG (free). Paste the plan's yaml block into the pack front matter / job or spec JSON ("combo": {...}); set combo_ad_prefix to the exact string the launched Meta ad names will start with. No file (natives, statics) → python3 scripts/combo_loop/tags.py register --prefix N1006-A combo_avatar=... .... Gate: python3 scripts/combo_loop/tags.py check <file> PASS. tags.py keys lists allowed values.
  3. LAUNCH. Normal launch path (core §6): own ad set per concept, preflight, dof guard, Fish's go. Ad names MUST start with combo_ad_prefix (copies/SCALE dupes keep the prefix; "LP Split · ", "LW · ", "- Copy", "- SCALE" are stripped before matching).
  4. READ + RECODE + UPDATE (free Meta GETs; Sonnet via subscription). python3 scripts/combo_loop/refresh.py --brand dawn (weekly via launchd, or on demand): pulls lifetime + weekly per-ad insights (≤1 req/s), assigns every ad to a unit (tags > existing code by ad base name > existing code by body hash), codes only NEW concepts ≥$100 with the codebook verbatim (cap 40/run, sure/unsure per field), aggregates per family (song / video / static), writes the dated snapshot + DIFF vs the previous one. --no-code skips Sonnet; --offline re-aggregates saved pulls.
  5. Review (Fish). Read the DIFF: recipe flips, cells that moved ≥0.05 ROAS, new winners/losers, frequency/decay per family. Check unsure fields on new codes before trusting a recipe that rests on them; correct a code by editing codes.json (set "c": "sure" with your value).
  6. Next plan starts from the new latest/ (step 1). The loop closes.

6. Tools & models

7. Gates & QA checklist

8. Failure modes

9. Sources