Production Skill · Revamp Dossier

ad-production-briefTurns a polished, approved script into a ready-to-shoot production brief — either an actor filming brief (human talent) or an AI-UGC handoff block (ugc-factory). Wrapped by /ad-brief.

Owner: ad-creative-system / creative-ops · 2026-06-11 · Phase 4 — Creative Production
What it does

ad-production-brief is the last step before a script enters a camera or an AI video generator. It reads the routing field set on each script — INTERNAL-TEAM, EXTERNAL-ACTOR, or AI-UGC — and branches into one of two output shapes. For filmed scripts (human talent), it builds a clean actor-facing brief: high-level shot direction, format spec, and a clean script with no square-bracket stage directions, no speaker labels, and no internal strategy. For AI-UGC (user-generated content) scripts, it emits a structured YAML block that goes straight into ugc-factory (NBP Pro → Enhancor → Seedance 2.0) — this time keeping full stage directions, durations, and speaker labels, because the generation pipeline needs them. A single batch may mix both routings; the skill groups them so each operator only sees their work. After operator sign-off, the skill creates a FILMING/SHOOT (filming batch) ticket in Fibery, writes a Google Doc for the actor, exports it as a PDF, and attaches it to the Fibery ticket via the catbox.moe upload procedure.

Handoff — operator decision pending

Gelo (the AI-UGC operator who ran rc-ai-ugc / ugc-factory) has left. Two questions are unresolved: (a) does Raedan replace Bonnie on filmed brief handoffs, or does Bonnie remain? (b) who now operates rc-ai-ugc — Raedan, Asel directly, or is AI-UGC production paused? The skill generates briefs as usual and marks the operator: field in the AI-UGC batch summary as PENDING until confirmed. Do not substitute Raedan for Gelo or swap Bonnie for Raedan in any output until the operator decides.

01 Model routing — which model runs which task

All calls go through OpenRouter and are logged with model identifier and cost to agent_run. Deterministic work — lookups, counting, naming — never touches a model.

TaskModelWhy
Sequential number (SEQ) lookup from Supabase winning_ads view; format_slug validation against production-pathways.md; naming string assembly ([SEQ]_[IdentityShort]_[Ad Simple Name]_[Style]); word-count checks; routing field read (INTERNAL-TEAM / EXTERNAL-ACTOR / AI-UGC)Plain code — no language modelDeterministic-first rule. A model adds no value and costs tokens. The SEQ lookup is a single filtered Supabase query; format validation is a string match; naming is string concatenation. Completeness is never a model's job.
Script pull and ingest from Supabase views; field extraction from script YAML (routing, ugc_scope, format, proof IDs)claude-haiku-4-5 (Haiku 4.5) via OpenRouterMechanical structured read at high volume and low consequence. The model extracts defined fields from well-structured YAML — no creative judgment required. Haiku 4.5 is the cheapest tier that handles structured extraction reliably.
Brief assembly for standard formats — Selfie, FAQ Phone Scroll, Seated Interior, Outdoor Walking Selfie, Mirror Selfie, Pub Chat, Park Bench — single- or multi-script structureclaude-sonnet-4-6 (Sonnet 4.6) via OpenRouterInstruction-following across a clear template with consistent voice and formatting standards. Quality matters (this goes to a human actor), but the structure is well-defined. Sonnet 4.6 is the right balance of quality and cost for high-volume brief packaging.
Nuanced multi-format direction — mixed-routing batches, energy direction for formats new to the actor, AI-UGC block population where scene prompt is ambiguous, multi-speaker 2-Person briefsclaude-opus-4-8 (Opus 4.8) via OpenRouterHigher-stakes creative judgment: a wrong energy direction misleads the actor on set; a malformed starting_frame_prompt corrupts AI-UGC asset generation. Opus 4.8 is the correct ceiling for brief work involving format ambiguity or novel setups.

GPT-5.5 and Fable 5 (claude-fable-5) are not used by this skill. Brief packaging has no broad-variation expansion work and no ceiling-synthesis work — those tiers belong to upstream phases (ad-scripter-write, ad-ideator-classify).

02 The spec

What goes in, and what comes out. Two separate output shapes depending on production pathway.

Inputs

InputWhat it is
Polished script (from scripter-polish)The final approved script file — 7 sections, full Ad Copy Block (primary text × 3, headlines × 3), construction log, and metadata including routing (INTERNAL-TEAM / EXTERNAL-ACTOR / AI-UGC), ugc_scope (FULL_SCRIPT / HOOK_ONLY), format, awareness level, and mechanism reveal level.
Concept card format fieldThe format assigned at concept card generation — Selfie, FAQ Phone Scroll, Seated Interior, Skillshow, etc. Governs which of the 11 format modules is loaded when building the actor brief.
Routing pathwayThe production routing from production-pathways.md: INTERNAL-TEAM (Bonnie or internal operator films), EXTERNAL-ACTOR (contracted actor), or AI-UGC (ugc-factory handles generation). The skill reads this field and branches. A batch may contain scripts with different routings — the skill groups them by routing so each downstream operator only reads their section.
Voice Book (Expert Voice Book) — Supabase expert_profile where status='current'The structured voice and identity profile for the expert (e.g. Amelia Fenmore / IDA). Used to populate the voice_ref field in AI-UGC blocks (pointing to experts/<expert>/voice/clean.m4a) and as a sanity check on register. If absent, the skill halts before any voice-dependent output.
Supabase winning_ads view (filtered by expert namespace)The read-only Supabase view of all approved winning ads for this expert. Used to confirm the current highest SEQ (sequential ad number) before assigning names. Local markdown exports are a fallback only — never primary at runtime.

Output shape A — Actor filming brief (INTERNAL-TEAM or EXTERNAL-ACTOR routing)

The brief the human actor reads. No implementation detail, no Meta copy, no internal strategy.

Multi-script actor brief

Primary output for batches of 2 or more filmed scripts · Delivered as .md → Google Doc → PDF → attached to Fibery FILMING/SHOOT ticket
Field / SectionWhat it contains
Title blockBrief title, date, expert name, total number of scripts, wardrobe note.
How This WorksPlain-English explanation of the session for multi-format or unfamiliar formats. What the actor needs to understand about the formats being shot. Omit for a single-format batch where the actor already knows the format.
Overview gridTable: Creative Name | Script Topic | Scene Format. The actor can see the whole session at a glance. Creative Name uses the full naming convention: [SEQ]_[IdentityShort]_[Ad Simple Name]_[Style]. No duration column.
Scene format blocks (A, B, C…)Scripts grouped by physical setup, not by script number. Most-scripts-first ordering to minimise equipment resets. Each block: Block header (format name + letter) → Setup section (equipment, location, lighting — only what's different from default) → Energy note (one sentence on register for this format) → Clean script(s). Clean means: no square-bracket stage directions, no EXPERT: speaker labels, no speech marks, no duration estimates. TEXT CARD: "text" on its own line for editor overlays. Plain-prose cues for mid-script physical moves (e.g. "Hold up your phone here.").
2-Person blocks (if present)Speaker labels retained (EXPERT: and INTERVIEWER:). Interviewer lines marked as guides, not teleprompter copy. How This Works section required explaining the friends or recognition mechanic. Interviewer name and location energy note included.

Fibery FILMING/SHOOT ticket (handoff record)

Created in Fibery after operator approval of the brief · Stage 2 of skl-operations pipeline
FieldWhat it contains
NameNaming convention: W[WEEK]_[IdentityShort]_[TYPE]_[FormatDescriptor]_[MMDDYY]. TYPE = TH (talking head, any real environment). FormatDescriptor = brief descriptor of the batch (e.g. "Selfie-FAQ-Seated"). Example: W16_ALBA_TH_Selfie-FAQ-Seated_040726.
IDENTITYThe expert identity (IDA, ALBA, EH).
Video TypeADS (always for ad-production-brief output).
StateUPCOMING (set at creation; not changed to Filmed until Bonnie posts the INGEST ALERT in #shoot-updates).
Description / Briefing docFull brief pasted as plain text (no markdown formatting — plain paragraphs, script text readable inline). Also used to link all relevant CREATIVE entities in the batch via COMPANY HUB/CREATIVE-NEWS collection.
PDF attachmentGoogle Doc exported as PDF and attached to the Fibery task via catbox.moe procedure (upload PDF to catbox.moe → copy direct URL → paste into Fibery File Attachments section). The PDF is the permanent actor-facing record.
created_by_run_idThe agent_run ID stamped on the Fibery entity and the Google Doc footer so every downstream user can trace the brief back to the exact run that produced it.
Slack alertPosted to #shoot-updates (Slack channel ID C09CXGQKP9D) after ticket creation: :memo: *PREP FOR FILMING* | ID: [ticket name] | Shoot Date: [MM-DD-YYYY] | Shoot Type: Ads | No. of Scripts: [count] | Owner: @Asel | Talent: @Bonnie | [Fibery Board Link]

Output shape B — AI-UGC handoff brief (AI-UGC routing)

Unlike the actor brief, ugc-factory needs full stage directions, durations, and speaker labels. The YAML block is a paste-ready input to rc-ai-ugc (the ugc-factory interface). One block per script, preceded by a batch summary header.

AI-UGC batch summary header

One per AI-UGC batch, above the per-script blocks · Consumed by rc-ai-ugc operator in Fibery
FieldWhat it contains
batch_idSlug identifying this batch (e.g. ida-2026-06-pioneer-v1).
expertExpert namespace (ida, alba, elena).
total_scriptsCount of AI-UGC scripts in this batch.
formats_usedFormat slugs and counts (e.g. selfie-white-wall (3), street-interview (2)).
operatorPENDING — unresolved following Gelo's departure. Do not substitute until operator confirms.
fibery_pipelineLink to the Fibery view or task ID for this batch.
run_idThe created_by_run_id from the open agent_run row — stamped before emitting.
processing_orderAlways by_format — groups QC (quality check) sessions by format so the operator's eye stays calibrated.

Per-script AI-UGC BRIEF BLOCK (YAML)

One block per AI-UGC script · Contract between ad-creative-system and rc-ai-ugc (ugc-factory)
FieldWhat it contains
creative_nameFull naming convention: [SEQ]_[IdentityShort]_[Ad Simple Name]_[Style]. Style is the format slug in CamelCase. For HOOK_ONLY scope, append _HookTest.
expertExpert namespace.
ugc_scopeFULL_SCRIPT (complete hook + body + CTA sent to ugc-factory) or HOOK_ONLY (first 5-10 seconds only — used for Seedance 2.0 hook tests before committing to full production, or when the body is being filmed separately). Default: FULL_SCRIPT if not set on script.
subjectfounder (expert identity locked via NBP Pro reference pack) or ugc-actor (contracted AI actor).
actor_idRequired only when subject = ugc-actor.
phasefirst-gen (new AI-UGC actor, building identity lock) or additional-gen (existing actor with established identity).
format_slugMust exactly match a JSON profile in rc-ai-ugc/profiles/. Validated against production-pathways.md by plain code before emitting. Available slugs: day-in-the-life, faq-phone-scroll, green-screen, mirror-selfie, multi-scene-founder, outdoor-walking-selfie, park-bench, pub-chat, seated-interior, selfie-white-wall, skillshow, stage-interview, street-interview, this-or-that.
starting_frame_promptStill-image prompt for the NBP Pro → Enhancor generation step. Describes subject pose, wardrobe, environment, lighting, and any per-script specifics. The motion profile JSON contributes format-level framing defaults; this field covers what's unique to this script.
scriptThe spoken dialogue, lip-synced. Full hook + body + CTA for FULL_SCRIPT. Hook only (first 5-10 seconds) for HOOK_ONLY, with a note: "Body pending [filmed / separate run]." Omit for b-roll-only formats (multi-scene-founder, day-in-the-life).
sceneOptional per-script scene context layered on the format profile defaults. Only include when this script needs to override format-level defaults.
ad_typeRequired for talking-head formats (selfie, seated-interior, mirror-selfie, etc). Always hook-only when ugc_scope = HOOK_ONLY. Skip for b-roll formats.
duration_sTarget duration in seconds. HOOK_ONLY: 5-10. FULL_SCRIPT: 4-15 typical, longer for narrative formats.
voice_reffounder — uses experts/<expert>/voice/clean.m4a for tone-locking (requires current expert_profile in Supabase). none — Seedance 2.0 synthesises a generic voice (gibberish risk; use only for UGC actor stand-ins).
variant_count_defaultHow many image variants the operator batches before QC gate 1. Default: 4.

03 Live output example

The sw-tc001 script from the 2026-06-10 depth eval, routed to EXTERNAL-ACTOR. Script content is a real eval artifact; the brief wrapper is representative.

ACTOR FILMING BRIEF — IDA (Amelia Fenmore) · Script: IDA-AGE-OBJECTION-DTC-V1 · Routing: EXTERNAL-ACTOR script content b-realbrief wrapper b-rep
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AMELIA FENMORE — FILMING BRIEF
Date: 2026-06-11 | Scripts: 1 | Format: Standard DTC (direct to camera)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

CREATIVE NAME: [SEQ]_IDA_AGE-OBJECTION-DTC-V1_Selfie
(SEQ confirmed from Supabase winning_ads view at run time)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BLOCK A — SELFIE / CLOSE-UP DTC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Setup
Close-up to camera. White wall or clean background. Phone on selfie stick or
handheld. FaceTime energy — you're talking to one person, not an audience.
Eye line direct to lens. No performance. Conversational.

Energy
Calm authority throughout. Not a pitch. Someone explaining something a
close friend needs to hear. Steady and validating — no high-energy phrasing.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SCRIPT
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

If you're 50 or older and you've been telling yourself it's too late to start
something new — I want you to hear this.

I speak to people in this position every single week.

They've been told to take online courses. Build a personal brand. Start from
scratch. And none of it works — because none of it accounts for the one thing
they have more of than anyone else in the room.

Slight pause. Let that land.

I get it. Right now it feels like that counts for nothing.

I want to tell you about Alexander. Laid off at 55 after 30 years in sales.
30 years.

Pause.

He started a design business built around what he already knew. Now earns
£2,500 per project, 2 to 3 projects a month. First time in 30 years the work
felt like his.

The approach we teach doesn't require a degree. It doesn't require a following.
It doesn't require starting from scratch. It's built around one skill your life
experience makes you better at — not worse.

I made a free training that walks you through exactly how this works.

No pause between the next three. Stack them tight — the rhythm is deliberate.

James — 15 years in IT, now $8,000 a month working 4 days a week.
Sophia taught for 18 years, built $2,800 a month in 9 months.
Adriana was 47, 22 years in teaching, now earning $4,800 a month.

The link is below. It's free. Your experience isn't the problem. The vehicle
you were handed for it is.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
END OF BRIEF
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Brief ready for review. Confirm approval to proceed with Fibery task creation
and Google Doc.
How to read it: Notice what's gone: no square-bracket stage directions, no AMELIA: speaker labels, no scene numbers, no word counts, no Meta ad copy, no internal strategy notes. The actor gets exactly what they need to perform — the format setup, the energy in one sentence, and a clean script where physical cues are written as plain prose (e.g. "Slight pause. Let that land." instead of "[Pause. Let that land.]"). The Hard Landing Repeat on "30 years" is preserved as natural repetition in the script body — the actor hears it the way any reader would, with no annotation required. The proof stack ("no pause between the next three") is a plain-prose direction, not a stage direction token. This is the correct actor-facing register.

How the same script looks as an AI-UGC brief block (HOOK_ONLY variant — testing the hook in Seedance 2.0 before committing the full script to production):

AI-UGC BRIEF BLOCK — IDA · Script: IDA-AGE-OBJECTION-DTC-V1 · Scope: HOOK_ONLY representative
## AI-UGC BRIEF BLOCK

creative_name: [SEQ]_IDA_AGE-OBJECTION-DTC-V1_SelfieWhiteWall_HookTest
expert: ida
ugc_scope: HOOK_ONLY
subject: founder
actor_id:
phase: additional-gen
format_slug: selfie-white-wall

starting_frame_prompt: |
  Subject standing close to camera, white wall behind. Warm neutral lighting,
  no shadows. Phone held at selfie angle. Direct eye contact with lens.
  Natural expression, mid-thought, slight earnestness. Minimal wardrobe —
  clean, professional but not formal.

script: |
  If you're 50 or older and you've been telling yourself it's too late to
  start something new — I want you to hear this.
  # HOOK_ONLY: hook text only (first ~8 seconds). Body pending — routed to
  # filmed production (EXTERNAL-ACTOR) for the full script.

ad_type: hook-only
duration_s: 8
voice_ref: founder

variant_count_default: 4
How this differs from the actor brief: The script field contains the hook verbatim — full spoken text, no cleaning. The starting_frame_prompt describes the visual precisely because ugc-factory generates the still image from this text, not from a human art director's memory of the set. The voice_ref: founder pulls the voice clean file from experts/ida/voice/clean.m4a via the Supabase expert_profile record — the system halts if that record is absent. This block goes into Fibery for the rc-ai-ugc operator (currently unresolved — see pending handoff note). The actor brief version strips all of this and delivers a human-readable performance document instead.

04 Glossary

Every abbreviation spelled out. A reviewer should understand any term cold, without prior context.

TermIn full / what it means
INTERNAL-TEAMInternal Team filming pathway — a script routed to Bonnie (or the assigned internal operator) for live filming. The actor filming brief is generated by ad-production-brief and delivered via Fibery FILMING/SHOOT ticket + PDF. One of three production pathways in production-pathways.md.
EXTERNAL-ACTORExternal Actor filming pathway — a script routed to a contracted outside actor. The brief is the same format as INTERNAL-TEAM but may include additional wardrobe, location, and reference image detail because the actor has less context about the system. One of three production pathways.
AI-UGCAI-Generated User-Generated Content pathway — a script routed to ugc-factory (NBP Pro → Enhancor → Seedance 2.0) for AI video generation rather than live filming. The brief is a structured YAML block, not a human-readable actor document. Used primarily for hook iterations and formats that are logistically difficult to film live (2-Person, Street Interview, Day in the Life). One of three production pathways.
ugc-factoryugc-factory (AI video generation pipeline) — the internal toolchain that produces AI-generated video ads. Consists of three steps: NBP Pro (still-image generation with identity lock), Enhancor (image-to-video motion), and Seedance 2.0 (final video synthesis with lip sync). The ad-production-brief AI-UGC block is the direct input to this pipeline.
NBP ProNBP Pro (Neural Background Plus Pro) — the still-image generation tool used in ugc-factory to produce identity-locked frames of the expert or UGC actor. The starting_frame_prompt field in the AI-UGC BRIEF BLOCK feeds NBP Pro directly.
EnhancorEnhancor — the image-to-video motion tool in ugc-factory that takes NBP Pro frames and adds realistic movement before the Seedance 2.0 lip-sync pass.
Seedance 2.0Seedance 2.0 — the final video synthesis and lip-sync tool in ugc-factory. Seedance reads the script field from the AI-UGC brief block and synchronises mouth movement to the spoken dialogue. When voice_ref: founder, it uses the expert's clean voice file for tone-locking. When voice_ref: none, it synthesises a generic voice — gibberish risk is high; use only for UGC actor stand-ins.
FILMING/SHOOTFibery FILMING/SHOOT entity — the Fibery ticket that represents a filming batch. Created by ad-production-brief after operator brief approval. Named per convention (W[WEEK]_[IdentityShort]_TH_[FormatDescriptor]_[MMDDYY]), linked to all CREATIVE entities in the batch, set to state UPCOMING, and populated with the brief as plain text plus PDF attachment. Lives in the FILMING space of the SKL Fibery workspace.
BonnieBonnie — the internal SKL talent who films ads for the INTERNAL-TEAM pathway. Receives the actor brief via Fibery and the PDF. Posts the INGEST ALERT to #shoot-updates when filming is complete, which triggers Stage 3 (engineering handoff).
format modulesFormat modules — the 11 named briefing recipes built into ad-production-brief, one per approved video format. Each module specifies: setup context for the actor, stage direction conventions, what the actor needs to know, and any format-specific brief requirements. The 11 modules are: Selfie / Close-Up DTC, Seated Interior, FAQ Phone Scroll, This or That Standing, 2-Person (Friends Catching Up), 2-Person (Stranger Recognition), Skillshow (Swipe Slideshow), Outdoor Walking Selfie, Mirror Selfie, Pub Chat, and Park Bench / Outdoors (Seated).
DTCDirect to Camera — a video ad format where the presenter speaks directly into the camera lens, creating a one-on-one feel with the viewer. The Selfie / Close-Up DTC and Seated Interior modules are the most common DTC formats in the IDA (Interior Design Academy) system.
UGCUser-Generated Content — an ad format that mimics organic, creator-style content — informal, handheld-looking, less produced. In this system, UGC is generated by ugc-factory rather than actual user content. The AI-UGC pathway produces synthetic UGC.
stage directionStage direction — a bracketed instruction in a script file (e.g. [Pause. Let that land.]) that tells the actor or AI system what to do physically or emotionally at that moment. Actor briefs remove all square-bracket stage directions and replace them with plain-prose cues or section-level energy notes. AI-UGC briefs keep stage directions because ugc-factory needs them for scene understanding.
SEQSequential ad number — a 3-digit zero-padded identifier assigned to each new creative in the system (e.g. 031). Read from the Supabase winning_ads view at runtime (filter by expert namespace, order by seq descending, take the first result) to confirm the current highest number before assigning the next. Never assumed from local files.
IDAInterior Design Academy — the expert identity for Amelia Fenmore, an interior-design business coach. IDA is the expert namespace in Supabase, Fibery, and all creative naming. The identity short form for naming is IDA. IDA ads drive cold Meta traffic to a free training, which converts to booked sales calls.
Voice BookExpert Voice Book — the structured voice and identity profile built by ad-voice-profile for each expert. Contains signature speech patterns, forbidden words, mechanism language, CTA register, and proof delivery conventions. The Voice Book lives in Supabase Layer 2 (expert_profile) and in orchestration/expert-config/<expert>/voice-book.md. The old name "Layer 3 calibration" or "L3 calibration" is deprecated — always say Voice Book.
CPBCCost Per Booked Call — how much was spent on Meta ads to get one person to book a sales call with the expert. The primary success metric for IDA cold traffic. Used upstream in ad-autopsy and ad-ideator-classify; not directly read by ad-production-brief, but informs which scripts reach the brief stage.
HITLHuman in the Loop — the firm-wide rule that no autonomous execution happens in the main creative pipeline in V1. The operator approves the brief before any Fibery task or Google Doc is created. ad-production-brief always presents the brief and waits for an explicit affirmative before proceeding to the Post-Review Workflow.
catbox.moecatbox.moe (file upload service) — the procedure used to attach PDFs to Fibery tasks. Export the Google Doc as PDF → upload to catbox.moe → copy the direct URL → paste into the Fibery File Attachments section. This is the canonical Fibery PDF attachment method for SKL — direct Google Drive links do not work reliably for Fibery attachments.
rc-ai-ugcrc-ai-ugc (ugc-factory operator interface) — the internal tool the AI-UGC operator uses to drive NBP Pro, Enhancor, and Seedance 2.0 using the YAML block fields from the AI-UGC brief. The operator pastes each field from the brief into the rc-ai-ugc UI form. Currently unresolved following Gelo's departure.
agent_runagent_run (Supabase audit table) — the cross-cutting table that records every agent run in the system. ad-production-brief opens a row at the start of each run and closes it at the end (success / partial / failed / halted). The row's ID is the created_by_run_id stamped on every downstream write — Fibery task, Google Doc, PDF attachment — so the full production trail is traceable.
POST-PRODPOST-PRODUCTION/EDITING entity (Fibery) — the Fibery ticket created by skl-operations post-production-intake after both filmed and AI-UGC pathways deliver footage. Both production pathways converge here. One editing ticket per ad. Links back to the CREATIVE entity. Routes to the editor queue.
PTPrimary Text — the main body copy in a Meta (Facebook / Instagram) ad — the text above the video. Generated by ad-scripter-write as part of the Ad Copy Block (Primary Text × 3, Headlines × 3). Never included in the actor filming brief — the brief is for the actor, not the ad account.