story-to-video-workflow — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited story-to-video-workflow (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 4 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 5 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
generate_* here.Use this ladder unless the user skips, reorders, supplies refs, or asks for a rough direct render:
script-compose production script; existing screenplay -> capture/adapt.script-compose splits <=15s dialogue-aware shots and extracts characters, material variants, detailed locations/location variants, and speaker/VO needs.image-compose creates useful visual anchors: base/variant character sheets and detailed location/detail anchors.voice-compose creates reusable anchors for every speaker and VO/narrator.shot_id when sequence order is unambiguous, then hand off to Timeline.Plan ahead internally, but only ask the next meaningful user-facing choice; the Consent and gates ladder fixes when render path and dispatch become askable.
| Need | Load next |
|---|---|
| Script capture, rewrite, split, or analysis | script-compose |
| Character, location, storyboard, starting frame, or visual anchor | image-compose |
| Narration, dialogue read, character voice, or audio node | voice-compose |
| Clip render, continuation, audio refs, storyboard animation, or video prompt | video-compose |
| Scene/ref grouping or canvas layout frames | groups-compose |
Capability skills own CLI flags, node grammar, refs, and recovery hints. PROJECT_AGENT.md owns shared failure handling.
audio_result.data.text is source of truth only for approved final narration/line reads.video-compose includes spoken text verbatim and treats voice samples as timbre anchors.Follow the project PROJECT_AGENT.md § "Recommendation and choice shape". Recommend one concrete next step. Add a second option only when there is a real tradeoff.
Before recommending refs/video, inspect workflow.json when needed and summarize only:
If the story implies more than roughly 3 minutes, recommend narrowing scope before clip planning.
After shot notes, missing video-bound character/location/voice anchors are the default next step; include a rough-direct skip when speed matters. Once anchors/user refs/rough-direct are settled, offer only a short ref review or clip-plan confirmation if ambiguity remains.
Ask only after the script/shot plan is settled and anchors, usable refs, rough-direct, or a simple single-clip case make rendering real. If anchors are still missing, return to Planning checkpoint.
Use project choice shape:
RenderChoose render path.Straight to video (Recommended)description: Fastest path to motion.
Storyboard firstdescription: Generate storyboard images first for composition control.
For storyboard-first, load image-compose Pattern 6: one composite mosaic per clip/<=15s shot note, subtype storyboard.
Ask only after render path is picked and a multi-clip plan exists. Skip for one clip. Use project choice shape:
DispatchChoose clip dispatch.(Recommended).Hybriddescription: Chain within continuous scenes; render separate scenes independently.
Paralleldescription: Render all clips independently.
Sequentialdescription: Each clip continues from the previous one; boundaries default to a hard cut to a new angle (avoids the same-shot seam) — keep a boundary same-shot only for an unbroken oner.
Signals: continuous scene/state -> sequential (hard-cut handoffs between clips); a single unbroken action the viewer must read as ONE motion -> one ≤15s clip, else sequential with a same-shot handoff; separate scenes/time jumps/wardrobe changes/montage -> parallel; continuous clusters separated by hard cuts -> hybrid. Do not chain video refs across location, time, wardrobe/state, dream/reality, or montage breaks.
After terminal generate_*:
ok:false, follow project failure handling and do not advance the pipeline.ok:true, identify the landed node id from the result or canvas state.workflow.json if shots, refs, voices, clips, or reel order affect the next decision.Typical priority:
Timeline owns reel order. Numeric video_result.data.shot_id means a clip is in the reel. When all planned story clips are ready and order is unambiguous, assign shot_id = 1..N with one updateBatch before handoff:
node "$PAI_REPO_ROOT/server/cli/canvas_mutate.js" \
--op updateBatch \
--payload-json '{"updates":[{"id":"<video_1>","patch":{"shot_id":1}},{"id":"<video_2>","patch":{"shot_id":2}}]}'Do not use generate_video.js --shot-id for speculative/partial ordering. Assign after clips land. Local export uses reel_stitch.js only on explicit request. Then tell the user to open Timeline to inspect and preview.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.