← All craftbooks

Audio Ad Spot

Media: audio and videoevalv1.0.0released 2026-06-05workflow: build-loop

Produce a short broadcast/podcast audio ad spot (15s/30s/60s) — a tightly-timed script with a hook, value, and a single call-to-action, synthesized into a finished, runtime-accurate voiced spot with optional music bed cue. Scopes the offer, exact runtime, and mandatory disclaimers FIRST, then synthesizes a voiced spot that hits the time target. Locking the runtime and CTA before recording is what makes a spot land in its slot and drive one action instead of overrunning or rambling.

Steps

Entry step: scope. Each step names the specialist role it wants; the full working prompt is expandable.

  1. Ad scopeplannerentry

    offer, exact runtime, single CTA, disclaimers, voice

    Show working prompt
    Lock the spot BEFORE writing or voicing. Step 1: capture the product/offer, the ONE target action (the single CTA), and the audience. Step 2: pick the EXACT runtime slot (15/30/60s) and derive the word budget (~2.5 words/second for ad reads — record it). Step 3: capture any mandatory disclaimer/legal line and how the brand/CTA must be stated. Step 4: pick the voice and tone, and whether a music bed cue is wanted. Step 5: define the arc: hook (first ~3s) -> value -> CTA -> brand/disclaimer. Write an acceptance-criteria checklist (finished audio within ±1s of the slot, opens with a hook in the first 3s, states exactly one CTA, includes the disclaimer, brand named clearly, not silent) and decisions to `notes/scope.md` via write_task_note AND the produces path.
  2. Write the spot scriptcopywriter

    timed ad script with hook, CTA, disclaimer, cues

    Show working prompt
    Write the spot to the scope. Step 1: write to the word budget so the read lands in the slot — open with the hook in the first ~3 seconds. Step 2: keep one clear value message and exactly ONE CTA, stated plainly. Step 3: include the brand name and the mandatory disclaimer (a quick read at the end is fine, but it counts against the time). Step 4: add VO cues (`[pause]`, emphasis, pace) and a music-bed cue if scoped, and write numbers/phone/URLs as they should be SPOKEN. Step 5: write the script to `notes/ad-script.md` with a running word count and estimated runtime via write_task_note AND the produces path. On a loop-back, trim/expand only to fix the time or a missing element.
  3. Produce the spotdeveloper

    synthesize the voiced spot to the exact runtime

    Show working prompt
    Render the finished spot. Step 1: synthesize the approved script with the locked voice/tone via the text-to-speech capability. Step 2: measure the rendered duration; if it is outside ±1s of the slot, adjust pacing or trim the script (loop the copy phase if it cannot fit) until it lands. Step 3: if a music bed was scoped, mix a low ducked bed under the VO and apply gentle fades. Step 4: normalize loudness to a broadcast-sane level so it is not too quiet/hot. Step 5: write the finished audio to `ad-spot.mp3` and note its exact measured duration. write_task_note the path and duration. On a loop-back, fix only the flagged issue (over/under time, missing CTA/disclaimer, silence).
  4. Evaluatereviewer

    Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.

    Show working prompt
    Time it and listen. Step 1: confirm `ad-spot.mp3` exists, is non-silent, and its duration is within ±1s of the target slot (PASS/FAIL). Step 2: sample-listen (if audio capability exists) or check the script — does it open with a hook in the first ~3s? Step 3: confirm exactly ONE CTA is stated and the brand is named clearly. Step 4: confirm the mandatory disclaimer is present. Step 5: confirm loudness is reasonable (and the music bed, if any, is ducked under the VO). Write PASS/FAIL per criterion.
    
    Then route — this is the whole point of the loop:
    
    - **Every criterion PASSES →** call `advance_task_step({ ref, stepId: "evaluate", next: "finish" })`.
    - **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: "evaluate", next: "produce" })` to loop back. The builder fixes exactly those gaps.
    
    Never route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.
  5. Finishdeveloper

    All acceptance criteria met. Stamp a short summary and report DONE.

    Show working prompt
    Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.

Triggers

Phrases that suggest this craftbook to a crew.

Source

View this craftbook on GitHub · MIT license