create-image-fal
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Mandatory pre-publish review gate for a UGC video render. Transcribes the finished render's AUDIO with Whisper and word-diffs it against the approved spoken script, then gates set_final_render — blocking a render whose generated audio mis-voices a word (e.g. the approved
$ npx -y skills add gooseworks-ai/goose-skills --skill review-ugc-render --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/review-ugc-renderContext preview
The summary Claude sees to decide when to auto-load this skill.
Mandatory pre-publish review gate for a UGC video render. Transcribes the finished render's AUDIO with Whisper and word-diffs it against the approved spoken script, then gates set_final_render — blocking a render whose generated audio mis-voices a word (e.g. the approved
name: review-ugc-render description: Mandatory pre-publish review gate for a UGC video render. Transcribes the finished render's AUDIO with Whisper and word-diffs it against the approved spoken script, then gates set_final_render — blocking a render whose generated audio mis-voices a word (e.g. the approved "human-vetted" spoken as "human witted"), drops an approved phrase, or comes back silent. Runnable, gating counterpart to content-goose's review-transcript-integrity atom. Every ugc-video-formats recipe runs this after render and BEFORE set_final_render. owner: akhil status: active version: 1 created: 2026-07-04 updated: 2026-07-04
> The QC gate every UGC video recipe MUST clear before it publishes. Not an > eyeball `/watch` — a deterministic transcript-vs-script diff that exits non-zero > on a defect so the recipe can hard-stop `set_final_render`.
Seedance generates the audio natively. It sometimes **mis-voices a word** — the approved line `human-vetted` comes back spoken as `human witted`; documented siblings: `Hume`→`Hune`, `Alitu`→`al-too`. The defect lives in the render's audio, so an eyeball `/watch` ("dialogue matches the script") slips it through, and a downstream caption pass then bakes the wrong word in verbatim. Nothing was comparing the **actual spoken audio** against the **script the user approved**.
This gate does exactly that, deterministically, and refuses to publish on a miss.
recipe, in the QC phase, **after** the master render exists and **before** `set_final_render`.
Before rendering, persist the exact approved spoken lines (the verbatim utterance, no beat notes) to `working/approved-script.txt`. Then, after render:
python3 <pack>/review-ugc-render/scripts/review_render.py \ --video working/final.mp4 \ --script-file working/approved-script.txt \ --json working/review-verdict.json
not publish blind.
Transcription backend (in priority order): `OPENAI_API_KEY` (honors `OPENAI_BASE_URL`, so it routes through the gooseworks Whisper proxy when set) → local `whisper` CLI. `ffmpeg` must be on PATH.
| Report line | Root cause | Fix | |---|---|---| | `[high] said [witted] where script has [vetted]` | Seedance mis-voiced the word in the generated audio | **Re-roll a new seed.** If it is a brand/coined token, spell it phonetically in the `SPOKEN LINE` (e.g. `Ali-too`, never a `(pronounced …)` parenthetical — Seedance reads parentheticals aloud). See `create-video-seedance-2-fal` Failure Modes. | | `[medium] dropped [...]` / low similarity | Seedance dropped an approved phrase | Re-roll; if only a tail word, a surgical `stitch_replacement.py` window fix may recover it. | | `⚠ audio is effectively silent` | Wrong render / audio track lost in post | Re-render / re-check the mux; never publish a silent take. | | `ERROR: no transcription backend` | No `OPENAI_API_KEY` and no local `whisper` | Set the key (proxy `OPENAI_BASE_URL`) or install `whisper`, then re-run. |
`--expect-music` is advisory only (warns if a music bed is absent); it does not by itself fail the gate.
both only for a genuinely script-free clip (the drift check is then skipped and the gate is advisory).
python3 tests/test_review_render.py # pure verdict logic; no audio/network
Covers the canonical `vetted→witted` mis-voicing, brand-name mis-voicing, dropped tails, benign filler, and the no-script advisory path.
This is the shipped, single-file, gating slice of the fuller `coworkers/video/molecules/review/review-loop` (18-axis rubric). Here we enforce the one axis that catches audio-vs-script defects at publish time (`review-transcript-integrity` / `brand_text_accuracy`). Deeper multi-axis review stays in the content-goose lab.
Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.
Repo: gooseworks-ai/goose-skills
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...), ROUTED THROUGH THE fal-proxy so it bills the Ads agent. image_urls…
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports gpt-image-1 (default, fixed sizes — the FAL fallback for Higgsfield's…
Generate an instrumental music bed via ElevenLabs Music, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Trims any sparse intro, loudnorm, fades…
Image-to-video (or text-to-video) via any FAL video model (Kling, Seedance, Veo), ROUTED THROUGH THE GooseWorks fal-proxy so the call bills the Ads agent. The…
Generate a voiceover (VO) clip via ElevenLabs text-to-speech, ROUTED THROUGH THE elevenlabs-proxy so it bills the Ads agent. Voice id + script text come from…
Scrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.