Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add ahmedawan-oracle/fde_demo_builder/plugin install fde-demo-builderWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/ahmedawan-oracle/fde_demo_builder/new-film)<a href="https://agentmods.dev/commands/ahmedawan-oracle/fde_demo_builder/new-film"><img src="https://agentmods.dev/badge/commands/ahmedawan-oracle/fde_demo_builder/new-film/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/ahmedawan-oracle/fde_demo_builder/new-film"><img src="https://agentmods.dev/badge/commands/ahmedawan-oracle/fde_demo_builder/new-film.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00111 | $0.04694 |
| Opus 5.5 | $0.00044 | $0.01878 |
| Sonnet 5.5 | $0.00022 | $0.00939 |
| Haiku 4.5 | $0.00011 | $0.00469 |
Grade A, and why
new-film scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 16d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 172 lines — stays where its author put it; the contents beside it link to each section on GitHub.
This file is the shared Claude Code and Codex scaffolding specification. A Claude slash-command invocation
expands its project-name and plugin-root placeholders. When this file is read directly in either client and a
placeholder remains literal, take the project name and optional template from the user's request, then resolve
the plugin root as dirname(<absolute SKILL.md path>)/../... Execute the same brief, scaffold, build, and QA
requirements in either client.
Scaffold a new v5 film project named $0 from the FDE Demo Builder templates. --template <name> picks one of
the three film templates in step 2 without asking (30–45 s booth trailer · 90–150 s customer story · 60–120 s
feature walkthrough); without it, offer them and let the author choose or keep the Acme defaults.
- Choose the scaffold. Resolve the requested template (or the Acme default) before creating files. Template duration,
destination and angle are recommendations until the requester confirms them; inference is not an answer.
When the requester has delegated direction or supplied an autonomous brief, make reasonable documented choices
from that brief. For a cinematic/kinetic story, read
references/story-film-recipe.mdand use the base scaffold; do not force the calm customer-story template. The recipe is a treatment, not another--templateoption. - Create
$0/in the current working directory (stop politely if it already exists; never overwrite). - From
${CLAUDE_PLUGIN_ROOT}/skills/demo-video-builder/scripts/film/copy into$0/:vo_script.example.py→vo_script.py·clips.example.json→clips.json·film.example.json→film.json·qa.example.json→qa.json·claims.example.json→claims.jsontemplates/seams.example.json→seams.json·templates/captions.example.json→scenes/captions.json·templates/captions_overrides.example.json→captions_overrides.json(if present) ·templates/BRIEF.example.md→BRIEF.md·templates/STORYBOARD.example.md→STORYBOARD.md·templates/design.example.md→design.md(do NOT copytemplates/media.example.jsonl;ledger.py adoptwrites the real one)- the film templates in
templates/films/(booth-trailer · customer-story · feature-walkthrough; each has a README, STORYBOARD skeleton,seams.json,captions.json,clips.json,film.json,skin.json): copy the one named by--template(or chosen when offered) over the defaults —STORYBOARD.md,seams.json,scenes/captions.json,film.json,clips.json, and itsskin.jsonasfilm.json → "skin". Never overwrite a completedBRIEF.md. These are planning skeletons, not alternate rendered Acme scenes: after selecting one, rewritevo_script.pyandscenes/shots.jsso their phases and visual ids implement that template before rendering. Do not call a selected template render-ready merely because its brief and storyboard validate. extract_clips.py,render_frames.js,build_film.py,qa_film.py,check_cues.js,export_timeline.js,make_sample_recording.py(unchanged)film.example.html→scenes/film.html·shots.example.js→scenes/shots.jslib/*.js→scenes/lib/(all of them: grammar, timeline, footage, camera, seams, captions, overlays, blocks, vfx, motion, typo, shaders, title3d, blocks2, light, depth, annotate, glass, reveals, stage, charts, compare, cursor, hud, reel)gates/*.py→gates/·tools/*→tools/·audio/*.py→audio/·skins/→skins/·studio/→studio/
- From
${CLAUDE_PLUGIN_ROOT}/skills/demo-video-builder/scripts/copygen_vo_multivoice.py,tts_providers.py,credit.pyandrequirements.txtinto$0/. 3a. Brief before any pixel. The copiedBRIEF.mdis a fictional example, not a record of requester answers. If the request names no angle, run the pitch round: five tellings (the subject's world · the emotion · the audience met or broken · the anti-pattern inverted · an unusual format), three lines each, at least two unlikely ones, all five before a recommendation; mixing is an answer; one round. For a delegated/autonomous brief, instead choose an angle, fill unanswered creative fields under## Inferred, and record the reasons without starting another questionnaire. This never substitutes for authorization or a human sign-off that was explicitly required. Otherwise fill the brief one field per message, recommended option first with its receipt; skip fields the request already answered. Reconcile the chosen template's suggested duration and destination here, put defaults only under## Inferred, and hand off with STATED and INFERRED as two groups. Add the## Never on screenlist (customer and colleague names the recording may show — the leak gate fuzzy-matches them).python tools/brief.py BRIEF.mdmust print BRIEF OK; do not proceed while required answers remain open. - Create empty
$0/broll/,$0/vo/,$0/out/,$0/music/,$0/golden/; runpython tools/ledger.py adoptinside$0/. Afterpython tools/brief.py BRIEF.mdprints BRIEF OK, runpython tools/brief.py BRIEF.md --seed-qa --write. Append to the project.gitignore:events.jsonl,*.events.jsonl,leaks.json,out/,audio/sfx/. - Install once inside
$0/:npm install --prefix . puppeteer gsap three d3-delaunay(the explicit prefix prevents npm from silently hoisting into a parent workspace; scenes load the three libraries from$0/node_modulesby relative browser paths — a parent/hoisted install is not visible tofile:scenes; never use a CDN) andpip install -r requirements.txt(edge-tts, Pillow, numpy and scipy — scipy is a hard dependency of the SFX synth, the voice chain, cursor tracking, idle detection and the leak gate's avatar detector; +pip install winocron Windows — the preferred OCR engine there, 60–100× faster than the bundled model at equal recall — orrapidocr-onnxruntime opencv-python-headless onnxruntimeelsewhere, to enable OCR in the leak gate).python tools/doctor.pyconfirms ffmpeg, node, Chrome, the Python modules (scipy included), the node libs and the GL path. - Print the flow as the next steps:
- Try it first (untemplated Acme default):
python make_sample_recording.pycreates a fictionalrecording.mp4; the default example config renders it end to end and passes every gate. A selected--templatereplaces the plan, seam and clip vocabulary; finish itsvo_script.pyandscenes/shots.jsadaptation before trying to render it. - References.
python tools/ref_study.py log --title "…" --shot "len|camera|lighting|cut" …for the films this one resembles (craft only — logos, taglines and copy are refused),measure <film.mp4>for the ones you have,report→REFERENCES.mdwith the shot-length, rhythm, luma and contrast bands the storyboard is written against. - Look pass. Pick a skin from
skins/README.md(open its sheet inskins/sheets/) or extract one from a logo:python tools/brand_kit.py extract --logo assets/logo.png --bg dark --mood corporate --name $0 --out skin_tokens.json --sheet out/style_sheet.png. Look at the sheet; setfilm.json → "skin";python tools/brand_kit.py check <skin>;python tools/skin_apply.py skins/<name>.jsonwritesscenes/skin_data.js(and the head-fade plate for light skins). If the look is wrong, change the skin, not the scene. - Storyboard. Edit
STORYBOARD.md(one beat per idea,real: recorded|recreated|placeholder,chapter:on the beats that open a chapter;start:andend:— the first and the last frame in one sentence each,end:mandatory on recreated beats;hold:on recreated beats — the fraction after which only the background moves, ornone (reason); the beats must add up to the narration);python tools/storyboard.py check STORYBOARD.md;python tools/storyboard.py sheet STORYBOARD.md→ openout/storyboard.html, revise only the cells that change;sheet --mobile --out out/storyboard_mobile.htmlfor a phone review (one column, tap to zoom). - Lock. Write
## Locked. The sketch pass is the default stop;build_film.pyruns only after the lock (--autonomousfor a drive-it run). - Seams before shots.
seams.json: one row per cut, every ordinary seam on the current (LEFT), at most one reserved vector per act, at most onetype: glaccent per act (dur≤ 0.5 s, never between two product screens). - Narration.
python gen_vo_multivoice.py→ narration + word timings (the clock). - Footage. Record with telemetry when you can:
python tools/record_events.py capture --out events.jsonl(F8 clap, F9 stop), thenalign --video recording.mp4. Old tape:python tools/cursor_track.py recording.mp4 --sheet out/cursor.jpg(a proposal — read the sheet).python extract_clips.py→ real-pixel clips;python tools/ledger.py adoptagain; for music / fonts:python tools/ledger.py add <path> --kind music --licence "…" --licence-url … --commercial-ok yes. - Proposals you accept in the storyboard.
python tools/camera_from_events.py events.jsonl --out out/camera_auto.json(push / hold / pull on the 1.0 / 1.35 / 1.6 / 2.0 ladder; pastemoves_jsintoshots.js);python tools/idle_detect.py recording.mp4 --t0 W0 --t1 W1 --js scenes/idle.js --clip <clip> --sheet out/idle_<clip>.pngper seq clip (cuts, ramps, caret follow — wireIDLE.<clip>.proposals.mapinto the shot'splay). - Cut list. For every footage shot that plays real motion, one text row (clip, length, start, speed, reverse):
python tools/cutlist.py resolve cutlist.txt --auto-window --fit(the window with the most motion; speed to the slot, never trim it; a short clip holds its end state) →emitwritesscenes/cutlist_data.js; inshots.js:play: Object.assign({ at: <cue> }, CUTLIST.<clip>);check --check-lengthbefore the build. - Pilot a look. Two skins or two choreographies:
python tools/pilot.py scenes/film.html "scenes/film.html?skin=cobalt" --shots 3-6→out/pilot.mp4(A over B on one clock) — pick one as a cut, write why in## Decisions. - Build the scene. Devices by moment:
references/picture-doctrine.md. A shot may carry its contract:spec: { forbidden: [...], claims: [...], references: [...] }(gates/spec_gate.py reads the rendered frames). Every number a block or chart shows is aclaims.jsonvalue; marks sit on a claim figure or a logged click. Declare the holds:FILM.holdsfor the recreated segments,hold:on a footage shot that ends settled, never on a footage match-cut (references/hold-doctrine.md). - (with a bed)
python audio/beat_grid.py <bed> --out out/beats_film.json;python audio/carve_bed.py vo_film.mp3 --bed <bed> --bed-db -12prints which bands the carve takes — keep"carve": true. SFX:python audio/sfx_synth.py --out audio/sfx, thensfx_place.py/envelope.pyrun from the build. The word guard drops a transient within 0.15 s of a spoken word; a sync point that must land anyway carries"force": true(reported asforced: true, still counted bysfx one impact). Chapters:"chapters": truemerges automatically for films under 60 s ({"merge": "auto"}; settrue/falseto override) — a 35 s trailer gets one chapter, not six. - Customer/industry proof and localization. For a prospect-specific or generic industry story, follow
references/customer-proof-film.mdand, for a kinetic treatment,references/story-film-recipe.md: measure references for craft only, choose the calm or kinetic treatment, and map every setup claim to later product proof. When localization is requested, emit and complete the source-locked caption template, setcaptions.translationwithcaptions.burn:false, and exportburn_ass; keep the narration clock and product footage unchanged. node check_cues.js scenes/timing_film_data.js scenes/shots.js scenes/film.html seams.jsonnode scenes/lib/camera.js --curves scenes/timing_film_data.js scenes/shots.js broll/clips.js— fix every FAIL.- Studio.
python tools/studio.py→ http://127.0.0.1:8765 : scrub, frame-step, hot reload at the same t; T taps a 1920x1080 still through the real renderer (out/taps/), Q runs the quick lint. Iterate here; render once. - Build + QA.
python tools/doctor.py→python build_film.py(plan → preflight → render on software GL → mix → master → captions → credit → ledger → exports → truth pass) →python qa_film.py(--profile=picturefor the fast set,fullfor every gate) →python tools/timeline.py. On aleaksFAIL:python tools/mask_propose.py leaks.json --verify, then--apply, re-extract, re-run. - Frame pairs.
python gates/snapshot.py --pairs out/<film>.mp4→out/pairs/pairs.jpg(START | END per segment; aSTATICpair never moved);python gates/pair_gate.py .— anchors within 2 px, no unplanned word, no unnamed newcomer. - Takes. Every build is a take:
python tools/takes.py list | time;annotateafter QA;prune --after-lockonce the plan is signed off. A later change ispython tools/cutlist.py bump v3.txt v4.txt --replace 'old=new' --previous-film out/<film>.mp4, a render, andpython gates/identity_gate.py . out/<film>_v3.mp4to prove the rest unchanged. - Review pack.
python tools/review_pack.py build --project . --film out/<film>.mp4→ sendout/review/index.html→ Approve start / Approve end per beat (END first — it is the frame the next cut lands on; onceapprovals.jsonexists the build refuses while an END is unapproved) → resolve comments →python tools/review_pack.py --lock --by "Name"; thereview lockgate passes after that. - Whole-cut notes. After the shared reviewer's whole-cut pass:
python tools/review_notes.py import notes.txt(each note snaps to the nearest cut / seam / shot boundary) →decide N --accept|--reject --why "…"→ the table lands inDELIVERY.mdwith the share pack. Rejections are kept on purpose. - Sound proof. After the build
cue sync(sfx_gate) locates every SFX in the finished audio;python audio/cues_check.py --cues out/cues_film.json --film out/<film>.mp4prints the per-cue offsets.--shutter 240onrender_frames.jsonly when a push or slide should smear like a camera (default off). - Export.
python tools/export.py --preset linkedin,booth_loop,youtube,share_pack(--closure hardcutwhen the film opens and closes on the same composition — the score and the fallback are recorded); vertical / square cuts follow the camera:node scenes/lib/stage.js --reflow 9:16 --track out/camera_curves.json --total <END> --out out/stage_reflow_9x16.jsonthen--preset vertical_9x16 --reflow out/stage_reflow_9x16.json. - After the first reviewed build:
python gates/snapshot.py scenes/film.html --updatefreezes golden frames. Then run the shared reviewer specification on the final MP4 (Claude agent; Codex separate no-edit pass). - Render notes: the default is software GL (frames identical on every machine; a DOM shot in 80 ms);
RENDER_GL=hardwareis for previews only — never mix the two in one film. Scenes with a 3D title render with"workers": 1.
- Try it first (untemplated Acme default):
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 16d ago Changed · +29 lines · +3 tokens per session 88047c162f73
- 28d ago Changed eda71fdb28cd
- 1mo ago Changed · +98 lines · +58 tokens per session d866340d5581
- 1mo ago First seen · 45 lines · 50 tokens per session scan A f27419d51133
new-film is a command published in the GitHub repository ahmedawan-oracle/fde_demo_builder (9 stars, last pushed 17d ago), licensed MIT. It adds 111 tokens to every session and 4,694 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-28.
new-film compared with commands from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| new-filmahmedawan-oracle/fde_demo_builder | Command | 9 | 17d ago | MIT | A | 111 | Claude Code |
| checklistgithub/spec-kit | Command | 148k | yesterday | MIT | A | 13 | Claude Code |
| clarifygithub/spec-kit | Command | 148k | yesterday | MIT | A | 27 | Claude Code |
| specifygithub/spec-kit | Command | 148k | yesterday | MIT | A | 13 | Claude Code |
| analyzegithub/spec-kit | Command | 148k | yesterday | MIT | A | 26 | Claude Code |
| convergegithub/spec-kit | Command | 148k | yesterday | MIT | A | 35 | Claude Code |
| implementgithub/spec-kit | Command | 148k | yesterday | MIT | A | 14 | Claude Code |