agentleFS
ttalkkaklabttalkkaklab/social-flow/skills/intro/SKILL.md

intro

Skill1 starsChanged 3 months agoApache-2.0View on GitHub

Makes the channel's opening video — character action, name plate, sonic logo. Use when the user asks to "인트로 영상 만들어", "채널 인트로", "오프닝 영상", "로고 애니메이션 영상", "make a channel intro video", "create a logo sting", or right after /social-flow:branding installs the profile image. Designs 4 concepts (character action × mood × sonic logo) for a human pick, generates the character acting with the saved video model, reveals the channel name on a deterministic text plate, aligns a Lyria sonic logo to the landing frame, runs brand-reviewer's intro mode on request, and installs master, stinger, lockup and sonic assets under data/[slug]/assets/intro/. Boundary — branding makes the still profile image, this makes the moving opening.

  • Reads credentials

4 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

9 rules. 0 are common, 4 are distinctive, and 5 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 4

    Distinctive

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Follow host evaluation for every requested review.

    line 16
  2. Distinctive:

    HITL records: Keep the chosen concept and action/music details in channel intro files.

    line 21
  3. Very specific:

    Read references/intro-playbook.md — the SoT for concept axes, prompt skeletons, and review criteria.

    line 65
  4. Very specific:

    If an intro already exists, always confirm first — replacing it puts the brand tone out of step with existing posts.

    line 67
  5. Very specific:

    Check whether GEMINI_API_KEY is set.

    line 71
  6. Very specific:

    If the concept is scene-led (a mini scene with props, a dark studio, etc.), generate the first frame with gpt_image_img2img (logo master as …

    line 136
  7. Very specific:

    If <slug>-sonic-logo.wav exists, just copy it to .work/sonic.wav (sonic branding = repetition).

    line 182
  8. Distinctive:

    If that fails too, skip this step (the clip's native sound only).

    line 187
  9. Distinctive:

    Update the intro assets line in profile.md §6 (add it if missing).

    line 266

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Follow host evaluation for every requested review.

Automatic execution policy: Read automation guidance first. Creative rules and review findings guide improvements; scores, review/hash/freeze records, CTA choices and intermediate approval steps do not block authorized work. Preserve actual external-action authorization and stop at the artifact the user requested. This policy supersedes older quality-gate wording below.

HITL records: Keep the chosen concept and action/music details in channel intro files. Preserve actual provenance in local files and reuse existing authorization. This adds no approval gate.

Channel intro video — data/[channel]/assets/intro/

Makes the intro (logo sting) that the channel's profile character acts in person — in this order: 4-concept HITL pick → video generation with the saved video model → channel-name reveal + sonic-logo alignment → review on request → HITL watch approval. The channel name and tagline must appear so a viewer knows "what channel this is" within 3 seconds, and a memorable sonic logo is aligned to the landing frame. The design rationale lives in references/intro-playbook.md — the SoT. Read it before starting.

Deliverables (path contract)

data/<slug>/assets/intro/
├── .work/                          # intermediates (not committed)
│   ├── brief.md                    # 4 concepts + pick + video prompt record
│   ├── lockup.html                 # lockup card instance (template substitution)
│   ├── lockup.png                  # full lockup (background+character+channel name) 1080×1920
│   ├── text-plate.png              # transparent text plate (channel-name reveal)
│   ├── char-card.png               # character card (no text — video first/last frame)
│   ├── open-frame.png              # (per concept) opening keyframe
│   ├── intro-raw.mp4               # video render (regenerations: intro-raw-r2.mp4 …)
│   ├── sonic.wav                   # sonic-logo working copy
│   ├── frames/                     # review frames (from build-intro.sh)
│   └── preview.html                # browser preview (candidate/final check)
├── <slug>-intro-master.mp4         # final master (~4.8s — post-roll closing splice, trailer)
├── <slug>-intro-stinger.mp4        # stinger (≤2.5s — series opener, ultra-compact splice)
├── <slug>-intro-lockup.png         # full lockup card (reused for covers/end cards)
└── <slug>-sonic-logo.wav           # sonic logo (shared across all videos — never regenerate)

Procedure

1. Load prerequisites

  • data/<slug>/profile.md — if missing, stop and point to /social-flow:channel add. Take §1 identity (topic, target, content promise), §3 THEME, and the banned subjects as fixed constraints.
  • Logo (character) master assets/branding/<slug>-logo-master-1024.png — if missing, stop and point to /social-flow:branding first (the intro is built on the finalized character).
  • Read references/intro-playbook.md — the SoT for concept axes, prompt skeletons, and review criteria.
  • If an intro already exists, always confirm first — replacing it puts the brand tone out of step with existing posts. An existing <slug>-sonic-logo.wav is reused by default (replace only on explicit request).
  • Check whether GEMINI_API_KEY is set. Without it music_generate_clip fails; if MLX Core is up, mlx_music_generate can still write the sonic logo (2–3s instrumental). If both are down, announce in §2 that the run will proceed with the clip's native sound only, no sonic logo.

2. Design 4 concepts → HITL pick

Design 4 distinct concepts along the playbook §3 axes (character action × scene mood × sonic-logo character) — at least one must include the signature gesture (the action that symbolizes the channel), and spread the emotional register (energy/trust/wit/cinematic).

Present them as one AskUserQuestion with 4 options — each option is a label (short concept name) + description (action, mood, sonic logo in one line) + a scene scenario in preview (3–4 lines of what the character does at which second). Other can carry a blend ("A's action with C's mood") or a full redesign — fold in a blend and confirm, or build 4 fresh concepts for a redesign.

Record the confirmed concept, scenario, and prompt draft in .work/brief.md — the baseline document for the review rounds and re-runs. The tagline (the §1 content promise compressed, 2 lines max) is also finalized here.

3. Capture the 3 brand cards (deterministic — logo pixels never pass through a generative model)

sed-substitute references/lockup-template.html into .work/lockup.html — {{INK}}, {{ACCENT}}, {{ACCENT2}} (profile §3 hex), {{CHANNEL_NAME}}, {{TAGLINE}} (line breaks as <br>), {{LOGO_SRC}} (the logo master — copy into .work/ and reference by file name). Shoot the 3 modes with the shared produce capture script:

CAP=${CLAUDE_PLUGIN_ROOT}/skills/produce/references/capture-frames.sh
WD="data/<slug>/assets/intro/.work"
# The intro has no episode scope — we call this from the repo root and only the
# output goes under the channel, so there's no `.work/format.env` to find.
# So pass the window size directly.
# Portrait 1080×1920 equals today's default, so behavior doesn't change. For a
# landscape intro use `CAP_W=1920 CAP_H=1080` and end the URL with `&format=wide`.
CAPENV='CAP_W=1080 CAP_H=1920'
env $CAPENV $CAP "file://$PWD/$WD/lockup.html?mode=full" "$WD/lockup.png" 0
env $CAPENV $CAP "file://$PWD/$WD/lockup.html?mode=text" "$WD/text-plate.png" 1   # alpha required
env $CAPENV $CAP "file://$PWD/$WD/lockup.html?mode=char" "$WD/char-card.png" 0

The shell variable was renamed from W to WD — W now means canvas width, and keeping the same name would confuse the reader (it isn't exported, so even before this it never reached child processes).

Open the 3 captures with Read and check them — channel-name typos, tagline line breaks, character crop. An error here corrupts everything downstream.

Once burned into the frame, the tagline can't be fixed. Run it through the style checker once and treat its findings as suggestions (the channel name is a proper noun, outside the checker's scope).

echo "<tagline>" | python3 ${CLAUDE_PLUGIN_ROOT}/skills/platform-guide/references/check-style.py --surface screen -

On request, or when the line reads off, delegate to the growth-post-reviewer agent on the standalone surface — use the review's concrete wording suggestions before putting the tagline on screen (it's a one-line copy, so delegate 2–3 candidates together and pick).

4. Opening keyframe (long version only — skipped at the 4-second standard)

If the concept is scene-led (a mini scene with props, a dark studio, etc.), generate the first frame with gpt_image_img2img (logo master as reference, 1080×1920; under Codex image_gen after view_image on the master, under Grok image_edit with the master as image) (an exception to the local-first default path — reference editing doesn't exist in image_local_generate) — the pre-entrance state or a silhouette, with the profile negative prompt + text exclusion, saved as .work/open-frame.png. Skip it for front-facing character-entrance concepts.

5. Video generation (the saved video model)

The body of the intro is always made with a video-generation tool — never substituted by HTML captures and ffmpeg assembly alone (cards and text are only the §7 finishing overlays). The tool is the saved video model (.social-flow/models.json → models.video); channel assets follow the directory model settings like episodes do, and a different engine needs the user's explicit request. In a configured workspace (one with .social-flow/models.json) an intro clip is a channel asset, not an episode: call the saved model's adapter directly with an outputPath under data/<slug>/assets/, without videoContext (video_plan takes an episode). The server binds the call to the saved video model and resolution (a different engine fails with model_selection_mismatch) and logs it to data/<slug>/assets/.work/video-requests.jsonl.

  • Host video model — the host image_to_video makes it: char-card.png as the source, duration 4, 720p, video.host in the ledger.
  • Default (4-second standard — user-confirmed): the saved model's image-to-video call (astra_genai_img2video, astra_img2video or seedance_img2video) — source = char-card.png (first frame = final pose card), 9:16, 4 seconds, the saved resolution. An intro has no dialogue, so any adapter works. Put "the framing and crop never change" + "returns to the exact starting pose by the 3-second mark" in the prompt; ending alignment is guaranteed by the §7 lockup crossfade, and the build normalizes the source to 1080×1920.
  • Long version (trailer use only): 8 seconds, with char-card as lastFramePath where the adapter takes one (astra_* image-to-video).
  • Mascot-acting-focused concepts: the saved engine's reference call (seedance_reference, astra_genai_msr) — the logo master (+ 1–2 other angles if available) as references, 9:16. Its strength is keeping the character on-model.
  • The prompt follows the playbook §5 L.O.G.O. skeleton: character preservation rules → the concept's single gesture (with per-second timing) → motion SFX description → "ends settled in the exact pose of the final frame, last second nearly static". Exclusions go in a negativePrompt argument where the adapter has one (astra_* guided tiers), never the body — text, letters, captions, subtitles, music, background score + the profile's banned subjects as noun phrases (playbook §5). Save as .work/intro-raw.mp4.

6. Sonic logo

If <slug>-sonic-logo.wav exists, just copy it to .work/sonic.wav (sonic branding = repetition). Otherwise generate the concept's sonic-logo description (playbook §7 — rise→impact→tail, 2–3s, no vocals) with music_generate_clip (Lyria) and save as .work/sonic.wav. If GEMINI_API_KEY is unset, try mlx_music_generate (instrumental, ~3s). If that fails too, skip this step (the clip's native sound only).

Voice tag (optional — when the user wants one): premix a TTS reading of the channel name, delivered with impact, into the sting. Generate with tts_generate, but fix a tag-specific voice and delivery in the brief (it may differ from the channel narration voice — e.g., a male voice with a signature delivery like "딸깍. 랩↗", the channel name stretched with a rising tone. Direct stretch and intonation via the text spelling ("따알깍") and stylePrompt). After trimming silence, align the end of the reading to the sting impact and premix with sidechain ducking (updating .work/sonic.wav), and sync TEXT_AT to the reading's start (text appears = reading starts). The confirmed premix becomes the <slug>-sonic-logo.wav asset — the voice tag is sonic branding too, so once confirmed it never changes.

7. Post-processing (build-intro.sh)

REF=${CLAUDE_PLUGIN_ROOT}/skills/intro/references
$REF/build-intro.sh "data/<slug>/assets/intro/.work"

Reads intro-raw.mp4 + lockup.png (+ text-plate.png · sonic.wav) from .work/ and builds intro-master.mp4 · intro-stinger.mp4 · frames/. Order: normalization (1080×1920/30fps) → channel-name plate slide-in → real-pixel lockup crossfade → hold → aligned sonic-logo mix (-14 LUFS). Knobs (environment variables):

KnobDefaultPurpose
TRIM_START0cut a stalled opening (mostly for the long version — usually unneeded at the 4s standard)
TEXT_AT / SONIC_ATlanding −1.2s / −0.2sfine-tune reveal and sonic-logo timing
LOCKUP_XF / HOLD0.6 / 0.8lockup transition, ending hold
STINGER2.5stinger length
AUDIO / SONIC_VOLnative / 1.0drop the clip's audio / sonic-logo gain

8. Optional adversarial review (brand-reviewer intro mode)

Delegate to the brand-reviewer agent (Agent) — pass the paths of intro-master.mp4, frames/, lockup.png, profile.md, .work/brief.md, plus any unresolved findings from the previous round, and state that this is "intro video mode". Parse the verdict tail INTRO_REVIEW: score=NN p0=N verdict=PASS|FAIL.

  • No findings worth acting on → §9.
  • Findings fixable in post (stalled opening, timing misalignment, level balance): re-run §7 with only the knobs changed (no video re-call — cheap).
  • Generation defects (character off-model, near-glyphs, effect soup): fold the findings into the prompt via the playbook §9 correction table and regenerate §5 — only when the user asks for the regeneration and it fits the authorized budget. A higher model grade is likewise the user's explicit request, never an automatic escalation after a FAIL label.
  • Report the chosen version and unresolved findings. Further generation depends on the authorized budget and task, not a reviewer score or an automatic escalation.

9. HITL watch approval (browser)

Substitute references/preview-template.html into .work/preview.html — {{TITLE}} "Final intro check", A = intro-master.mp4, B = intro-stinger.mp4, with the timeline (reveal, sonic logo, lockup times) in DESC. Open it with open, tell the user to unmute and verify the sonic logo too, then get approval via AskUserQuestion. Fix requests route back to §7 (knobs) or §5 (regeneration) depending on their nature.

10. Install & report

IN="data/<slug>/assets/intro"
cp "$IN/.work/intro-master.mp4"  "$IN/<slug>-intro-master.mp4"
cp "$IN/.work/intro-stinger.mp4" "$IN/<slug>-intro-stinger.mp4"
cp "$IN/.work/lockup.png"        "$IN/<slug>-intro-lockup.png"
cp "$IN/.work/sonic.wav"         "$IN/<slug>-sonic-logo.wav"   # only if the sonic logo is new
ASSET=${CLAUDE_PLUGIN_ROOT}/skills/channel/references/resolve-asset.py
python3 "$ASSET" --ensure data/<slug> intro master  "intro/<slug>-intro-master.mp4"  "post-roll splice, trailer"
python3 "$ASSET" --ensure data/<slug> intro stinger "intro/<slug>-intro-stinger.mp4" "series opener"
python3 "$ASSET" --ensure data/<slug> intro lockup  "intro/<slug>-intro-lockup.png"  "cover, end card"
# only if the sonic logo is new
python3 "$ASSET" --ensure data/<slug> intro sonic   "intro/<slug>-sonic-logo.wav"    "shared across all videos"

Update the intro assets line in profile.md §6 (add it if missing). Report: review findings when a review ran, regeneration count, timeline, deliverable path table + usage guidance (the playbook §1 table — always state never placed in front of short-form content). Note that uploading to platform channel pages (trailer, profile intro) is manual work.

Rules

  • The video body is always generated with the saved video model — card captures and ffmpeg handle only the finishing (text reveal, lockup guarantee, mix).
  • Never call the video model before the concept is confirmed — the pick happens on the 4 text concepts of §2. Generating multiple video candidates to choose from is banned on cost.
  • Reviews are advisory — brand-reviewer (intro mode) findings inform revisions and are reported as they came; no score manipulation, no fabricated review, no regeneration spent on a verdict label alone.
  • Channel-name and tagline text is never left to the generative model — text goes in negativePrompt where the adapter has one, and text is handled by the lockup card and plate (deterministic render). Writing "no text" in the body makes letters appear instead.
  • The sonic logo is a channel asset — once confirmed, reuse it across all videos; regenerate only on the user's explicit request.
  • No concept drift after the HITL pick — if it must change, stop the loop and return to §2 for a fresh pick.
  • Intermediates live in .work/ (gitignored); only the 4 final files go into assets/intro/.
  • The intro is never placed in front of short-form content — the default uses are post-roll splice (brand closing), trailer, and series opener (after the hook). Follow the playbook §1 table.

Additional Resources

Reference Files

  • references/intro-playbook.md — best-practice SoT (placement, length, concept axes, L.O.G.O. prompting, sonic logo, final-frame contract, correction table)
  • references/lockup-template.html — brand lockup card (full/text/char 3 modes, for 1080×1920 headless capture)
  • references/build-intro.sh — post-processing render (normalization, text reveal, lockup crossfade, sonic-logo mix, stinger derivation)
  • references/preview-template.html — browser preview (2-slot video comparison — final check and candidate comparison)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.