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

channel

Skill1 starsChanged 3 months agoApache-2.0View on GitHub

Creates channel profiles and reusable character sheets; stops before episodes. Use when the user asks to "채널 만들어", "채널 추가", "채널 목록", "프로파일 수정", "add a channel", "set up a content channel", "캐릭터 만들어", "캐릭터 시트 수정", or wants to create or update the channel directory under data/. For full workspace defaults (SNS, genre, style, video ratio) use project-init. Writes data/[slug]/profile.md — target audience, tone, pinned voice IDs, visual theme, target platforms, fact-check policy — the identity file every storyboard, produce and publish run opens first; engines, SNS targets, visual style and ratio live in .social-flow/models.json.

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

Show its rules and text

We split this skill into the rules it gives an agent

19 rules. About 0 are common, 9 are distinctive, and 10 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 10

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Follow production order. Project setup precedes all episode work.

    line 14
  2. Distinctive:

    HITL records: Keep channel answers in profile.md.

    line 21
  3. Distinctive:

    When project-init authors a new profile, use the choices already collected there, especially the speech engine and target platforms.

    line 29
  4. Distinctive:

    If it already exists, stop and point to update.

    line 68
  5. Distinctive:

    If the working directory already has model settings, use its speech engine/model when proposing a new voice instead of the default above.

    line 95
  6. Very specific:

    When branding·intro·outro install finalized assets, they add rows via references/resolve-asset.py --ensure.

    line 129
  7. Very specific:

    Create the episode slot data/<slug>/episodes/.

    line 132
  8. Very specific:

    If accounts must be opened from scratch, point to the per-platform setup skills — they run account opening, branding, and API token …

    line 147
  9. Very specific:

    Read data/<slug>/profile.md (if missing, show the list and re-confirm).

    line 165
  10. Distinctive:

    If the channel copy (description·bio) changed, run the same optional check as add step 5 again (style diagnostics as suggestions.

    line 176
  11. Very specific:

    Run it in the background (run_in_background) so the session stays free, then hand the URL to the user.

    line 211
  12. Very specific:

    Stop it when the user is done (pkill -f references/serve.js) — a listener left behind is one more process the next session has to notice.

    line 219
  13. Very specific:

    Every confirmed character sheet includes its selected tts in the identity JSON.

    line 232
  14. Very specific:

    Before the voice audition (requested character work), the draft keeps tts: null.

    line 233
  15. Distinctive:

    Keep dialogue speaker IDs attached to their characters.

    line 244
  16. Very specific:

    When the user requests speech accuracy, run stt_local_transcribe without supplying the expected text as context, compare the transcript …

    line 255
  17. Distinctive:

    After creating or updating character identity, panels or voice, run:

    line 262
  18. Very specific:

    Keep changing scores, thresholds and pending/passed state in this record, not in identity.md.

    line 277
  19. Distinctive:

    Do not claim an age correction after changing only turn style with the same voice ID.

    line 328

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “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 production order. Project setup precedes all episode work. Complete each artifact stage before the next; pending media cannot complete a visual stage. Preserve actual spending authorization.

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 channel answers in profile.md. Preserve actual provenance in local files and reuse existing authorization. This adds no approval gate.

Channel management — data/[channel]/profile.md

For an entire project setup use project-init, which collects shared preferences and creates this layout with project_manage. A channel-only request still follows this skill without forcing full project setup. When project-init authors a new profile, use the choices already collected there, especially the speech engine and target platforms; do not ask them again.

A channel is the top-level unit of the social-flow pipeline — one content channel (brand) the user runs maps to one directory under data/, and its output gets published to accounts on multiple SNS platforms (Threads·Instagram·Facebook·YouTube). Each channel has a data/<slug>/ directory and a profile.md (the channel profile); every storyboard/production/publish run that follows loads this profile as its first step and inherits tone, voice, theme, platforms, and verification policy.

data/
└── <channel slug>/
    ├── profile.md             # channel profile (SoT)
    ├── assets/                # channel-shared assets — catalog.md + branding/ intro/ outro/ …
    ├── growth/                # growth-loop state
    └── episodes/<topic slug>/ # episodes (created by the storyboard skill)

data/README.md and references/assets-catalog-template.md are the source of truth for the assets/ kind slots and catalog conventions. Keep only what gets reused in two or more episodes; single-episode artifacts go in the topic's .work/.

Argument parsing

[add|list|update|serve|character] [channel-name]

  • add <name> — create a new channel (procedure below)
  • list — Glob for data/*/profile.md and report channel, description, and publish platforms as a table
  • update <name> — read the existing profile.md and edit only the fields the user specifies
  • character <channel> <id> — create or update the reusable character with character_manage following character-identity.md: the basics (name, gender, species, age, role, summary, height) are required arguments and every other field is optional. Read the existing identity first and pass only the optional fields that change. The tool exports the sheets; run --check after changes.
  • serve — open the channel browser in the browser (procedure below)
  • With no argument, show the current state via list, then ask what to do next

add procedure

  1. Pick the slug — convert the channel name to a kebab-case English slug and propose it (e.g. "베트남 생활" ("Vietnam life") → vn-life). It's used in directories and paths, so avoid Korean slugs. If it already exists, stop and point to update.
  2. Collect the core info — confirm the following with AskUserQuestion (at most 4 at a time; don't re-ask anything the user already gave):
    • Target audience (who watches, and in what moment)
    • Tone (polite explanatory (존댓말) / casual punchy (반말) / documentary narration, etc.) — the register decided here is the source of truth for every output that follows. The style check doesn't change this register; it only strips AI tells (platform-guide references/korean-style.md)
    • Publish platforms (threads / instagram / facebook / youtube)
    • Fact-check policy (informational=research required / creative·daily-life=skip)
  3. Assign the TTS voice — use tts_list_voices for Gemini or tts_elevenlabs_voices for the ElevenLabs account. Follow the saved speech model; ElevenLabs permits eleven_v4 only. Local TTS is removed. Pin the voice ID and identity settings. Keep line-specific emotion in narration[].acting, not the character's identity. Follow acting prompts. Change the identity voice only when the user requests it. A new character's voice is auditioned only when the user requests character work (character, or an explicit voice request): generate real samples with distinct voices (three is the usual audition), one shared Korean sample and the selected engine/model, show the playable candidates, wait for the user's selection, then save the selected voice settings/reference audio to the identity and sheet. During add and project-init the voice stays pending and no sample is billed. Pending drafts must not label a candidate as confirmed.

    If the working directory already has model settings, use its speech engine/model when proposing a new voice instead of the default above. Do not start full media-model setup for a channel-only request. Preserve existing pinned voices; resolve conflicts when the user starts episode production.

  4. Fix the visual theme — propose colors that fit the THEME contract of video-template.html (accent/accent2/ink/brand). The default is dark cinematic (ink navy + blue→violet gradient); channel personality comes from the accent color and the background mood prompt.
  5. Create profile.md — copy references/profile-template.md and fill it with the collected values. Leave no section empty — for unknown values, ask the user or use a well-grounded default and mark it (default).

    Settle the motion contract as part of the visual theme — whether the channel permits still-led episodes, which true-motion kinds count, the longest permitted still run, whether each moving shot needs a visible action, and the paid generated-video cap. Keep the template's off defaults only when the channel made no motion promise. Ken Burns, caption changes and swapping still images never count as true motion.

    Two more front-matter choices sit next to it. shortform_outro is on unless the channel deliberately ends its shorts on the CTA's last frame, and length_min_seconds / length_max_seconds narrow the short-form band. Leave the length keys out unless the channel has a reason to hold a tighter band — omitted, the format's own band applies.

    Channel copy (description·bio) is outgoing copy — the setup skills upload this text as the platform bio verbatim. After writing it, run check-style (--surface screen) and use its findings as suggestions. On the user's request, or when a line reads off and you want an independent read, delegate to the growth-post-reviewer agent as a standalone surface and fold the useful findings into the copy with the user; a score decides nothing here.

    Shared-asset catalog — copy data/<slug>/assets/catalog.md from references/assets-catalog-template.md. Don't create empty kind folders. When branding·intro·outro install finalized assets, they add rows via references/resolve-asset.py --ensure.

    Create the episode slot data/<slug>/episodes/. Topic directories are opened under it by storyboard.

  6. Point to the SNS token directory — publishing credentials live in the per-channel directory ~/.config/social-flow/<slug>/ (same slug as data/<slug> — the publish tools' channel argument points at this directory. When a channel is specified there is no fallback to default tokens):

    mkdir -p ~/.config/social-flow/<slug> && chmod 700 ~/.config/social-flow/<slug>

    For token issuance and file conventions, point to the publish skill's references/token-setup.md, and after setup have the user confirm the accounts to publish to via sns_account_check (channel=<slug>). If accounts must be opened from scratch, point to the per-platform setup skills — they run account opening, branding, and API token issuance together with the user via ego lite: /social-flow:setup-threads <channel> · /social-flow:setup-instagram <channel> · /social-flow:setup-youtube <channel>. Storyboarding and production work without tokens — they only need to be ready by publish time.

  7. Report — show the full generated profile.md and point to the next steps: if there's no profile image (logo) yet, first /social-flow:branding <channel> (4 candidates → HITL direction pick → review on request); once the logo is fixed, optionally /social-flow:intro <channel> (a channel intro video where the character acts — 4 concepts HITL → generation with the saved video model), then pick a market-validated topic with /social-flow:topic-scout <channel> and go to /social-flow:storyboard <channel> <topic>.

update procedure

  1. Read data/<slug>/profile.md (if missing, show the list and re-confirm).
  2. Edit only the fields the user specifies — in particular, warn on TTS voice and THEME color changes: they clash with the tone of already-published videos, and the channel-shared outro (assets/outro/) must be rebuilt too. Warn on shortform_outro and the length band for a different reason — they change what gets made from here on. Flipping shortform_outro to off drops the spliced tail from every future short (the outro file stays on disk; it just stops being used), and narrowing length_min_seconds / length_max_seconds moves what the length check measures against, so a board that drew no flag last week comes back flagged today (check-scenes.js and the approval strip warn outside the band; only the 180s platform cap fails). Neither touches an episode that is already built. If the channel copy (description·bio) changed, run the same optional check as add step 5 again (style diagnostics as suggestions; a reviewer read on request).
  3. Report before/after as a table.

serve procedure

references/serve.js serves the offline library over HTTP on this machine. The root lists channels; each channel has 스토리보드 · 캐릭터 in the left nav. The current library follows the static layout described below.

The previous browser remains at /legacy. Its storyboard list is a card per episode — cover (the first scene's image as scenes.js names it), title, frontmatter status, the stage episode-state.js derives, format, image count and blockers — grouped by playlist tabs: 전체 · one tab per distinct series: frontmatter line (the same line pundago's site reads; a (n/m) tail becomes the card's episode marker) · 재생목록없음 for episodes without one. The legacy browser at /legacy opens the episode's own storyboard.html in place (it only references ./scenes.js, images/ and ../../../assets/characters/…, so it renders the same as from file://). The character list shows every panel image in assets/characters/<id>/ and the catalog note; the detail page renders identity.md, swaps the main panel from thumbnails, and plays voice.wav.

Legacy panels come back face → front → back — the order the reference set goes into a generation call (../produce/references/video-model-selection.md §The character panels), so the card thumbnail and the detail page's opening panel are both the face. Naming isn't uniform across channels, so the rank is read off the filename: face/head is the face, back/rear is the rear, everything else (body, front, real, three-quarter) is a front view. Within one rank the shorter name wins — a variant earns its length from a suffix, so head-closeup.png leads head-closeup-pre-led.png and a card shows the canonical panel rather than an old take.

node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/serve.js" data --open     # http://127.0.0.1:8390/
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/serve.js" data --port 8400
  1. Run it in the background (run_in_background) so the session stays free, then hand the URL to the user. If the port is taken, pass --port.
  2. The home page exports the offline library for every channel. Opening a generated index refreshes that channel; ordinary media requests only read files. /legacy retains the previous API browser. A conflicting hand-authored index is reported.
  3. It binds 127.0.0.1 on purpose. data/ holds research notes, growth state and .work/ intermediates, so --host 0.0.0.0 (other machines, a cloudflared tunnel) is the user's call, never a default. Path segments starting with . are never served.
  4. Stop it when the user is done (pkill -f references/serve.js) — a listener left behind is one more process the next session has to notice.

Local review HTML (required after character edits)

For every new or updated character, follow character-identity.md. Required: the basics, the three sheet panels and the selected voice below; every other identity field is optional. For dramatic characters, apply character depth when filling existing personality, relationship and acting fields. Name tendencies in traits, then connect them to choices and costs in flaw, fear and relationships. Preserve existing canon and keep episode-specific pressure separate from the shared identity; no extra JSON keys are required.

Export the bundled sheet before any episode candidates or scene images, including drafts with pending media. Make each panel with character_panel; it follows the panel specifications for purpose, canvas ratio and subject size and builds the prompt from the identity. Never hand-author the review HTML.

Every confirmed character sheet includes its selected tts in the identity JSON. Before the voice audition (requested character work), the draft keeps tts: null; do not substitute the following example as a confirmed voice. After selection, the block includes:

{"tts":{"engine":"gemini","model":"gemini-3.8-flash-tts","voiceId":"Charon","language":"ko","speed":1}}

This is an example, not a default for the cast. Choose and pin each character's voice; include model/stylePrompt when the engine uses them. Silent characters still need a voice configuration for reuse. Narrator settings do not substitute for a character voice. Copy this exact tts into SB_DOC.characters. Keep dialogue speaker IDs attached to their characters; voice settings alone do not author dialogue or lip sync. Missing or invalid settings produce content diagnostics and prevent the sheet from displaying a review pass; template freshness is checked separately. Existing sheets need migration, not an invented voice.

For a new character or a changed voice, generate voice.wav from a short Korean sample (or the explicitly selected language) using that exact configuration. Save sample.txt, the generation request/result and the WAV SHA-256 next to the sheet. A failed or unavailable engine means the voice is pending, not ready. Do not silently substitute the channel narrator, another engine or a stock sample. Reuse an existing sample only when its text, voice settings and hash still match. When the user requests speech accuracy, run stt_local_transcribe without supplying the expected text as context, compare the transcript with sample.txt, and save the transcript, normalization method and character error rate. Fix omissions or incorrect words and rerun the check. Transcription checks wording; it does not establish acting, timbre or pronunciation quality. Report those limits and never invent a listening pass. A voice setting alone does not prove that the generated sample speaks correctly.

After creating or updating character identity, panels or voice, run:

node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/review-library.js" "data/<channel>"
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/review-library.js" "data/<channel>" --check

Deliver data/<channel>/assets/characters/index.html for the complete cast and assets/characters/<id>/index.html for each sheet. They open directly with file://; no HTTP server is needed. Each sheet shows the required basics, three required image slots (front/body, back, face), optional extras, voice.wav and the specification cards for the optional fields that are present. Keep identity.md and media as the source; do not edit exported HTML. Named voice/appearance/role fields are read from identity.md.

Optional review.json exposes independent review separately from image availability: Keep changing scores, thresholds and pending/passed state in this record, not in identity.md. The identity document defines the character; duplicate status prose can contradict a later review or user threshold change and invalidate its input hash. score (0–100), iteration (positive integer), critical (nonnegative integer), and inputHashes mapping identity.md/body.png/back.png/face.png to their reviewed SHA-256 values. Include voice.wav, sample.txt and voice-accuracy.json whenever present; adding, removing or changing one invalidates the review. Record what the review actually assessed and any listening limitations. Optional threshold (integer 1–100, legacy default 95) records the user's chosen passing score; do not lower it without their instruction. Write only an actual review result. A score at or above that threshold with zero critical defects displays a pass only while all reviewed hashes match. Changed inputs display a request for re-review; missing/invalid records display draft status.

The same export updates storyboards/index.html and storyboards/<episode>/index.html. The latter uses the canonical storyboard renderer and relative references to episodes/<episode>/storyboard/; it never moves production data or duplicates media. Re-export after changes, including SB_DOC edits, and run --check before delivery. Hand-authored index.html files and output symlinks are refused, never overwritten. Keep the channel folder together when copying it to another machine. Design source and limits: local-review-design.md.

Rules

  • profile.md is the SoT for identity, tone, theme and pinned voice IDs — don't keep them in session memory or other files. Engines, SNS targets, visual style and video ratio live in .social-flow/models.json (project-init). The storyboard/produce/publish skills read both first.
  • Platform signatures stay within platform grammar — define hashtags·CTA within the platform-guide skill's playbook limits (Threads hashtags ≤1, YouTube 3~5, etc.).
  • Channel deletion is not provided — the directory holds publish history, so deleting is irreversible. If the user wants it, point to adding status: archived at the top of profile.md.

Additional Resources

Reference Files

  • references/profile-template.md — standard profile.md template (section structure, THEME contract, voice examples)
  • references/assets-catalog-template.md — assets/catalog.md starter (kind+id table)
  • references/resolve-asset.py — resolve shared assets via catalog + well-known paths (--ensure adds a row, --selftest)
  • references/review-library.js — exports offline character sheets, both indexes and episode review pages; --check detects stale output
  • references/serve.js — the channel browser over HTTP: /api/channels, /api/channels/<slug>/storyboards, /api/channels/<slug>/characters[/<id>], and /files/<slug>/… static from data/ (dot segments refused, Range for audio/video). Zero dependencies, --selftest

Character voice age and identity changes

For character samples or a request to sound older/younger, follow Gemini voice design. Route sample-only edits to the character identity and sheet; do not rebuild episode media unless requested. Do not claim an age correction after changing only turn style with the same voice ID.

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.