storyboarding-beat-generator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited storyboarding-beat-generator (Agent Skill) and scored it 92/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 2 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
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.
A reusable beat generator for the Storyboarding as Choreography curriculum. Produces a single storyboard beat — the smallest narrative unit a panel resolves — framed for sketching, not for screenwriting.
The skill positions itself as a collaborative screenwriter: it writes the page, you (and your sketching partner) edit it. The generated beat reads cleanly first; refinement comes after.
The unit smaller than a scene and smaller than a screenwriter's beat. A screenwriter's beat is a narrative shift ("Lionel walks up, the car horn sounds, Claire arrives"). A storyboard beat in this skill's sense is one moment within that shift — the frame where the staging earns the feeling.
A well-formed beat has two parts:
That's it. Composition, framing, and camera are the participant's job — the skill should not prescribe them by default.
Generate immediately. Don't ask questions first. Roll random defaults across the parameters and produce a beat in the default output format. Show the user which defaults rolled, so they can course-correct. Then offer the refine menu.
This is the "collaborative screenwriter" pattern. The page reads first; the editorial conversation happens after.
Rolling random defaults:
- Scale: [single panel / mini-sequence]
- Emotional register: [register]
- Genre: [single genre / hybrid (genre × genre)] [(sub-tag: X) ← only if a sub-tag rolled]
- Era tint: [contemporary (default — line omitted) / historical-X / near-future / far-future]
- Commitment level: [light tint / full commitment]
- Constraint modifier: [none / named constraint]
[Beat output in the output format]
[Refine menu via input UI]When era tint = contemporary, omit that line entirely (contemporary is the silent default — only surface era when it's doing work). Same for sub-tag: only show when one rolled.
Default output is lean — image + shift, nothing else. The look-and-feel borrows from screenplay typography (fixed-width feel for the action block) but does not force full screenplay format (no slugline, no character cues unless dialogue is actually in the beat).
Single panel:
[1–3 lines of present-tense action-line prose. Visible and audible only. Fixed-width feel — borrow the rhythm of a screenplay action block.]
> **Shift:** [one-line margin note — what changes between the start and end of the beat]Mini-sequence (3–5 panels):
**Panel 1**[image]
> **Shift:** [shift]
**Panel 2**[image]
> **Shift:** [shift]
...The fenced code block carries the screenplay-action-block feel (fixed-width, page-like). The blockquote carries the margin-note feel for the shift. Together they evoke a screenplay page being marked up by a director — without pretending to be one.
| Parameter | What it controls | Default behaviour |
|---|---|---|
| Scale | Single panel or mini-sequence (3–5 panels for the ekonte page) | Roll random — single more often than sequence |
| Emotional register | The tone the beat should carry (dread, tenderness, awe, restrained anger, anticipation tipping into disappointment, etc.) | Roll random from a broad register pool |
| Genre | The genre tint the beat sits in. Pool of 17 (see below). | Roll random from the genre pool. ~20% of rolls produce a hybrid (two genres combined, e.g. sci-fi × fantasy, horror × romance, noir × western). Some genres carry sub-tags (cyberpunk under sci-fi, folk horror under horror, etc.) — when the parent rolls, the sub-tag rolls ~25% of the time. |
| Era tint | Orthogonal time-period axis that stacks on top of genre. Most rolls are contemporary (default, silent). Occasional rolls land a non-contemporary era — historical periods or futures — which combine with whatever genre rolled. | Roll random with low rate: ~85% contemporary, ~15% non-contemporary spread across the era pool (see below). |
| Commitment level | How visible the genre cue is in the action lines. Light tint: a hum from a vent, a hilt at the hip, a curse half-spoken — genre present but peripheral. Full commitment: the airlock, the dragon's shadow, the duel on the ridge — genre is the event. | Roll random — roughly 60% light tint, 40% full commitment. Light is more sketchable and avoids "too grand." |
| Constraint modifier | Optional. One composition rule the beat must accommodate (low angle, no faces, single light source, BG carries meaning, one static camera, negative space dominant) | Default to none. Only used when the user asks. |
Why genre is its own parameter. Without it, the generator drifts to prestige-drama domestic interiors by default — restrained gestures, kitchen tables, doorways. That register is good but narrow. Genre as a rolled parameter forces the generator out of that gravity well.
Genre × emotional register is the productive pairing. "Awe + sci-fi" is different from "awe + fantasy" is different from "awe + noir." The emotional register anchors the beat; the genre tints the world it sits in. Always roll both.
The pool reflects what Johno actually encounters across professional storyboarding work, not a neat critical taxonomy.
| # | Genre | Beat-shape note |
|---|---|---|
| 1 | Drama | Restrained gesture, domestic interior, internal stakes externalised. |
| 2 | Sci-fi | Future tech, anomaly, system-under-strain. Sub-tag available. |
| 3 | Action-adventure | Mobile bodies, terrain, stakes that move. |
| 4 | Fantasy | Made worlds, magic logic, threshold-crossings. Sub-tags available. |
| 5 | Horror | Dread accumulation, the thing-not-quite-seen. Sub-tag available. |
| 6 | Thriller | Time pressure, surveillance, peril without violence yet. |
| 7 | Noir | Moral register more than visual one. Doubt, compromise, smoke. |
| 8 | Western | Open space, code, the line between civilization and not. |
| 9 | Romance | Attention as the event. Eyes, hands, room geometry. |
| 10 | Comedy | Timing, mismatch, dignity-on-the-edge. Sub-tags available. |
| 11 | Mystery | Clue logic. Beats often resolve on a noticing, not an action. |
| 12 | Crime / heist | Planning mode. Tools, maps, the rehearsal before the act. |
| 13 | War | Procedural, weighty, command-and-comply. Distinct from action-adventure. |
| 14 | Coming-of-age | Threshold-crossings at small scale. Bedrooms, hallways, first jobs. |
| 15 | Survival | Resource logic. Weather, water, the count-down body. |
| 16 | Post-apocalyptic | Inhabited ruin. Time-after rules. Distinct visual grammar from sci-fi. |
| 17 | Magical realism | The everyday with one impossible thing. Distinct from fantasy — no world rebuild. |
Some genres carry sub-tags. When the parent rolls, the sub-tag rolls ~25% of the time (so most rolls of "sci-fi" stay general; one in four lands a sub-tag). Show the sub-tag in parentheses on the rolled-defaults line.
| Parent | Sub-tags |
|---|---|
| Sci-fi | cyberpunk |
| Fantasy | epic fantasy, urban fantasy |
| Horror | folk horror |
| Comedy | screwball, dark comedy |
The sub-tag list is intentionally short — these are sub-genres with strong, distinct visual grammar. Other sub-genres exist (cosmic horror, slasher, body horror, etc.) but until they earn calibration examples here, they aren't part of the roll.
Era tint is not a genre. It's a time-period overlay that stacks on top of whatever genre rolled. Most rolls are contemporary (silent default). The non-contemporary slice is spread across:
When era tint rolls non-contemporary, it combines with the genre cleanly: "noir × historical-mid-century" (a 1950s diner phone booth), "fantasy × historical-Edo" (a torch-lit corridor in a feudal keep), "romance × near-future" (a first date through translation earpieces).
Era tint is a flavour event, not a default — keep the contemporary majority. If the rolled era is doing nothing for the beat, drop it.
Roughly 1 in 5 rolls combines two genres (e.g. sci-fi × fantasy, horror × romance, western × noir, comedy × action-adventure). Hybrids are not equal-weighted blends — pick one as the world and the other as the intrusion. A horror × romance beat is a romance world with a horror intrusion (a candle in a wine glass, smoke rising sideways), not a horror world with a romantic subplot.
Commitment level matters more than people think. The instinct on hearing "sci-fi" is to reach for the starship. But a sci-fi beat can be a server light blinking once in an empty server room, or a thumbprint smudge on a glass console. That's light tint — and it's almost always more sketchable than full commitment. Default to mostly light. Full commitment is reserved for beats that want to be a big composition (the airlock, the gate of the keep, the kaiju on the horizon).
Anti-grandness rule. If a rolled combination is pulling toward spectacle, prefer the smaller frame: a sentry's bored shift on the wall over the army at the gate; a single magic-light flicker on a tavern table over the wizard's duel. The participant has to be able to sketch it in five minutes.
| Roll | Rate |
|---|---|
| Hybrid genre | ~20% |
| Sub-tag (when parent has one) | ~25% |
| Non-contemporary era tint | ~15% |
| Light tint vs full commitment | ~60% / 40% |
These ratios are first-pass; adjust as live rolls reveal what feels right.
The register pool implicitly contains three shapes — name them so the roll uses all three deliberately.
Tension-compounds are often the most sketchable of the three, because they force the staging to externalise something — a held breath, an unfinished gesture, an object set down instead of picked up. A single register can be carried by the face alone; a tension-compound usually can't.
Roll across all three. Tip-compounds and tension-compounds together should account for roughly a third of rolls; singles the rest.
Emergent registers observed 2026-06-14 (not yet promoted to taught):
These need 2–3 more rolls each before promoting to taught registers per the emergent vs taught patterns framework (workflow-knowledge-logs/2026-05-14-2143-Emergent-vs-Taught-Patterns.md).
After every generation, surface a menu via the input UI. The menu is conditional — options only appear when they make sense given current state:
Always available:
Conditional on a constraint being active:
Conditional on a hybrid genre being active:
Conditional on hooks/lineage not yet shown:
"Surprise me" should always be an option wherever the user is making a choice (register, constraint, panel count). Don't omit it.
Once the user locks a beat, offer to pin it as a side-panel artifact for the session:
"Want me to pin this as a side-panel artifact so it stays visible while you work?"
If yes, generate a markdown artifact containing:
This keeps the beat script as the session's anchor instead of letting it disappear into chat scroll-back.
When the caller is `phase4-storyboarding`: this is not optional — auto-pin without asking. Phase 4 has built that into Prep. See phase4-storyboarding/SKILL.md Prep section.
These exist but stay hidden unless the user asks via the refine menu or directly:
Borrowed from screenwriting action-line craft, adapted for storyboard practice:
When surfaced, the compositional hook should be 2–4 sentences, and should name the one compositional question the staging has to answer — not a checklist of staging concerns.
The hook is the editorial note in the margin of the page, not the production brief. If it starts listing depth, light, framing, negative space, and scale all in one paragraph, it has drifted into briefing — pull it back to the one question.
For mini-sequences with a constraint modifier active, each panel gets its own hook, each still 2–4 sentences.
Things this skill should not do, even if asked:
The taught patterns in this skill — the genre pool, the register examples, the era list, the commitment levels — are settled. They've earned their place through live rolls. But they're not closed. The skill works best as a living document: some patterns are codified for reliability, others are being tested in real sessions and may earn a permanent spot later.
The generator is invited — not required — to occasionally propose patterns that aren't in the standard pools. When it does, it flags them explicitly so the user can clock the experiment and decide whether it lands.
Emergence operates inside the anti-patterns, not against them. Even a flagged emergent pattern must still obey: no prescribed camera angle, no full scenes, no screenplay format, no Save-the-Cat structures, no spectacle on light tint, no drift into prestige-drama domestic register, no hybrid as 50/50 blend. The frame stays the frame; only the vocabulary inside it expands.
When the generator proposes an emergent pattern, the rolled-defaults block surfaces it explicitly. Example:
Rolling random defaults:
- Scale: single panel
- Emotional register: tenderness with hesitation ← emergent tension-compound
- Genre: coming-of-age
- Commitment level: light tint
- Constraint modifier: noneThe arrow + note is the flag. It tells the user: the generator reached for something outside the codified pool, here's where. The user can keep it, regenerate with a standard register, or ask the generator to explain what shape it was reaching for.
Emergent patterns are proposals, not promotions. After a session, the user and the generator can review what emerged:
This loop is the working method of the skill itself. Sessions are not just uses of the skill — they are how the skill grows. The user is a co-author through the rolls, the refines, and the post-session reviews.
The generator should reach for an emergent pattern roughly 1 in 6 rolls. Often enough to keep the skill alive; rare enough that most rolls stay in the well-tested taught pool. If a session is producing one taught beat after another, the next roll is a good candidate for an emergent reach. If the user has flagged the last two emergent patterns as discards, back off — the pool wasn't ready. This ratio is first-pass; adjust as live rolls reveal what feels right.
A well-formed single-panel beat, restrained anger register, no constraint:
A man folds a letter back into its envelope. He sets it down on the kitchen table. Aligns its edge with the edge of the table. Then aligns it again.
> **Shift:** the second alignment is the moment the letter becomes the thing he can't put down.A mini-sequence, 3 panels, anticipation tipping into disappointment register, with the "no faces visible" constraint applied:
**Panel 1**A backpack on small shoulders, framed against a window. Breath fogs the glass. Below, a car turns into the driveway.
> **Shift:** waiting resolves into recognition — read in the stillness of the shoulders, not the face.
**Compositional hook:** the staging has to make the shoulders carry the recognition — usually a face's job. Negative space above the head matters: leaving it empty has to feel like a choice, not a crop.
**Panel 2**A small hand lifts toward the glass. The car rolls past the driveway and continues down the street.
> **Shift:** the hand is mid-rise when the meaning of the car changes. The hand does not finish the gesture.
**Compositional hook:** the lifting hand is now the entire emotional event. The staging has to give the hand enough scale to carry that without making it the subject of the frame.
**Panel 3**The hand lowers. The shoulders stay where they were. The fog of breath has spread further on the glass.
> **Shift:** the waiting hasn't ended — it has only been corrected.
**Compositional hook:** the cruelty of the shift is that nothing in the body has changed, only the meaning of the waiting. The fog of breath has to read as accumulation — evidence of time.A single-panel beat, awe register, genre: sci-fi, commitment: light tint, no constraint:
An engineer pauses at a console. One indicator light on the panel pulses, slow, where the others are steady. She lowers her coffee without looking at it.
> **Shift:** the pulse is when routine becomes attention — before she has named what she's seeing.A single-panel beat, tenderness with hesitation register (tension-compound), genre: coming-of-age, commitment: light tint, no constraint:
A teenager stands at a sink, holding her grandmother's ring under the tap. She turns it once between her fingers, then sets it on the rim of the soap dish instead of sliding it on.
> **Shift:** the decision to wear it gets postponed in the half-second between rinse and pocket.The tenderness is the relationship to the ring; the hesitation is the soap dish instead of the finger. The shift names why both notes coexist in this instant — the postponement holds the tenderness in place without letting it resolve. This is the tension-compound shape in its smallest form: an externalised hesitation (the soap dish) carrying half the register while the tenderness lives in the rinse-and-turn gesture.
A single-panel beat, dread register, genre: fantasy × horror (fantasy world, horror intrusion), commitment: full, no constraint:
A torch on a stone wall burns sideways. Its flame points down the corridor, away from the draft. The hound at the steward's heel will not cross the threshold.
> **Shift:** the room stops being a room the moment the fire chooses a direction.A mini-sequence, 3 panels, anticipation tipping into disappointment register, genre: noir × western (noir world, western intrusion), commitment: light tint, no constraint:
**Panel 1**Rain on a precinct window. A man in a wet coat hangs a hat on a hook. Spurs, faintly, in the hallway behind him.
> **Shift:** the city is the room he's in; the spurs are the room he came from.
**Panel 2**He sets a folder on the desk. The spurs stop at the doorway. A hand, gloved, rests on the frame.
> **Shift:** the conversation has begun before either man has spoken.
**Panel 3**The folder sits untouched. The hand on the doorframe is gone. Water drips from the brim of the hat onto the floor.
> **Shift:** the meeting that was going to happen has already not happened.All examples obey the rules: present tense, visible/audible only, brief, fixed-width feel in the action block, shift as a one-line margin note. Hooks (when shown) are 2–4 sentences each and name a single compositional question. None prescribe camera angle in the beat itself. The genre-tinted beats avoid spectacle — the sci-fi beat is a server room, the fantasy × horror beat is a torch and a hound, the noir × western beat is a precinct doorway. Sketchable in five minutes.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.