| name | story-engine |
| description | YouTube story channel script writing skill with 9-wave automated pipeline (with manual user gates after W3 script and W7 image production). Supports three genres: (1) yadam โ Korean historical tales (์ผ๋ด, ๋ฏผ๋ด, ์คํ, ์กฐ์ ์๋) in Korean, (2) dark-history โ Western dark history, medieval mystery, gothic tales, true crime, folklore in English, (3) bespoke โ universal genre with per-episode meta-prompts synthesized from user-provided 3โ5 successful reference scripts (any topic, any audience language). Trigger on: 'write a script', 'new episode', 'create storyboard', 'start ep5', '์ผ๋ด ๋๋ณธ ์จ์ค', '์ ์ํผ์๋ ๋ง๋ค์ด์ค', '์คํ ๋ฆฌ๋ณด๋ ์์ฑํด์ค', 'ep11 ์์ํ์', 'rewrite', 'redesign', '๋ฆฌ๋ผ์ดํ
', '๋ฆฌ๋์์ธ'. Auto-detects genre by user language + topic keywords (Korean + ์ผ๋ด/๋ฏผ๋ด/์กฐ์ /์คํ/์ ์ค keywords โ yadam; English + dark/gothic/medieval/witch/folklore/colonial keywords โ dark-history; otherwise โ bespoke). Override via `--genre yadam|dark-history|bespoke`. |
Story Engine v2
9-Wave ์๋ ํ์ดํ๋ผ์ธ์ผ๋ก YouTube ์คํ ๋ฆฌ ์ฑ๋ ๋๋ณธ์ ์์ฑํ๊ณ , TTS/SFX ์์ฑ, ์ด๋ฏธ์ง ์์ฑ, ์ด์
๋ธ๋ฆฌ(์ค๋์ค ์ํฌํธ/CapCut), ์
๋ก๋ ์ ๋ณด๊น์ง ์๋ํํ๋ค.
์คํฌ ๊ตฌ์กฐ
| ์คํฌ | ์ญํ | ํธ๋ฆฌ๊ฑฐ |
|---|
/story-new | ์ํผ์๋ ์ด๊ธฐํ + ์ฃผ์ ๋
ผ์ | "์ ์ํผ์๋", "start ep5" |
/story-execute | W1~W9 ์๋ ํ์ดํ๋ผ์ธ | "ํ์ดํ๋ผ์ธ ์คํ", "execute" |
/story-next | ์ค๋จ ํ ์ฌ๊ฐ | "์ด์ด์ ํด์ค", "continue" |
/story-rewrite | ๊ธฐ์กด ์ํผ์๋ ๊ฐ์ (๋ชฐ์
๋ ์ง๋จ โ fork โ ๊ฐ์ ํ) | "rewrite my", "ep03 ๊ฐ์ ", "๋ค์ ์จ์ค" |
9-Wave ํ์ดํ๋ผ์ธ
| Wave | ๋ด์ฉ | ๋ฆฌ๋ทฐ |
|---|
| W1 | ์คํ ๋ฆฌ ์ค๊ณ (์ ๊ท/๋ฆฌ๋ผ์ดํ
๋ถ๊ธฐ) | โ |
| W2 | ์๋์์ค + ํ๋ฆฌํ๋ผ์ดํธ | ์ต๋ 5ํ |
| W3 | ๋๋ณธ ์์ฑ + ๊ฒํ | ์ต๋ 5ํ (๋ชฉํ 9.5์ ) |
| ๐ ์ฌ์ฉ์ ํ์ธ | |
| W4 | ํ๋ก๋์
์ถ์ถ + ๊ฒ์ฆ (W4-0 production-scope ์ฌ์ฉ์ ๊ฒ์ดํธ โ dialogue/sfx ์ผ๊ธฐ/๋๊ธฐ ์ ํ) | ์ต๋ 5ํ |
| W5 | TTS/SFX + mechanic ํ์์ฝ๋ ๊ฒ์ฆ + W5-0-prep API key preflight (provider๋ณ cheap GET ๊ฒ์ฆ โ miss/stale ์ manual-assisted remediation) (production_scope.dialogue: false โ 5-1f ์คํต; production_scope.sfx: false โ 5-2/5-3 SFX ๋ณํ no-op/5-4 SFX ๊ฒ์ฌ vacuous) | ๋ฆฌ๋ทฐ |
| W6 | ์คํ ๋ฆฌ๋ณด๋ CSV + ๊ฒํ (batch QA, 3๊ทธ๋ฃน ๋ณ๋ ฌ) | ์ต๋ 5ํ |
| W7 | ์ด๋ฏธ์ง ํ๋ก๋์
(ref + ์ฌ + ์๋ฌ fix + image QA, batch QA) | ์ต๋ 5ํ |
| ๐ ์ฌ์ฉ์ ํ์ธ | |
| W8 | ์ด์
๋ธ๋ฆฌ (SFX ์ฌ ๋งค์นญ + ์ค๋์ค ์ํฌํธ + CapCut export + ์์ ์ ํ) | ์ต๋ 5ํ |
| W9 | ์
๋ก๋ ์ ๋ณด (์ ๋ชฉ/์ค๋ช
/ํ๊ทธ/์ธ๋ค์ผ) | โ |
์ฅ๋ฅด
| ํธ๋ฆฌ๊ฑฐ | ์ฅ๋ฅด | ๋ฉํํ๋กฌํํธ |
|---|
| ํ๊ตญ์ด + ์ผ๋ด/๋ฏผ๋ด/์กฐ์ /์คํ/์ ์ค ํค์๋ | yadam (์ผ๋ด) | meta-prompts/yadam/ (ํ๊ตญ์ด 5๊ฐ ํ์ผ) |
| English + dark/gothic/medieval/witch/folklore/colonial ํค์๋ | dark-history | meta-prompts/dark-history/ (์๋ฌธ 5๊ฐ ํ์ผ) |
์ด๋ ์ฅ๋ฅด๋ ๋ช
ํํ์ง ์์ (๋๋ --genre bespoke) | bespoke (๋ง์ถคํ) | meta-prompts/bespoke/{lang}/ (ํ๊ตญ์ด ์ถ๋ ฅ ์ ko/, ์๋ฌธ ์ถ๋ ฅ ์ en/ โ ๊ฐ 5๊ฐ) + ์ํผ์๋๋ณ _story_source/_meta_supplement.md (W1-5์์ user reference 3~5๊ฐ๋ก ํฉ์ฑ). {lang}์ STATE.md "Output language:" ํ๋์์ ํด์. |
--genre yadam, --genre dark-history, ๋๋ --genre bespoke๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ.
Bespoke ์ฅ๋ฅด ์ถ๊ฐ ์๊ฑด: /story-new ์ ์ฌ์ฉ์์๊ฒ 3~5๊ฐ ์ฑ๊ณต ๋๋ณธ reference๋ฅผ ๋ฐ์์ผ ํจ (URL / ํ
์คํธ / ๋ก์ปฌ ํ์ผ). reference๊ฐ โค 2๊ฐ โ escalation (๋ค๋ฅธ ์ฅ๋ฅด๋ก ์ ํ ๊ถ์ฅ).
Review discipline (W2โW7)
- Every substep runs a review loop: subagent self-review โ list issues โ revise.
- Max 5 rounds. 0 issues โ proceed immediately.
- 5 rounds exceeded โ escalate to user.
- W1 (research) and W8 (upload info) are exceptions with no review loop.
๋ฆฌ๋ทฐ ์์น (W2โW8)
- ๋ชจ๋ ์๋ธ์คํ
์ ๋ฆฌ๋ทฐ ๋ฃจํ๋ฅผ ์คํํ๋ค: ์๋ธ์์ด์ ํธ ์๊ฐ๊ฒํ โ ์ด์ ๋ชฉ๋ก โ ์์ .
- ์ต๋ 5ํ. 0 ์ด์ ์ ์ฆ์ ์งํ.
- 5ํ ์ด๊ณผ ์ ์ฌ์ฉ์์๊ฒ ์์ค์ปฌ๋ ์ด์
.
- W1(๋ฆฌ์์น)๊ณผ W9(์
๋ก๋ ์ ๋ณด)์ ๋ฆฌ๋ทฐ ๋ฃจํ ์๋ ์์ธ ๋จ๊ณ์ด๋ค.
Batch QA discipline (parallel subagent reviewers, checklist > 5 items)
When a review checklist exceeds 5 items, a single subagent skims rather than audits. Split into focused groups and spawn ONE subagent per group, in parallel.
- Group size: 3โ4 items per group (target 3, max 4).
- QA is subagent + Read tool, NOT scripts. Even if a scene/CSV check could in principle be automated by a Python script, the QA step itself is performed by a subagent reading the artifacts via the Read tool and reporting findings. Pre-check scripts (running BEFORE QA as a fast sanity gate) are allowed and separate; they do not replace subagent inspection. "Script passed, so QA passes" is forbidden.
- Parallelism: spawn all groups in a single message with multiple
Agent tool uses โ concurrent execution.
- Recommended concurrency: 3 (sweet spot). Max useful: 5. Beyond 5 = diminishing returns; token cost still scales Nร.
- Each subagent receives: only its group's items + the read-only inputs it needs + an exclusive output file path (e.g.,
{wave}_review_group{X}.md).
- Subagent prohibitions during batch: do NOT touch
STATE.md, W_progress.json, or any other shared state. The orchestrator merges all group results AFTER every subagent returns.
- Heartbeat prefix: every
_progress.log line written by a batch subagent MUST be prefixed with [Group {X}] to allow interleaved-line forwarding without ambiguity.
- Sequential fallback: if a group must call external APIs (TTS, image gen, app-state mutation), run that group sequentially or extract the API work out of QA. Read-only QA stays parallel.
Batch QA ์์น (๋ณ๋ ฌ ์๋ธ์์ด์ ํธ ๋ฆฌ๋ทฐ์ด, ์ฒดํฌ๋ฆฌ์คํธ > 5 ํญ๋ชฉ)
์ฒดํฌ๋ฆฌ์คํธ๊ฐ 5๊ฐ๋ฅผ ๋๊ธฐ๋ฉด ํ ์๋ธ์์ด์ ํธ๋ ํ์์ ํต๊ณผ๋ง ํจ. focused ๊ทธ๋ฃน์ผ๋ก ์ชผ๊ฐ์ ๊ทธ๋ฃน๋ง๋ค ๋ณ๋ ์๋ธ์์ด์ ํธ๋ฅผ ๋ณ๋ ฌ๋ก ํธ์ถํ๋ค.
- ๊ทธ๋ฃน ํฌ๊ธฐ: 3~4 ํญ๋ชฉ (๋ชฉํ 3, ์ต๋ 4).
- QA๋ subagent + Read ๋๊ตฌ, ์คํฌ๋ฆฝํธ ์๋. ์ด๋ค ๊ฒ์ฌ ํญ๋ชฉ์ด Python ์คํฌ๋ฆฝํธ๋ก ์๋ํ ๊ฐ๋ฅํ๋๋ผ๋, QA ์์ฒด๋ subagent๊ฐ Read ๋๊ตฌ๋ก ์ฐ์ถ๋ฌผ์ ์ง์ ์ฝ๊ณ ์ ๊ฒํ๋ค. Pre-check ์คํฌ๋ฆฝํธ (QA ์ง์ ์ ๋น ๋ฅธ sanity gate๋ก ๋๋ฆฌ๋ ์๋ ๊ฒ์ฌ)๋ ํ์ฉ๋๊ณ ๋ณ๊ฐ์ด๋ค โ subagent ์ ๊ฒ์ ๋์ฒดํ ์ ์์. "์คํฌ๋ฆฝํธ ํต๊ณผํ์ผ๋ QA ํต๊ณผ"๋ ๊ธ์ง.
- ๋ณ๋ ฌ์ฑ: ํ ๋ฉ์์ง์ ์ฌ๋ฌ
Agent ํธ์ถ์ ๋์์ ๋ณด๋ด๋ฉด ๋์ ์คํ๋จ.
- ๊ถ์ฅ ๋์ N: 3 (sweet spot). ์ต๋ ์ ์ฉ N: 5. 5 ๋์ผ๋ฉด ํ๊ณ ํจ์ฉ ๋น ๋ฅด๊ฒ ๊ฐ์, ํ ํฐ ๋น์ฉ์ N๋ฐฐ ๊ทธ๋๋ก.
- ๊ฐ ์๋ธ์์ด์ ํธ๊ฐ ๋ฐ๋ ๊ฒ: ์๊ธฐ ๊ทธ๋ฃน ํญ๋ชฉ๋ง + ํ์ํ read-only ์
๋ ฅ๋ง + ์ ์ฉ ์ถ๋ ฅ ํ์ผ ๊ฒฝ๋ก (
{wave}_review_group{X}.md).
- batch ์ค ์๋ธ์์ด์ ํธ ๊ธ์ง:
STATE.md, W_progress.json, ๊ธฐํ ๊ณต์ ์ํ ์ ๋ ์ ๊ฑด๋๋ฆผ. ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ๋ชจ๋ ๊ทธ๋ฃน ๋ฐํ ํ 1ํ ํฉ์ฐ update.
- ํํธ๋นํธ prefix: batch ์๋ธ์์ด์ ํธ๊ฐ
_progress.log์ ์ฐ๋ ๋ชจ๋ ๋ผ์ธ์ [Group {X}] prefix ํ์ (interleaved ๋ผ์ธ forwarding ์ ๋ชจํธ์ฑ ์ ๊ฑฐ).
- Sequential ํด๋ฐฑ: ์ธ๋ถ API ํธ์ถ (TTS, ์ด๋ฏธ์ง ์์ฑ, ์ฑ ์ํ ๋ณ๊ฒฝ) ํ์ํ ๊ทธ๋ฃน์ sequential๋ก. read-only QA๋ง ๋ณ๋ ฌ ์ ์ง.
Progress reporting discipline (orchestrator โ wave AND sub-step level)
The user must always know what is currently happening. Wave-level START/DONE banners (see workflows/execute-pipeline.md) cover wave boundaries; this discipline covers EVERYTHING inside a wave.
- Every new sub-step announces itself in one line BEFORE work begins. Format:
โธ Starting <step name>โฆ
- Every sub-step completion announces its result with elapsed time. Format:
โ
<step name> done (mm:ss). Next: <next step>.
- Sub-step โ wave. A wave has multiple sub-steps. Example W5 sub-steps: W5-0 voice-pick, W5-1 narration-TTS, W5-2 dialogue-TTS, W5-3 SRT, W5-4 SFX (batched), W5-5 merge. Each sub-step MUST emit its own status line. See the canonical sub-step decomposition table in
workflows/execute-pipeline.md.
- No silent block longer than 3 minutes. Any operation expected to run >3 min MUST be split into 1โ3 minute chunks at the orchestrator level, with a status line between chunks.
- Repeated calls batch. When a sub-step does N similar API calls (e.g. 55 SFX cues, 20 scene images), group into batches of 10โ15 with one status line per batch:
โธ SFX batch 2/4 (cues 16โ30)โฆ then โ
batch 2/4 done (M:SS), N/N succeeded.
- Heartbeat fallback. If a sub-step genuinely cannot be split, the subagent writes
_progress.log per state change. The orchestrator polls every 30โ60 s and forwards the latest line.
- Trigger: any time the action changes โ reading docs โ spawning subagent โ calling API โ writing files โ reviewing โ announce it.
- Subagent invocations are the highest-risk silence point. Always over-announce them:
- BEFORE every
Agent tool call: โธ Spawning <type> subagent for <task> (est. <X> min, prompt ~<N> tokens)โฆ
- AFTER every
Agent tool call returns: โ
<task> subagent returned in <mm:ss>. Result: <one-line summary>.
- For
SendMessage to an existing agent: โธ Sending message to agent <id> (<reason>)โฆ then โ
Agent <id> response in <mm:ss>.
- The user MUST NEVER see a silent
Agent or SendMessage tool call. These are the exact moments where multi-minute silence happens โ bracket every one with announcements.
- Subagents must self-report during execution (heartbeat). Every wave subagent MUST append a one-line heartbeat to
_story_source/_progress.log at every sub-step transition. Format: <ISO-8601 UTC> <wave-label> <event>: <description> [<metrics>]. Events: START, END, API, SPAWN, WRITE, ERROR, WAIT. Triggers: sub-step start/end, before every external API call, before every file write, entering/exiting review rounds, before spawning child agents, on errors/retries. The orchestrator polls this file (every 30โ60 s for run_in_background: true calls; once after return for foreground) and forwards new lines to the user as ๐ก [<wave>]: <line>. See workflows/execute-pipeline.md "Subagent heartbeat protocol" for full spec.
- Default to over-reporting. Silence is the failure mode; verbosity is recoverable.
์งํ ์ํฉ ๋ณด๊ณ ์์น (์ค์ผ์คํธ๋ ์ดํฐ โ Wave ๋ฐ ์๋ธ์คํ
๋จ์ ๊ณตํต)
์ฌ์ฉ์๋ ํญ์ ์ง๊ธ ๋ฌด์์ด ์งํ๋๊ณ ์๋์ง ์์์ผ ํ๋ค. Wave ๊ฒฝ๊ณ์ START/DONE ๋ฐฐ๋(workflows/execute-pipeline.md ์ฐธ์กฐ)๋ Wave ๊ฒฝ๊ณ๋ง ๋ค๋ฃฌ๋ค. ์ด ์์น์ Wave ๋ด๋ถ์ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฌ๋ค.
- ์ ์๋ธ์คํ
์์ ์ ๋ฌด์กฐ๊ฑด 1์ค ์๋ฆผ (์์
์์ ์ ). ํ์:
โธ <๋จ๊ณ๋ช
> ์์โฆ
- ์๋ธ์คํ
์๋ฃ ์ 1์ค ์๋ฆผ (์์์๊ฐ ํฌํจ). ํ์:
โ
<๋จ๊ณ๋ช
> ์๋ฃ (mm:ss). ๋ค์: <๋ค์ ๋จ๊ณ>.
- ์๋ธ์คํ
โ Wave. ํ Wave๋ ์ฌ๋ฌ ์๋ธ์คํ
์ผ๋ก ๊ตฌ์ฑ. ์์ W5: W5-0(์์ฑ ์ ํ), W5-1(๋๋ ์ด์
TTS), W5-2(๋ํ TTS), W5-3(SRT), W5-4(SFX ๋ฐฐ์น), W5-5(๋จธ์ง). ๊ฐ ์๋ธ์คํ
๋ง๋ค ์ํ ๋ผ์ธ ํ์. ์บ๋
ธ๋์ปฌ ์๋ธ์คํ
๋ถํด ํ๋
workflows/execute-pipeline.md ์ฐธ์กฐ.
- 3๋ถ ์ด์์ ์นจ๋ฌต ๊ธ์ง. 3๋ถ ์ด๊ณผ ์์๋๋ ์์
์ ์ค์ผ์คํธ๋ ์ดํฐ ๋ ๋ฒจ์์ 1~3๋ถ ๋จ์ ์ฒญํฌ๋ก ๋ถํ , ์ฒญํฌ ์ฌ์ด์ ์ํ ๋ณด๊ณ .
- ๋ฐ๋ณต ํธ์ถ์ ๋ฐฐ์น๋ก ๋ฌถ๊ธฐ. ํ ์๋ธ์คํ
์ด N๊ฐ์ ์ ์ฌ ํธ์ถ(SFX 55๊ฐ, ์ฌ ์ด๋ฏธ์ง 20๊ฐ ๋ฑ)์ ํ ๋ 10~15๊ฐ ๋ฐฐ์น๋ก ๋ฌถ๊ณ , ๋ฐฐ์น๋น ์ํ 1์ค.
- ํํธ๋นํธ ๋์ฒด. ๋ถํ ์ด ์ ๋ง ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์๋ธ์์ด์ ํธ๊ฐ ๋งค ์ํ ๋ณํ๋ง๋ค
_progress.log์ 1์ค ๊ธฐ๋ก โ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ 30~60์ด๋ง๋ค ํด๋ง.
- ํธ๋ฆฌ๊ฑฐ: ๋ฌด์์ ํ๊ณ ์๋๊ฐ๊ฐ ๋ฐ๋ ๋ โ ๋ฌธ์ ์ฝ๊ธฐ โ ์๋ธ์์ด์ ํธ ์คํฐ โ API ํธ์ถ โ ํ์ผ ์ฐ๊ธฐ โ ๊ฒํ โ ๋งค๋ฒ ์๋ฆผ.
- ์๋ธ์์ด์ ํธ ํธ์ถ์ ์นจ๋ฌต ์ํ ์ต๊ณ ์น. ๊ณผ๋ณด๊ณ ํ์:
- ๋ชจ๋
Agent ๋๊ตฌ ํธ์ถ ์ : โธ <type> ์๋ธ์์ด์ ํธ ์คํฐ โ <ํ์คํฌ๋ช
> (์์ <X>๋ถ, ํ๋กฌํํธ ~<N> ํ ํฐ)โฆ
- ๋ชจ๋
Agent ํธ์ถ ๋ฐํ ํ: โ
<ํ์คํฌ๋ช
> ์๋ธ์์ด์ ํธ ๋ฐํ (<mm:ss>). ๊ฒฐ๊ณผ: <ํ ์ค ์์ฝ>.
- ๊ธฐ์กด ์์ด์ ํธ์
SendMessage: โธ ์์ด์ ํธ <id>์ ๋ฉ์์ง ์ก์ (<์ด์ >)โฆ ๊ทธ๋ฆฌ๊ณ โ
์์ด์ ํธ <id> ์๋ต (<mm:ss>).
Agent๋ SendMessage ํธ์ถ์ด ์กฐ์ฉํ ์ผ์ด๋๋ฉด ์ ๋ ์ ๋จ โ ๋ค๋ถ ์นจ๋ฌต์ด ๋ฐ์ํ๋ ์ ํํ ์ง์ ์ด๋ฏ๋ก ๋งค๋ฒ ์๋ฆผ์ผ๋ก ๊ฐ์ธ๊ธฐ.
- ์๋ธ์์ด์ ํธ๋ ์คํ ์ค ์๊ฐ ๋ณด๊ณ ํ์ (ํํธ๋นํธ). ๋ชจ๋ Wave ์๋ธ์์ด์ ํธ๋
_story_source/_progress.log์ ์๋ธ์คํ
์ ํ๋ง๋ค 1์ค append ํ์. ํ์: <ISO-8601 UTC> <wave-label> <event>: <์ค๋ช
> [<๋ฉํธ๋ฆญ>]. ์ด๋ฒคํธ: START, END, API, SPAWN, WRITE, ERROR, WAIT. ํธ๋ฆฌ๊ฑฐ: ์๋ธ์คํ
์์/์ข
๋ฃ, ์ธ๋ถ API ํธ์ถ ์ , ํ์ผ ์ฐ๊ธฐ ์ , ๋ฆฌ๋ทฐ ๋ผ์ด๋ ์ง์
/์ข
๋ฃ, ์์ ์์ด์ ํธ ์คํฐ ์ , ์๋ฌ/์ฌ์๋ ์. ์ค์ผ์คํธ๋ ์ดํฐ๋ ์ด ํ์ผ์ ํด๋ง(run_in_background: true ์ 30~60์ด๋ง๋ค, foreground ์ ๋ฐํ ํ 1ํ)ํ๊ณ ์ ์ค์ ์ฌ์ฉ์์๊ฒ ๐ก [<wave>]: <์ค> ํ์์ผ๋ก ์ ๋ฌ. ์ ์ฒด ์คํ์ workflows/execute-pipeline.md "Subagent heartbeat protocol" ์ฐธ์กฐ.
- ๊ณผ๋ณด๊ณ ๊ฐ ๋ํดํธ. ์นจ๋ฌต์ด ์คํจ ๋ชจ๋, ์ฅํฉํจ์ ๋ณต๊ตฌ ๊ฐ๋ฅ.
Subagent transparency contract (orchestrator MUST verify, never trust blindly)
Subagent self-reports are not trusted by default โ they are verified against disk reality. Without this, subagents can perform invisible work (file writes, API calls, side effects) that the orchestrator and user never see.
Subagent obligations (every wave subagent return MUST include)
In addition to the wave-specific return fields, every subagent MUST append:
{
"disk_changes": {
"created": ["_story_source/...", "..."],
"modified": ["_story_source/STATE.md", "_story_source/W_progress.json"],
"deleted": []
},
"bash_commands": ["mkdir -p segments", "ffmpeg -i ..."],
"external_api_calls": [
{"method": "GET", "url": "https://api.elevenlabs.io/v1/voices", "status": 200},
{"method": "POST", "url": "https://api.elevenlabs.io/v1/text-to-speech/<voice_id>", "status": 200}
]
}
Rules: command strings only (no env values, no credentials, no body content); URL/method/status only.
Subagent prohibitions (hard rules โ no "going beyond to be helpful")
- Do NOT create, modify, or delete files outside the declared
deliverables list.
- Do NOT call external APIs (TTS, image gen, web requests beyond research) unless the wave brief explicitly authorizes that surface.
- Do NOT "over-reach" โ if the brief says "do NOT generate audio", that is a hard rule, not a hint. The brief is the contract.
- If a code path WOULD require a forbidden action, STOP and return
escalation_required: true with a description. Do not proceed.
Orchestrator verification (mandatory, after every Agent return)
- Snapshot
wave_start_ts BEFORE spawning the subagent.
- After return, list actual disk changes: every file under episode dir with
mtime โฅ wave_start_ts.
- Diff actual vs
disk_changes. Any actual file missing from disk_changes = undeclared change.
- Verify every
deliverables entry exists on disk. Missing = wave failure โ retry once.
- If the wave brief forbade certain API surfaces (e.g. W4 forbids audio gen, W6 forbids image gen), scan
external_api_calls โ any hit on a forbidden surface = boundary violation.
- On ANY violation: print
โธ โ Subagent contract violation: <detail> to user, pause pipeline, ask continue/rollback/escalate.
์๋ธ์์ด์ ํธ ํฌ๋ช
์ฑ ๊ณ์ฝ (์ค์ผ์คํธ๋ ์ดํฐ๋ ๊ฒ์ฆํ๋ผ, ์ ๋ขฐ๋ง์ผ๋ก๋ ์ ๋จ)
์๋ธ์์ด์ ํธ์ ์๊ฐ ๋ณด๊ณ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ขฐํ์ง ์๋๋ค โ ๋์คํฌ ์ค์ ์ํ์ ๋์กฐํด ๊ฒ์ฆํ๋ค. ์ด๊ฒ ์์ผ๋ฉด ์๋ธ์์ด์ ํธ๊ฐ ๋ณด์ด์ง ์๋ ์์
(ํ์ผ ์์ฑ, API ํธ์ถ, ๋ถ์์ฉ)์ ์ํํด๋ ์ค์ผ์คํธ๋ ์ดํฐ๋ ์ฌ์ฉ์๋ ๋ชจ๋ฅธ๋ค.
- ์๋ธ์์ด์ ํธ ์๋ฌด: ๋ชจ๋ ๋ฐํ JSON์
disk_changes (created/modified/deleted), bash_commands, external_api_calls ๋ธ๋ก ํฌํจ ํ์. ๋ช
๋ น์ด ๋ฌธ์์ด๋ง (env๊ฐ/์๊ฒฉ์ฆ๋ช
/๋ฐ๋ ๊ธ์ง). URL/๋ฉ์๋/์ํ์ฝ๋๋ง.
- ์๋ธ์์ด์ ํธ ๊ธ์ง: deliverables ๋ชฉ๋ก ์ธ ํ์ผ ์์ฑ/์์ /์ญ์ ๊ธ์ง. ๋ช
์์ ๊ถํ ์๋ ์ธ๋ถ API ํธ์ถ ๊ธ์ง. "๋์์ฃผ๋ ค๊ณ oversize" ๊ธ์ง โ ๋ธ๋ฆฌํ๊ฐ ๊ณง ๊ณ์ฝ. ์๋ฐ ์ํ ์ ์ฆ์
escalation_required: true๋ก ๋ฐํ.
- ์ค์ผ์คํธ๋ ์ดํฐ ๊ฒ์ฆ (๋ชจ๋
Agent ๋ฐํ ํ ํ์):
- ์๋ธ์์ด์ ํธ ์คํฐ ์ ์
wave_start_ts ๊ธฐ๋ก
- ๋ฐํ ํ, ์ํผ์๋ dir์
mtime โฅ wave_start_ts ํ์ผ ์ ์ฒด ๋์ด
disk_changes ๋์กฐ โ ๋๋ฝ๋ ๋ณ๊ฒฝ = undeclared change
deliverables ๋ชจ๋ ๋์คํฌ์ ์กด์ฌ ๊ฒ์ฆ, ์์ผ๋ฉด = wave ์คํจ โ 1ํ ์ฌ์๋
- ๋ธ๋ฆฌํ๊ฐ ๊ธ์งํ API ํ๋ฉด์
external_api_calls์์ ์ค์บ โ ์ ์ค = boundary violation
- ์๋ฐ ์:
โธ โ ์๋ธ์์ด์ ํธ ๊ณ์ฝ ์๋ฐ: <์์ธ> ์ฌ์ฉ์์ ์ถ๋ ฅ, ํ์ดํ๋ผ์ธ ์ผ์์ ์ง, ๊ณ์/๋กค๋ฐฑ/์์ค์ปฌ๋ ์ด์
์ง๋ฌธ
ํต์ฌ ์์น โ ๋ชฐ์
๋๊ฐ ๋ชจ๋ wave์ ํ๊ฐ anchor
๊ถ๊ธ์ฆ + ๊ธฐ๋๊ฐ = ๋ชฐ์
๋. ๋ชฐ์
๋๊ฐ ๋ชจ๋ wave์ ์ต์์ ํ๊ฐ ๊ธฐ์ค.
์์ฒญ์๊ฐ ํด๋ฆญํ๊ณ (๊ถ๊ธ์ฆ ์๋), ๋๊น์ง ๋ณด๊ณ (๊ธฐ๋๊ฐ ์๋), ๋ค์ ์์๋ ๋ณธ๋ค(๋ชฐ์
๋ ๋์ ). ์กฐํ์ / CTR / retention / ๊ตฌ๋
์ ์ฆ๊ฐ๋ ๋ชฐ์
๋์ ์ฌํ proxy์ผ ๋ฟ, ํ๊ฐ์ ์
๋ ฅ ๋ณ์๊ฐ ์๋๋ค. ๋ฉ์ปค๋์ฆ์ ๊ฐํํ๋ฉด metric์ ๋ฐ๋ผ์จ๋ค.
๋ชจ๋ wave๋ ์ด ์์น์ผ๋ก ํ๊ฐํ๋ค
| Wave | ๊ฒํ ์ง๋ฌธ |
|---|
| W1 reference ๋ถ์ (Bespoke) | ๊ทธ ์์์ด ์์ฒญ์ ๊ถ๊ธ์ฆ/๊ธฐ๋๊ฐ์ ์ด๋ป๊ฒ ๋ง๋ค๊ณ ์ ์งํ๋ (์กฐํ์๋ proxy๋ก ๊ธฐ๋ก๋ง, ํ๊ฐ ๊ธฐ์ค์ ๋ฉ์ปค๋์ฆ) |
| W1-4 success synthesis | 4 ์น์
mandatory: โ ๊ถ๊ธ์ฆ ๋ฐ์ ๋ฉ์ปค๋์ฆ โก ๊ธฐ๋๊ฐ ๋์ ๋ฉ์ปค๋์ฆ โข ๋์ interplay โฃ ๋ชฐ์
๋ ๊ณก์ |
| W2 ์๋์์ค + preflight | ๋งค ์ฑํฐ๊ฐ ๊ถ๊ธ์ฆ์ ์ ์งํ๊ฑฐ๋ ๊ธฐ๋๊ฐ์ ๋์ ํ๋๊ฐ (๋ ๋ค ๊ธฐ์ฌ ์ ํ๋ฉด ์ฑํฐ ๊ตฌ์กฐ ์คํจ) |
| W3 ๋๋ณธ + review | ๋งค ๋จ๋ฝ์ด ์์ฒญ์๋ฅผ ๋ค์ ๋จ๋ฝ์ผ๋ก ๋๊ณ ๊ฐ๋๊ฐ (โ "์ฌ๋ฏธ์๋๊ฐ") |
| W9 ์
๋ก๋ ์ ๋ณด | title/thumbnail์ด ์์ฒญ์์๊ฒ ๊ถ๊ธ์ฆ/๊ธฐ๋๊ฐ promise๋ฅผ ๊ฑฐ๋๊ฐ; ์ฒซ 30์ด๊ฐ ๊ทธ promise๋ฅผ ์งํค๋๊ฐ |
๊ตฌ์กฐ ์์น (๋ชฐ์
๋ ๊ณก์ )
- W1~W2: ๋ค์ค ์ฉ์์/๊ฐ๋ฅ์ฑ โ ์์ฒญ์ ํ์ ๋ถ๊ฐ โ ๊ถ๊ธ์ฆ ์ ์ง
- W3 ์ ๋ฐ: ๊ฑฐ์ง ํด๊ฒฐ / ๋ฐ์ / ๋ก๋ฐฅ โ ๊ธฐ๋๊ฐ ๊ทน๋ํ
- W3 ํ๋ฐ (ch.16~17): ์ง์ค ํญ๋ก โ ๋ชฐ์
๋ ์ต๊ณ ์กฐ
- ๊ฒฐ๋ง (ch.18~20): held quiet โ ๋ชฐ์
๋ resonant low close
- ์ง๋ฒ/์ง์ค์ด ์ ์ค๋ฐ(15์ฑํฐ) ์ด์ ์ ํ์ ๋๋ฉด ๊ตฌ์กฐ์ ์คํจ (๋ชฐ์
๋ ๊ณก์ ๊นจ์ง โ ์์ฒญ์ ์ดํ)
์ํ ๊ด๋ฆฌ
| ํ์ผ | ์ญํ |
|---|
STATE.md | ๋ฉ์ธ โ ํ์ฌ Wave, ์๋ฃ ๋จ๊ณ, ๊ฒฐ์ ์ฌํญ |
W{N}_SUMMARY.md | Wave๋ณ ๊ฒฐ๊ณผ, ๋ฆฌ๋ทฐ ๋ผ์ด๋, ์ด์ |
W_progress.json | ์ฌ์ด๋ ๋ก๊ทธ โ ์ฑ/์ธ๋ถ ๋๊ตฌ์ฉ JSON |
์ฐธ์กฐ ๋ฌธ์
๋ฌธ์๋ ์ธ์ด๋ณ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค. ์ฅ๋ฅด + ์ถ๋ ฅ ์ธ์ด์ ๋ฐ๋ผ ์๋ ์ ํ:
| ์ฅ๋ฅด | {lang} | meta-prompts ๊ฒฝ๋ก |
|---|
| yadam (์ผ๋ด/๋ฏผ๋ด/์กฐ์ ์๋) | ko | meta-prompts/yadam/ (ํ๊ตญ์ด 5๊ฐ ํ์ผ) |
| dark-history (Western dark history/gothic/folklore) | en | meta-prompts/dark-history/ (์๋ฌธ 5๊ฐ ํ์ผ) |
| ๋ง์ถคํ (Bespoke) (์ด๋ค ์ฃผ์ ๋ ) | reference + ์ฃผ์ ์ธ์ด ์๋ ๊ฐ์ง (Korean refs โ ko, English refs โ en; ์ฌ์ฉ์ override ๊ฐ๋ฅ) | meta-prompts/bespoke/{lang}/ โ subfolder per language: bespoke/ko/ (ํ๊ตญ์ด 5๊ฐ) + bespoke/en/ (์๋ฌธ 5๊ฐ) |
Bespoke ํ์ ๊ท์ฝ: ํ๊ตญ์ด doc/UI๋ "๋ง์ถคํ" (๋๋ "๋ง์ถคํ (Bespoke)"), ์๋ฌธ doc/UI๋ "Bespoke". ์ฝ๋/ํ๋๊ทธ๋ ๋์ผํ๊ฒ bespoke.
Bespoke ์ถ๊ฐ read ํ์: _story_source/_meta_supplement.md (W1-5์์ ์์ฑ๋ ์ํผ์๋ ์ ์ฉ supplement) โ W2, W3, (์กฐ๊ฑด๋ถ W6/W9) ์๋ธ์์ด์ ํธ ํ๋กฌํํธ์ ์๋ ํฌํจ.
| Wave | ๋ฌธ์ |
|---|
| W1 | docs/{lang}/W1-story-design.md |
| W2 | docs/{lang}/W2-synopsis.md + ๋ฉํํ๋กฌํํธ: โข yadam: meta-prompts/yadam/yadam-synopsis-guide.md + yadam-preflight.md โข dark-history: meta-prompts/dark-history/synopsis_guidelines.md + preflight.md โข bespoke: meta-prompts/bespoke/{lang}/synopsis_guidelines.md + preflight.md + _story_source/_meta_supplement.md |
| W3 | docs/{lang}/W3-writing.md + ๋ฉํํ๋กฌํํธ: โข yadam: meta-prompts/yadam/yadam-scenario-guide.md + yadam-narrative-guide.md + yadam-suspense-techniques.md โข dark-history: meta-prompts/dark-history/screenplay_guidelines.md + narrative_techniques.md + suspense_techniques.md โข bespoke: meta-prompts/bespoke/{lang}/screenplay_guidelines.md + narrative_techniques.md + suspense_techniques.md + _story_source/_meta_supplement.md |
| W4 | docs/{lang}/W4-production.md |
| W5 | docs/{lang}/W5-tts-sfx.md |
| W6 | docs/{lang}/W6-storyboard.md |
| W7 | docs/{lang}/W7-image-production.md (์ด๋ฏธ์ง ํ๋ก๋์
โ ref + ์ฌ + QA) |
| W8 | docs/{lang}/W8-assembly.md (์ด์
๋ธ๋ฆฌ โ SFX ์ฌ ๋งค์นญ + ์ค๋์ค ์ํฌํธ + CapCut export + ์์) |
| W9 | docs/{lang}/W9-upload-info.md (์
๋ก๋ ์ ๋ณด) |
AutoFlowCut MCP ๋๊ตฌ
- ํ๋ก์ ํธ:
app_list_projects, app_create_project
- CSV:
load_csv, list_scenes, update_prompt, save_csv
- ๋ ํผ๋ฐ์ค:
list_references, update_reference_prompt
- ์ด๋ฏธ์ง:
app_start_ref_batch, app_start_scene_batch, app_wait_batch
- ์คํค๋ง:
get_schema({ type: "scenes" | "references" | "prompt-image" })
- ์คํ์ผ:
list_styles
Red Flags
| ์๊ฐ | ํ์ค |
|---|
| "๋ฆฌ๋ทฐ ์ ํด๋ ๋๊ฒ ์ง" | ๋ฆฌ๋ทฐ ๋ฃจํ๋ ํ์ |
| "์ด๋ฏธ์ง๋ก ๋ฐ๋ก ๊ฐ์" | Wave ์์ ์์ |
| "CSV ๋ง์ ๊ฑฐ์ผ" | subagent ๋ฆฌ๋ทฐ๊ฐ ์๋ ์ด์ |
| "์คํฌ ๋ด์ฉ ๊ธฐ์ต๋" | ๋งค๋ฒ docs ์ฝ๊ธฐ |
| "๊ฐ๋จํ๋ค" | ๊ฐ๋จํ ๊ฑด ๋ณต์กํด์ง๋ค. ๋จผ์ ํ์ธ |
| "๋นจ๋ฆฌ ํ์" | ๋น ๋ฅธ ๊ฒ๋ณด๋ค ์ ํํ ๊ฒ |
| "์กฐ์ฉํ ๋๊น์ง ๊ฐ์" | ๋งค ์๋ธ์คํ
๋ณด๊ณ โ 3๋ถ ์นจ๋ฌต = red flag |
| "ํ ๋ฒ์ ํฐ ์๋ธ์์ด์ ํธ๋ก" | 3๋ถ ์ด๊ณผ = ์ฒญํฌ ๋ถํ , ์๋ธ์คํ
๋จ์ ๋ณด๊ณ |
| "์๋ธ์์ด์ ํธ๊ฐ ์์งํ ๋ค ๋งํ๊ฒ ์ง" | self-report ์ ๋ขฐ ๊ธ์ง โ disk_changes ๋์คํฌ ๋์กฐ ํ์ |
| "deliverables์ ์์ง๋ง ๋์์ฃผ๋ ค๊ณ " | over-reach = ๊ณ์ฝ ์๋ฐ โ ์ฆ์ escalation, ์งํ ๊ธ์ง |
| "Subagent ์์์ ์ผ์ด๋๋ ๊ฑด ์ด์ฐจํผ ์ ๋ณด์ฌ๋ ์ด์ฉ ์ ์์" | _progress.log ํํธ๋นํธ + ์ค์ผ์คํธ๋ ์ดํฐ ํด๋ง ํ์ |