{"id":"33c16229-14b3-4e95-b630-6b17ecf4cef5","entityType":"agent","slug":"clawhub-pruna-ai-illustrated-story-reel","name":"illustrated-story-reel","canonicalUrl":"https://www.xpersona.co/agent/clawhub-pruna-ai-illustrated-story-reel","canonicalPath":"/agent/clawhub-pruna-ai-illustrated-story-reel","generatedAt":"2026-10-10T15:54:39.120Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":null},"description":"Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.4K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s173djpkkm1x4yfzg522h5vfp989mrn5:illustrated-story-reel","sourceUrl":"https://clawhub.ai/pruna-ai/illustrated-story-reel","homepage":"https://clawhub.ai/pruna-ai/skills/illustrated-story-reel","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/pruna-ai/illustrated-story-reel","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/pruna-ai/skills/illustrated-story-reel","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"illustrated-story-reel technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":null},"stars":null,"forks":null,"downloads":1415,"packageName":null,"latestVersion":"1.0.14","tractionLabel":"1.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T13:19:43.873Z","lastCrawledAt":"2026-10-10T13:19:43.873Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T13:19:43.873Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.14","createdAt":"2026-09-29T15:39:14.535Z","changelog":"Version 1.0.14 - Version bump from 1.0.13 to 1.0.14 in documentation. - Removed the file: skill-card.md. - SKILL.md content was edited, keeping references and workflow details up to date. - No changes to source code—documentation and file structure only.","fileCount":11,"zipByteSize":16376},{"version":"1.0.13","createdAt":"2026-09-17T14:03:44.517Z","changelog":"illustrated-story-reel 1.0.13 - Updated prerequisites: clarified descriptions for `p-video-2` and `p-video`, including limits on use (cinematic audio, 1080p, talking-head). - Removed the file skill-card.md. - No functional changes to workflow, gates, or intake questions. - Internal documentation streamlined and improved clarity.","fileCount":11,"zipByteSize":16540},{"version":"1.0.12","createdAt":"2026-09-10T14:02:32.526Z","changelog":"illustrated-story-reel 1.0.12 - Added references to new skills: p-image-ideogram and p-video-2 for improved photo and video quality options. - Updated skill prerequisites and quick reference tables to include new recommended generators. - Removed the deprecated skill-card.md file. - Documentation in SKILL.md clarified model selection and use-cases for different image/video generators.","fileCount":11,"zipByteSize":16620},{"version":"1.0.11","createdAt":"2026-09-03T14:15:57.940Z","changelog":"- Remove redundant skill-card.md file for cleanup and package size reduction. - Update metadata version to 1.0.11 in SKILL.md. - No changes to skill logic or workflow—documentation and file maintenance only.","fileCount":11,"zipByteSize":16115},{"version":"1.0.10","createdAt":"2026-08-28T08:01:51.934Z","changelog":"illustrated-story-reel 1.0.10 - Updated documentation and workflow in SKILL.md. - Removed skill-card.md file. - No changes to core logic or generation functionality.","fileCount":11,"zipByteSize":16169},{"version":"1.0.9","createdAt":"2026-08-04T06:19:56.592Z","changelog":"illustrated-story-reel 1.0.9 - Updated p-image skill description for greater clarity about its scope and when to use it. - Removed redundant or outdated documentation file (skill-card.md). - Version bump and maintenance updates for documentation and metadata.","fileCount":11,"zipByteSize":16148},{"version":"1.0.8","createdAt":"2026-07-28T17:21:54.503Z","changelog":"illustrated-story-reel v1.0.8 - Updated intake instructions to clarify opening intake and `generation-diversity` requirements. - Added explicit question about 720p vs 1080p export size in \"Delivery shape\". - Removed the deprecated skill-card.md file. - No functional or workflow logic changes; documentation only.","fileCount":11,"zipByteSize":16113},{"version":"1.0.7","createdAt":"2026-07-23T12:37:09.991Z","changelog":"Summary: Adds gentle p-video motion option, simplifies policy, and streamlines references and documentation. - Adds support for a new `motion_mode: p-video` (gentle illustrated motion per beat), in addition to Ken Burns. - Refactors and shortens documentation, moving detailed policy and quality checklists to external references; simplifies SKILL.md. - Updates intake to require motion mode selection (`ken_burns` or `p-video`) before generation. - Removes obsolete scripts, quality checklist files, and extra policy files for clarity and maintainability. - Adds dedicated craft reference for p-video motion ([illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md)). - Updates phase gates and workflow to cover both motion types; clarifies when each approval is required.","fileCount":11,"zipByteSize":16111}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s173djpkkm1x4yfzg522h5vfp989mrn5:illustrated-story-reel","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s173djpkkm1x4yfzg522h5vfp989mrn5:illustrated-story-reel` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/pruna-ai/illustrated-story-reel before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T15:54:39.116Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-pruna-ai-illustrated-story-reel/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":null},"readme":"Skill: illustrated-story-reel\n\nOwner: pruna-ai\n\nSummary: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\n\nTags: ai:1.0.14, generative:1.0.14, latest:1.0.14, pruna:1.0.14\n\nVersion history:\n\nv1.0.14 | 2026-09-29T15:39:14.535Z | auto\n\nVersion 1.0.14\n\n- Version bump from 1.0.13 to 1.0.14 in documentation.\n- Removed the file: skill-card.md.\n- SKILL.md content was edited, keeping references and workflow details up to date.\n- No changes to source code—documentation and file structure only.\n\nv1.0.13 | 2026-09-17T14:03:44.517Z | auto\n\nillustrated-story-reel 1.0.13\n\n- Updated prerequisites: clarified descriptions for `p-video-2` and `p-video`, including limits on use (cinematic audio, 1080p, talking-head).\n- Removed the file skill-card.md.\n- No functional changes to workflow, gates, or intake questions.\n- Internal documentation streamlined and improved clarity.\n\nv1.0.12 | 2026-09-10T14:02:32.526Z | auto\n\nillustrated-story-reel 1.0.12\n\n- Added references to new skills: p-image-ideogram and p-video-2 for improved photo and video quality options.\n- Updated skill prerequisites and quick reference tables to include new recommended generators.\n- Removed the deprecated skill-card.md file.\n- Documentation in SKILL.md clarified model selection and use-cases for different image/video generators.\n\nv1.0.11 | 2026-09-03T14:15:57.940Z | auto\n\n- Remove redundant skill-card.md file for cleanup and package size reduction.\n- Update metadata version to 1.0.11 in SKILL.md.\n- No changes to skill logic or workflow—documentation and file maintenance only.\n\nv1.0.10 | 2026-08-28T08:01:51.934Z | auto\n\nillustrated-story-reel 1.0.10\n\n- Updated documentation and workflow in SKILL.md.\n- Removed skill-card.md file.\n- No changes to core logic or generation functionality.\n\nv1.0.9 | 2026-08-04T06:19:56.592Z | auto\n\nillustrated-story-reel 1.0.9\n\n- Updated p-image skill description for greater clarity about its scope and when to use it.\n- Removed redundant or outdated documentation file (skill-card.md).\n- Version bump and maintenance updates for documentation and metadata.\n\nv1.0.8 | 2026-07-28T17:21:54.503Z | auto\n\nillustrated-story-reel v1.0.8\n\n- Updated intake instructions to clarify opening intake and `generation-diversity` requirements.\n- Added explicit question about 720p vs 1080p export size in \"Delivery shape\".\n- Removed the deprecated skill-card.md file.\n- No functional or workflow logic changes; documentation only.\n\nv1.0.7 | 2026-07-23T12:37:09.991Z | auto\n\nSummary: Adds gentle p-video motion option, simplifies policy, and streamlines references and documentation.\n\n- Adds support for a new `motion_mode: p-video` (gentle illustrated motion per beat), in addition to Ken Burns.\n- Refactors and shortens documentation, moving detailed policy and quality checklists to external references; simplifies SKILL.md.\n- Updates intake to require motion mode selection (`ken_burns` or `p-video`) before generation.\n- Removes obsolete scripts, quality checklist files, and extra policy files for clarity and maintainability.\n- Adds dedicated craft reference for p-video motion ([illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md)).\n- Updates phase gates and workflow to cover both motion types; clarifies when each approval is required.\n\nv1.0.6 | 2026-07-16T20:57:08.675Z | auto\n\n**Introduces stricter workflow policy, new quality controls, and updated references for story reel generation.**\n\n- Added a shared generation policy section detailing new required pre-generation steps: random seed ritual, diversity rotation, quality checklists, and staged approval gates.\n- Introduced dedicated reference docs: approval red flags, parallel execution, staged generation, and consolidated quality checklists.\n- Updated workflow to clarify that each phase (plan, stills, audio, assembly) must be approved before proceeding.\n- Expanded and reorganized feedback gate guidance and workflow policies to ensure stricter quality and review at each step.\n- Replaced or updated prior reference links to point to new, specific policy docs.\n- Minor updates to running instructions and intake questions to match new workflow structure.\n\nv1.0.2 | 2026-07-16T13:23:44.072Z | auto\n\nillustrated-story-reel 1.0.2\n\n- Documentation and reference file updates for clarity and workflow accuracy.\n- Updated SKILL.md to reflect latest workflow instructions and options.\n- Improved references for API credentials, generation diversity, and random seed handling.\n- Removed outdated skill-card.md documentation file.\n- No functional or interface changes; update targets documentation and guidance.\n\nv1.0.1 | 2026-07-14T15:45:15.490Z | auto\n\n- Clarifies that this skill creates illustrated, still-image story reels or narrated slideshows—**not** full-motion AI videos.\n- Adds detailed instructions on aspect ratios (9:16, 16:9, 1:1), output options, and how to override filenames for landscape outputs.\n- Provides comprehensive intake questions to ensure correct setup before generation (delivery format, audio mode, plan confirmation).\n- Documents stepwise feedback gates (approve plan, stills, audio) and workflow phases for transparency and user checkpoints.\n- Expands guidance on common mistakes, security considerations, and when to use or not use this skill.\n- Adds quick references for required models, templates, and related skills for easy navigation.\n\nv0.0.1 | 2026-06-30T12:36:52.638Z | auto\n\n- Initial release of **illustrated-story-reel** skill.\n- Generates still-image story reels or slideshows with subtle Ken Burns motion, synced to narration (TTS) or instrumental music.\n- Supports flexible aspect ratios: vertical (9:16), horizontal (16:9), and square (1:1).\n- Assembly uses local ffmpeg; does not support full-motion video generation or use p-video.\n- Includes clear intake questions and phase-based feedback gates to ensure user approval at each step.\n- Designed for illustrated “story posts”, picture-book explainer videos, mood reels, and moving slideshow formats.\n\nArchive index:\n\nArchive v1.0.14: 11 files, 16376 bytes\n\nFiles: references/illustrated-story-reel-api.md (2108b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3249b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1826b), skill-card.md (2200b), skill.manifest.json (479b), SKILL.md (13023b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (142b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.14\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image-ideogram` | Use when photo generation needs more control — photoreal results, text in the image, or structured JSON with hex colors and bounding boxes. Simpler photo generation, edits, and video use other skills in the suite. | `npx skills add PrunaAI/pruna-skills@p-image-ideogram -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video-2` | Use when someone wants a polished short clip from text, images, or imported audio — 1080p B-roll, start/end frame animation, or a motion shot with a mixed track. Not for cinematic generated-audio clips or talking-head-only hosts. | `npx skills add PrunaAI/pruna-skills@p-video-2 -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs cinematic generation, highest quality, tight lip-sync, or imported audio at 1080p. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in music mode (Ken Burns only). Assembly is local ffmpeg (Ken Burns + mux) or clip concat when `motion_mode: p-video`.\n\n## When to Use\n\n- Illustrated story with narration or music bed\n- Picture-book / comic-panel narrative with VO or bed\n- User references a “slideshow story”, “Ken Burns reel”, or gentle illustrated motion\n- Budget runs: `ken_burns` (images + TTS only, no video API)\n\n**When NOT to use:** motion between two composed stills (**visual-transition-reel**), lip-sync avatars (**interactive-explainer**), or full sung music video (**music-video**).\n\n## Security & scope\n\nBundled references are scoped to this workflow; do not follow avatar or replace examples from other skills.\n\n| Risk | Mitigation |\n|------|------------|\n| Paid API use | `PRUNA_API_KEY` + `REPLICATE_API_TOKEN`; gates before TTS/music/video/assembly |\n| Credential exposure | Parent agent holds keys; do not pass to subagents except per-lane still/TTS work |\n| Local execution | `ffmpeg`/`ffprobe` subprocess; **`-y` overwrites** output MP4 without confirmation |\n| Data retention | `plan.json` and media under the out dir may contain prompts — treat as confidential |\n\nRequires: `pruna-api` credentials.\n\n## Feedback gates\n\n[./references/illustrated-story-reel-gates.md](./references/illustrated-story-reel-gates.md) · `generation-diversity`\n\n| Phase | What to show | Proceed when |\n|-------|--------------|--------------|\n| **0 — Plan** | Beat table, `audio_mode`, `motion_mode`, sample still lines + narration | **approve plan** |\n| **A — Stills** | `stills/*.png` | **approve stills** |\n| **A2 — Audio** | `audio/narration_*.mp3` or `audio/music.mp3` — **listen** | **approve audio** |\n| **B — Motion** (p-video only) | `clips/*.mp4` — **watch + listen** | **approve clips** |\n| **C — Assemble** | `story_reel.mp4` | User accepts |\n\nDefault first stop: **stills**.\n\n## Quick reference\n\n| Item | Value |\n|------|--------|\n| Models | **p-image** (or **p-image-ideogram** for text / tighter style), **p-image-edit**, optional motion (`p-video-2` quality / `p-video` simpler), Gemini TTS, Stable Audio 2.5 |\n| Plan field | `audio_mode`: `\"narration\"` \\| `\"music\"` |\n| Motion | `defaults.motion_mode`: `\"ken_burns\"` \\| `\"p-video\"` (narration mode only) |\n| Aspect | `defaults.aspect_ratio`: `\"9:16\"` \\| `\"16:9\"` \\| `\"1:1\"` |\n| Templates | [templates/story-plan.template.json](./templates/story-plan.template.json) (9:16) · [templates/story-plan.landscape.template.json](./templates/story-plan.landscape.template.json) (16:9) |\n| Craft | [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md) · [./references/illustrated-story-reel-prompts.md](./references/illustrated-story-reel-prompts.md) |\n| Output | `{out_dir}/story_reel.mp4` |\n\n## Intake — ask before generating\n\nOpen intake → **`generation-diversity`** clarification intake.\n\n**First questions (required):**\n\n1. **Delivery shape** — vertical reel (**9:16**), horizontal slideshow (**16:9**), or square (**1:1**)? Target **720p vs 1080p** if export size matters?\n2. **Audio** — **narration** (voiceover per beat) or **music** (instrumental bed / user track)?\n3. **Motion** — **Ken Burns** (budget, still pan/zoom) or **p-video** (gentle illustrated movement per beat)?\n\nSet `defaults.aspect_ratio`, `audio_mode`, and `motion_mode` in the plan before generation.\n\n| Topic | Questions |\n|-------|-----------|\n| **Story** | Title? Beat order (1…N)? Emotional arc? |\n| **Visual** | Style (`style_bible`)? Character continuity? `chain_from_previous` for edit chains? |\n| **Per beat** | `edit_prompt` (one frame)? `narration` line (narration mode)? `hold_seconds` (music mode)? |\n| **Ken Burns** | `ken_burns`: prefer **`pan_left` / `pan_right`** over aggressive zoom (see **Motion + assemble**). |\n| **p-video** | `video_prompt` (OPEN/MID/CLOSE, no VO transcript)? TTS ≤ ~19s per beat — see [p-video-motion](./references/illustrated-story-reel-p-video-motion.md). |\n| **Music mode** | Stable Audio prompt, user `music.track` path, or equal seconds per beat? |\n| **Narration mode** | Voice (`Kore`, etc.)? Storyteller pace in `narration.style_prompt`? |\n\nDo not start generation until the beat table is written and **audio_mode** + **motion_mode** are confirmed.\n\n### Beat table (template)\n\n| `#` | Still (`edit_prompt`) | Narration / hold | Motion | Chain? |\n|-----|------------------------|------------------|--------|--------|\n| 1 | opening wide | line or 4s | ken_burns / p-video | no |\n| 2 | detail insert | line or 3.5s | ken_burns / p-video | yes |\n\n## Generation phases\n\n| Phase | When | Gate |\n|-------|------|------|\n| **stills** | After plan approval | **approve stills** |\n| **tts** / **music** | After stills — matches `audio_mode` | **approve audio** |\n| **video** | Only if `motion_mode: p-video` | **approve clips** |\n| **assemble** | After audio (ken_burns) or clips (p-video) | User accepts MP4 |\n\n## How the agent runs this\n\n1. Copy a plan template → fill beat table → **approve plan**.\n2. Hero → parallel `p-image-edit` stills (`pruna-api`) → **approve stills**.\n3. Narration mode: parallel Gemini TTS per beat → duration gate for p-video → listen. Music mode: Stable Audio or user track → listen → **approve audio**.\n4. `p-video-2` mode only: one job per beat (`image` + `audio`; omit `duration`) → **approve clips**.\n5. Assemble with ffmpeg (Ken Burns pan/zoom + mux, or concat p-video clips).\n\n**Duration gate (p-video / long TTS):**\n\n```bash\nffprobe -v error -show_entries format=duration -of csv=p=0 audio/narration_01.mp3\n# ≤ ~19s before p-video\n```\n\n## Workflow\n\n### Stills\n\nHero `p-image` (`p-image-ideogram` if frames need readable text or tighter style) → parallel `p-image-edit` per beat (`edit_prompt`). Chain edits from previous still when `chain_from_previous: true`.\n\n### Audio\n\n- **Narration:** one Gemini TTS file per beat.\n- **Music:** one bed (Stable Audio or user file); timing from `hold_seconds`.\n\n### Motion + assemble\n\n**Ken Burns (budget):** for each still, render a short pan/zoom clip, then concat and mux narration or bed. Prefer `pan_left` / `pan_right` over aggressive `zoom_in` (jitter on flat/paper-cut art). Upscale (e.g. ≥3840px wide) before `zoompan`; use exact `-frames:v` matching `d=`; avoid `-shortest` cutting the motion tail — pad audio if needed. Do **not** call `p-video-2` to fix Ken Burns tremor.\n\nConceptual pan (adapt duration / size to aspect):\n\n```bash\nffmpeg -y -loop 1 -i stills/01.png -vf \"scale=3840:-1,zoompan=z='1':x='x+1':y='y':d=120:s=1080x1920:fps=24\" \\\n  -frames:v 120 -c:v libx264 clips/01.mp4\n```\n\nMux per-beat narration (or concat silent clips then mix bed):\n\n```bash\nffmpeg -y -i clips/01.mp4 -i audio/narration_01.mp3 \\\n  -map 0:v -map 1:a -c:v copy -c:a aac -shortest beat_01.mp4\n```\n\nHard-cut concat:\n\n```bash\nffmpeg -y -f concat -safe 0 -i beats.txt -c copy story_reel.mp4\n```\n\n**p-video:** parallel I2V jobs with uploaded narration; then concat clips (VO already embedded). Craft: [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md).\n\n## Common mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| VO transcript inside **`video_prompt`** | Mode B motion only — [p-video-motion](./references/illustrated-story-reel-p-video-motion.md) |\n| **`duration`** with uploaded narration | Omit `duration`; clip length follows audio |\n| Ken Burns **tremor / jitter** | Prefer `pan_*`; upscale before zoompan; exact `-frames:v` — see **Motion + assemble** |\n| **`p-video` in music mode** | Use `ken_burns` for music-mode reels |\n| Skipping audio listen gate | Wait for **approve audio** |\n| One long narration blob | One line per beat; TTS per scene; probe ≤ ~19s for p-video |\n| Music mode without `hold_seconds` | Set per beat or `defaults.hold_seconds` |\n| Negation in still prompts | Positive description only — [prompts](./references/illustrated-story-reel-prompts.md) |\n| Assuming vertical only | Set `aspect_ratio` to `16:9` and landscape framing in prompts for horizontal deliverables |\n| Mismatched ratio in prompts | `aspect_ratio` in plan must match “vertical” / “horizontal” / “square” in `hero_prompt` and beats |\n\n## Related\n\nRelated skills:\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `narrated-multi-scene` | Use when someone wants a multi-part story with voiceover — episodic B-roll, chaptered promo, or several linked video scenes without on-camera dialogue. | `npx skills add PrunaAI/pruna-skills@narrated-multi-scene -y` |\n| `visual-transition-reel` | Use when someone wants a montage with transitions between shots — action-sequence reel or multi-scene piece where narration is optional. | `npx skills add PrunaAI/pruna-skills@visual-transition-reel -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs cinematic generation, highest quality, tight lip-sync, or imported audio at 1080p. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `video-editing` | Use when assembling or polishing already-rendered clips with ffmpeg — concat, crossfades, burned captions and subtitles, text/logo overlays, before/after sliders, background music beds, platform export — or when composing a multi-layer HTML combination video with Hyperframes. Not for AI video generation, prompt craft, or model-based video edits. | `npx skills add PrunaAI/pruna-skills@video-editing -y` |\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn7cagwf7q3t0cxrgteb7xk0bh81j0eb\",\n  \"slug\": \"illustrated-story-reel\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1790696354535\n}\n\nFile v1.0.14:references/illustrated-story-reel-api.md\n\n# Illustrated story reel — API reference (scoped)\n\nAPIs used by **illustrated-story-reel**. Optional motion when `motion_mode: p-video` — **`p-video-2`** (quality) or **`p-video`** (simpler).\n\nCredentials: `pruna-api`\n\n## Pruna P-API (stills + optional motion)\n\n- Base: `https://api.pruna.ai/v1/predictions`\n- Upload: `https://api.pruna.ai/v1/files`\n- Header: `apikey: ${PRUNA_API_KEY}`, `Model: p-image` | `p-image-ideogram` | `p-image-edit` | `p-video-2` | `p-video`\n- Body: `{ \"input\": { ... } }`\n- Sync (`Try-Sync: true`) is acceptable for hero stills; async + poll for p-video clips.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `p-image` | Hero anchor still (default for illustrated frames) |\n| `p-image-ideogram` | Hero when frames need readable text or tighter style control |\n| `p-image-edit` | Per-beat still from hero or chained prior plate |\n| `p-video-2` | Optional Mode B clip (quality): still + narration (`save_audio: true`, omit `duration`) |\n| `p-video` | Same Mode B payload for simpler / quicker clips |\n\nHTTP patterns and upload/poll/download: `pruna-api`. Motion payload fields: `p-video-2` / `p-video` skills.\n\n## Replicate (audio)\n\n- Header: `Authorization: Bearer ${REPLICATE_API_TOKEN}`\n- Create: `POST https://api.replicate.com/v1/models/{owner}/{name}/predictions`\n- Poll `urls.get` until `succeeded`; download output URL.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `google/gemini-3.1-flash-tts` | Per-beat narration (`audio_mode: narration`) |\n| `stability-ai/stable-audio-2.5` | Instrumental bed (`audio_mode: music`, no user track) |\n\nShared client: pruna-api / Replicate HTTP in tool skill\n\n## Local assembly (ffmpeg)\n\nRequires **`ffmpeg`** and **`ffprobe`** on PATH. The agent runs ffmpeg with **`-y`** (overwrite output without prompt). Confirm out dir and output name before assembly.\n\n- **Ken Burns:** segments + narration/bed mux — `illustrated-story-reel` **Motion + assemble**\n- **p-video:** concat `clips/*.mp4` (audio embedded) — [illustrated-story-reel-p-video-motion.md](./illustrated-story-reel-p-video-motion.md)\n\nFile v1.0.14:references/illustrated-story-reel-gates.md\n\n# Illustrated story reel — staged gates\n\nHuman-in-the-loop phases for **illustrated-story-reel**. Uses **p-image**, **p-image-edit**, optional **p-video** (Mode B motion), Replicate TTS/music, and local ffmpeg assembly.\n\n## Phases\n\n| Phase | Models / tools | Cost | User interaction |\n|-------|----------------|------|------------------|\n| **0 — Plan** | none | free | Present beat table, `audio_mode`, `motion_mode`, sample still lines; **approve plan** |\n| **A — Stills** | `p-image`, `p-image-edit` | low | Show `stills/*.png`; run checklists; **approve stills** |\n| **A2 — Audio** | Gemini TTS **or** Stable Audio / user track | low–medium | **Listen** to `audio/narration_*.mp3` or `audio/music.mp3`; **approve audio** |\n| **B — Motion** | `p-video` (when `motion_mode: p-video`) | medium | **Watch + listen** to `clips/*.mp4`; **approve clips** |\n| **C — Assemble** | local ffmpeg (Ken Burns + mux **or** clip concat) | free | Review `story_reel.mp4` (or `--output-name`) |\n\nKen Burns path skips Phase B. Music-mode reels use Ken Burns only (no p-video).\n\n## Agent rules\n\n1. **Only** call `p-video` when `motion_mode: p-video` and narration is approved — not for Ken Burns tremor fixes.\n2. **Never** run audio, video, or assembly in the same turn as still generation without showing stills and waiting for approval.\n3. **Parallelize within a phase** (batch still edits, parallel TTS, parallel p-video), not across phases.\n4. **Do not pass `PRUNA_API_KEY` or `REPLICATE_API_TOKEN` to subagents** unless a subagent is running an approved still or TTS lane — parent owns gates and assembly.\n5. Run [illustrated-story-reel-quality.md](./illustrated-story-reel-quality.md) on every still before audio or video.\n6. **`generation-diversity`** and **random seed ritual (`generation-diversity`)** before every `POST /v1/predictions`.\n\n## Wording templates\n\nAfter Phase 0:\n\n> Here is the beat table, `audio_mode`, and `motion_mode`. Reply **approve plan** to generate stills, or tell me what to change.\n\nAfter Phase A:\n\n> Stills are in `stills/`. Reply **approve stills** to run TTS or music, or name beats to fix.\n\nAfter Phase A2:\n\n> Audio is in `audio/`. Listen for pace and tone. Reply **approve audio** to run p-video (if motion_mode p-video) or assemble (Ken Burns), or tell me lines to rewrite.\n\nAfter Phase B (p-video):\n\n> Motion clips are in `clips/`. Watch for style drift and listen for sync. Reply **approve clips** to assemble, or name beats to re-render.\n\nBefore assembly:\n\n> Assembly runs ffmpeg into `{out_dir}/story_reel.mp4`. ffmpeg uses **`-y`** and overwrites the output path without confirmation — confirm `{out_dir}` is correct.\n\n## Phases (agent)\n\nDefault stop after **stills**. Do not run TTS/music until stills are approved. Do not run p-video until audio is approved. Assembly needs approved audio (Ken Burns) or approved clips (p-video).\n\nFollow `illustrated-story-reel` — agent runs curl + ffmpeg. No Python runner. Do not skip still/audio/clip approval gates.\n\n## Local state files\n\n| File | Purpose | Privacy note |\n|------|---------|--------------|\n| `generation_status.json` | Phase approval flags (`phase_a`, `phase_b`, `phase_c`) | Written under `--out-dir`; safe to delete to reset gates |\n| `stills/`, `audio/`, `clips/`, `segments/` | Generated media | May contain prompts reflected in filenames and plan JSON |\n| `plan.json` | Beat prompts and narration | Can include sensitive project details — treat as confidential |\n\n## Anti-patterns\n\n- **`p-video` for Ken Burns tremor** — tune `ken_burns` (prefer `pan_*`) + re-assemble per SKILL **Motion + assemble**\n- **VO transcript in `video_prompt`** — Mode B motion only ([p-video-motion](./illustrated-story-reel-p-video-motion.md))\n- Aggressive **zoom_in on every illustrated beat** — prefer `pan_left` / `pan_right`\n- Skipping still, audio, or clip review before the next paid phase\n- Passing API keys to broad subagent trees\n- Running assembly before the user listens to narration or watches p-video clips\n\nFile v1.0.14:references/illustrated-story-reel-p-video-motion.md\n\n# Illustrated story reel — p-video motion (Mode B)\n\nOptional **illustrated movement** per beat: upload the beat still + Gemini TTS narration to **`p-video-2`** (Mode B). Clip length follows audio — **omit `duration`**, set **`save_audio: true`**. Plan flag stays `motion_mode: \"p-video\"`.\n\nKen Burns (ffmpeg only) remains the **budget** path — prefer `pan_left` / `pan_right` and follow **Motion + assemble** in `illustrated-story-reel`.\n\n## When to use\n\n| Path | Cost | Motion |\n|------|------|--------|\n| **`ken_burns`** (default) | images + TTS only | Slow pan/zoom on still |\n| **`p-video`** (`p-video-2` API) | + one video API call per beat | Books flutter, whale drifts, gentle illustrated drift |\n\nSet `defaults.motion_mode` or per-scene `motion_mode`: `\"ken_burns\"` \\| `\"p-video\"`.\n\n**Requires `audio_mode: narration`.** Music-mode reels stay Ken Burns + `hold_seconds`.\n\n## Plan fields\n\n| Field | Role |\n|-------|------|\n| `defaults.motion_mode` | `\"ken_burns\"` (default) or `\"p-video\"` |\n| `scenes[].motion_mode` | Override per beat |\n| `scenes[].video_prompt` | Mode B motion prompt (OPEN/MID/CLOSE) — **no VO transcript** |\n\nTTS per beat must be **≤ ~19s** (P-API audio-led cap ~20s). Probe before render — see `video-prompting`.\n\n## Mode B prompt template\n\n```text\nOPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only.\n```\n\nRules (full ref: `video-prompting`):\n\n- Describe **picture motion**, not spoken words.\n- Match narrator mood — calm story → slow drift; wonder → slightly livelier flutter.\n- Keep style stable — no morphing from paper-cut to photoreal.\n- Static or slow camera; physics-safe motion on illustrated elements.\n\n## API payload\n\nUse Build the `p-video-2` payload (see `p-video-2` skill):\n\n```python\nbuild_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)\n```\n\nDo **not** post-mux narration over a silent clip — long lines truncate.\n\n## Phases (p-video)\n\n1. Stills → approve\n2. TTS per beat → approve audio\n3. `p-video-2` per beat (narration as `audio`) → approve clips\n4. ffmpeg concat\n\nKen Burns path skips video generation; assemble muxes narration over ffmpeg Ken Burns segments. See `illustrated-story-reel`.\n\n## QA\n\n- [ ] Narration probed ≤ ~19s per beat\n- [ ] `video_prompt` has no VO transcript\n- [ ] Still matches `style_bible` before video\n- [ ] Clip motion stays illustrated — no photoreal drift\n- [ ] Listen to `clips/*.mp4` before assemble\n\n## Anti-patterns\n\n| Do not | Do instead |\n|--------|------------|\n| Paste narration text into `video_prompt` | Mode B mood + motion only |\n| Set `duration` with uploaded `audio` | Omit `duration` |\n| Switch to p-video for Ken Burns tremor | Tune `ken_burns` + re-assemble |\n| Mix `ken_burns` and `p-video` beats in one reel (v1) | Uniform `motion_mode` across all beats |\n\nFile v1.0.14:references/illustrated-story-reel-prompts.md\n\n# Illustrated story reel — positive still prompts\n\nStill-line guidance for **illustrated-story-reel** (`hero_prompt`, `style_bible`, `edit_prompt` per beat). **No `video_prompt`** — motion is Ken Burns in ffmpeg only.\n\n## Principle\n\nDescribe **what appears** in each frame — never what to leave out. Saying `no text` often **creates** readable type. Be explicit about the single frame you want.\n\n**Never** use `no …`, `avoid …`, `not …`, `without …`, `don't`, or `do not` in creative fields. Spoken narration lines may use natural negation.\n\n## Banned patterns → positive rewrite\n\n| Banned pattern | Write explicitly instead |\n|----------------|--------------------------|\n| `no text` / `no signage` / `no labels` | `plain unmarked walls`, `unprinted wood surfaces`, `matte unprinted props` |\n| `avoid markets` / `avoid text` | `plain wood table`, `single camera angle`, `one focal subject` |\n| `without vocals` (music bed prompt) | `instrumental only` |\n| `no cartoon` / `no modern` | `painterly historical illustration`, `period-accurate props only` |\n\n## Rules\n\n1. **One positive sentence per beat** — location, subject, light, `one camera angle`.\n2. **`style_bible`** — positive comma-clauses only. Match `defaults.aspect_ratio` (e.g. `16:9 horizontal frame` for landscape).\n3. **`edit_prompt`** — one composed still per beat; use `chain_from_previous` for visual continuity.\n4. **`ken_burns`** — `pan_left`, `pan_right`, `zoom_in`, `zoom_out`, or `none` (per beat or `defaults`). **Prefer slow pan** on illustrated/paper-cut beats; reserve zoom for photo-style heroes. Assembly tips: `illustrated-story-reel` **Motion + assemble**.\n\n## Text & signage (most common)\n\n| Blocked phrase in stills | Use instead |\n|--------------------------|-------------|\n| `farmers market`, `signage`, `neon signs` | produce on **plain wood table**, **matte unprinted** baskets |\n| `labeled`, `packaging`, `price tag`, `menu` | **matte unprinted** jars, food in **plain glass bowl** |\n| `graphic tee`, `poster`, `magazine` | solid-color fabrics, unbranded matte props |\n| `maps`, `newspaper`, `headline`, `caption` | blank folded parchment, plain walls, unmarked wood |\n\n## Collage & layout\n\n| Blocked phrase | Use instead |\n|----------------|-------------|\n| `split`, `side by side`, `grid`, `collage`, `montage`, `multiple angles` | one subject, one camera angle, one frame |\n| `OPENING:` / `CLOSING:` prefixes | plain scene description |\n| `storyboard`, `triptych` | one continuous composition |\n\n## Good vs bad still lines\n\n| Bad | Good |\n|-----|------|\n| `No text, farmers market` | `Plain wood table`, matte baskets, sunny window, **one camera angle** |\n| `Avoid labels on packaging` | **Matte unprinted** jars on **plain counter** |\n\nFile v1.0.14:references/illustrated-story-reel-quality.md\n\n# Illustrated story reel — quality gates\n\nAgent vision review for **illustrated-story-reel** stills, audio, and optional p-video clips.\n\n## Who applies these?\n\n**The coding agent** opens real output files (`stills/*.png`, `audio/*.mp3`, `clips/*.mp4` when p-video) and judges pass/fail. Then present paths for user **approve stills** / **approve audio** / **approve clips** per [illustrated-story-reel-gates.md](./illustrated-story-reel-gates.md).\n\n## Core (every job)\n\n- **`generation-diversity`** — ritual seed + rotate scenario axes.\n- **Random seed ritual (`generation-diversity`)** — state ritual string before every prediction; never copy doc examples.\n- Goal and acceptance criteria are explicit.\n- `aspect_ratio` in plan matches prompt wording (vertical / horizontal / square).\n- No accidental watermarks, UI overlays, or stray text unless requested.\n\n## Per model\n\nAfter each still, open the file and review:\n\n- **Hero + beats (`p-image` / `p-image-ideogram`, `p-image-edit`):** `image-prompting` — skip avatar handoff rows.\n- **Narration (`gemini-3.1-flash-tts`):** pace, tone, line clarity per beat; probe ≤ ~19s before p-video.\n- **Music bed (`stable-audio-2.5`):** instrumental, no vocals unless brief asks; level appropriate under stills.\n- **Motion clips (`p-video`, when `motion_mode: p-video`):** style matches still; gentle illustrated drift; no photoreal morph; audio sync; no VO transcript leaked into motion.\n- **Assembled reel (`story_reel.mp4`, Ken Burns):** motion is **smooth** — no tremor/jitter. Fix with `ken_burns` pan + re-assemble — `illustrated-story-reel` **Motion + assemble**. Do not use p-video to fix tremor.\n\n## Traceability\n\n`generation_status.json` under `--out-dir` records phase approvals. Plan JSON retains prompts and narration — treat as confidential project data.\n\nFile v1.0.14:skill-card.md\n\n## Description:\n\nCreates illustrated story reels with narration or music, using picture-book frames and gentle pan-and-zoom or optional generated motion.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pruna-ai](https://clawhub.ai/user/pruna-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and marketing teams use this skill to plan and produce illustrated slideshow stories with voiceover or music, review each stage, and assemble a finished video reel.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and generated media are sent to external Pruna or Replicate services.\n\nMitigation: Use only intended API keys and review sensitive content before submitting prompts or media.\n\nRisk: Paid generation may incur costs, and final assembly can overwrite an existing MP4.\n\nMitigation: Observe the plan, still, audio and optional clip approval gates; confirm a safe output directory before assembly.\n\nRisk: Installing dependencies from an untrusted source can introduce unwanted behavior.\n\nMitigation: Confirm the Pruna AI skill source and prefer pinned or preapproved dependencies.\n\n## Reference(s):\n\n- [Illustrated Story Reel on ClawHub](https://clawhub.ai/pruna-ai/skills/illustrated-story-reel)\n- [Workflow and approval gates](artifact/references/illustrated-story-reel-gates.md)\n- [API reference](artifact/references/illustrated-story-reel-api.md)\n- [Quality gates](artifact/references/illustrated-story-reel-quality.md)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, JSON, Shell commands, Guidance]\n\n**Output Format:** [Markdown beat plans, JSON story plans, and shell commands for media generation and assembly]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces reviewed stills, audio, optional motion clips, and an assembled MP4 reel.]\n\n## Skill Version(s):\n\n1.0.14 (source: release evidence and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.14:skill.manifest.json\n\n{\n  \"references\": [\n    \"illustrated-story-reel-prompts.md\",\n    \"illustrated-story-reel-p-video-motion.md\",\n    \"illustrated-story-reel-gates.md\",\n    \"illustrated-story-reel-api.md\",\n    \"illustrated-story-reel-quality.md\"\n  ],\n  \"templates\": [\n    \"story-plan.template.json\",\n    \"story-plan.landscape.template.json\"\n  ],\n  \"generation_phases\": {\n    \"default\": \"stills\",\n    \"phases\": [\n      \"stills\",\n      \"tts\",\n      \"music\",\n      \"video\",\n      \"assemble\"\n    ]\n  }\n}\n\nFile v1.0.14:templates/story-plan.landscape.template.json\n\n{\n  \"title\": \"Horizontal photo essay (template)\",\n  \"audio_mode\": \"music\",\n  \"hero_prompt\": \"Photoreal wide establishing shot, 16:9 horizontal frame, natural daylight, single clear subject, documentary composition\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"16:9\",\n    \"fps\": 24,\n    \"hold_seconds\": 3.5,\n    \"hold_pad_seconds\": 0.25,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.4,\n    \"hard_cut_crossfade_seconds\": 0.12\n  },\n  \"style_bible\": \"Photoreal 35mm, natural color, shallow depth of field, consistent subject wardrobe\",\n  \"music\": {\n    \"prompt\": \"Cinematic instrumental underscore, gentle pulse, no vocals, 80 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_open\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_in\",\n      \"hold_seconds\": 4,\n      \"edit_prompt\": \"Wide landscape horizon, subject small in frame, golden hour, photoreal\"\n    },\n    {\n      \"id\": \"02_detail\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_left\",\n      \"hold_seconds\": 3,\n      \"edit_prompt\": \"Medium shot same subject, environment sharper, editorial realism\"\n    }\n  ]\n}\n\nFile v1.0.14:templates/story-plan.template.json\n\n{\n  \"title\": \"The lighthouse keeper's letter\",\n  \"audio_mode\": \"narration\",\n  \"hero_prompt\": \"Painterly storybook illustration, elderly lighthouse keeper in yellow raincoat, stormy sea, warm lamplight, single character, 9:16 vertical frame, one scene\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"9:16\",\n    \"fps\": 24,\n    \"hold_seconds\": 4,\n    \"hold_pad_seconds\": 0.35,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.45,\n    \"hard_cut_crossfade_seconds\": 0.15\n  },\n  \"style_bible\": \"Soft watercolor storybook, muted blues and amber lamp glow, gentle grain, consistent character face and coat\",\n  \"narration\": {\n    \"voice\": \"Kore\",\n    \"style_prompt\": \"Warm storyteller pace, ~2.2 words per second, clear diction, gentle emotion\",\n    \"language_code\": \"en-US\"\n  },\n  \"music\": {\n    \"prompt\": \"Soft piano and strings, nostalgic bedtime story, no vocals, 72 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_storm\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Wide shot: lighthouse tower against black clouds, keeper tiny at the railing, waves crashing\",\n      \"narration\": \"On the night the letter arrived, the sea forgot how to be gentle.\"\n    },\n    {\n      \"id\": \"02_letter\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Close on wrinkled hands opening a sealed envelope, lamplight on the paper, same keeper coat\",\n      \"narration\": \"The ink was faded, but the name was still legible — the one he had not spoken in thirty years.\"\n    },\n    {\n      \"id\": \"03_memory\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_out\",\n      \"edit_prompt\": \"Interior lantern room, keeper reading by window, ghostly reflection of a younger face in the glass\",\n      \"narration\": \"Some doors stay closed until the storm forces them open.\"\n    },\n    {\n      \"id\": \"04_dawn\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"zoom_in\",\n      \"edit_prompt\": \"Dawn breaking over calm water, keeper on steps with letter pressed to chest, golden light\",\n      \"narration\": \"By morning, the letter was answered — not in words, but in the choice to walk back down the hill.\"\n    }\n  ]\n}\n\nArchive v1.0.13: 11 files, 16540 bytes\n\nFiles: references/illustrated-story-reel-api.md (2108b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3249b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1826b), skill-card.md (2811b), skill.manifest.json (479b), SKILL.md (13023b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (142b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.13\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image-ideogram` | Use when photo generation needs more control — photoreal results, text in the image, or structured JSON with hex colors and bounding boxes. Simpler photo generation, edits, and video use other skills in the suite. | `npx skills add PrunaAI/pruna-skills@p-image-ideogram -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video-2` | Use when someone wants a polished short clip from text, images, or imported audio — 1080p B-roll, start/end frame animation, or a motion shot with a mixed track. Not for cinematic generated-audio clips or talking-head-only hosts. | `npx skills add PrunaAI/pruna-skills@p-video-2 -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs cinematic generation, highest quality, tight lip-sync, or imported audio at 1080p. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in music mode (Ken Burns only). Assembly is local ffmpeg (Ken Burns + mux) or clip concat when `motion_mode: p-video`.\n\n## When to Use\n\n- Illustrated story with narration or music bed\n- Picture-book / comic-panel narrative with VO or bed\n- User references a “slideshow story”, “Ken Burns reel”, or gentle illustrated motion\n- Budget runs: `ken_burns` (images + TTS only, no video API)\n\n**When NOT to use:** motion between two composed stills (**visual-transition-reel**), lip-sync avatars (**interactive-explainer**), or full sung music video (**music-video**).\n\n## Security & scope\n\nBundled references are scoped to this workflow; do not follow avatar or replace examples from other skills.\n\n| Risk | Mitigation |\n|------|------------|\n| Paid API use | `PRUNA_API_KEY` + `REPLICATE_API_TOKEN`; gates before TTS/music/video/assembly |\n| Credential exposure | Parent agent holds keys; do not pass to subagents except per-lane still/TTS work |\n| Local execution | `ffmpeg`/`ffprobe` subprocess; **`-y` overwrites** output MP4 without confirmation |\n| Data retention | `plan.json` and media under the out dir may contain prompts — treat as confidential |\n\nRequires: `pruna-api` credentials.\n\n## Feedback gates\n\n[./references/illustrated-story-reel-gates.md](./references/illustrated-story-reel-gates.md) · `generation-diversity`\n\n| Phase | What to show | Proceed when |\n|-------|--------------|--------------|\n| **0 — Plan** | Beat table, `audio_mode`, `motion_mode`, sample still lines + narration | **approve plan** |\n| **A — Stills** | `stills/*.png` | **approve stills** |\n| **A2 — Audio** | `audio/narration_*.mp3` or `audio/music.mp3` — **listen** | **approve audio** |\n| **B — Motion** (p-video only) | `clips/*.mp4` — **watch + listen** | **approve clips** |\n| **C — Assemble** | `story_reel.mp4` | User accepts |\n\nDefault first stop: **stills**.\n\n## Quick reference\n\n| Item | Value |\n|------|--------|\n| Models | **p-image** (or **p-image-ideogram** for text / tighter style), **p-image-edit**, optional motion (`p-video-2` quality / `p-video` simpler), Gemini TTS, Stable Audio 2.5 |\n| Plan field | `audio_mode`: `\"narration\"` \\| `\"music\"` |\n| Motion | `defaults.motion_mode`: `\"ken_burns\"` \\| `\"p-video\"` (narration mode only) |\n| Aspect | `defaults.aspect_ratio`: `\"9:16\"` \\| `\"16:9\"` \\| `\"1:1\"` |\n| Templates | [templates/story-plan.template.json](./templates/story-plan.template.json) (9:16) · [templates/story-plan.landscape.template.json](./templates/story-plan.landscape.template.json) (16:9) |\n| Craft | [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md) · [./references/illustrated-story-reel-prompts.md](./references/illustrated-story-reel-prompts.md) |\n| Output | `{out_dir}/story_reel.mp4` |\n\n## Intake — ask before generating\n\nOpen intake → **`generation-diversity`** clarification intake.\n\n**First questions (required):**\n\n1. **Delivery shape** — vertical reel (**9:16**), horizontal slideshow (**16:9**), or square (**1:1**)? Target **720p vs 1080p** if export size matters?\n2. **Audio** — **narration** (voiceover per beat) or **music** (instrumental bed / user track)?\n3. **Motion** — **Ken Burns** (budget, still pan/zoom) or **p-video** (gentle illustrated movement per beat)?\n\nSet `defaults.aspect_ratio`, `audio_mode`, and `motion_mode` in the plan before generation.\n\n| Topic | Questions |\n|-------|-----------|\n| **Story** | Title? Beat order (1…N)? Emotional arc? |\n| **Visual** | Style (`style_bible`)? Character continuity? `chain_from_previous` for edit chains? |\n| **Per beat** | `edit_prompt` (one frame)? `narration` line (narration mode)? `hold_seconds` (music mode)? |\n| **Ken Burns** | `ken_burns`: prefer **`pan_left` / `pan_right`** over aggressive zoom (see **Motion + assemble**). |\n| **p-video** | `video_prompt` (OPEN/MID/CLOSE, no VO transcript)? TTS ≤ ~19s per beat — see [p-video-motion](./references/illustrated-story-reel-p-video-motion.md). |\n| **Music mode** | Stable Audio prompt, user `music.track` path, or equal seconds per beat? |\n| **Narration mode** | Voice (`Kore`, etc.)? Storyteller pace in `narration.style_prompt`? |\n\nDo not start generation until the beat table is written and **audio_mode** + **motion_mode** are confirmed.\n\n### Beat table (template)\n\n| `#` | Still (`edit_prompt`) | Narration / hold | Motion | Chain? |\n|-----|------------------------|------------------|--------|--------|\n| 1 | opening wide | line or 4s | ken_burns / p-video | no |\n| 2 | detail insert | line or 3.5s | ken_burns / p-video | yes |\n\n## Generation phases\n\n| Phase | When | Gate |\n|-------|------|------|\n| **stills** | After plan approval | **approve stills** |\n| **tts** / **music** | After stills — matches `audio_mode` | **approve audio** |\n| **video** | Only if `motion_mode: p-video` | **approve clips** |\n| **assemble** | After audio (ken_burns) or clips (p-video) | User accepts MP4 |\n\n## How the agent runs this\n\n1. Copy a plan template → fill beat table → **approve plan**.\n2. Hero → parallel `p-image-edit` stills (`pruna-api`) → **approve stills**.\n3. Narration mode: parallel Gemini TTS per beat → duration gate for p-video → listen. Music mode: Stable Audio or user track → listen → **approve audio**.\n4. `p-video-2` mode only: one job per beat (`image` + `audio`; omit `duration`) → **approve clips**.\n5. Assemble with ffmpeg (Ken Burns pan/zoom + mux, or concat p-video clips).\n\n**Duration gate (p-video / long TTS):**\n\n```bash\nffprobe -v error -show_entries format=duration -of csv=p=0 audio/narration_01.mp3\n# ≤ ~19s before p-video\n```\n\n## Workflow\n\n### Stills\n\nHero `p-image` (`p-image-ideogram` if frames need readable text or tighter style) → parallel `p-image-edit` per beat (`edit_prompt`). Chain edits from previous still when `chain_from_previous: true`.\n\n### Audio\n\n- **Narration:** one Gemini TTS file per beat.\n- **Music:** one bed (Stable Audio or user file); timing from `hold_seconds`.\n\n### Motion + assemble\n\n**Ken Burns (budget):** for each still, render a short pan/zoom clip, then concat and mux narration or bed. Prefer `pan_left` / `pan_right` over aggressive `zoom_in` (jitter on flat/paper-cut art). Upscale (e.g. ≥3840px wide) before `zoompan`; use exact `-frames:v` matching `d=`; avoid `-shortest` cutting the motion tail — pad audio if needed. Do **not** call `p-video-2` to fix Ken Burns tremor.\n\nConceptual pan (adapt duration / size to aspect):\n\n```bash\nffmpeg -y -loop 1 -i stills/01.png -vf \"scale=3840:-1,zoompan=z='1':x='x+1':y='y':d=120:s=1080x1920:fps=24\" \\\n  -frames:v 120 -c:v libx264 clips/01.mp4\n```\n\nMux per-beat narration (or concat silent clips then mix bed):\n\n```bash\nffmpeg -y -i clips/01.mp4 -i audio/narration_01.mp3 \\\n  -map 0:v -map 1:a -c:v copy -c:a aac -shortest beat_01.mp4\n```\n\nHard-cut concat:\n\n```bash\nffmpeg -y -f concat -safe 0 -i beats.txt -c copy story_reel.mp4\n```\n\n**p-video:** parallel I2V jobs with uploaded narration; then concat clips (VO already embedded). Craft: [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md).\n\n## Common mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| VO transcript inside **`video_prompt`** | Mode B motion only — [p-video-motion](./references/illustrated-story-reel-p-video-motion.md) |\n| **`duration`** with uploaded narration | Omit `duration`; clip length follows audio |\n| Ken Burns **tremor / jitter** | Prefer `pan_*`; upscale before zoompan; exact `-frames:v` — see **Motion + assemble** |\n| **`p-video` in music mode** | Use `ken_burns` for music-mode reels |\n| Skipping audio listen gate | Wait for **approve audio** |\n| One long narration blob | One line per beat; TTS per scene; probe ≤ ~19s for p-video |\n| Music mode without `hold_seconds` | Set per beat or `defaults.hold_seconds` |\n| Negation in still prompts | Positive description only — [prompts](./references/illustrated-story-reel-prompts.md) |\n| Assuming vertical only | Set `aspect_ratio` to `16:9` and landscape framing in prompts for horizontal deliverables |\n| Mismatched ratio in prompts | `aspect_ratio` in plan must match “vertical” / “horizontal” / “square” in `hero_prompt` and beats |\n\n## Related\n\nRelated skills:\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `narrated-multi-scene` | Use when someone wants a multi-part story with voiceover — episodic B-roll, chaptered promo, or several linked video scenes without on-camera dialogue. | `npx skills add PrunaAI/pruna-skills@narrated-multi-scene -y` |\n| `visual-transition-reel` | Use when someone wants a montage with transitions between shots — action-sequence reel or multi-scene piece where narration is optional. | `npx skills add PrunaAI/pruna-skills@visual-transition-reel -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs cinematic generation, highest quality, tight lip-sync, or imported audio at 1080p. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `video-editing` | Use when assembling or polishing already-rendered clips with ffmpeg — concat, crossfades, burned captions and subtitles, text/logo overlays, before/after sliders, background music beds, platform export — or when composing a multi-layer HTML combination video with Hyperframes. Not for AI video generation, prompt craft, or model-based video edits. | `npx skills add PrunaAI/pruna-skills@video-editing -y` |\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn7cagwf7q3t0cxrgteb7xk0bh81j0eb\",\n  \"slug\": \"illustrated-story-reel\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1789653824517\n}\n\nFile v1.0.13:references/illustrated-story-reel-api.md\n\n# Illustrated story reel — API reference (scoped)\n\nAPIs used by **illustrated-story-reel**. Optional motion when `motion_mode: p-video` — **`p-video-2`** (quality) or **`p-video`** (simpler).\n\nCredentials: `pruna-api`\n\n## Pruna P-API (stills + optional motion)\n\n- Base: `https://api.pruna.ai/v1/predictions`\n- Upload: `https://api.pruna.ai/v1/files`\n- Header: `apikey: ${PRUNA_API_KEY}`, `Model: p-image` | `p-image-ideogram` | `p-image-edit` | `p-video-2` | `p-video`\n- Body: `{ \"input\": { ... } }`\n- Sync (`Try-Sync: true`) is acceptable for hero stills; async + poll for p-video clips.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `p-image` | Hero anchor still (default for illustrated frames) |\n| `p-image-ideogram` | Hero when frames need readable text or tighter style control |\n| `p-image-edit` | Per-beat still from hero or chained prior plate |\n| `p-video-2` | Optional Mode B clip (quality): still + narration (`save_audio: true`, omit `duration`) |\n| `p-video` | Same Mode B payload for simpler / quicker clips |\n\nHTTP patterns and upload/poll/download: `pruna-api`. Motion payload fields: `p-video-2` / `p-video` skills.\n\n## Replicate (audio)\n\n- Header: `Authorization: Bearer ${REPLICATE_API_TOKEN}`\n- Create: `POST https://api.replicate.com/v1/models/{owner}/{name}/predictions`\n- Poll `urls.get` until `succeeded`; download output URL.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `google/gemini-3.1-flash-tts` | Per-beat narration (`audio_mode: narration`) |\n| `stability-ai/stable-audio-2.5` | Instrumental bed (`audio_mode: music`, no user track) |\n\nShared client: pruna-api / Replicate HTTP in tool skill\n\n## Local assembly (ffmpeg)\n\nRequires **`ffmpeg`** and **`ffprobe`** on PATH. The agent runs ffmpeg with **`-y`** (overwrite output without prompt). Confirm out dir and output name before assembly.\n\n- **Ken Burns:** segments + narration/bed mux — `illustrated-story-reel` **Motion + assemble**\n- **p-video:** concat `clips/*.mp4` (audio embedded) — [illustrated-story-reel-p-video-motion.md](./illustrated-story-reel-p-video-motion.md)\n\nFile v1.0.13:references/illustrated-story-reel-gates.md\n\n# Illustrated story reel — staged gates\n\nHuman-in-the-loop phases for **illustrated-story-reel**. Uses **p-image**, **p-image-edit**, optional **p-video** (Mode B motion), Replicate TTS/music, and local ffmpeg assembly.\n\n## Phases\n\n| Phase | Models / tools | Cost | User interaction |\n|-------|----------------|------|------------------|\n| **0 — Plan** | none | free | Present beat table, `audio_mode`, `motion_mode`, sample still lines; **approve plan** |\n| **A — Stills** | `p-image`, `p-image-edit` | low | Show `stills/*.png`; run checklists; **approve stills** |\n| **A2 — Audio** | Gemini TTS **or** Stable Audio / user track | low–medium | **Listen** to `audio/narration_*.mp3` or `audio/music.mp3`; **approve audio** |\n| **B — Motion** | `p-video` (when `motion_mode: p-video`) | medium | **Watch + listen** to `clips/*.mp4`; **approve clips** |\n| **C — Assemble** | local ffmpeg (Ken Burns + mux **or** clip concat) | free | Review `story_reel.mp4` (or `--output-name`) |\n\nKen Burns path skips Phase B. Music-mode reels use Ken Burns only (no p-video).\n\n## Agent rules\n\n1. **Only** call `p-video` when `motion_mode: p-video` and narration is approved — not for Ken Burns tremor fixes.\n2. **Never** run audio, video, or assembly in the same turn as still generation without showing stills and waiting for approval.\n3. **Parallelize within a phase** (batch still edits, parallel TTS, parallel p-video), not across phases.\n4. **Do not pass `PRUNA_API_KEY` or `REPLICATE_API_TOKEN` to subagents** unless a subagent is running an approved still or TTS lane — parent owns gates and assembly.\n5. Run [illustrated-story-reel-quality.md](./illustrated-story-reel-quality.md) on every still before audio or video.\n6. **`generation-diversity`** and **random seed ritual (`generation-diversity`)** before every `POST /v1/predictions`.\n\n## Wording templates\n\nAfter Phase 0:\n\n> Here is the beat table, `audio_mode`, and `motion_mode`. Reply **approve plan** to generate stills, or tell me what to change.\n\nAfter Phase A:\n\n> Stills are in `stills/`. Reply **approve stills** to run TTS or music, or name beats to fix.\n\nAfter Phase A2:\n\n> Audio is in `audio/`. Listen for pace and tone. Reply **approve audio** to run p-video (if motion_mode p-video) or assemble (Ken Burns), or tell me lines to rewrite.\n\nAfter Phase B (p-video):\n\n> Motion clips are in `clips/`. Watch for style drift and listen for sync. Reply **approve clips** to assemble, or name beats to re-render.\n\nBefore assembly:\n\n> Assembly runs ffmpeg into `{out_dir}/story_reel.mp4`. ffmpeg uses **`-y`** and overwrites the output path without confirmation — confirm `{out_dir}` is correct.\n\n## Phases (agent)\n\nDefault stop after **stills**. Do not run TTS/music until stills are approved. Do not run p-video until audio is approved. Assembly needs approved audio (Ken Burns) or approved clips (p-video).\n\nFollow `illustrated-story-reel` — agent runs curl + ffmpeg. No Python runner. Do not skip still/audio/clip approval gates.\n\n## Local state files\n\n| File | Purpose | Privacy note |\n|------|---------|--------------|\n| `generation_status.json` | Phase approval flags (`phase_a`, `phase_b`, `phase_c`) | Written under `--out-dir`; safe to delete to reset gates |\n| `stills/`, `audio/`, `clips/`, `segments/` | Generated media | May contain prompts reflected in filenames and plan JSON |\n| `plan.json` | Beat prompts and narration | Can include sensitive project details — treat as confidential |\n\n## Anti-patterns\n\n- **`p-video` for Ken Burns tremor** — tune `ken_burns` (prefer `pan_*`) + re-assemble per SKILL **Motion + assemble**\n- **VO transcript in `video_prompt`** — Mode B motion only ([p-video-motion](./illustrated-story-reel-p-video-motion.md))\n- Aggressive **zoom_in on every illustrated beat** — prefer `pan_left` / `pan_right`\n- Skipping still, audio, or clip review before the next paid phase\n- Passing API keys to broad subagent trees\n- Running assembly before the user listens to narration or watches p-video clips\n\nFile v1.0.13:references/illustrated-story-reel-p-video-motion.md\n\n# Illustrated story reel — p-video motion (Mode B)\n\nOptional **illustrated movement** per beat: upload the beat still + Gemini TTS narration to **`p-video-2`** (Mode B). Clip length follows audio — **omit `duration`**, set **`save_audio: true`**. Plan flag stays `motion_mode: \"p-video\"`.\n\nKen Burns (ffmpeg only) remains the **budget** path — prefer `pan_left` / `pan_right` and follow **Motion + assemble** in `illustrated-story-reel`.\n\n## When to use\n\n| Path | Cost | Motion |\n|------|------|--------|\n| **`ken_burns`** (default) | images + TTS only | Slow pan/zoom on still |\n| **`p-video`** (`p-video-2` API) | + one video API call per beat | Books flutter, whale drifts, gentle illustrated drift |\n\nSet `defaults.motion_mode` or per-scene `motion_mode`: `\"ken_burns\"` \\| `\"p-video\"`.\n\n**Requires `audio_mode: narration`.** Music-mode reels stay Ken Burns + `hold_seconds`.\n\n## Plan fields\n\n| Field | Role |\n|-------|------|\n| `defaults.motion_mode` | `\"ken_burns\"` (default) or `\"p-video\"` |\n| `scenes[].motion_mode` | Override per beat |\n| `scenes[].video_prompt` | Mode B motion prompt (OPEN/MID/CLOSE) — **no VO transcript** |\n\nTTS per beat must be **≤ ~19s** (P-API audio-led cap ~20s). Probe before render — see `video-prompting`.\n\n## Mode B prompt template\n\n```text\nOPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only.\n```\n\nRules (full ref: `video-prompting`):\n\n- Describe **picture motion**, not spoken words.\n- Match narrator mood — calm story → slow drift; wonder → slightly livelier flutter.\n- Keep style stable — no morphing from paper-cut to photoreal.\n- Static or slow camera; physics-safe motion on illustrated elements.\n\n## API payload\n\nUse Build the `p-video-2` payload (see `p-video-2` skill):\n\n```python\nbuild_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)\n```\n\nDo **not** post-mux narration over a silent clip — long lines truncate.\n\n## Phases (p-video)\n\n1. Stills → approve\n2. TTS per beat → approve audio\n3. `p-video-2` per beat (narration as `audio`) → approve clips\n4. ffmpeg concat\n\nKen Burns path skips video generation; assemble muxes narration over ffmpeg Ken Burns segments. See `illustrated-story-reel`.\n\n## QA\n\n- [ ] Narration probed ≤ ~19s per beat\n- [ ] `video_prompt` has no VO transcript\n- [ ] Still matches `style_bible` before video\n- [ ] Clip motion stays illustrated — no photoreal drift\n- [ ] Listen to `clips/*.mp4` before assemble\n\n## Anti-patterns\n\n| Do not | Do instead |\n|--------|------------|\n| Paste narration text into `video_prompt` | Mode B mood + motion only |\n| Set `duration` with uploaded `audio` | Omit `duration` |\n| Switch to p-video for Ken Burns tremor | Tune `ken_burns` + re-assemble |\n| Mix `ken_burns` and `p-video` beats in one reel (v1) | Uniform `motion_mode` across all beats |\n\nFile v1.0.13:references/illustrated-story-reel-prompts.md\n\n# Illustrated story reel — positive still prompts\n\nStill-line guidance for **illustrated-story-reel** (`hero_prompt`, `style_bible`, `edit_prompt` per beat). **No `video_prompt`** — motion is Ken Burns in ffmpeg only.\n\n## Principle\n\nDescribe **what appears** in each frame — never what to leave out. Saying `no text` often **creates** readable type. Be explicit about the single frame you want.\n\n**Never** use `no …`, `avoid …`, `not …`, `without …`, `don't`, or `do not` in creative fields. Spoken narration lines may use natural negation.\n\n## Banned patterns → positive rewrite\n\n| Banned pattern | Write explicitly instead |\n|----------------|--------------------------|\n| `no text` / `no signage` / `no labels` | `plain unmarked walls`, `unprinted wood surfaces`, `matte unprinted props` |\n| `avoid markets` / `avoid text` | `plain wood table`, `single camera angle`, `one focal subject` |\n| `without vocals` (music bed prompt) | `instrumental only` |\n| `no cartoon` / `no modern` | `painterly historical illustration`, `period-accurate props only` |\n\n## Rules\n\n1. **One positive sentence per beat** — location, subject, light, `one camera angle`.\n2. **`style_bible`** — positive comma-clauses only. Match `defaults.aspect_ratio` (e.g. `16:9 horizontal frame` for landscape).\n3. **`edit_prompt`** — one composed still per beat; use `chain_from_previous` for visual continuity.\n4. **`ken_burns`** — `pan_left`, `pan_right`, `zoom_in`, `zoom_out`, or `none` (per beat or `defaults`). **Prefer slow pan** on illustrated/paper-cut beats; reserve zoom for photo-style heroes. Assembly tips: `illustrated-story-reel` **Motion + assemble**.\n\n## Text & signage (most common)\n\n| Blocked phrase in stills | Use instead |\n|--------------------------|-------------|\n| `farmers market`, `signage`, `neon signs` | produce on **plain wood table**, **matte unprinted** baskets |\n| `labeled`, `packaging`, `price tag`, `menu` | **matte unprinted** jars, food in **plain glass bowl** |\n| `graphic tee`, `poster`, `magazine` | solid-color fabrics, unbranded matte props |\n| `maps`, `newspaper`, `headline`, `caption` | blank folded parchment, plain walls, unmarked wood |\n\n## Collage & layout\n\n| Blocked phrase | Use instead |\n|----------------|-------------|\n| `split`, `side by side`, `grid`, `collage`, `montage`, `multiple angles` | one subject, one camera angle, one frame |\n| `OPENING:` / `CLOSING:` prefixes | plain scene description |\n| `storyboard`, `triptych` | one continuous composition |\n\n## Good vs bad still lines\n\n| Bad | Good |\n|-----|------|\n| `No text, farmers market` | `Plain wood table`, matte baskets, sunny window, **one camera angle** |\n| `Avoid labels on packaging` | **Matte unprinted** jars on **plain counter** |\n\nFile v1.0.13:references/illustrated-story-reel-quality.md\n\n# Illustrated story reel — quality gates\n\nAgent vision review for **illustrated-story-reel** stills, audio, and optional p-video clips.\n\n## Who applies these?\n\n**The coding agent** opens real output files (`stills/*.png`, `audio/*.mp3`, `clips/*.mp4` when p-video) and judges pass/fail. Then present paths for user **approve stills** / **approve audio** / **approve clips** per [illustrated-story-reel-gates.md](./illustrated-story-reel-gates.md).\n\n## Core (every job)\n\n- **`generation-diversity`** — ritual seed + rotate scenario axes.\n- **Random seed ritual (`generation-diversity`)** — state ritual string before every prediction; never copy doc examples.\n- Goal and acceptance criteria are explicit.\n- `aspect_ratio` in plan matches prompt wording (vertical / horizontal / square).\n- No accidental watermarks, UI overlays, or stray text unless requested.\n\n## Per model\n\nAfter each still, open the file and review:\n\n- **Hero + beats (`p-image` / `p-image-ideogram`, `p-image-edit`):** `image-prompting` — skip avatar handoff rows.\n- **Narration (`gemini-3.1-flash-tts`):** pace, tone, line clarity per beat; probe ≤ ~19s before p-video.\n- **Music bed (`stable-audio-2.5`):** instrumental, no vocals unless brief asks; level appropriate under stills.\n- **Motion clips (`p-video`, when `motion_mode: p-video`):** style matches still; gentle illustrated drift; no photoreal morph; audio sync; no VO transcript leaked into motion.\n- **Assembled reel (`story_reel.mp4`, Ken Burns):** motion is **smooth** — no tremor/jitter. Fix with `ken_burns` pan + re-assemble — `illustrated-story-reel` **Motion + assemble**. Do not use p-video to fix tremor.\n\n## Traceability\n\n`generation_status.json` under `--out-dir` records phase approvals. Plan JSON retains prompts and narration — treat as confidential project data.\n\nFile v1.0.13:skill-card.md\n\n## Description:\n\nUse when someone wants a slideshow story with narration or music: picture-book illustrated frames with Ken Burns or gentle p-video motion.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pruna-ai](https://clawhub.ai/user/pruna-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and content creators use this skill to plan and produce illustrated story reels with generated stills, narration or music, optional gentle motion, staged review gates, and local assembly.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts, generated images, narration, and optional audio may be sent to Pruna or Replicate APIs using the user's API keys.\n\nMitigation: Review the skill source before installation, use trusted installer paths, and avoid sending confidential material unless external API processing is acceptable.\n\nRisk: Local ffmpeg assembly uses overwrite behavior for the target MP4.\n\nMitigation: Use a fresh output directory and confirm the output path before assembly.\n\nRisk: Generated plan files and media can contain prompts, narration, and project details.\n\nMitigation: Treat the output directory as confidential project data and delete local state when it is no longer needed.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/pruna-ai/skills/illustrated-story-reel)\n- [Illustrated story reel API reference](references/illustrated-story-reel-api.md)\n- [Illustrated story reel staged gates](references/illustrated-story-reel-gates.md)\n- [Illustrated story reel p-video motion](references/illustrated-story-reel-p-video-motion.md)\n- [Illustrated story reel positive still prompts](references/illustrated-story-reel-prompts.md)\n- [Illustrated story reel quality gates](references/illustrated-story-reel-quality.md)\n- [Pruna P-API predictions endpoint](https://api.pruna.ai/v1/predictions)\n- [Pruna P-API file upload endpoint](https://api.pruna.ai/v1/files)\n- [Replicate model predictions endpoint](https://api.replicate.com/v1/models/{owner}/{name}/predictions)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, JSON, Shell commands, Configuration, API calls]\n\n**Output Format:** [Markdown guidance with JSON plan templates and inline shell/API command patterns]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces a plan and generated media workflow ending in an MP4 story reel under the selected output directory.]\n\n## Skill Version(s):\n\n1.0.13 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.13:skill.manifest.json\n\n{\n  \"references\": [\n    \"illustrated-story-reel-prompts.md\",\n    \"illustrated-story-reel-p-video-motion.md\",\n    \"illustrated-story-reel-gates.md\",\n    \"illustrated-story-reel-api.md\",\n    \"illustrated-story-reel-quality.md\"\n  ],\n  \"templates\": [\n    \"story-plan.template.json\",\n    \"story-plan.landscape.template.json\"\n  ],\n  \"generation_phases\": {\n    \"default\": \"stills\",\n    \"phases\": [\n      \"stills\",\n      \"tts\",\n      \"music\",\n      \"video\",\n      \"assemble\"\n    ]\n  }\n}\n\nFile v1.0.13:templates/story-plan.landscape.template.json\n\n{\n  \"title\": \"Horizontal photo essay (template)\",\n  \"audio_mode\": \"music\",\n  \"hero_prompt\": \"Photoreal wide establishing shot, 16:9 horizontal frame, natural daylight, single clear subject, documentary composition\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"16:9\",\n    \"fps\": 24,\n    \"hold_seconds\": 3.5,\n    \"hold_pad_seconds\": 0.25,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.4,\n    \"hard_cut_crossfade_seconds\": 0.12\n  },\n  \"style_bible\": \"Photoreal 35mm, natural color, shallow depth of field, consistent subject wardrobe\",\n  \"music\": {\n    \"prompt\": \"Cinematic instrumental underscore, gentle pulse, no vocals, 80 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_open\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_in\",\n      \"hold_seconds\": 4,\n      \"edit_prompt\": \"Wide landscape horizon, subject small in frame, golden hour, photoreal\"\n    },\n    {\n      \"id\": \"02_detail\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_left\",\n      \"hold_seconds\": 3,\n      \"edit_prompt\": \"Medium shot same subject, environment sharper, editorial realism\"\n    }\n  ]\n}\n\nFile v1.0.13:templates/story-plan.template.json\n\n{\n  \"title\": \"The lighthouse keeper's letter\",\n  \"audio_mode\": \"narration\",\n  \"hero_prompt\": \"Painterly storybook illustration, elderly lighthouse keeper in yellow raincoat, stormy sea, warm lamplight, single character, 9:16 vertical frame, one scene\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"9:16\",\n    \"fps\": 24,\n    \"hold_seconds\": 4,\n    \"hold_pad_seconds\": 0.35,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.45,\n    \"hard_cut_crossfade_seconds\": 0.15\n  },\n  \"style_bible\": \"Soft watercolor storybook, muted blues and amber lamp glow, gentle grain, consistent character face and coat\",\n  \"narration\": {\n    \"voice\": \"Kore\",\n    \"style_prompt\": \"Warm storyteller pace, ~2.2 words per second, clear diction, gentle emotion\",\n    \"language_code\": \"en-US\"\n  },\n  \"music\": {\n    \"prompt\": \"Soft piano and strings, nostalgic bedtime story, no vocals, 72 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_storm\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Wide shot: lighthouse tower against black clouds, keeper tiny at the railing, waves crashing\",\n      \"narration\": \"On the night the letter arrived, the sea forgot how to be gentle.\"\n    },\n    {\n      \"id\": \"02_letter\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Close on wrinkled hands opening a sealed envelope, lamplight on the paper, same keeper coat\",\n      \"narration\": \"The ink was faded, but the name was still legible — the one he had not spoken in thirty years.\"\n    },\n    {\n      \"id\": \"03_memory\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_out\",\n      \"edit_prompt\": \"Interior lantern room, keeper reading by window, ghostly reflection of a younger face in the glass\",\n      \"narration\": \"Some doors stay closed until the storm forces them open.\"\n    },\n    {\n      \"id\": \"04_dawn\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"zoom_in\",\n      \"edit_prompt\": \"Dawn breaking over calm water, keeper on steps with letter pressed to chest, golden light\",\n      \"narration\": \"By morning, the letter was answered — not in words, but in the choice to walk back down the hill.\"\n    }\n  ]\n}\n\nArchive v1.0.12: 11 files, 16620 bytes\n\nFiles: references/illustrated-story-reel-api.md (2108b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3249b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1826b), skill-card.md (3091b), skill.manifest.json (479b), SKILL.md (12930b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (142b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.12\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image-ideogram` | Use when photo generation needs more control — photoreal results, text in the image, or structured JSON with hex colors and bounding boxes. Simpler photo generation, edits, and video use other skills in the suite. | `npx skills add PrunaAI/pruna-skills@p-image-ideogram -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video-2` | Use when someone wants the best-quality short clip from text, images, or audio — polished B-roll, start/end frame animation, or a motion shot with stronger lip-sync. Not for full multi-scene films or talking-head-only hosts. | `npx skills add PrunaAI/pruna-skills@p-video-2 -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs the highest quality or tight lip-sync. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in music mode (Ken Burns only). Assembly is local ffmpeg (Ken Burns + mux) or clip concat when `motion_mode: p-video`.\n\n## When to Use\n\n- Illustrated story with narration or music bed\n- Picture-book / comic-panel narrative with VO or bed\n- User references a “slideshow story”, “Ken Burns reel”, or gentle illustrated motion\n- Budget runs: `ken_burns` (images + TTS only, no video API)\n\n**When NOT to use:** motion between two composed stills (**visual-transition-reel**), lip-sync avatars (**interactive-explainer**), or full sung music video (**music-video**).\n\n## Security & scope\n\nBundled references are scoped to this workflow; do not follow avatar or replace examples from other skills.\n\n| Risk | Mitigation |\n|------|------------|\n| Paid API use | `PRUNA_API_KEY` + `REPLICATE_API_TOKEN`; gates before TTS/music/video/assembly |\n| Credential exposure | Parent agent holds keys; do not pass to subagents except per-lane still/TTS work |\n| Local execution | `ffmpeg`/`ffprobe` subprocess; **`-y` overwrites** output MP4 without confirmation |\n| Data retention | `plan.json` and media under the out dir may contain prompts — treat as confidential |\n\nRequires: `pruna-api` credentials.\n\n## Feedback gates\n\n[./references/illustrated-story-reel-gates.md](./references/illustrated-story-reel-gates.md) · `generation-diversity`\n\n| Phase | What to show | Proceed when |\n|-------|--------------|--------------|\n| **0 — Plan** | Beat table, `audio_mode`, `motion_mode`, sample still lines + narration | **approve plan** |\n| **A — Stills** | `stills/*.png` | **approve stills** |\n| **A2 — Audio** | `audio/narration_*.mp3` or `audio/music.mp3` — **listen** | **approve audio** |\n| **B — Motion** (p-video only) | `clips/*.mp4` — **watch + listen** | **approve clips** |\n| **C — Assemble** | `story_reel.mp4` | User accepts |\n\nDefault first stop: **stills**.\n\n## Quick reference\n\n| Item | Value |\n|------|--------|\n| Models | **p-image** (or **p-image-ideogram** for text / tighter style), **p-image-edit**, optional motion (`p-video-2` quality / `p-video` simpler), Gemini TTS, Stable Audio 2.5 |\n| Plan field | `audio_mode`: `\"narration\"` \\| `\"music\"` |\n| Motion | `defaults.motion_mode`: `\"ken_burns\"` \\| `\"p-video\"` (narration mode only) |\n| Aspect | `defaults.aspect_ratio`: `\"9:16\"` \\| `\"16:9\"` \\| `\"1:1\"` |\n| Templates | [templates/story-plan.template.json](./templates/story-plan.template.json) (9:16) · [templates/story-plan.landscape.template.json](./templates/story-plan.landscape.template.json) (16:9) |\n| Craft | [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md) · [./references/illustrated-story-reel-prompts.md](./references/illustrated-story-reel-prompts.md) |\n| Output | `{out_dir}/story_reel.mp4` |\n\n## Intake — ask before generating\n\nOpen intake → **`generation-diversity`** clarification intake.\n\n**First questions (required):**\n\n1. **Delivery shape** — vertical reel (**9:16**), horizontal slideshow (**16:9**), or square (**1:1**)? Target **720p vs 1080p** if export size matters?\n2. **Audio** — **narration** (voiceover per beat) or **music** (instrumental bed / user track)?\n3. **Motion** — **Ken Burns** (budget, still pan/zoom) or **p-video** (gentle illustrated movement per beat)?\n\nSet `defaults.aspect_ratio`, `audio_mode`, and `motion_mode` in the plan before generation.\n\n| Topic | Questions |\n|-------|-----------|\n| **Story** | Title? Beat order (1…N)? Emotional arc? |\n| **Visual** | Style (`style_bible`)? Character continuity? `chain_from_previous` for edit chains? |\n| **Per beat** | `edit_prompt` (one frame)? `narration` line (narration mode)? `hold_seconds` (music mode)? |\n| **Ken Burns** | `ken_burns`: prefer **`pan_left` / `pan_right`** over aggressive zoom (see **Motion + assemble**). |\n| **p-video** | `video_prompt` (OPEN/MID/CLOSE, no VO transcript)? TTS ≤ ~19s per beat — see [p-video-motion](./references/illustrated-story-reel-p-video-motion.md). |\n| **Music mode** | Stable Audio prompt, user `music.track` path, or equal seconds per beat? |\n| **Narration mode** | Voice (`Kore`, etc.)? Storyteller pace in `narration.style_prompt`? |\n\nDo not start generation until the beat table is written and **audio_mode** + **motion_mode** are confirmed.\n\n### Beat table (template)\n\n| `#` | Still (`edit_prompt`) | Narration / hold | Motion | Chain? |\n|-----|------------------------|------------------|--------|--------|\n| 1 | opening wide | line or 4s | ken_burns / p-video | no |\n| 2 | detail insert | line or 3.5s | ken_burns / p-video | yes |\n\n## Generation phases\n\n| Phase | When | Gate |\n|-------|------|------|\n| **stills** | After plan approval | **approve stills** |\n| **tts** / **music** | After stills — matches `audio_mode` | **approve audio** |\n| **video** | Only if `motion_mode: p-video` | **approve clips** |\n| **assemble** | After audio (ken_burns) or clips (p-video) | User accepts MP4 |\n\n## How the agent runs this\n\n1. Copy a plan template → fill beat table → **approve plan**.\n2. Hero → parallel `p-image-edit` stills (`pruna-api`) → **approve stills**.\n3. Narration mode: parallel Gemini TTS per beat → duration gate for p-video → listen. Music mode: Stable Audio or user track → listen → **approve audio**.\n4. `p-video-2` mode only: one job per beat (`image` + `audio`; omit `duration`) → **approve clips**.\n5. Assemble with ffmpeg (Ken Burns pan/zoom + mux, or concat p-video clips).\n\n**Duration gate (p-video / long TTS):**\n\n```bash\nffprobe -v error -show_entries format=duration -of csv=p=0 audio/narration_01.mp3\n# ≤ ~19s before p-video\n```\n\n## Workflow\n\n### Stills\n\nHero `p-image` (`p-image-ideogram` if frames need readable text or tighter style) → parallel `p-image-edit` per beat (`edit_prompt`). Chain edits from previous still when `chain_from_previous: true`.\n\n### Audio\n\n- **Narration:** one Gemini TTS file per beat.\n- **Music:** one bed (Stable Audio or user file); timing from `hold_seconds`.\n\n### Motion + assemble\n\n**Ken Burns (budget):** for each still, render a short pan/zoom clip, then concat and mux narration or bed. Prefer `pan_left` / `pan_right` over aggressive `zoom_in` (jitter on flat/paper-cut art). Upscale (e.g. ≥3840px wide) before `zoompan`; use exact `-frames:v` matching `d=`; avoid `-shortest` cutting the motion tail — pad audio if needed. Do **not** call `p-video-2` to fix Ken Burns tremor.\n\nConceptual pan (adapt duration / size to aspect):\n\n```bash\nffmpeg -y -loop 1 -i stills/01.png -vf \"scale=3840:-1,zoompan=z='1':x='x+1':y='y':d=120:s=1080x1920:fps=24\" \\\n  -frames:v 120 -c:v libx264 clips/01.mp4\n```\n\nMux per-beat narration (or concat silent clips then mix bed):\n\n```bash\nffmpeg -y -i clips/01.mp4 -i audio/narration_01.mp3 \\\n  -map 0:v -map 1:a -c:v copy -c:a aac -shortest beat_01.mp4\n```\n\nHard-cut concat:\n\n```bash\nffmpeg -y -f concat -safe 0 -i beats.txt -c copy story_reel.mp4\n```\n\n**p-video:** parallel I2V jobs with uploaded narration; then concat clips (VO already embedded). Craft: [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md).\n\n## Common mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| VO transcript inside **`video_prompt`** | Mode B motion only — [p-video-motion](./references/illustrated-story-reel-p-video-motion.md) |\n| **`duration`** with uploaded narration | Omit `duration`; clip length follows audio |\n| Ken Burns **tremor / jitter** | Prefer `pan_*`; upscale before zoompan; exact `-frames:v` — see **Motion + assemble** |\n| **`p-video` in music mode** | Use `ken_burns` for music-mode reels |\n| Skipping audio listen gate | Wait for **approve audio** |\n| One long narration blob | One line per beat; TTS per scene; probe ≤ ~19s for p-video |\n| Music mode without `hold_seconds` | Set per beat or `defaults.hold_seconds` |\n| Negation in still prompts | Positive description only — [prompts](./references/illustrated-story-reel-prompts.md) |\n| Assuming vertical only | Set `aspect_ratio` to `16:9` and landscape framing in prompts for horizontal deliverables |\n| Mismatched ratio in prompts | `aspect_ratio` in plan must match “vertical” / “horizontal” / “square” in `hero_prompt` and beats |\n\n## Related\n\nRelated skills:\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `narrated-multi-scene` | Use when someone wants a multi-part story with voiceover — episodic B-roll, chaptered promo, or several linked video scenes without on-camera dialogue. | `npx skills add PrunaAI/pruna-skills@narrated-multi-scene -y` |\n| `visual-transition-reel` | Use when someone wants a montage with transitions between shots — action-sequence reel or multi-scene piece where narration is optional. | `npx skills add PrunaAI/pruna-skills@visual-transition-reel -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs the highest quality or tight lip-sync. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `video-editing` | Use when assembling or polishing already-rendered clips with ffmpeg — concat, crossfades, burned captions and subtitles, text/logo overlays, before/after sliders, background music beds, platform export — or when composing a multi-layer HTML combination video with Hyperframes. Not for AI video generation, prompt craft, or model-based video edits. | `npx skills add PrunaAI/pruna-skills@video-editing -y` |\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn7cagwf7q3t0cxrgteb7xk0bh81j0eb\",\n  \"slug\": \"illustrated-story-reel\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1789048952526\n}\n\nFile v1.0.12:references/illustrated-story-reel-api.md\n\n# Illustrated story reel — API reference (scoped)\n\nAPIs used by **illustrated-story-reel**. Optional motion when `motion_mode: p-video` — **`p-video-2`** (quality) or **`p-video`** (simpler).\n\nCredentials: `pruna-api`\n\n## Pruna P-API (stills + optional motion)\n\n- Base: `https://api.pruna.ai/v1/predictions`\n- Upload: `https://api.pruna.ai/v1/files`\n- Header: `apikey: ${PRUNA_API_KEY}`, `Model: p-image` | `p-image-ideogram` | `p-image-edit` | `p-video-2` | `p-video`\n- Body: `{ \"input\": { ... } }`\n- Sync (`Try-Sync: true`) is acceptable for hero stills; async + poll for p-video clips.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `p-image` | Hero anchor still (default for illustrated frames) |\n| `p-image-ideogram` | Hero when frames need readable text or tighter style control |\n| `p-image-edit` | Per-beat still from hero or chained prior plate |\n| `p-video-2` | Optional Mode B clip (quality): still + narration (`save_audio: true`, omit `duration`) |\n| `p-video` | Same Mode B payload for simpler / quicker clips |\n\nHTTP patterns and upload/poll/download: `pruna-api`. Motion payload fields: `p-video-2` / `p-video` skills.\n\n## Replicate (audio)\n\n- Header: `Authorization: Bearer ${REPLICATE_API_TOKEN}`\n- Create: `POST https://api.replicate.com/v1/models/{owner}/{name}/predictions`\n- Poll `urls.get` until `succeeded`; download output URL.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `google/gemini-3.1-flash-tts` | Per-beat narration (`audio_mode: narration`) |\n| `stability-ai/stable-audio-2.5` | Instrumental bed (`audio_mode: music`, no user track) |\n\nShared client: pruna-api / Replicate HTTP in tool skill\n\n## Local assembly (ffmpeg)\n\nRequires **`ffmpeg`** and **`ffprobe`** on PATH. The agent runs ffmpeg with **`-y`** (overwrite output without prompt). Confirm out dir and output name before assembly.\n\n- **Ken Burns:** segments + narration/bed mux — `illustrated-story-reel` **Motion + assemble**\n- **p-video:** concat `clips/*.mp4` (audio embedded) — [illustrated-story-reel-p-video-motion.md](./illustrated-story-reel-p-video-motion.md)\n\nFile v1.0.12:references/illustrated-story-reel-gates.md\n\n# Illustrated story reel — staged gates\n\nHuman-in-the-loop phases for **illustrated-story-reel**. Uses **p-image**, **p-image-edit**, optional **p-video** (Mode B motion), Replicate TTS/music, and local ffmpeg assembly.\n\n## Phases\n\n| Phase | Models / tools | Cost | User interaction |\n|-------|----------------|------|------------------|\n| **0 — Plan** | none | free | Present beat table, `audio_mode`, `motion_mode`, sample still lines; **approve plan** |\n| **A — Stills** | `p-image`, `p-image-edit` | low | Show `stills/*.png`; run checklists; **approve stills** |\n| **A2 — Audio** | Gemini TTS **or** Stable Audio / user track | low–medium | **Listen** to `audio/narration_*.mp3` or `audio/music.mp3`; **approve audio** |\n| **B — Motion** | `p-video` (when `motion_mode: p-video`) | medium | **Watch + listen** to `clips/*.mp4`; **approve clips** |\n| **C — Assemble** | local ffmpeg (Ken Burns + mux **or** clip concat) | free | Review `story_reel.mp4` (or `--output-name`) |\n\nKen Burns path skips Phase B. Music-mode reels use Ken Burns only (no p-video).\n\n## Agent rules\n\n1. **Only** call `p-video` when `motion_mode: p-video` and narration is approved — not for Ken Burns tremor fixes.\n2. **Never** run audio, video, or assembly in the same turn as still generation without showing stills and waiting for approval.\n3. **Parallelize within a phase** (batch still edits, parallel TTS, parallel p-video), not across phases.\n4. **Do not pass `PRUNA_API_KEY` or `REPLICATE_API_TOKEN` to subagents** unless a subagent is running an approved still or TTS lane — parent owns gates and assembly.\n5. Run [illustrated-story-reel-quality.md](./illustrated-story-reel-quality.md) on every still before audio or video.\n6. **`generation-diversity`** and **random seed ritual (`generation-diversity`)** before every `POST /v1/predictions`.\n\n## Wording templates\n\nAfter Phase 0:\n\n> Here is the beat table, `audio_mode`, and `motion_mode`. Reply **approve plan** to generate stills, or tell me what to change.\n\nAfter Phase A:\n\n> Stills are in `stills/`. Reply **approve stills** to run TTS or music, or name beats to fix.\n\nAfter Phase A2:\n\n> Audio is in `audio/`. Listen for pace and tone. Reply **approve audio** to run p-video (if motion_mode p-video) or assemble (Ken Burns), or tell me lines to rewrite.\n\nAfter Phase B (p-video):\n\n> Motion clips are in `clips/`. Watch for style drift and listen for sync. Reply **approve clips** to assemble, or name beats to re-render.\n\nBefore assembly:\n\n> Assembly runs ffmpeg into `{out_dir}/story_reel.mp4`. ffmpeg uses **`-y`** and overwrites the output path without confirmation — confirm `{out_dir}` is correct.\n\n## Phases (agent)\n\nDefault stop after **stills**. Do not run TTS/music until stills are approved. Do not run p-video until audio is approved. Assembly needs approved audio (Ken Burns) or approved clips (p-video).\n\nFollow `illustrated-story-reel` — agent runs curl + ffmpeg. No Python runner. Do not skip still/audio/clip approval gates.\n\n## Local state files\n\n| File | Purpose | Privacy note |\n|------|---------|--------------|\n| `generation_status.json` | Phase approval flags (`phase_a`, `phase_b`, `phase_c`) | Written under `--out-dir`; safe to delete to reset gates |\n| `stills/`, `audio/`, `clips/`, `segments/` | Generated media | May contain prompts reflected in filenames and plan JSON |\n| `plan.json` | Beat prompts and narration | Can include sensitive project details — treat as confidential |\n\n## Anti-patterns\n\n- **`p-video` for Ken Burns tremor** — tune `ken_burns` (prefer `pan_*`) + re-assemble per SKILL **Motion + assemble**\n- **VO transcript in `video_prompt`** — Mode B motion only ([p-video-motion](./illustrated-story-reel-p-video-motion.md))\n- Aggressive **zoom_in on every illustrated beat** — prefer `pan_left` / `pan_right`\n- Skipping still, audio, or clip review before the next paid phase\n- Passing API keys to broad subagent trees\n- Running assembly before the user listens to narration or watches p-video clips\n\nFile v1.0.12:references/illustrated-story-reel-p-video-motion.md\n\n# Illustrated story reel — p-video motion (Mode B)\n\nOptional **illustrated movement** per beat: upload the beat still + Gemini TTS narration to **`p-video-2`** (Mode B). Clip length follows audio — **omit `duration`**, set **`save_audio: true`**. Plan flag stays `motion_mode: \"p-video\"`.\n\nKen Burns (ffmpeg only) remains the **budget** path — prefer `pan_left` / `pan_right` and follow **Motion + assemble** in `illustrated-story-reel`.\n\n## When to use\n\n| Path | Cost | Motion |\n|------|------|--------|\n| **`ken_burns`** (default) | images + TTS only | Slow pan/zoom on still |\n| **`p-video`** (`p-video-2` API) | + one video API call per beat | Books flutter, whale drifts, gentle illustrated drift |\n\nSet `defaults.motion_mode` or per-scene `motion_mode`: `\"ken_burns\"` \\| `\"p-video\"`.\n\n**Requires `audio_mode: narration`.** Music-mode reels stay Ken Burns + `hold_seconds`.\n\n## Plan fields\n\n| Field | Role |\n|-------|------|\n| `defaults.motion_mode` | `\"ken_burns\"` (default) or `\"p-video\"` |\n| `scenes[].motion_mode` | Override per beat |\n| `scenes[].video_prompt` | Mode B motion prompt (OPEN/MID/CLOSE) — **no VO transcript** |\n\nTTS per beat must be **≤ ~19s** (P-API audio-led cap ~20s). Probe before render — see `video-prompting`.\n\n## Mode B prompt template\n\n```text\nOPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only.\n```\n\nRules (full ref: `video-prompting`):\n\n- Describe **picture motion**, not spoken words.\n- Match narrator mood — calm story → slow drift; wonder → slightly livelier flutter.\n- Keep style stable — no morphing from paper-cut to photoreal.\n- Static or slow camera; physics-safe motion on illustrated elements.\n\n## API payload\n\nUse Build the `p-video-2` payload (see `p-video-2` skill):\n\n```python\nbuild_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)\n```\n\nDo **not** post-mux narration over a silent clip — long lines truncate.\n\n## Phases (p-video)\n\n1. Stills → approve\n2. TTS per beat → approve audio\n3. `p-video-2` per beat (narration as `audio`) → approve clips\n4. ffmpeg concat\n\nKen Burns path skips video generation; assemble muxes narration over ffmpeg Ken Burns segments. See `illustrated-story-reel`.\n\n## QA\n\n- [ ] Narration probed ≤ ~19s per beat\n- [ ] `video_prompt` has no VO transcript\n- [ ] Still matches `style_bible` before video\n- [ ] Clip motion stays illustrated — no photoreal drift\n- [ ] Listen to `clips/*.mp4` before assemble\n\n## Anti-patterns\n\n| Do not | Do instead |\n|--------|------------|\n| Paste narration text into `video_prompt` | Mode B mood + motion only |\n| Set `duration` with uploaded `audio` | Omit `duration` |\n| Switch to p-video for Ken Burns tremor | Tune `ken_burns` + re-assemble |\n| Mix `ken_burns` and `p-video` beats in one reel (v1) | Uniform `motion_mode` across all beats |\n\nFile v1.0.12:references/illustrated-story-reel-prompts.md\n\n# Illustrated story reel — positive still prompts\n\nStill-line guidance for **illustrated-story-reel** (`hero_prompt`, `style_bible`, `edit_prompt` per beat). **No `video_prompt`** — motion is Ken Burns in ffmpeg only.\n\n## Principle\n\nDescribe **what appears** in each frame — never what to leave out. Saying `no text` often **creates** readable type. Be explicit about the single frame you want.\n\n**Never** use `no …`, `avoid …`, `not …`, `without …`, `don't`, or `do not` in creative fields. Spoken narration lines may use natural negation.\n\n## Banned patterns → positive rewrite\n\n| Banned pattern | Write explicitly instead |\n|----------------|--------------------------|\n| `no text` / `no signage` / `no labels` | `plain unmarked walls`, `unprinted wood surfaces`, `matte unprinted props` |\n| `avoid markets` / `avoid text` | `plain wood table`, `single camera angle`, `one focal subject` |\n| `without vocals` (music bed prompt) | `instrumental only` |\n| `no cartoon` / `no modern` | `painterly historical illustration`, `period-accurate props only` |\n\n## Rules\n\n1. **One positive sentence per beat** — location, subject, light, `one camera angle`.\n2. **`style_bible`** — positive comma-clauses only. Match `defaults.aspect_ratio` (e.g. `16:9 horizontal frame` for landscape).\n3. **`edit_prompt`** — one composed still per beat; use `chain_from_previous` for visual continuity.\n4. **`ken_burns`** — `pan_left`, `pan_right`, `zoom_in`, `zoom_out`, or `none` (per beat or `defaults`). **Prefer slow pan** on illustrated/paper-cut beats; reserve zoom for photo-style heroes. Assembly tips: `illustrated-story-reel` **Motion + assemble**.\n\n## Text & signage (most common)\n\n| Blocked phrase in stills | Use instead |\n|--------------------------|-------------|\n| `farmers market`, `signage`, `neon signs` | produce on **plain wood table**, **matte unprinted** baskets |\n| `labeled`, `packaging`, `price tag`, `menu` | **matte unprinted** jars, food in **plain glass bowl** |\n| `graphic tee`, `poster`, `magazine` | solid-color fabrics, unbranded matte props |\n| `maps`, `newspaper`, `headline`, `caption` | blank folded parchment, plain walls, unmarked wood |\n\n## Collage & layout\n\n| Blocked phrase | Use instead |\n|----------------|-------------|\n| `split`, `side by side`, `grid`, `collage`, `montage`, `multiple angles` | one subject, one camera angle, one frame |\n| `OPENING:` / `CLOSING:` prefixes | plain scene description |\n| `storyboard`, `triptych` | one continuous composition |\n\n## Good vs bad still lines\n\n| Bad | Good |\n|-----|------|\n| `No text, farmers market` | `Plain wood table`, matte baskets, sunny window, **one camera angle** |\n| `Avoid labels on packaging` | **Matte unprinted** jars on **plain counter** |\n\nFile v1.0.12:references/illustrated-story-reel-quality.md\n\n# Illustrated story reel — quality gates\n\nAgent vision review for **illustrated-story-reel** stills, audio, and optional p-video clips.\n\n## Who applies these?\n\n**The coding agent** opens real output files (`stills/*.png`, `audio/*.mp3`, `clips/*.mp4` when p-video) and judges pass/fail. Then present paths for user **approve stills** / **approve audio** / **approve clips** per [illustrated-story-reel-gates.md](./illustrated-story-reel-gates.md).\n\n## Core (every job)\n\n- **`generation-diversity`** — ritual seed + rotate scenario axes.\n- **Random seed ritual (`generation-diversity`)** — state ritual string before every prediction; never copy doc examples.\n- Goal and acceptance criteria are explicit.\n- `aspect_ratio` in plan matches prompt wording (vertical / horizontal / square).\n- No accidental watermarks, UI overlays, or stray text unless requested.\n\n## Per model\n\nAfter each still, open the file and review:\n\n- **Hero + beats (`p-image` / `p-image-ideogram`, `p-image-edit`):** `image-prompting` — skip avatar handoff rows.\n- **Narration (`gemini-3.1-flash-tts`):** pace, tone, line clarity per beat; probe ≤ ~19s before p-video.\n- **Music bed (`stable-audio-2.5`):** instrumental, no vocals unless brief asks; level appropriate under stills.\n- **Motion clips (`p-video`, when `motion_mode: p-video`):** style matches still; gentle illustrated drift; no photoreal morph; audio sync; no VO transcript leaked into motion.\n- **Assembled reel (`story_reel.mp4`, Ken Burns):** motion is **smooth** — no tremor/jitter. Fix with `ken_burns` pan + re-assemble — `illustrated-story-reel` **Motion + assemble**. Do not use p-video to fix tremor.\n\n## Traceability\n\n`generation_status.json` under `--out-dir` records phase approvals. Plan JSON retains prompts and narration — treat as confidential project data.\n\nFile v1.0.12:skill-card.md\n\n## Description:\n\nUse when someone wants a slideshow story with narration or music: picture-book illustrated frames with Ken Burns or gentle p-video motion.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pruna-ai](https://clawhub.ai/user/pruna-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to plan and generate illustrated story reels with still frames, narration or music, optional gentle video motion, and local ffmpeg assembly.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow uses paid external APIs and credentials for Pruna and Replicate.\n\nMitigation: Install and run only with approved credentials, keep approval gates before paid phases, and avoid sharing API keys beyond the narrow approved work lanes.\n\nRisk: The documented install commands use unpinned remote npx installs.\n\nMitigation: Prefer pinned, reviewed dependency installs before using the skill in production or commercial workflows.\n\nRisk: Local ffmpeg assembly uses overwrite behavior for the output MP4.\n\nMitigation: Confirm the output directory and filename before assembly so existing media is not replaced unintentionally.\n\nRisk: Plans and generated media can contain confidential prompts, narration, images, or audio.\n\nMitigation: Run the workflow in a limited project directory and treat plan.json plus generated media folders as confidential project data.\n\nRisk: The skill includes an overbroad every-reply instruction.\n\nMitigation: Review the skill before deployment and constrain behavior to the story-reel workflow and its explicit approval gates.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/pruna-ai/skills/illustrated-story-reel)\n- [Illustrated story reel API reference](references/illustrated-story-reel-api.md)\n- [Illustrated story reel staged gates](references/illustrated-story-reel-gates.md)\n- [Illustrated story reel p-video motion](references/illustrated-story-reel-p-video-motion.md)\n- [Illustrated story reel positive still prompts](references/illustrated-story-reel-prompts.md)\n- [Illustrated story reel quality gates](references/illustrated-story-reel-quality.md)\n- [Vertical story plan template](templates/story-plan.template.json)\n- [Landscape story plan template](templates/story-plan.landscape.template.json)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON plan templates, API payload examples, and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Guides creation of plan.json, stills, audio, clips, and story_reel.mp4 through staged approval gates.]\n\n## Skill Version(s):\n\n1.0.12 (source: server release metadata and skill metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.12:skill.manifest.json\n\n{\n  \"references\": [\n    \"illustrated-story-reel-prompts.md\",\n    \"illustrated-story-reel-p-video-motion.md\",\n    \"illustrated-story-reel-gates.md\",\n    \"illustrated-story-reel-api.md\",\n    \"illustrated-story-reel-quality.md\"\n  ],\n  \"templates\": [\n    \"story-plan.template.json\",\n    \"story-plan.landscape.template.json\"\n  ],\n  \"generation_phases\": {\n    \"default\": \"stills\",\n    \"phases\": [\n      \"stills\",\n      \"tts\",\n      \"music\",\n      \"video\",\n      \"assemble\"\n    ]\n  }\n}\n\nFile v1.0.12:templates/story-plan.landscape.template.json\n\n{\n  \"title\": \"Horizontal photo essay (template)\",\n  \"audio_mode\": \"music\",\n  \"hero_prompt\": \"Photoreal wide establishing shot, 16:9 horizontal frame, natural daylight, single clear subject, documentary composition\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"16:9\",\n    \"fps\": 24,\n    \"hold_seconds\": 3.5,\n    \"hold_pad_seconds\": 0.25,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.4,\n    \"hard_cut_crossfade_seconds\": 0.12\n  },\n  \"style_bible\": \"Photoreal 35mm, natural color, shallow depth of field, consistent subject wardrobe\",\n  \"music\": {\n    \"prompt\": \"Cinematic instrumental underscore, gentle pulse, no vocals, 80 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_open\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_in\",\n      \"hold_seconds\": 4,\n      \"edit_prompt\": \"Wide landscape horizon, subject small in frame, golden hour, photoreal\"\n    },\n    {\n      \"id\": \"02_detail\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_left\",\n      \"hold_seconds\": 3,\n      \"edit_prompt\": \"Medium shot same subject, environment sharper, editorial realism\"\n    }\n  ]\n}\n\nFile v1.0.12:templates/story-plan.template.json\n\n{\n  \"title\": \"The lighthouse keeper's letter\",\n  \"audio_mode\": \"narration\",\n  \"hero_prompt\": \"Painterly storybook illustration, elderly lighthouse keeper in yellow raincoat, stormy sea, warm lamplight, single character, 9:16 vertical frame, one scene\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"9:16\",\n    \"fps\": 24,\n    \"hold_seconds\": 4,\n    \"hold_pad_seconds\": 0.35,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.45,\n    \"hard_cut_crossfade_seconds\": 0.15\n  },\n  \"style_bible\": \"Soft watercolor storybook, muted blues and amber lamp glow, gentle grain, consistent character face and coat\",\n  \"narration\": {\n    \"voice\": \"Kore\",\n    \"style_prompt\": \"Warm storyteller pace, ~2.2 words per second, clear diction, gentle emotion\",\n    \"language_code\": \"en-US\"\n  },\n  \"music\": {\n    \"prompt\": \"Soft piano and strings, nostalgic bedtime story, no vocals, 72 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_storm\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Wide shot: lighthouse tower against black clouds, keeper tiny at the railing, waves crashing\",\n      \"narration\": \"On the night the letter arrived, the sea forgot how to be gentle.\"\n    },\n    {\n      \"id\": \"02_letter\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Close on wrinkled hands opening a sealed envelope, lamplight on the paper, same keeper coat\",\n      \"narration\": \"The ink was faded, but the name was still legible — the one he had not spoken in thirty years.\"\n    },\n    {\n      \"id\": \"03_memory\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_out\",\n      \"edit_prompt\": \"Interior lantern room, keeper reading by window, ghostly reflection of a younger face in the glass\",\n      \"narration\": \"Some doors stay closed until the storm forces them open.\"\n    },\n    {\n      \"id\": \"04_dawn\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"zoom_in\",\n      \"edit_prompt\": \"Dawn breaking over calm water, keeper on steps with letter pressed to chest, golden light\",\n      \"narration\": \"By morning, the letter was answered — not in words, but in the choice to walk back down the hill.\"\n    }\n  ]\n}\n\nArchive v1.0.11: 11 files, 16115 bytes\n\nFiles: references/illustrated-story-reel-api.md (1814b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3181b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1827b), skill-card.md (2835b), skill.manifest.json (479b), SKILL.md (12166b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (142b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.11\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants one short video clip from text or images — B-roll, start/end frame animation, or a quick motion shot. Not for full multi-scene films or lip-synced hosts. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in music mode (Ken Burns only). Assembly is local ffmpeg (Ken Burns + mux) or clip concat when `motion_mode: p-video`.\n\n## When to Use\n\n- Illustrated story with narration or music bed\n- Picture-book / comic-panel narrative with VO or bed\n- User references a “slideshow story”, “Ken Burns reel”, or gentle illustrated motion\n- Budget runs: `ken_burns` (images + TTS only, no video API)\n\n**When NOT to use:** motion between two composed stills (**visual-transition-reel**), lip-sync avatars (**interactive-explainer**), or full sung music video (**music-video**).\n\n## Security & scope\n\nBundled references are scoped to this workflow; do not follow avatar or replace examples from other skills.\n\n| Risk | Mitigation |\n|------|------------|\n| Paid API use | `PRUNA_API_KEY` + `REPLICATE_API_TOKEN`; gates before TTS/music/video/assembly |\n| Credential exposure | Parent agent holds keys; do not pass to subagents except per-lane still/TTS work |\n| Local execution | `ffmpeg`/`ffprobe` subprocess; **`-y` overwrites** output MP4 without confirmation |\n| Data retention | `plan.json` and media under the out dir may contain prompts — treat as confidential |\n\nRequires: `pruna-api` credentials.\n\n## Feedback gates\n\n[./references/illustrated-story-reel-gates.md](./references/illustrated-story-reel-gates.md) · `generation-diversity`\n\n| Phase | What to show | Proceed when |\n|-------|--------------|--------------|\n| **0 — Plan** | Beat table, `audio_mode`, `motion_mode`, sample still lines + narration | **approve plan** |\n| **A — Stills** | `stills/*.png` | **approve stills** |\n| **A2 — Audio** | `audio/narration_*.mp3` or `audio/music.mp3` — **listen** | **approve audio** |\n| **B — Motion** (p-video only) | `clips/*.mp4` — **watch + listen** | **approve clips** |\n| **C — Assemble** | `story_reel.mp4` | User accepts |\n\nDefault first stop: **stills**.\n\n## Quick reference\n\n| Item | Value |\n|------|--------|\n| Models | **p-image**, **p-image-edit**, **p-video** (optional), Gemini TTS, Stable Audio 2.5 |\n| Plan field | `audio_mode`: `\"narration\"` \\| `\"music\"` |\n| Motion | `defaults.motion_mode`: `\"ken_burns\"` \\| `\"p-video\"` (narration mode only) |\n| Aspect | `defaults.aspect_ratio`: `\"9:16\"` \\| `\"16:9\"` \\| `\"1:1\"` |\n| Templates | [templates/story-plan.template.json](./templates/story-plan.template.json) (9:16) · [templates/story-plan.landscape.template.json](./templates/story-plan.landscape.template.json) (16:9) |\n| Craft | [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md) · [./references/illustrated-story-reel-prompts.md](./references/illustrated-story-reel-prompts.md) |\n| Output | `{out_dir}/story_reel.mp4` |\n\n## Intake — ask before generating\n\nOpen intake → **`generation-diversity`** clarification intake.\n\n**First questions (required):**\n\n1. **Delivery shape** — vertical reel (**9:16**), horizontal slideshow (**16:9**), or square (**1:1**)? Target **720p vs 1080p** if export size matters?\n2. **Audio** — **narration** (voiceover per beat) or **music** (instrumental bed / user track)?\n3. **Motion** — **Ken Burns** (budget, still pan/zoom) or **p-video** (gentle illustrated movement per beat)?\n\nSet `defaults.aspect_ratio`, `audio_mode`, and `motion_mode` in the plan before generation.\n\n| Topic | Questions |\n|-------|-----------|\n| **Story** | Title? Beat order (1…N)? Emotional arc? |\n| **Visual** | Style (`style_bible`)? Character continuity? `chain_from_previous` for edit chains? |\n| **Per beat** | `edit_prompt` (one frame)? `narration` line (narration mode)? `hold_seconds` (music mode)? |\n| **Ken Burns** | `ken_burns`: prefer **`pan_left` / `pan_right`** over aggressive zoom (see **Motion + assemble**). |\n| **p-video** | `video_prompt` (OPEN/MID/CLOSE, no VO transcript)? TTS ≤ ~19s per beat — see [p-video-motion](./references/illustrated-story-reel-p-video-motion.md). |\n| **Music mode** | Stable Audio prompt, user `music.track` path, or equal seconds per beat? |\n| **Narration mode** | Voice (`Kore`, etc.)? Storyteller pace in `narration.style_prompt`? |\n\nDo not start generation until the beat table is written and **audio_mode** + **motion_mode** are confirmed.\n\n### Beat table (template)\n\n| `#` | Still (`edit_prompt`) | Narration / hold | Motion | Chain? |\n|-----|------------------------|------------------|--------|--------|\n| 1 | opening wide | line or 4s | ken_burns / p-video | no |\n| 2 | detail insert | line or 3.5s | ken_burns / p-video | yes |\n\n## Generation phases\n\n| Phase | When | Gate |\n|-------|------|------|\n| **stills** | After plan approval | **approve stills** |\n| **tts** / **music** | After stills — matches `audio_mode` | **approve audio** |\n| **video** | Only if `motion_mode: p-video` | **approve clips** |\n| **assemble** | After audio (ken_burns) or clips (p-video) | User accepts MP4 |\n\n## How the agent runs this\n\n1. Copy a plan template → fill beat table → **approve plan**.\n2. Hero → parallel `p-image-edit` stills (`pruna-api`) → **approve stills**.\n3. Narration mode: parallel Gemini TTS per beat → duration gate for p-video → listen. Music mode: Stable Audio or user track → listen → **approve audio**.\n4. `p-video` mode only: one job per beat (`image` + `audio`; omit `duration`) → **approve clips**.\n5. Assemble with ffmpeg (Ken Burns pan/zoom + mux, or concat p-video clips).\n\n**Duration gate (p-video / long TTS):**\n\n```bash\nffprobe -v error -show_entries format=duration -of csv=p=0 audio/narration_01.mp3\n# ≤ ~19s before p-video\n```\n\n## Workflow\n\n### Stills\n\nHero `p-image` → parallel `p-image-edit` per beat (`edit_prompt`). Chain edits from previous still when `chain_from_previous: true`.\n\n### Audio\n\n- **Narration:** one Gemini TTS file per beat.\n- **Music:** one bed (Stable Audio or user file); timing from `hold_seconds`.\n\n### Motion + assemble\n\n**Ken Burns (budget):** for each still, render a short pan/zoom clip, then concat and mux narration or bed. Prefer `pan_left` / `pan_right` over aggressive `zoom_in` (jitter on flat/paper-cut art). Upscale (e.g. ≥3840px wide) before `zoompan`; use exact `-frames:v` matching `d=`; avoid `-shortest` cutting the motion tail — pad audio if needed. Do **not** call `p-video` to fix Ken Burns tremor.\n\nConceptual pan (adapt duration / size to aspect):\n\n```bash\nffmpeg -y -loop 1 -i stills/01.png -vf \"scale=3840:-1,zoompan=z='1':x='x+1':y='y':d=120:s=1080x1920:fps=24\" \\\n  -frames:v 120 -c:v libx264 clips/01.mp4\n```\n\nMux per-beat narration (or concat silent clips then mix bed):\n\n```bash\nffmpeg -y -i clips/01.mp4 -i audio/narration_01.mp3 \\\n  -map 0:v -map 1:a -c:v copy -c:a aac -shortest beat_01.mp4\n```\n\nHard-cut concat:\n\n```bash\nffmpeg -y -f concat -safe 0 -i beats.txt -c copy story_reel.mp4\n```\n\n**p-video:** parallel I2V jobs with uploaded narration; then concat clips (VO already embedded). Craft: [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md).\n\n## Common mistakes\n\n| Mistake | Fix |\n|---------|-----|\n| VO transcript inside **`video_prompt`** | Mode B motion only — [p-video-motion](./references/illustrated-story-reel-p-video-motion.md) |\n| **`duration`** with uploaded narration | Omit `duration`; clip length follows audio |\n| Ken Burns **tremor / jitter** | Prefer `pan_*`; upscale before zoompan; exact `-frames:v` — see **Motion + assemble** |\n| **`p-video` in music mode** | Use `ken_burns` for music-mode reels |\n| Skipping audio listen gate | Wait for **approve audio** |\n| One long narration blob | One line per beat; TTS per scene; probe ≤ ~19s for p-video |\n| Music mode without `hold_seconds` | Set per beat or `defaults.hold_seconds` |\n| Negation in still prompts | Positive description only — [prompts](./references/illustrated-story-reel-prompts.md) |\n| Assuming vertical only | Set `aspect_ratio` to `16:9` and landscape framing in prompts for horizontal deliverables |\n| Mismatched ratio in prompts | `aspect_ratio` in plan must match “vertical” / “horizontal” / “square” in `hero_prompt` and beats |\n\n## Related\n\nRelated skills:\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `narrated-multi-scene` | Use when someone wants a multi-part story with voiceover — episodic B-roll, chaptered promo, or several linked video scenes without on-camera dialogue. | `npx skills add PrunaAI/pruna-skills@narrated-multi-scene -y` |\n| `visual-transition-reel` | Use when someone wants a montage with transitions between shots — action-sequence reel or multi-scene piece where narration is optional. | `npx skills add PrunaAI/pruna-skills@visual-transition-reel -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants one short video clip from text or images — B-roll, start/end frame animation, or a quick motion shot. Not for full multi-scene films or lip-synced hosts. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `video-editing` | Use when assembling or polishing already-rendered clips with ffmpeg — concat, crossfades, burned captions and subtitles, text/logo overlays, before/after sliders, background music beds, platform export — or when composing a multi-layer HTML combination video with Hyperframes. Not for AI video generation, prompt craft, or model-based video edits. | `npx skills add PrunaAI/pruna-skills@video-editing -y` |\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn7cagwf7q3t0cxrgteb7xk0bh81j0eb\",\n  \"slug\": \"illustrated-story-reel\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1788444957940\n}\n\nFile v1.0.11:references/illustrated-story-reel-api.md\n\n# Illustrated story reel — API reference (scoped)\n\nAPIs used by **illustrated-story-reel**. Optional **`p-video`** when `motion_mode: p-video`.\n\nCredentials: `pruna-api`\n\n## Pruna P-API (stills + optional motion)\n\n- Base: `https://api.pruna.ai/v1/predictions`\n- Upload: `https://api.pruna.ai/v1/files`\n- Header: `apikey: ${PRUNA_API_KEY}`, `Model: p-image` | `p-image-edit` | `p-video`\n- Body: `{ \"input\": { ... } }`\n- Sync (`Try-Sync: true`) is acceptable for hero stills; async + poll for p-video clips.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `p-image` | Hero anchor still |\n| `p-image-edit` | Per-beat still from hero or chained prior plate |\n| `p-video` | Optional Mode B clip: still + narration (`save_audio: true`, omit `duration`) |\n\nHTTP patterns and upload/poll/download: `pruna-api`. p-video payload fields: `p-video` skill.\n\n## Replicate (audio)\n\n- Header: `Authorization: Bearer ${REPLICATE_API_TOKEN}`\n- Create: `POST https://api.replicate.com/v1/models/{owner}/{name}/predictions`\n- Poll `urls.get` until `succeeded`; download output URL.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `google/gemini-3.1-flash-tts` | Per-beat narration (`audio_mode: narration`) |\n| `stability-ai/stable-audio-2.5` | Instrumental bed (`audio_mode: music`, no user track) |\n\nShared client: pruna-api / Replicate HTTP in tool skill\n\n## Local assembly (ffmpeg)\n\nRequires **`ffmpeg`** and **`ffprobe`** on PATH. The agent runs ffmpeg with **`-y`** (overwrite output without prompt). Confirm out dir and output name before assembly.\n\n- **Ken Burns:** segments + narration/bed mux — `illustrated-story-reel` **Motion + assemble**\n- **p-video:** concat `clips/*.mp4` (audio embedded) — [illustrated-story-reel-p-video-motion.md](./illustrated-story-reel-p-video-motion.md)\n\nFile v1.0.11:references/illustrated-story-reel-gates.md\n\n# Illustrated story reel — staged gates\n\nHuman-in-the-loop phases for **illustrated-story-reel**. Uses **p-image**, **p-image-edit**, optional **p-video** (Mode B motion), Replicate TTS/music, and local ffmpeg assembly.\n\n## Phases\n\n| Phase | Models / tools | Cost | User interaction |\n|-------|----------------|------|------------------|\n| **0 — Plan** | none | free | Present beat table, `audio_mode`, `motion_mode`, sample still lines; **approve plan** |\n| **A — Stills** | `p-image`, `p-image-edit` | low | Show `stills/*.png`; run checklists; **approve stills** |\n| **A2 — Audio** | Gemini TTS **or** Stable Audio / user track | low–medium | **Listen** to `audio/narration_*.mp3` or `audio/music.mp3`; **approve audio** |\n| **B — Motion** | `p-video` (when `motion_mode: p-video`) | medium | **Watch + listen** to `clips/*.mp4`; **approve clips** |\n| **C — Assemble** | local ffmpeg (Ken Burns + mux **or** clip concat) | free | Review `story_reel.mp4` (or `--output-name`) |\n\nKen Burns path skips Phase B. Music-mode reels use Ken Burns only (no p-video).\n\n## Agent rules\n\n1. **Only** call `p-video` when `motion_mode: p-video` and narration is approved — not for Ken Burns tremor fixes.\n2. **Never** run audio, video, or assembly in the same turn as still generation without showing stills and waiting for approval.\n3. **Parallelize within a phase** (batch still edits, parallel TTS, parallel p-video), not across phases.\n4. **Do not pass `PRUNA_API_KEY` or `REPLICATE_API_TOKEN` to subagents** unless a subagent is running an approved still or TTS lane — parent owns gates and assembly.\n5. Run [illustrated-story-reel-quality.md](./illustrated-story-reel-quality.md) on every still before audio or video.\n6. **`generation-diversity`** and **random seed ritual (`generation-diversity`)** before every `POST /v1/predictions`.\n\n## Wording templates\n\nAfter Phase 0:\n\n> Here is the beat table, `audio_mode`, and `motion_mode`. Reply **approve plan** to generate stills, or tell me what to change.\n\nAfter Phase A:\n\n> Stills are in `stills/`. Reply **approve stills** to run TTS or music, or name beats to fix.\n\nAfter Phase A2:\n\n> Audio is in `audio/`. Listen for pace and tone. Reply **approve audio** to run p-video (if motion_mode p-video) or assemble (Ken Burns), or tell me lines to rewrite.\n\nAfter Phase B (p-video):\n\n> Motion clips are in `clips/`. Watch for style drift and listen for sync. Reply **approve clips** to assemble, or name beats to re-render.\n\nBefore assembly:\n\n> Assembly runs ffmpeg into `{out_dir}/story_reel.mp4`. ffmpeg uses **`-y`** and overwrites the output path without confirmation — confirm `{out_dir}` is correct.\n\n## Phases (agent)\n\nDefault stop after **stills**. Do not run TTS/music until stills are approved. Do not run p-video until audio is approved. Assembly needs approved audio (Ken Burns) or approved clips (p-video).\n\nFollow `illustrated-story-reel` — agent runs curl + ffmpeg. No Python runner. Do not skip still/audio/clip approval gates.\n\n## Local state files\n\n| File | Purpose | Privacy note |\n|------|---------|--------------|\n| `generation_status.json` | Phase approval flags (`phase_a`, `phase_b`, `phase_c`) | Written under `--out-dir`; safe to delete to reset gates |\n| `stills/`, `audio/`, `clips/`, `segments/` | Generated media | May contain prompts reflected in filenames and plan JSON |\n| `plan.json` | Beat prompts and narration | Can include sensitive project details — treat as confidential |\n\n## Anti-patterns\n\n- **`p-video` for Ken Burns tremor** — tune `ken_burns` (prefer `pan_*`) + re-assemble per SKILL **Motion + assemble**\n- **VO transcript in `video_prompt`** — Mode B motion only ([p-video-motion](./illustrated-story-reel-p-video-motion.md))\n- Aggressive **zoom_in on every illustrated beat** — prefer `pan_left` / `pan_right`\n- Skipping still, audio, or clip review before the next paid phase\n- Passing API keys to broad subagent trees\n- Running assembly before the user listens to narration or watches p-video clips\n\nFile v1.0.11:references/illustrated-story-reel-p-video-motion.md\n\n# Illustrated story reel — p-video motion (Mode B)\n\nOptional **illustrated movement** per beat: upload the beat still + Gemini TTS narration to **`p-video`** (Mode B). Clip length follows audio — **omit `duration`**, set **`save_audio: true`**.\n\nKen Burns (ffmpeg only) remains the **budget** path — prefer `pan_left` / `pan_right` and follow **Motion + assemble** in `illustrated-story-reel`.\n\n## When to use\n\n| Path | Cost | Motion |\n|------|------|--------|\n| **`ken_burns`** (default) | images + TTS only | Slow pan/zoom on still |\n| **`p-video`** | + one video API call per beat | Books flutter, whale drifts, gentle illustrated drift |\n\nSet `defaults.motion_mode` or per-scene `motion_mode`: `\"ken_burns\"` \\| `\"p-video\"`.\n\n**Requires `audio_mode: narration`.** Music-mode reels stay Ken Burns + `hold_seconds`.\n\n## Plan fields\n\n| Field | Role |\n|-------|------|\n| `defaults.motion_mode` | `\"ken_burns\"` (default) or `\"p-video\"` |\n| `scenes[].motion_mode` | Override per beat |\n| `scenes[].video_prompt` | Mode B motion prompt (OPEN/MID/CLOSE) — **no VO transcript** |\n\nTTS per beat must be **≤ ~19s** (P-API audio-led cap ~20s). Probe before render — see `video-prompting`.\n\n## Mode B prompt template\n\n```text\nOPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only.\n```\n\nRules (full ref: `video-prompting`):\n\n- Describe **picture motion**, not spoken words.\n- Match narrator mood — calm story → slow drift; wonder → slightly livelier flutter.\n- Keep style stable — no morphing from paper-cut to photoreal.\n- Static or slow camera; physics-safe motion on illustrated elements.\n\n## API payload\n\nUse Build the `p-video` payload (see `p-video` skill):\n\n```python\nbuild_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)\n```\n\nDo **not** post-mux narration over a silent clip — long lines truncate.\n\n## Phases (p-video)\n\n1. Stills → approve\n2. TTS per beat → approve audio\n3. `p-video` per beat (narration as `audio`) → approve clips\n4. ffmpeg concat\n\nKen Burns path skips video generation; assemble muxes narration over ffmpeg Ken Burns segments. See `illustrated-story-reel`.\n\n## QA\n\n- [ ] Narration probed ≤ ~19s per beat\n- [ ] `video_prompt` has no VO transcript\n- [ ] Still matches `style_bible` before video\n- [ ] Clip motion stays illustrated — no photoreal drift\n- [ ] Listen to `clips/*.mp4` before assemble\n\n## Anti-patterns\n\n| Do not | Do instead |\n|--------|------------|\n| Paste narration text into `video_prompt` | Mode B mood + motion only |\n| Set `duration` with uploaded `audio` | Omit `duration` |\n| Switch to p-video for Ken Burns tremor | Tune `ken_burns` + re-assemble |\n| Mix `ken_burns` and `p-video` beats in one reel (v1) | Uniform `motion_mode` across all beats |\n\nFile v1.0.11:references/illustrated-story-reel-prompts.md\n\n# Illustrated story reel — positive still prompts\n\nStill-line guidance for **illustrated-story-reel** (`hero_prompt`, `style_bible`, `edit_prompt` per beat). **No `video_prompt`** — motion is Ken Burns in ffmpeg only.\n\n## Principle\n\nDescribe **what appears** in each frame — never what to leave out. Saying `no text` often **creates** readable type. Be explicit about the single frame you want.\n\n**Never** use `no …`, `avoid …`, `not …`, `without …`, `don't`, or `do not` in creative fields. Spoken narration lines may use natural negation.\n\n## Banned patterns → positive rewrite\n\n| Banned pattern | Write explicitly instead |\n|----------------|--------------------------|\n| `no text` / `no signage` / `no labels` | `plain unmarked walls`, `unprinted wood surfaces`, `matte unprinted props` |\n| `avoid markets` / `avoid text` | `plain wood table`, `single camera angle`, `one focal subject` |\n| `without vocals` (music bed prompt) | `instrumental only` |\n| `no cartoon` / `no modern` | `painterly historical illustration`, `period-accurate props only` |\n\n## Rules\n\n1. **One positive sentence per beat** — location, subject, light, `one camera angle`.\n2. **`style_bible`** — positive comma-clauses only. Match `defaults.aspect_ratio` (e.g. `16:9 horizontal frame` for landscape).\n3. **`edit_prompt`** — one composed still per beat; use `chain_from_previous` for visual continuity.\n4. **`ken_burns`** — `pan_left`, `pan_right`, `zoom_in`, `zoom_out`, or `none` (per beat or `defaults`). **Prefer slow pan** on illustrated/paper-cut beats; reserve zoom for photo-style heroes. Assembly tips: `illustrated-story-reel` **Motion + assemble**.\n\n## Text & signage (most common)\n\n| Blocked phrase in stills | Use instead |\n|--------------------------|-------------|\n| `farmers market`, `signage`, `neon signs` | produce on **plain wood table**, **matte unprinted** baskets |\n| `labeled`, `packaging`, `price tag`, `menu` | **matte unprinted** jars, food in **plain glass bowl** |\n| `graphic tee`, `poster`, `magazine` | solid-color fabrics, unbranded matte props |\n| `maps`, `newspaper`, `headline`, `caption` | blank folded parchment, plain walls, unmarked wood |\n\n## Collage & layout\n\n| Blocked phrase | Use instead |\n|----------------|-------------|\n| `split`, `side by side`, `grid`, `collage`, `montage`, `multiple angles` | one subject, one camera angle, one frame |\n| `OPENING:` / `CLOSING:` prefixes | plain scene description |\n| `storyboard`, `triptych` | one continuous composition |\n\n## Good vs bad still lines\n\n| Bad | Good |\n|-----|------|\n| `No text, farmers market` | `Plain wood table`, matte baskets, sunny window, **one camera angle** |\n| `Avoid labels on packaging` | **Matte unprinted** jars on **plain counter** |\n\nFile v1.0.11:references/illustrated-story-reel-quality.md\n\n# Illustrated story reel — quality gates\n\nAgent vision review for **illustrated-story-reel** stills, audio, and optional p-video clips.\n\n## Who applies these?\n\n**The coding agent** opens real output files (`stills/*.png`, `audio/*.mp3`, `clips/*.mp4` when p-video) and judges pass/fail. Then present paths for user **approve stills** / **approve audio** / **approve clips** per [illustrated-story-reel-gates.md](./illustrated-story-reel-gates.md).\n\n## Core (every job)\n\n- **`generation-diversity`** — ritual seed + rotate scenario axes.\n- **Random seed ritual (`generation-diversity`)** — state ritual string before every prediction; never copy doc examples.\n- Goal and acceptance criteria are explicit.\n- `aspect_ratio` in plan matches prompt wording (vertical / horizontal / square).\n- No accidental watermarks, UI overlays, or stray text unless requested.\n\n## Per model\n\nAfter each still, open the file and review:\n\n- **Hero + beats (`p-image`, `p-image-edit`):** `image-prompting` and `image-prompting` — skip avatar handoff rows.\n- **Narration (`gemini-3.1-flash-tts`):** pace, tone, line clarity per beat; probe ≤ ~19s before p-video.\n- **Music bed (`stable-audio-2.5`):** instrumental, no vocals unless brief asks; level appropriate under stills.\n- **Motion clips (`p-video`, when `motion_mode: p-video`):** style matches still; gentle illustrated drift; no photoreal morph; audio sync; no VO transcript leaked into motion.\n- **Assembled reel (`story_reel.mp4`, Ken Burns):** motion is **smooth** — no tremor/jitter. Fix with `ken_burns` pan + re-assemble — `illustrated-story-reel` **Motion + assemble**. Do not use p-video to fix tremor.\n\n## Traceability\n\n`generation_status.json` under `--out-dir` records phase approvals. Plan JSON retains prompts and narration — treat as confidential project data.\n\nFile v1.0.11:skill-card.md\n\n## Description:\n\nUse when someone wants a slideshow story with narration or music, using picture-book illustrated frames with Ken Burns or gentle p-video motion.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[pruna-ai](https://clawhub.ai/user/pruna-ai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal creators and developers use this skill to plan and generate illustrated slideshow stories with narration or music. It supports staged review gates, optional p-video motion, and local ffmpeg assembly into a final story reel.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow uses paid Pruna and Replicate APIs and prerequisite skills.\n\nMitigation: Confirm the prerequisite skill source is trusted and require the documented approval gates before paid generation phases.\n\nRisk: Generated plans, prompts, narration, and media can contain confidential project details.\n\nMitigation: Treat plan files and generated media under the output directory as confidential when user inputs include private information.\n\nRisk: Local ffmpeg assembly can overwrite the final MP4 output path.\n\nMitigation: Verify the output directory and final filename before assembly because ffmpeg is documented to use overwrite behavior.\n\n## Reference(s):\n\n- [Illustrated story reel API reference](artifact/references/illustrated-story-reel-api.md)\n- [Illustrated story reel staged gates](artifact/references/illustrated-story-reel-gates.md)\n- [Illustrated story reel p-video motion guidance](artifact/references/illustrated-story-reel-p-video-motion.md)\n- [Illustrated story reel prompt guidance](artifact/references/illustrated-story-reel-prompts.md)\n- [Illustrated story reel quality gates](artifact/references/illustrated-story-reel-quality.md)\n- [Vertical story plan template](artifact/templates/story-plan.template.json)\n- [Landscape story plan template](artifact/templates/story-plan.landscape.template.json)\n- [ClawHub skill page](https://clawhub.ai/pruna-ai/skills/illustrated-story-reel)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, JSON, Shell commands, Configuration, Guidance, Files]\n\n**Output Format:** [Markdown guidance with JSON plan templates, shell commands, API payload patterns, and media file paths]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces plan.json, stills, narration or music audio, optional clips, and story_reel.mp4 under the selected output directory.]\n\n## Skill Version(s):\n\n1.0.11 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.11:skill.manifest.json\n\n{\n  \"references\": [\n    \"illustrated-story-reel-prompts.md\",\n    \"illustrated-story-reel-p-video-motion.md\",\n    \"illustrated-story-reel-gates.md\",\n    \"illustrated-story-reel-api.md\",\n    \"illustrated-story-reel-quality.md\"\n  ],\n  \"templates\": [\n    \"story-plan.template.json\",\n    \"story-plan.landscape.template.json\"\n  ],\n  \"generation_phases\": {\n    \"default\": \"stills\",\n    \"phases\": [\n      \"stills\",\n      \"tts\",\n      \"music\",\n      \"video\",\n      \"assemble\"\n    ]\n  }\n}\n\nFile v1.0.11:templates/story-plan.landscape.template.json\n\n{\n  \"title\": \"Horizontal photo essay (template)\",\n  \"audio_mode\": \"music\",\n  \"hero_prompt\": \"Photoreal wide establishing shot, 16:9 horizontal frame, natural daylight, single clear subject, documentary composition\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"16:9\",\n    \"fps\": 24,\n    \"hold_seconds\": 3.5,\n    \"hold_pad_seconds\": 0.25,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.4,\n    \"hard_cut_crossfade_seconds\": 0.12\n  },\n  \"style_bible\": \"Photoreal 35mm, natural color, shallow depth of field, consistent subject wardrobe\",\n  \"music\": {\n    \"prompt\": \"Cinematic instrumental underscore, gentle pulse, no vocals, 80 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_open\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_in\",\n      \"hold_seconds\": 4,\n      \"edit_prompt\": \"Wide landscape horizon, subject small in frame, golden hour, photoreal\"\n    },\n    {\n      \"id\": \"02_detail\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_left\",\n      \"hold_seconds\": 3,\n      \"edit_prompt\": \"Medium shot same subject, environment sharper, editorial realism\"\n    }\n  ]\n}\n\nFile v1.0.11:templates/story-plan.template.json\n\n{\n  \"title\": \"The lighthouse keeper's letter\",\n  \"audio_mode\": \"narration\",\n  \"hero_prompt\": \"Painterly storybook illustration, elderly lighthouse keeper in yellow raincoat, stormy sea, warm lamplight, single character, 9:16 vertical frame, one scene\",\n  \"ritual_seed\": \"k7Qm2xP9\",\n  \"defaults\": {\n    \"aspect_ratio\": \"9:16\",\n    \"fps\": 24,\n    \"hold_seconds\": 4,\n    \"hold_pad_seconds\": 0.35,\n    \"ken_burns\": \"pan_right\",\n    \"motion_mode\": \"ken_burns\"\n  },\n  \"assembly\": {\n    \"crossfade_seconds\": 0.45,\n    \"hard_cut_crossfade_seconds\": 0.15\n  },\n  \"style_bible\": \"Soft watercolor storybook, muted blues and amber lamp glow, gentle grain, consistent character face and coat\",\n  \"narration\": {\n    \"voice\": \"Kore\",\n    \"style_prompt\": \"Warm storyteller pace, ~2.2 words per second, clear diction, gentle emotion\",\n    \"language_code\": \"en-US\"\n  },\n  \"music\": {\n    \"prompt\": \"Soft piano and strings, nostalgic bedtime story, no vocals, 72 BPM\",\n    \"volume\": 0.85,\n    \"track\": null\n  },\n  \"scenes\": [\n    {\n      \"id\": \"01_storm\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Wide shot: lighthouse tower against black clouds, keeper tiny at the railing, waves crashing\",\n      \"narration\": \"On the night the letter arrived, the sea forgot how to be gentle.\"\n    },\n    {\n      \"id\": \"02_letter\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"pan_right\",\n      \"edit_prompt\": \"Close on wrinkled hands opening a sealed envelope, lamplight on the paper, same keeper coat\",\n      \"narration\": \"The ink was faded, but the name was still legible — the one he had not spoken in thirty years.\"\n    },\n    {\n      \"id\": \"03_memory\",\n      \"chain_from_previous\": false,\n      \"ken_burns\": \"zoom_out\",\n      \"edit_prompt\": \"Interior lantern room, keeper reading by window, ghostly reflection of a younger face in the glass\",\n      \"narration\": \"Some doors stay closed until the storm forces them open.\"\n    },\n    {\n      \"id\": \"04_dawn\",\n      \"chain_from_previous\": true,\n      \"ken_burns\": \"zoom_in\",\n      \"edit_prompt\": \"Dawn breaking over calm water, keeper on steps with letter pressed to chest, golden light\",\n      \"narration\": \"By morning, the letter was answered — not in words, but in the choice to walk back down the hill.\"\n    }\n  ]\n}\n\nArchive v1.0.10: 11 files, 16169 bytes\n\nFiles: references/illustrated-story-reel-api.md (1814b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3181b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1827b), skill-card.md (2914b), skill.manifest.json (479b), SKILL.md (12166b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (142b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.10\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video` | Use when someone wants one short video clip from text or images — B-roll, start/end frame animation, or a quick motion shot. Not for full multi-scene films or lip-synced hosts. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in music mode (Ken Burns only). Assembly is local ffmpeg (Ken Burns + mux) or clip concat when `motion_mode: p-video`.\n\n## When to Use\n\n- Illustrated story with narration or music bed\n- Picture-book / comic-panel narrative with VO or bed\n- User references a “slideshow story”, “Ken Burns reel”, or gentle illustrated motion\n- Budget runs: `ken_burns` (images + TTS only, no video API)\n\n**When NOT to use:** motion between two composed stills (**visual-transition-reel**), lip-sync avatars (**interactive-explainer**), or full sung music video (**music-video**).\n\n## Security & scope\n\nBundled references are scoped to this workflow; do not follow avatar or replace examples from other skills.\n\n| Risk | Mitigation |\n|------|------------|\n| Paid API use | `PRUNA_API_KEY` + `REPLICATE_API_TOKEN`; gates before TTS/music/video/assembly |\n| Credential exposure | Parent agent holds keys; do not pass to subagents except per-lane still/TTS work |\n| Local execution | `ffmpeg`/`ffprobe` subprocess; **`-y` overwrites** output MP4 without confirmation |\n| Data retention | `plan.json` and media under the out dir may contain prompts — treat as confidential |\n\nRequires: `pruna-api` credentials.\n\n## Feedback gates\n\n[./references/illustrated-story-reel-gates.md](./references/illustrated-story-reel-gates.md) · `generation-diversity`\n\n| Phase | What to show | Proceed when |\n|-------|--------------|--------------|\n| **0 — Plan** | Beat table, `audio_mode`, `motion_mode`, sample still lines + narration | **approve plan** |\n| **A — Stills** | `stills/*.png` | **approve stills** |\n| **A2 — Audio** | `audio/narration_*.mp3` or `audio/music.mp3` — **listen** | **approve audio** |\n| **B — Motion** (p-video only) | `clips/*.mp4` — **watch + listen** | **approve clips** |\n| **C — Assemble** | `story_reel.mp4` | User accepts |\n\nDefault first stop: **stills**.\n\n## Quick reference\n\n| Item | Value |\n|------|--------|\n| Models | **p-image**, **p-image-edit**, **p-video** (optional), Gemini TTS, Stable Audio 2.5 |\n| Plan field | `audio_mode`: `\"narration\"` \\| `\"music\"` |\n| Motion | `defaults.motion_mode`: `\"ken_burns\"` \\| `\"p-video\"` (narration mode only) |\n| Aspect | `defaults.aspect_ratio`: `\"9:16\"` \\| `\"16:9\"` \\| `\"1:1\"` |\n| Templates | [templates/story-plan.template.json](./templates/story-plan.template.json) (9:16) · [templates/story-plan.landscape.template.json](./templates/story-plan.landscape.template.json) (16:9) |\n| Craft | [./references/illustrated-story-reel-p-video-motion.md](./references/illustrated-story-reel-p-video-motion.md) · [./references/illustrated-story-reel-prompts.md](./references/illustrated-story-reel-prompts.md) |\n| Output | `{out_dir}/story_reel.mp4` |\n\n## Intake — ask before generating\n\nOpen intake → **`generation-diversity`** clarification intake.\n\n**First questions (required):**\n\n1. **Delivery shape** — vertical reel (**9:16**), horizontal slideshow (**16:9**), or square (**1:1**)? Target **720p vs 1080p** if export size matters?\n2. **Audio** — **narration** (voiceover per beat) or **music** (instrumental bed / user track)?\n3. **Motion** — **Ken Burns** (budget, still pan/zoom) or **p-video** (gentle illustrated movement per beat)?\n\nSet `defaults.aspect_ratio`, `audio_mode`, and `motion_mode` in the plan before generation.\n\n| Topic | Questions |\n|-------|-----------|\n| **Story** | Title? Beat order (1…N)? Emotional arc? |\n| **Visual** | Style (`style_bible`)? Character continuity? `chain_from_previous` for edit chains? |\n| **Per beat** | `edit_prompt` (one frame)? `narration` line (narration mode)? `hold_seconds` (music mode)? |\n| **Ken Burns** | `ken_burns`: prefer **`pan_left` / `pan_right`** over aggressive zoom (see **Motion + assemble**). |\n| **p-video** | `video_prompt` (OPEN/MID/CLOSE, no VO transcript)? TTS ≤ ~19s per beat — see [p-video-motion](./references/illustrated-story-reel-p-video-motion.md). |\n| **Music mode** | Stable Audio prompt, user `music.track` path, or equal seconds per beat? |\n| **Narration mode** | Voice (`Kore`, etc.)? Storyteller pace in `narration.style_prompt`? |\n\nDo not start generation until the beat table is written and **audio_mode** + **motion_mode** are confirmed.\n\n### Beat table (template)\n\n| `#` | Still (`edit_prompt`) | Narration / hold | Motion | Chain? |\n|-----|------------------------|------------------|--------|--------|\n| 1 | opening wide | line or 4s | ken_burns / p-video | no |\n| 2 | detail insert | line or 3.5s | ken_burns / p-video | yes |\n\n## Generation phases\n\n| Phase | When | Gate |\n|-------|------|------|\n| **stills** | After plan approval | **approve stills** |\n| **tts** / **music** | After \n\nArchive v1.0.9: 11 files, 16148 bytes\n\nFiles: references/illustrated-story-reel-api.md (1814b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3181b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1827b), skill-card.md (2859b), skill.manifest.json (479b), SKILL.md (12165b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (141b)\n\nArchive v1.0.8: 11 files, 16113 bytes\n\nFiles: references/illustrated-story-reel-api.md (1814b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3181b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1827b), skill-card.md (3041b), skill.manifest.json (479b), SKILL.md (12037b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (141b)\n\nArchive v1.0.7: 11 files, 16111 bytes\n\nFiles: references/illustrated-story-reel-api.md (1814b), references/illustrated-story-reel-gates.md (4019b), references/illustrated-story-reel-p-video-motion.md (3181b), references/illustrated-story-reel-prompts.md (2750b), references/illustrated-story-reel-quality.md (1827b), skill-card.md (3070b), skill.manifest.json (479b), SKILL.md (11922b), templates/story-plan.landscape.template.json (1215b), templates/story-plan.template.json (2300b), _meta.json (141b)\n\nArchive v1.0.6: 31 files, 59910 bytes\n\nFiles: apm.yml (507b), README-INSTALL.md (998b), references/api-credentials.md (3192b), references/approval-red-flags.md (2650b), references/generation-diversity.md (25910b), references/generation-quality-checklists.md (10086b), references/illustrated-story-reel-api.md (1577b), references/illustrated-story-reel-gates.md (4057b), references/illustrated-story-reel-prompts.md (2603b), references/illustrated-story-reel-quality.md (1801b), references/p-image-edit-quality-checklist.md (1249b), references/p-image-quality-checklist.md (2269b), references/parallel-execution.md (7807b), references/random-seed-ritual.md (3875b), references/staged-generation-gate.md (7290b), references/workflow-feedback-gates.md (5034b), scripts/assemble_slideshow.py (11232b), scripts/generation_gate.py (3141b), scripts/launch_background_music.py (8332b), scripts/pruna_api.py (5129b), scripts/replicate_api.py (5739b), scripts/requirements.txt (15b), scripts/run_from_plan.py (8397b), scripts/stills_pipeline.py (8741b), skill-card.md (3563b), skill.deps.json (1161b), skill.manifest.json (2414b), SKILL.md (7989b), templates/story-plan.landscape.template.json (1183b), templates/story-plan.template.json (2264b), _meta.json (141b)\n\nArchive v1.0.2: 26 files, 47187 bytes\n\nFiles: apm.yml (537b), README-INSTALL.md (1470b), references/api-credentials.md (3207b), references/generation-diversity.md (26090b), references/illustrated-story-reel-api.md (1577b), references/illustrated-story-reel-gates.md (4053b), references/illustrated-story-reel-prompts.md (2603b), references/illustrated-story-reel-quality.md (1797b), references/p-image-edit-quality-checklist.md (1259b), references/p-image-quality-checklist.md (2279b), references/random-seed-ritual.md (4088b), scripts/assemble_slideshow.py (11232b), scripts/generation_gate.py (3139b), scripts/launch_background_music.py (8332b), scripts/pruna_api.py (5129b), scripts/replicate_api.py (5739b), scripts/requirements.txt (15b), scripts/run_from_plan.py (8397b), scripts/stills_pipeline.py (8741b), skill-card.md (2865b), skill.deps.json (1161b), skill.manifest.json (2260b), SKILL.md (6984b), templates/story-plan.landscape.template.json (1183b), templates/story-plan.template.json (2264b), _meta.json (141b)","readmeExcerpt":"Skill: illustrated-story-reel Owner: pruna-ai Summary: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion. Tags: ai:1.0.14, generative:1.0.14, latest:1.0.14, pruna:1.0.14 Version history: v1.0.14 | 2026-09-29T15:39:14.535Z | auto Version 1.0.14 - Version bump from 1.0.13 to 1.0.14 in documentation. - Removed the file: skill-card.m","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"ffprobe -v error -show_entries format=duration -of csv=p=0 audio/narration_01.mp3\n# ≤ ~19s before p-video"},{"language":"bash","snippet":"ffmpeg -y -loop 1 -i stills/01.png -vf \"scale=3840:-1,zoompan=z='1':x='x+1':y='y':d=120:s=1080x1920:fps=24\" \\\n  -frames:v 120 -c:v libx264 clips/01.mp4"},{"language":"bash","snippet":"ffmpeg -y -i clips/01.mp4 -i audio/narration_01.mp3 \\\n  -map 0:v -map 1:a -c:v copy -c:a aac -shortest beat_01.mp4"},{"language":"bash","snippet":"ffmpeg -y -f concat -safe 0 -i beats.txt -c copy story_reel.mp4"},{"language":"text","snippet":"OPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only."},{"language":"python","snippet":"build_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: illustrated-story-reel\ndescription: Use when someone wants a slideshow story with narration or music — picture-book illustrated frames with Ken Burns or gentle p-video motion.\nlicense: MIT\nmetadata:\n  version: \"1.0.14\"\n  package: pruna-skills\n---\n\n## Prerequisites\n\nInstall and load these skills before generating (skip if already in context via `@pruna`):\n\n| Skill | Description | Install |\n| --- | --- | --- |\n| `p-image-ideogram` | Use when photo generation needs more control — photoreal results, text in the image, or structured JSON with hex colors and bounding boxes. Simpler photo generation, edits, and video use other skills in the suite. | `npx skills add PrunaAI/pruna-skills@p-image-ideogram -y` |\n| `p-image` | Use when someone explicitly wants the fastest, cheapest photo generation — mood boards, bulk panels, or quick iterations — not when controlled photoreal or in-image text is needed. | `npx skills add PrunaAI/pruna-skills@p-image -y` |\n| `p-image-edit` | Use when someone wants to edit an existing photo — change outfits or backgrounds, compose from reference images, or apply prompt-driven edits. | `npx skills add PrunaAI/pruna-skills@p-image-edit -y` |\n| `p-video-2` | Use when someone wants a polished short clip from text, images, or imported audio — 1080p B-roll, start/end frame animation, or a motion shot with a mixed track. Not for cinematic generated-audio clips or talking-head-only hosts. | `npx skills add PrunaAI/pruna-skills@p-video-2 -y` |\n| `p-video` | Use when someone wants a simple short clip from text or images — quick B-roll, drafts, or start/end frame animation. Not when the brief needs cinematic generation, highest quality, tight lip-sync, or imported audio at 1080p. | `npx skills add PrunaAI/pruna-skills@p-video -y` |\n| `gemini-3.1-flash-tts` | Use when someone needs spoken narration or voiceover — explainer tracks, documentary lines, or voice to pair with generated video. | `npx skills add PrunaAI/pruna-skills@gemini-3.1-flash-tts -y` |\n| `stable-audio-2.5` | Use when someone wants light instrumental background music — an ambient bed under dialogue or underscore for reels and explainers. | `npx skills add PrunaAI/pruna-skills@stable-audio-2.5 -y` |\n\nOr install the full suite once: `npx skills add PrunaAI/pruna-skills@pruna -y`\n\nFollow each skill's **Before generating** / craft sections — do not restate guide content here.\n\n## Workflow habit\n\nIn **every reply**, name `` `illustrated-story-reel` `` in backticks. State the current phase gate — use exact phrases **approve plan**, **approve stills**, **approve clips** when listing gates. Do **not** same-turn plan + paid video. Skip-review / burn-credits → follow `generation-diversity` **Red flags**.\n\n## Overview\n\nOne still per story beat. Hero anchor → **p-image-edit** per scene. **Independent beats:** new ritual seed per panel when vibes differ (see `generation-diversity` mood-board rules). Audio drives timing in narration mode; fixed **hold_seconds** per beat in mu"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7cagwf7q3t0cxrgteb7xk0bh81j0eb\",\n  \"slug\": \"illustrated-story-reel\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1790696354535\n}"},{"path":"references/illustrated-story-reel-api.md","content":"# Illustrated story reel — API reference (scoped)\n\nAPIs used by **illustrated-story-reel**. Optional motion when `motion_mode: p-video` — **`p-video-2`** (quality) or **`p-video`** (simpler).\n\nCredentials: `pruna-api`\n\n## Pruna P-API (stills + optional motion)\n\n- Base: `https://api.pruna.ai/v1/predictions`\n- Upload: `https://api.pruna.ai/v1/files`\n- Header: `apikey: ${PRUNA_API_KEY}`, `Model: p-image` | `p-image-ideogram` | `p-image-edit` | `p-video-2` | `p-video`\n- Body: `{ \"input\": { ... } }`\n- Sync (`Try-Sync: true`) is acceptable for hero stills; async + poll for p-video clips.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `p-image` | Hero anchor still (default for illustrated frames) |\n| `p-image-ideogram` | Hero when frames need readable text or tighter style control |\n| `p-image-edit` | Per-beat still from hero or chained prior plate |\n| `p-video-2` | Optional Mode B clip (quality): still + narration (`save_audio: true`, omit `duration`) |\n| `p-video` | Same Mode B payload for simpler / quicker clips |\n\nHTTP patterns and upload/poll/download: `pruna-api`. Motion payload fields: `p-video-2` / `p-video` skills.\n\n## Replicate (audio)\n\n- Header: `Authorization: Bearer ${REPLICATE_API_TOKEN}`\n- Create: `POST https://api.replicate.com/v1/models/{owner}/{name}/predictions`\n- Poll `urls.get` until `succeeded`; download output URL.\n\n**Models in this workflow:**\n\n| Model | Use |\n|-------|-----|\n| `google/gemini-3.1-flash-tts` | Per-beat narration (`audio_mode: narration`) |\n| `stability-ai/stable-audio-2.5` | Instrumental bed (`audio_mode: music`, no user track) |\n\nShared client: pruna-api / Replicate HTTP in tool skill\n\n## Local assembly (ffmpeg)\n\nRequires **`ffmpeg`** and **`ffprobe`** on PATH. The agent runs ffmpeg with **`-y`** (overwrite output without prompt). Confirm out dir and output name before assembly.\n\n- **Ken Burns:** segments + narration/bed mux — `illustrated-story-reel` **Motion + assemble**\n- **p-video:** concat `clips/*.mp4` (audio embedded) — [illustrated-story-reel-p-video-motion.md](./illustrated-story-reel-p-video-motion.md)"},{"path":"references/illustrated-story-reel-gates.md","content":"# Illustrated story reel — staged gates\n\nHuman-in-the-loop phases for **illustrated-story-reel**. Uses **p-image**, **p-image-edit**, optional **p-video** (Mode B motion), Replicate TTS/music, and local ffmpeg assembly.\n\n## Phases\n\n| Phase | Models / tools | Cost | User interaction |\n|-------|----------------|------|------------------|\n| **0 — Plan** | none | free | Present beat table, `audio_mode`, `motion_mode`, sample still lines; **approve plan** |\n| **A — Stills** | `p-image`, `p-image-edit` | low | Show `stills/*.png`; run checklists; **approve stills** |\n| **A2 — Audio** | Gemini TTS **or** Stable Audio / user track | low–medium | **Listen** to `audio/narration_*.mp3` or `audio/music.mp3`; **approve audio** |\n| **B — Motion** | `p-video` (when `motion_mode: p-video`) | medium | **Watch + listen** to `clips/*.mp4`; **approve clips** |\n| **C — Assemble** | local ffmpeg (Ken Burns + mux **or** clip concat) | free | Review `story_reel.mp4` (or `--output-name`) |\n\nKen Burns path skips Phase B. Music-mode reels use Ken Burns only (no p-video).\n\n## Agent rules\n\n1. **Only** call `p-video` when `motion_mode: p-video` and narration is approved — not for Ken Burns tremor fixes.\n2. **Never** run audio, video, or assembly in the same turn as still generation without showing stills and waiting for approval.\n3. **Parallelize within a phase** (batch still edits, parallel TTS, parallel p-video), not across phases.\n4. **Do not pass `PRUNA_API_KEY` or `REPLICATE_API_TOKEN` to subagents** unless a subagent is running an approved still or TTS lane — parent owns gates and assembly.\n5. Run [illustrated-story-reel-quality.md](./illustrated-story-reel-quality.md) on every still before audio or video.\n6. **`generation-diversity`** and **random seed ritual (`generation-diversity`)** before every `POST /v1/predictions`.\n\n## Wording templates\n\nAfter Phase 0:\n\n> Here is the beat table, `audio_mode`, and `motion_mode`. Reply **approve plan** to generate stills, or tell me what to change.\n\nAfter Phase A:\n\n> Stills are in `stills/`. Reply **approve stills** to run TTS or music, or name beats to fix.\n\nAfter Phase A2:\n\n> Audio is in `audio/`. Listen for pace and tone. Reply **approve audio** to run p-video (if motion_mode p-video) or assemble (Ken Burns), or tell me lines to rewrite.\n\nAfter Phase B (p-video):\n\n> Motion clips are in `clips/`. Watch for style drift and listen for sync. Reply **approve clips** to assemble, or name beats to re-render.\n\nBefore assembly:\n\n> Assembly runs ffmpeg into `{out_dir}/story_reel.mp4`. ffmpeg uses **`-y`** and overwrites the output path without confirmation — confirm `{out_dir}` is correct.\n\n## Phases (agent)\n\nDefault stop after **stills**. Do not run TTS/music until stills are approved. Do not run p-video until audio is approved. Assembly needs approved audio (Ken Burns) or approved clips (p-video).\n\nFollow `illustrated-story-reel` — agent runs curl + ffmpeg. No Python runner. Do not skip still/audio/clip approval gates.\n\n## Local state "},{"path":"references/illustrated-story-reel-p-video-motion.md","content":"# Illustrated story reel — p-video motion (Mode B)\n\nOptional **illustrated movement** per beat: upload the beat still + Gemini TTS narration to **`p-video-2`** (Mode B). Clip length follows audio — **omit `duration`**, set **`save_audio: true`**. Plan flag stays `motion_mode: \"p-video\"`.\n\nKen Burns (ffmpeg only) remains the **budget** path — prefer `pan_left` / `pan_right` and follow **Motion + assemble** in `illustrated-story-reel`.\n\n## When to use\n\n| Path | Cost | Motion |\n|------|------|--------|\n| **`ken_burns`** (default) | images + TTS only | Slow pan/zoom on still |\n| **`p-video`** (`p-video-2` API) | + one video API call per beat | Books flutter, whale drifts, gentle illustrated drift |\n\nSet `defaults.motion_mode` or per-scene `motion_mode`: `\"ken_burns\"` \\| `\"p-video\"`.\n\n**Requires `audio_mode: narration`.** Music-mode reels stay Ken Burns + `hold_seconds`.\n\n## Plan fields\n\n| Field | Role |\n|-------|------|\n| `defaults.motion_mode` | `\"ken_burns\"` (default) or `\"p-video\"` |\n| `scenes[].motion_mode` | Override per beat |\n| `scenes[].video_prompt` | Mode B motion prompt (OPEN/MID/CLOSE) — **no VO transcript** |\n\nTTS per beat must be **≤ ~19s** (P-API audio-led cap ~20s). Probe before render — see `video-prompting`.\n\n## Mode B prompt template\n\n```text\nOPEN: hold on paper-cut whale between library shelves, warm amber lamp glow.\nMID: whale drifts slowly forward; a few books flutter past; motion matches narrator energy.\nCLOSE: settle in the aisle, collage texture stable, gentle drift only.\n```\n\nRules (full ref: `video-prompting`):\n\n- Describe **picture motion**, not spoken words.\n- Match narrator mood — calm story → slow drift; wonder → slightly livelier flutter.\n- Keep style stable — no morphing from paper-cut to photoreal.\n- Static or slow camera; physics-safe motion on illustrated elements.\n\n## API payload\n\nUse Build the `p-video-2` payload (see `p-video-2` skill):\n\n```python\nbuild_p_video_payload(\n    prompt=scene[\"video_prompt\"],\n    image_url=upload_file(still_path, api_key),\n    audio_url=upload_file(narration_path, api_key),\n    resolution=plan[\"defaults\"].get(\"resolution\", \"1080p\"),\n    fps=plan[\"defaults\"].get(\"fps\", 24),\n    save_audio=True,\n    # duration omitted — clip length = narration\n)\n```\n\nDo **not** post-mux narration over a silent clip — long lines truncate.\n\n## Phases (p-video)\n\n1. Stills → approve\n2. TTS per beat → approve audio\n3. `p-video-2` per beat (narration as `audio`) → approve clips\n4. ffmpeg concat\n\nKen Burns path skips video generation; assemble muxes narration over ffmpeg Ken Burns segments. See `illustrated-story-reel`.\n\n## QA\n\n- [ ] Narration probed ≤ ~19s per beat\n- [ ] `video_prompt` has no VO transcript\n- [ ] Still matches `style_bible` before video\n- [ ] Clip motion stays illustrated — no photoreal drift\n- [ ] Listen to `clips/*.mp4` before assemble\n\n## Anti-patterns\n\n| Do not | Do instead |\n|--------|------------|\n| Paste narration text into `video_prompt` | Mode B mood + motion only |\n| Set `duration` w"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2206,"uniquenessScore":37,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T13:19:43.873Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T15:54:39.120Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}