product-demo-director
Skill38 starsChanged 4 months agoMITView on GitHub
Turn product evidence, narration, and footage into a single-focus announcement, dramatic Save-the-Cat, causal investor, sales, or short-form demo with narration-safe cuts, exact-frame deterministic QA, and an advisory AI judge loop.
- Reads credentials
- Installs packages
1 other project uses a version of this.
Adopted by
Most recently taken up by
- SkillMedev/motion-video-directiontheir own version, first seen Oct 5, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- SkillMedev/motion-video-direction★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. About 0 are common, 9 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
Before writing narration, choose the buyer's question and the recorded change that answers it.
- Very specific: line 27
When reconstructing an existing case with native product components, declare visualTreatment: "replay", liveState: false, and a …
- Very specific: line 41
When the ask is a launch, brand or "slick, punchy, studio-level" ad rather than a footage demo, use the motion-graphics track: read …
- Distinctive: line 60
Not for: editing arbitrary cinematic footage, or anything where you don't control the shot list.
- Very specific: line 202
After repeated in-point/zoom/pacing changes fail to resolve the same note, revisit the narration, story structure, or capture.
- Very specific: line 211
Use connected camera moves when the viewer needs the relationship between an action and its result.
- Distinctive: line 232
If the complete unit cannot fit, choose a smaller complete unit or recapture a responsive layout with larger UI.
- Very specific: line 310
When a shot has vo, the on-screen caption defaults to that exact line.
- Very specific: line 313
Use narration.fromMap=true plus exact narrationMap[].text and shotN for a generated master.
- Very specific: line 314
When production.autoPaceNarration=true, configure ELEVENLABS_API_KEY: ElevenLabs character alignment fills the cue times, then pace.py …
- Very specific: line 324
Keep one continuityId in one clip while the same screen and action continue.
- Distinctive: line 363
Choose one causal unit of work: Follow input → evidence → hypothesis → test → result → bounded decision → durable outcome.
- Distinctive: line 369
Escalate with a falsifiable test: When one signal is inconclusive, show what evidence would change the decision, run the lowest-friction …
- Distinctive: line 378
One spoken action per visible step: Use language a real operator would say, not an inventory of capabilities or API-like status prose.
- Distinctive: line 381
Pace by meaning: Remove inert time, but retain the setup and decision holds that make the causal story legible.
- Distinctive: line 394
Be honest: Only verified claims; neither invent autonomy nor add unnecessary human gates.
- Distinctive: line 395
End once: After the operational payoff, show only necessary proof, one fresh forward-looking state, and one CTA.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Product Demo Director
Give it product evidence, footage, and a JSON production contract. It can make a single-focus announcement film, a dramatic Save-the-Cat product story, or a continuous causal product film, with per-shot TTS, one continuous generated performance, or one locked human narration master. It binds every render to source hashes and integer frame boundaries, runs deterministic delivery QA, then lets a Gemini judge review story and taste.
Before writing narration, choose the buyer's question and the recorded change that answers it. Inspect the strongest proof at delivery size, then build the shortest causal path to it. Preserve the initiating action and enough settled time to read the result. If the footage cannot support the intended claim, capture the missing evidence or narrow the claim; a zoom cannot supply it. Compare narrated quantities and absolute wording with the actual counts and limitations in the filmed evidence. A source reference or an approved claim label does not resolve a visible contradiction.
Plan native capture density against the largest delivery-frame magnification, not only the
phone preview. A 1080p export does not make a twice-enlarged 1× screenshot HD. Use captureScale
2–4 for product footage that needs close-ups; retain that raster through normalization. Inspect
thin glyph strokes at 100% and check the small-screen composition separately. A complete panel
can be sharp yet too small to understand.
When reconstructing an existing case with native product components, declare
visualTreatment: "replay", liveState: false, and a replayProvenance manifest listed in
production.sourceManifests. Label the reconstruction visibly. Bind the frozen data and the
matching product revision: updated business logic can change historical counts even when the
packet is identical. Never portray a replay as a fresh recording or a new recorded decision.
For a centered composition, opt into direction.align: "center" and place the complete product
unit on a symmetric screenRect (x + width / 2 = 50). Keep one clear reading axis and reserve
separate space for the product, the buyer's question, and a concise readout. The story should
connect the pain to an observable workflow and its bounded outcome; centered decoration alone
does not explain the product.
Motion-graphics films (no footage)
When the ask is a launch, brand or "slick, punchy, studio-level" ad rather than a footage demo, use the
motion-graphics track: read docs/MOTION_GRAPHICS.md completely, then follow its method in order.
Style frames first: design 2 to 3 contrasting directions as stills (hook, proof, close), show them, and
animate only the direction the founder picks. Build with motion/kit.js (hits pop(), flows glide(),
measured callout(), colour-block sceneWipes()), keep a locked scene timeline for music and cues, and
deliver through tools/motion.py all (motion-blurred render, mix, QA). Study
examples/motion-pdd-self/ before designing: it is the worked example. Never fall back to busy
product screenshots, a TTS narrator, AI-generated footage, or generic dark/light UI themes for this track.
The motion engine is a single props-driven Remotion composition, so one pipeline renders many cuts (teaser, walkthrough, race, full demo) from the same assets.
When to use
- Producing a launch announcement, dramatic Save-the-Cat product story, causal live-product demo, or sales walkthrough.
- Re-cutting one set of footage into multiple lengths/formats.
- Narration-locked investor demos where exact claims, frames, continuity, and source framing matter.
Not for: editing arbitrary cinematic footage, or anything where you don't control the shot list.
Setup (once)
cd engine && npm install && cd ..
python -m venv .venv && . .venv/bin/activate && pip install -r tools/requirements.txt
playwright install chromium # only if you use tools/capture.py
export GEMINI_API_KEY=... # judge (gemini-3.1-pro-preview) + non-auto-paced Gemini TTS + Lyria 3.5
export ELEVENLABS_API_KEY=... # required for auto-paced narration maps; also VO + musicNew announcement scaffolds use narration.fromMap=true and production.autoPaceNarration=true;
they require ELEVENLABS_API_KEY because pace.py consumes ElevenLabs character timestamps.
With only GEMINI_API_KEY, vo.py still speaks non-auto-paced and legacy scripts through Gemini
TTS (--provider gemini, voice via gemini_voice/tts_direction), while music.py composes
through Lyria 3.5 and judge.py can review the final cut. ElevenLabs is selected automatically when
its key is present.
Run the pipeline
A project is a folder with script.json + an assets/ dir of clips (and, ideally, a
brand.json and a product.json). Start one with
./pdd new projects/my-demo --name "My Product". The source-only
examples/save-the-cat/ project documents how this repository created its own announcement; its
generated media remains ignored. The first three steps below onboard a brand, let the director
capture footage, and draft the script from the product brief:
# 0a. ONBOARD — auto-extract the brand (palette/font/logo) from the product site, confirm, write brand.json
python tools/onboard.py --project projects/my-demo --url https://yourproduct.com # or --template / --manual
# 0b. SHOOT — the director records the footage itself -> assets/<name>.mp4 (web app and/or terminal/CLI)
python tools/shoot.py --project projects/my-demo # reads shoot.json
# (one-shot web: python tools/shoot.py --url https://app.x.com --goal "tour it" --out assets/web.mp4)
# For a Claude/Codex-operated product, turn a committed whitelisted session into one workbench
# clip with prompt, tool actions, preview, timeline, render, and QA states. The result is a curated
# replay and must be labeled as such; it is not a proprietary agent-UI screen recording.
python tools/workbench.py --project projects/my-demo \
--session projects/my-demo/_src/codex-workbench.json \
--out projects/my-demo/assets/codex-workbench.webm
# 0c. DRAFT — choose the story grammar explicitly. Use launch-film for a public announcement.
python tools/script.py --project projects/my-demo --format launch-film --seconds 60
# For a 30-second dramatic product story:
# python tools/script.py --project projects/my-demo --format save-the-cat --seconds 30
# For a three-minute causal product story:
# python tools/script.py --project projects/my-demo --format causal-workflow --seconds 175
# 1. voiceover -> per-shot audio/manifest.json, or one generated narration master. For an
# announcement, set narration.fromMap=true and author one exact thought + shotN per map entry;
# ElevenLabs is required and writes character-level timing beside the master.
python tools/vo.py --project projects/my-demo
# 1b. narration pacing -> move each picture cut to a safe frame between complete spoken thoughts
python tools/pace.py --project projects/my-demo --write
# 2. music bed -> <project>/music.mp3 (sized to the paced runtime, picked up by build.py)
python tools/music.py --project projects/my-demo
# 2b. (optional) regenerate the bespoke SFX palette (a model listens and keeps the best/cue)
python tools/sfx.py
# 2c. DIRECTION — new drafts already use studio. Preview or enable it on an existing script.
./pdd direct projects/my-demo
# ./pdd direct projects/my-demo --write
# Read docs/STUDIO_DIRECTION.md before authoring camera, type, transitions, annotations, or cues.
# Give moves a visible reason; arrive, then hold. Never invent product coordinates or score values.
# 2d. EDITORIAL — after narration pacing, anchor each important thought to an inspected source frame.
./pdd editorial projects/my-demo --write
# Read docs/EDITORIAL_DIRECTION.md for sourceBeats and sourceTimeline. Capture wall-clock marks
# are not source timestamps. Keep actions in real time; compress only identified navigation.
# Audit warnings prompt picture review. Unknown proof timing is not a quality pass.
# 3. PREFLIGHT — block source, story, authority, claim, camera, and narration violations
python tools/preflight.py --project projects/my-demo --strict
# 4. ASSEMBLE + RENDER — exact frames, compiled direction-plan.json, props, build plan, artifact
python tools/build.py --project projects/my-demo --contracts strict
# 5. FINISH — preserve exact frames while creating a two-pass loudness-normalized, BT.709 web master
python tools/finish.py --input projects/my-demo/out/demo.mp4 \
--out projects/my-demo/out/demo-final.mp4 --require-artifact
# 6. FINAL-MEDIA QA — bind and decode the exact MP4; check frames, streams, audio, black/silence,
# and generate review sheets. This gate is deterministic, not a model opinion.
python tools/qa.py --video projects/my-demo/out/demo-final.mp4 \
--project projects/my-demo --require-artifact --strict
# 6b. REVIEW — local film playback, searchable shots, narration, and bound delivery findings
./pdd review projects/my-demo
# Use --serve to review at a loopback URL with frame-accurate media seeking.
# Return out/review.html alongside the final video. Regenerate after any source or story edits;
# an old review page is a snapshot, not a fresh delivery check.
# 7. JUDGE STORY/TASTE — only after deterministic QA; require the artifact manifest so a stale
# or similarly named MP4 cannot be reviewed by mistake.
python tools/judge.py --video projects/my-demo/out/demo-final.mp4 \
--require-artifact --all-lenses --runs 1 --fps 6 --context "what this demo is"
# For requested motion review, submit the complete actual video at 24 fps, then verify
# the temporal findings in playback. Use the requested model; static sheets are insufficient.
python tools/judge.py --video projects/my-demo/out/demo-final.mp4 \
--require-artifact --model gemini-2.5-pro --lens motion --fps 24 --runs 1
# 7a. BEFORE an improve loop: compare the bundled bad fixture with your approved local master
python tools/judge.py --probe --probe-good projects/my-demo/out/demo-final.mp4
# 8. OPTIONAL SCORED EXPERIMENT — compare both display orders after candidate QA.
# This command's 2–0 gate is an experiment policy, not a measure of viewer engagement.
python tools/compare.py \
--champion projects/my-demo/out/champion.mp4 \
--champion-artifact projects/my-demo/out/champion-artifact.json \
--candidate projects/my-demo/out/candidate.mp4 \
--candidate-artifact projects/my-demo/out/candidate-artifact.json \
--candidate-qa projects/my-demo/out/candidate-qa/qa-report.jsonSteps 0a-0c are optional conveniences to generate brand.json and script.json automatically.
The scaffold and source example include authored JSON, while footage, narration, music, renders,
and QA output are generated locally and ignored. brand.json is the brand source of truth — its
palette, font, and logo flow into the engine theme (not just the CTA wordmark), so the whole cut
adopts the brand. See docs/CAPTURE.md for autonomous shoot planning + terminal footage and
docs/PRODUCTION_CONTRACT.md for profiles, causal beats, source locks, human narration, claims,
cursor safety, exact-frame artifact binding, and shipping gates.
For final delivery, do a separate technical finishing pass after render when needed: voice isolation
or mastering belongs in the project's audio/ files, and web-safe video normalization belongs in the
export MP4. Keep these distinct from creative grading, and verify with ffprobe, volumedetect, and
contact sheets before calling the artifact final.
To iterate, verify judge.py's specific notes against the actual picture and sound before editing.
Judge scores are advisory; do not tune a film to maximize them or claim measured engagement from
them. Improve
script.json, brand.json, skill docs, rubrics, or engine code directly; do not treat a binary MP4
as the editable source of truth. Every candidate must pass deterministic gates first. When using
the optional scored comparison, review both display orders and retain the champion on a split or
noise-level change. Evaluate comprehension, evidence timing, readability, and continuity directly.
After repeated in-point/zoom/pacing changes fail to resolve the same note, revisit the narration,
story structure, or capture. Builds retain exact input snapshots so prior decisions stay inspectable.
For phone viewing, judge the film in a 320px-wide player, with 390px as a second check; use a different width when the brief supplies one. A readable desktop render can become miniature UI at that size. Phone readability is necessary, but a frame of enlarged, severed UI fragments is still a weak composition. Choose a complete meaningful unit: the button with its label, a full status card, or the menu with its selected value. Keep qualifiers, units, consequences, and source labels visible.
Use connected camera moves when the viewer needs the relationship between an action and its result.
For new measured camera plans, include framing.motion ({} uses 1.5 screens/second and
1.2 zoom octaves/second). Resolve infeasible moves with less travel, a wider view, justified extra
time, or a cut that preserves source truth; preserve reading holds and actions. Source native FPS or 1× playback
does not constrain rendered camera velocity, so diagnose those separately.
For a complete inspected component at a natural story/state boundary, framing.presentation="detail"
mounts its native source rectangle on a clean brand canvas. It requires one fixed rectangle for the
whole shot; it does not justify cutting a sentence or inventing a state change. Reserve an actual
settled reading hold after arrival. Use framing.entranceSec: 0 when the plate should already be
stationary on the first frame; omit it for the restrained default entrance. A detail plate retains
source timing and pixels, with editorial title/context outside it; it does not recreate product text
or hide a duplicate desktop behind it.
Presentation ratio follows visual meaning, not the file extension: generated/slide clips count,
and external encoded graphics need visualTreatment: "presentation" plus appropriate provenance
labels. Native recordings and designed explanations can coexist when the brief warrants them;
declare and assess that balance honestly. For motion review, inspect the whole exported sequence
with sound and the requested 24 fps Google review. Its receipt records submitted sampling and model
usage; neither static frames, model scores, nor passing QA establish production timing quality.
Measure glyph ink height when available and inspect the rendered motion, not just the size estimate.
If the complete unit cannot fit, choose a smaller complete unit or recapture a responsive layout with
larger UI. Higher capture density improves sharpness, not the amount of information a small player
can hold; enlarging soft text cannot recover missing detail. The review room's actual-width previews
and bound framing reports support this inspection. Neither geometric checks nor delivery QA certify
studio quality or engagement. See docs/SMALL_SCREEN_FRAMING.md for both presentation grammars and
docs/STUDIO_DIRECTION.md for connected motion and the legacy OpenScreen timing behavior.
Script schema
script.json is both a timeline and, for final-delivery work, a production contract. Each shot is
one of title | clip | split | stat | cta | score | bars | strip. The default announcement
contract is generated by pdd new; the minimal shape below shows the additional evidence fields
used by a causal live-product profile:
{
"fps": 30,
"production": {
"profile": "yc_3m",
"hardMaxSec": 180,
"productBySec": 15,
"requiredStoryBeats": ["input", "contradiction", "test", "decision", "receipt", "outcome"],
"requireLiveProgression": true,
"maxHumanDecisions": 1,
"enforceSameScreenContinuity": true,
"requireClaimEvidence": true,
"sourceManifests": ["_src/codex-workbench.json"]
},
"claims": [
{ "id": "measured-result", "status": "verified", "evidence": ["evidence/result.json"] }
],
"narration": {
"file": "audio/final-human-master.wav",
"sha256": "<sha256>",
"expectedDurationSec": 169.62839,
"durationToleranceSec": 0.01
},
"shots": [
{
"n": 1,
"kind": "clip",
"src": "live-case.mp4",
"durSec": 18,
"storyBeat": "test",
"sourceType": "product",
"liveState": true,
"stateId": "test-running",
"continuityId": "hero-case",
"actor": "agent",
"actionRisk": "low-friction",
"claimIds": ["measured-result"]
}
]
}For an explicitly requested legacy before/after promo, the lighter timeline remains valid. score is an animated count-up,
bars visualizes sourced take scores clearing a pass line, and strip pans a filmstrip of shots:
{
"fps": 30,
"music": "calm confident minimal corporate underscore, soft pulse, no drums",
"brand": { "name": "Product Demo ", "accent": "Director" },
"pronounce": { "ACME": "Ack-me" },
"voice_settings": { "stability": 0.32, "style": 0.75, "similarity_boost": 0.85, "use_speaker_boost": true },
"shots": [
{ "n": 1, "kind": "title", "title": "Your demo is a flat screen recording.", "durSec": 2.6, "vo": "..." },
{ "n": 2, "kind": "clip", "src": "raw.mp4", "inSec": 2, "chapter": "BEFORE", "scale": 1.0, "startScale": 1.0, "endScale": 1.18, "focusX": 50, "focusY": 68, "captionTop": 160, "vo": "..." },
{ "n": 3, "kind": "clip", "src": "raw.mp4", "chapter": "AFTER", "flash": true, "scale": 1.2, "accentAtSec": 1.4, "captionBottom": 150, "vo": "..." },
{ "n": 4, "kind": "split", "srcL": "raw.mp4", "labelL": "Raw", "srcR": "directed.mp4", "labelR": "Directed", "durSec": 4, "vo": "..." },
{ "n": 5, "kind": "stat", "title": "Scored 92 / 100.", "durSec": 2.5, "vo": "..." },
{ "n": 6, "kind": "cta", "title": "the demo your product deserves", "durSec": 3, "vo": "..." }
]
}Notes:
- When a shot has
vo, the on-screen caption defaults to that exact line. Override with an explicitcaption, or setcaption: falsewhen subtitles would cover the live product. Any visible subtitle must match the spoken words. - Use
narration.fromMap=trueplus exactnarrationMap[].textandshotNfor a generated master. Whenproduction.autoPaceNarration=true, configureELEVENLABS_API_KEY: ElevenLabs character alignment fills the cue times, thenpace.py --writemoves the cuts before music/render. Gemini TTS remains valid when auto-pacing is disabled. A strict cut may occur only between complete mapped thoughts, and picture must retain the declared narration tail. Keep per-shot VO for short promos. Never globally accelerate supplied narration. storyBeat,stateId, andliveStatedescribe causal progress. A final answer that is already visible before its initiating event fails the live-product contract.actorisagent,human, orsystem;actionRiskislow-frictionorconsequential. Low-friction work should not wait for human approval. Consequential work stays human unless the production contract explicitly authorizes autonomy.- Keep one
continuityIdin one clip while the same screen and action continue. Put connectedzoomsinside that shot; split only on a declared route, application, or major state change. - Lock human and other composition-sensitive sources with
preserveFramingorproduction.sourceLocks. A locked source cannot be cropped or pushed in. - Bind repo-native capture/replay files with
production.sourceManifests. Each entry must be a project-relative file; its hash becomes acapture-sourceartifact input and changes the build ID. focusX/focusYare percentage anchors for the zoom origin. Use them to land motion on the thing the viewer must read or click, while keeping its context and cursor visible.startScale/endScalecreate a controlled push-in without changing the basescale; keep UI text legible and avoid zooming away from the narrated action.captionTopandcaptionBottomare pixel offsets. Use them when captions would cover a text field, CTA, report card, or browser/player controls.accentAtSecdelays a sound effect until the actual completion event inside a shot. Use it for "report finished" or "purchase confirmed" moments instead of firing the sound at shot start.clickX/clickY/clickAtSec(clip) spring-zoom into a real click —capture.pyoverlays a visible eased cursor with a click ripple during web shoots and writes<clip>.events.json(click coords + timestamps), so these values come from the recording, not guesswork.takes+passLine(+ optionaltakeLabels) on abarsshot render REAL take scores clearing a pass line — feed it the judge history of the video itself.sound: true(clip) plays the clip's own audio — for UGC talking heads or a finished-demo excerpt.- A narrated card (
title/stat/score/bars/cta) holds for exactly VO + ~0.7s and is then cut (dead-air ceiling); opt out with"hold": true. The music bed ducks under every VO line and fades out at the end automatically. accenton a shot fires a palette sound on that beat (click,data_tick,success_chime,confirm_cash,pivot_boom); the pivot also gets ariser+ boom automatically.production.profile="announcement"enables single-focus shots, required continuity IDs, narration-map coverage, between-thought cut enforcement, and protected end padding. Split-screen fails unless the production explicitly opts into the legacy treatment.flash: true(orchapter: "AFTER") marks a legacy before/after pivot. It is not required or desirable merely because a causal workflow advances to a new state.pronouncerewrites spellings for the TTS audio only; captions keep the real spelling.brand.name+brand.accentrender the CTA wordmark (accent tail colored).
Craft rules
The methodology — each rule was a real mistake first — lives in docs/EDITING.md (the edit),
docs/CAPTURE.md (capturing live-app footage), and docs/COLOR_GRADING.md (color correction
and grading). Read them before authoring a script. Highlights:
- Choose one causal unit of work. Follow input → evidence → hypothesis → test → result → bounded decision → durable outcome. If the beats can be reordered, the cut is a feature list.
- Make progress appear. Reasoning, recommendations, and results arrive after their initiating events. Do not reveal a complete answer in the first frame and call it live AI.
- Make authority visible. The agent owns reversible, low-friction work; the accountable human appears only at a consequential boundary. Restraint under uncertainty is proof of judgment.
- Escalate with a falsifiable test. When one signal is inconclusive, show what evidence would change the decision, run the lowest-friction check, and update the case from the result. Another feature panel does not create the same causal pressure.
- Use live takes for causality. Stills and slides may explain sourced context, but they cannot prove that the product initiated work, changed state, learned, or completed a queue.
- Show evidence, not only counters. A scale claim needs events, receipts, or at least one completed packet. Rows disappearing quickly demonstrate motion, not casework.
- Captions are optional; subtitles are exact. Suppress duplicated text when it obscures dense UI. If text functions as a subtitle, it must match the spoken words.
- One spoken action per visible step. Use language a real operator would say, not an inventory of capabilities or API-like status prose. For an approved human master, the recording outranks an older written draft.
- Pace by meaning. Remove inert time, but retain the setup and decision holds that make the causal story legible.
- Keep the camera connected. One screen/session gets one clip and connected focus regions, not jumpy same-screen crop resets. Keep target, context, status, safeguard, and cursor visible.
- Preserve people. Moving customer, founder, or teammate footage retains its recorded framing unless the brief explicitly authorizes a punch-in.
- Make integrations inhabited. A Slack/email/case-system handoff lands in the customer's named operational context and reports completed work, exceptions, and evidence. Avoid generic internal channels or codenames the viewer has never met.
- Introduce people after they speak. Let the first complete sentence land, then use a brief freeze-frame name/role treatment if useful; return to the original moving composition afterward.
- Show the work. Open from the real entry point and include one click-to-evidence beat.
- Redact identifiers, never the value. Hide client marks; keep the proof sharp and legible.
- Be honest. Only verified claims; neither invent autonomy nor add unnecessary human gates.
- End once. After the operational payoff, show only necessary proof, one fresh forward-looking state, and one CTA.
- Correction before look. Product demos must preserve trust: neutral UI whites, legible text, stable brand colors, plausible skin, and matched adjacent shots. Do not apply a decorative color grade by default. UGC/founder footage should stay authentic unless the brief explicitly asks for a stylized commercial look; avoid global vignettes, blurred side-fill, saturation pushes, and brightness tweaks as defaults.
Proof beats (the YC/PG canon rules)
How the proof shot earns belief — distilled from the YC/PG canon; violating these reads as AI-washing to professional evaluators:
- Proof hierarchy. Rank what you show: real paying usage with exact numbers > pull signals (demand outpacing supply, users asking for features, word-of-mouth) > benchmark wins > pilot logos > polish. Never present pilots as product-market fit — name them as exactly what they are ("paid pilot, live" is strong because it claims nothing more).
- Exact numbers beat adjectives. "$11.4k in 3 months" beats "strong early traction"; "68 → 84 in 8 iterations" beats "dramatically better". If the footage can show the number moving, never say the adjective at all.
- Survive the AI-washing gauntlet. One uncut real run on screen, exact figures, and a test-on-your-own-data ask in the CTA ("point it at yours"). A demo that only shows curated moments invites the question it can't answer.
- Formidable register. Plain, concise, matter-of-fact narration; confidence through substance, never asserted ("blazing fast" is banned; a visible timer is not).
- Show the real authority boundary plainly. A consequential payout, block, or policy decision may require one accountable signature; a reversible evidence request or research step may run automatically. Adding a reviewer to every step makes a real autonomous product look like a presentation tool, while hiding a consequential reviewer makes the demo untrustworthy.
- Earnest beats polished. A rough real run with real numbers outranks a beautiful simulation — polish only ever amplifies proof, it never substitutes for it.
When it breaks
- Preflight rejects a low-friction human gate → model the real workflow. Let the agent or system execute reversible evidence gathering automatically; reserve the human action for the actual consequential boundary.
- Preflight rejects a same-screen cut → combine the adjacent source excerpts into one clip and
use connected camera motion. A deliberate context/detail edit may use
presentationCutonly with continuous source time, a complete native unit, and a concrete reason. Do not invent application state changes to silence a check. An existing aligned narration master can continue across the picture cut withcontinuous-audioand a cue's consecutiveshotNsspan. - A crop makes text readable but leaves fragments of labels, controls, or sentences → recompose
around the complete meaningful UI unit. Preserve spatial context with a connected camera move,
or use a complete native detail plate at a real story/state boundary. If that unit remains too
small or soft, change the capture. For a short recorded fact, an exact source-bound typeset excerpt
is also available through
term.py --focus-spec; keep its explicit recorded/typeset label and verify every word against the source. More zoom cannot supply missing context or source detail. - A locked customer/founder source is cropped or punched in → remove camera transforms and use
objectFit: "contain". Preserve the recorded framing unless the source owner approved a change. - Global narration hash/duration fails → restore the approved human master or deliberately update its contract and audit. Do not stretch, speed, or silently replace it to make the timeline pass.
- No ElevenLabs key → an auto-paced narration map stops in
vo.pybefore synthesis because Gemini TTS does not return the character alignment required bypace.py. ConfigureELEVENLABS_API_KEY, or deliberately disableproduction.autoPaceNarrationand author timing another way. Gemini TTS / Lyria remain valid for non-auto-paced and legacy narration/music (GEMINI_API_KEY), and projects with supplied or locally cached audio can still render. A 401 is deterministic—replace the key; do not retry it. - A VO line fails or renders empty →
vo.pyexits non-zero (a silent shot must never ship). Re-run after fixing; unchanged lines are cached and not re-billed. - Footage shorter than the VO line → the clip freezes on its last frame (build floors clip duration at VO + 0.2s). Shorten the line or cut a longer excerpt — never ship the freeze.
- Type renders as serif → the brand font isn't installed;
build.pyappends the bundled Inter stack automatically, but always check captions in extracted frames. - Judge scores swing between runs on identical content (±10 documented) → median-of-3 is the
default; confirm
--probepasses, use order-reversed pairwise comparison, and frame-verify any specific claim the judge makes before acting on it. A split does not beat the champion. - Judge is pointed at the wrong or stale MP4 → require
artifact.json. Thejudge.py --require-artifactgate rejects a path or hash that does not match the bound output. - The cut passes the judge but contains a black frame, silence, cropped cursor, or incomplete error
page → the judge cannot waive delivery evidence. Run
qa.py --require-artifact --strictand inspect opening/ending, every-five-second, cut-boundary, and configured critical-range sheets. - Three plausible zoom, in-point, or pacing candidates lose or split → restore the champion and stop mechanical recutting. Recapture a missing action/state, revise narration, or change the story.
- Identifier discovered in a rendered frame → fix the source excerpt (crop or trim — never blur-patch the render), re-render, then re-verify the excerpt's boundary seconds at ~1fps. A folder or file named "redacted" is not evidence of redaction.
License
MIT licensed. See LICENSE and THIRD_PARTY_NOTICES.md.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

