[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-browser-use-video-use":3,"mdc-74gngv-key":35,"related-repo-browser-use-video-use":3200,"related-org-browser-use-video-use":3222},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":26,"mdContent":34},"video-use","edit and process videos via conversation","Edit any video by conversation. Transcribe, cut, color grade, generate overlay animations, burn subtitles — for talking heads, montages, tutorials, travel, interviews. No presets, no menus. Ask questions, confirm the plan, execute, iterate, persist. Production-correctness rules are hard; everything else is artistic freedom.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"browser-use","Browser-use","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fbrowser-use.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Creative","creative","tag",{"name":17,"slug":18,"type":15},"Transcription","transcription",{"name":20,"slug":21,"type":15},"Animation","animation",{"name":23,"slug":24,"type":15},"Video","video",17171,"https:\u002F\u002Fgithub.com\u002Fbrowser-use\u002Fvideo-use","2026-04-16T12:17:10.522375",null,2058,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Edit videos with coding agents","---\nname: video-use\ndescription: Edit any video by conversation. Transcribe, cut, color grade, generate overlay animations, burn subtitles — for talking heads, montages, tutorials, travel, interviews. No presets, no menus. Ask questions, confirm the plan, execute, iterate, persist. Production-correctness rules are hard; everything else is artistic freedom.\n---\n\n# Video Use\n\n## Principle\n\n1. **LLM reasons from raw transcript + on-demand visuals.** The only derived artifact that earns its keep is a packed phrase-level transcript (`takes_packed.md`). Everything else — filler tagging, retake detection, shot classification, emphasis scoring — you derive at decision time.\n2. **Audio is primary, visuals follow.** Cut candidates come from speech boundaries and silence gaps. Drill into visuals only at decision points.\n3. **Ask → confirm → execute → iterate → persist.** Never touch the cut until the user has confirmed the strategy in plain English.\n4. **Generalize.** Do not assume what kind of video this is. Look at the material, ask the user, then edit.\n5. **Artistic freedom is the default.** Every specific value, preset, font, color, duration, pitch structure, and technique in this document is a *worked example* from one proven video — not a mandate. Read them to understand what's possible and why each worked. Then make your own taste calls based on what the material actually is and what the user actually wants. **The only things you MUST do are in the Hard Rules section below.** Everything else is yours.\n6. **Invent freely.** If the material calls for a technique not described here — split-screen, picture-in-picture, lower-third identity cards, reaction cuts, speed ramps, freeze frames, crossfades, match cuts, L-cuts, J-cuts, speed ramps over breath, whatever — build it. The helpers are ffmpeg and PIL. They can do anything the format supports. Do not wait for permission.\n7. **Verify your own output before showing it to the user.** If you wouldn't ship it, don't present it.\n\n## Hard Rules (production correctness — non-negotiable)\n\nThese are the things where deviation produces silent failures or broken output. They are not taste, they are correctness. Memorize them.\n\n1. **Subtitles are applied LAST in the filter chain**, after every overlay. Otherwise overlays hide captions. Silent failure.\n2. **Per-segment extract → lossless `-c copy` concat**, not single-pass filtergraph. Otherwise you double-encode every segment when overlays are added.\n3. **30ms audio fades at every segment boundary** (`afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03`). Otherwise audible pops at every cut.\n4. **Overlays use `setpts=PTS-STARTPTS+T\u002FTB`** to shift the overlay's frame 0 to its window start. Otherwise you see the middle of the animation during the overlay window.\n5. **Master SRT uses output-timeline offsets**: `output_time = word.start - segment_start + segment_offset`. Otherwise captions misalign after segment concat.\n6. **Never cut inside a word.** Snap every cut edge to a word boundary from the Scribe transcript.\n7. **Pad every cut edge.** Working window: 30–200ms. Scribe timestamps drift 50–100ms — padding absorbs the drift. Tighter for fast-paced, looser for cinematic.\n8. **Word-level verbatim ASR only.** Never SRT\u002Fphrase mode (loses sub-second gap data). Never normalized fillers (loses editorial signal).\n9. **Cache transcripts per source.** Never re-transcribe unless the source file itself changed.\n10. **Parallel sub-agents for multiple animations.** Never sequential. Spawn N at once via the `Agent` tool; total wall time ≈ slowest one.\n11. **Strategy confirmation before execution.** Never touch the cut until the user has approved the plain-English plan.\n12. **All session outputs in `\u003Cvideos_dir>\u002Fedit\u002F`.** Never write inside the `video-use\u002F` project directory.\n\nEverything else in this document is a worked example. Deviate whenever the material calls for it.\n\n## Directory layout\n\nThe skill lives in `video-use\u002F`. User footage lives wherever they put it. All session outputs go into `\u003Cvideos_dir>\u002Fedit\u002F`.\n\n```\n\u003Cvideos_dir>\u002F\n├── \u003Csource files, untouched>\n└── edit\u002F\n    ├── project.md               ← memory; appended every session\n    ├── takes_packed.md          ← phrase-level transcripts, the LLM's primary reading view\n    ├── edl.json                 ← cut decisions\n    ├── transcripts\u002F\u003Cname>.json  ← cached raw Scribe JSON\n    ├── animations\u002Fslot_\u003Cid>\u002F    ← per-animation source + render + reasoning\n    ├── clips_graded\u002F            ← per-segment extracts with grade + fades\n    ├── master.srt               ← output-timeline subtitles\n    ├── downloads\u002F               ← yt-dlp outputs\n    ├── verify\u002F                  ← debug frames \u002F timeline PNGs\n    ├── preview.mp4\n    └── final.mp4\n```\n\n## Setup\n\nFirst-time install lives in `install.md` (clone, deps, ffmpeg, skill registration, API key). Don't re-run it every session; on cold start just verify:\n\n- `ELEVENLABS_API_KEY` resolves — either in the environment or in `.env` at the video-use repo root. If missing, ask the user to paste one and write it to `.env` (never to the user's `\u003Cvideos_dir>`).\n- `ffmpeg` + `ffprobe` on PATH.\n- Python deps installed (`uv sync` or `pip install -e .` inside the repo).\n- Node.js + npm available if the session needs HyperFrames or Remotion slots. HyperFrames currently requires Node.js 22+.\n- `yt-dlp`, HyperFrames, Remotion, Manim installed only on first use.\n- First-use animation setup happens inside the slot directory, never at the video-use repo root. HyperFrames can be invoked with `npx --yes hyperframes ...`; Remotion can be scaffolded with `npx create-video@latest` or installed as a project-local dependency before using its `remotion render` command.\n- This skill vendors `skills\u002Fmanim-video\u002F`. Read its SKILL.md when building a Manim slot.\n\nHelpers (`helpers\u002Ftranscribe.py`, `helpers\u002Frender.py`, etc.) live alongside this SKILL.md. Resolve their paths relative to the directory containing this file — the skill is typically symlinked at `~\u002F.claude\u002Fskills\u002Fvideo-use\u002F` or `~\u002F.codex\u002Fskills\u002Fvideo-use\u002F`.\n\n## Helpers\n\n- **`transcribe.py \u003Cvideo>`** — single-file Scribe call. `--num-speakers N` optional. Cached.\n- **`transcribe_batch.py \u003Cvideos_dir>`** — 4-worker parallel transcription. Use for multi-take.\n- **`pack_transcripts.py --edit-dir \u003Cdir>`** — `transcripts\u002F*.json` → `takes_packed.md` (phrase-level, break on silence ≥ 0.5s).\n- **`timeline_view.py \u003Cvideo> \u003Cstart> \u003Cend>`** — filmstrip + waveform PNG. On-demand visual drill-down. **Not a scan tool** — use it at decision points, not constantly.\n- **`render.py \u003Cedl.json> -o \u003Cout>`** — per-segment extract → concat → overlays (PTS-shifted) → subtitles LAST. `--preview` for 720p fast. `--build-subtitles` to generate master.srt inline.\n- **`grade.py \u003Cin> -o \u003Cout>`** — ffmpeg filter chain grade. Presets + `--filter '\u003Craw>'` for custom.\n\nFor animations, create `\u003Cedit>\u002Fanimations\u002Fslot_\u003Cid>\u002F` with `Bash` and spawn a sub-agent via the `Agent` tool.\n\n## The process\n\n1. **Inventory.** `ffprobe` every source. `transcribe_batch.py` on the directory. `pack_transcripts.py` to produce `takes_packed.md`. Sample one or two `timeline_view`s for a visual first impression.\n2. **Pre-scan for problems.** One pass over `takes_packed.md` to note verbal slips, obvious mis-speaks, or phrasings to avoid. Plain list, feed into the editor brief.\n3. **Converse.** Describe what you see in plain English. Ask questions *shaped by the material*. Collect: content type, target length\u002Faspect, aesthetic\u002Fbrand direction, pacing feel, must-preserve moments, must-cut moments, animation and grade preferences, subtitle needs. Do not use a fixed checklist — the right questions are different every time.\n4. **Propose strategy.** 4–8 sentences: shape, take choices, cut direction, animation plan, grade direction, subtitle style, length estimate. **Wait for confirmation.**\n5. **Execute.** Produce `edl.json` via the editor sub-agent brief. Drill into `timeline_view` at ambiguous moments. Build animations in parallel sub-agents. Apply grade per-segment. Compose via `render.py`.\n6. **Preview.** `render.py --preview`.\n7. **Self-eval (before showing the user).** Run `timeline_view` on the **rendered output** (not the sources) at every cut boundary (±1.5s window). Check each image for:\n   - Visual discontinuity \u002F flash \u002F jump at the cut\n   - Waveform spike at the boundary (audio pop that slipped past the 30ms fade)\n   - Subtitle hidden behind an overlay (Rule 1 violation)\n   - Overlay misaligned or showing wrong frames (Rule 4 violation)\n\n   Also sample: first 2s, last 2s, and 2–3 mid-points — check grade consistency, subtitle readability, overall coherence. Run `ffprobe` on the output to verify duration matches the EDL expectation.\n\n   If anything fails: fix → re-render → re-eval. **Cap at 3 self-eval passes** — if issues remain after 3, flag them to the user rather than looping forever. Only present the preview once the self-eval passes.\n8. **Iterate + persist.** Natural-language feedback, re-plan, re-render. Never re-transcribe. Final render on confirmation. Append to `project.md`.\n\n## Cut craft (techniques)\n\n- **Audio-first.** Candidate cuts from word boundaries and silence gaps.\n- **Preserve peaks.** Laughs, punchlines, emphasis beats. Extend past punchlines to include reactions — the laugh IS the beat.\n- **Speaker handoffs** benefit from air between utterances. Common values: 400–600ms. Less for fast-paced, more for cinematic. Taste call.\n- **Audio events as signals.** `(laughs)`, `(sighs)`, `(applause)` mark beats. Extend past them.\n- **Silence gaps are cut candidates.** Silences ≥400ms are usually the cleanest. 150–400ms phrase boundaries are usable with a visual check. \u003C150ms is unsafe (mid-phrase).\n- **Example cut padding** (the launch video shipped with this): 50ms before the first kept word, 80ms after the last. Tighter for montage energy, looser for documentary. Stay in the 30–200ms working window (Hard Rule 7).\n- **Never reason audio and video independently.** Every cut must work on both tracks.\n\n## The packed transcript (primary reading view)\n\n`pack_transcripts.py` reads all `transcripts\u002F*.json` and produces one markdown file where each take is a list of phrase-level lines, each prefixed with its `[start-end]` time range. Phrases break on any silence ≥ 0.5s OR speaker change. This is the artifact the editor sub-agent reads to pick cuts — it gives word-boundary precision from text alone at 1\u002F10 the tokens of raw JSON.\n\nExample line:\n```\n## C0103  (duration: 43.0s, 8 phrases)\n  [002.52-005.36] S0 Ninety percent of what a web agent does is completely wasted.\n  [006.08-006.74] S0 We fixed this.\n```\n\n## Editor sub-agent brief (for multi-take selection)\n\nWhen the task is \"pick the best take of each beat across many clips,\" spawn a dedicated sub-agent with a brief shaped like this. The structure is load-bearing; the pitch-shape example is not.\n\n```\nYou are editing a \u003Ctype> video. Pick the best take of each beat and \nassemble them chronologically by beat, not by source clip order.\n\nINPUTS:\n  - takes_packed.md (time-annotated phrase-level transcripts of all takes)\n  - Product\u002Fnarrative context: \u003C2 sentences from the user>\n  - Speaker(s): \u003Cname, role, delivery style note>\n  - Expected structure: \u003Cpick an archetype or invent one>\n  - Verbal slips to avoid: \u003Clist from the pre-scan pass>\n  - Target runtime: \u003Cseconds>\n\nCommon structural archetypes (pick, adapt, or invent):\n  - Tech launch \u002F demo:   HOOK → PROBLEM → SOLUTION → BENEFIT → EXAMPLE → CTA\n  - Tutorial:             INTRO → SETUP → STEPS → GOTCHAS → RECAP\n  - Interview:            (QUESTION → ANSWER → FOLLOWUP) repeat\n  - Travel \u002F event:       ARRIVAL → HIGHLIGHTS → QUIET MOMENTS → DEPARTURE\n  - Documentary:          THESIS → EVIDENCE → COUNTERPOINT → CONCLUSION\n  - Music \u002F performance:  INTRO → VERSE → CHORUS → BRIDGE → OUTRO\n  - Or invent your own.\n\nRULES:\n  - Start\u002Fend times must fall on word boundaries from the transcript.\n  - Pad cut boundaries (working window 30–200ms).\n  - Prefer silences ≥ 400ms as cut targets.\n  - Unavoidable slips are kept if no better take exists. Note them in \"reason\".\n  - If over budget, revise: drop a beat or trim tails. Report total and self-correct.\n\nOUTPUT (JSON array, no prose):\n  [{\"source\": \"C0103\", \"start\": 2.42, \"end\": 6.85, \"beat\": \"HOOK\",\n    \"quote\": \"...\", \"reason\": \"...\"}, ...]\n\nReturn the final EDL and a one-line total runtime check.\n```\n\n## Color grade (when requested)\n\nYour job is to **reason about the image**, not apply a preset. Look at a frame (via `timeline_view`), decide what's wrong, adjust one thing, look again.\n\nMental model is ASC CDL. Per channel: `out = (in * slope + offset) ** power`, then global saturation. `slope` → highlights, `offset` → shadows, `power` → midtones.\n\n**Example filter chains** (`grade.py` has `--list-presets`; use them as starting points or mix your own):\n\n- **`warm_cinematic`** — retro\u002Ftechnical, subtle teal\u002Forange split, desaturated. Shipped in a real launch video. Safe for talking heads.\n- **`neutral_punch`** — minimal corrective: contrast bump + gentle S-curve. No hue shifts.\n- **`none`** — straight copy. Default when the user hasn't asked.\n\nFor anything else — portraiture, nature, product, music video, documentary — invent your own chain. `grade.py --filter '\u003Craw ffmpeg>'` accepts any filter string.\n\nHard rules: apply **per-segment during extraction** (not post-concat, which re-encodes twice). Never go aggressive without testing skin tones.\n\n## Subtitles (when requested)\n\nSubtitles have three dimensions worth reasoning about: **chunking** (1\u002F2\u002F3\u002Fsentence per line), **case** (UPPER\u002FTitle\u002FNatural), and **placement** (margin from bottom). The right combo depends on content.\n\n**Worked styles** — pick, adapt, or invent:\n\n**`bold-overlay`** — short-form tech launch, fast-paced social. 2-word chunks, UPPERCASE, break on punctuation, Helvetica 18 Bold, white-on-outline, `MarginV=35`. `render.py` ships with this as `SUB_FORCE_STYLE`.\n\n```\nFontName=Helvetica,FontSize=18,Bold=1,\nPrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,BackColour=&H00000000,\nBorderStyle=1,Outline=2,Shadow=0,\nAlignment=2,MarginV=35\n```\n\n**`natural-sentence`** (if you invent this mode) — narrative, documentary, education. 4–7 word chunks, sentence case, break on natural pauses, `MarginV=60–80`, larger font for readability, slightly wider max-width. No shipped force_style — design one if you need it.\n\nInvent a third style if neither fits. Hard rules: subtitles LAST (Rule 1), output-timeline offsets (Rule 5).\n\n## Animations (when requested)\n\nAnimations match the content and the brand. **Get the palette, font, and visual language from the conversation** — never assume a default. If the user hasn't told you, propose a palette in the strategy phase and wait for confirmation before building anything.\n\n**Tool options:**\n\nPick the engine per animation slot. Do not default to Remotion just because the animation is web-adjacent.\n\n- **HyperFrames** — Browser-native HTML\u002FCSS\u002FGSAP video compositions: product UI motion, website-to-video or mockup-to-video captures, kinetic typography, landing-page\u002Fstoryboard promos, data-driven UI states, transparent WebM overlays, and clips that need deterministic frame capture plus HyperFrames lint\u002Fvalidate\u002Frender checks. Best when the animation should be authored and verified like a web composition instead of a React component tree.\n- **Remotion** — React\u002FCSS compositions with component state, reusable React primitives, or an existing Remotion brand system. Best when the user specifically asks for React\u002FRemotion or when React composition is the simpler authoring model.\n- **Manim** — formal diagrams, state machines, equation derivations, graph morphs. Read `skills\u002Fmanim-video\u002FSKILL.md` and its references for depth.\n- **PIL + PNG sequence + ffmpeg** — simple overlay cards: counters, typewriter text, single bar reveals, progressive draws. Fast to iterate, any aesthetic you want. The launch video used this.\n\nFor HyperFrames slots, scaffold the slot inside `edit\u002Fanimations\u002Fslot_\u003Cid>\u002F` with `npx --yes hyperframes init . --example blank --non-interactive --skip-skills`, build the HTML composition there, run the HyperFrames checks that fit the slot (`lint`, `validate`, and a draft render when practical), then produce the final overlay video with `npx --yes hyperframes render . -o render.mp4` or `--format webm -o render.webm` when alpha is required. Point the EDL overlay `file` at the actual rendered path.\n\nFor Remotion slots, keep the Remotion project isolated inside the same slot directory, scaffold with `npx create-video@latest` or install Remotion locally there, render the composition to `render.mp4` with the project-local `remotion render` command, and verify duration and dimensions with `ffprobe`.\n\nNone is mandatory. Invent hybrids if useful (e.g., PIL background with a HyperFrames or Remotion layer on top).\n\n**Duration rules of thumb, context-dependent:**\n\n- **Sync-to-narration explanations.** A viewer needs to parse the content at 1×. Rough floor 3s, typical 5–7s for simple cards, 8–14s for complex diagrams. The launch video shipped at 5–7s per simple card.\n- **Beat-synced accents** (music video, fast montage). 0.5–2s is fine — they're visual accents, not information. The \"readable at 1×\" rule becomes *\"recognizable at 1×\"*, not *\"fully parseable.\"*\n- **Hold the final frame ≥ 1s** before the cut (universal).\n- **Over voiceover:** total duration ≥ `narration_length + 1s` (universal).\n- **Never parallel-reveal independent elements** — the eye can't track two new things at once. One thing, pause, next thing.\n\n**Animation payoff timing (rule for sync-to-narration):** get the payoff word's timestamp. Start the overlay `reveal_duration` seconds earlier so the landing frame coincides with the spoken payoff word. Without this sync the animation feels disconnected.\n\n**Easing** (universal — never `linear`, it looks robotic):\n\n```python\ndef ease_out_cubic(t):    return 1 - (1 - t) ** 3\ndef ease_in_out_cubic(t):\n    if t \u003C 0.5: return 4 * t ** 3\n    return 1 - (-2 * t + 2) ** 3 \u002F 2\n```\n\n`ease_out_cubic` for single reveals (slow landing). `ease_in_out_cubic` for continuous draws.\n\n**Typing text anchor trick:** center on the FULL string's width, not the partial-string width — otherwise text slides left during reveal.\n\n**Example palette** (the launch video — one aesthetic among infinite):\n- Background `(10, 10, 10)` near-black\n- Accent `#FF5A00` \u002F `(255, 90, 0)` orange\n- Labels `(110, 110, 110)` dim gray\n- Font: Menlo Bold at `\u002FSystem\u002FLibrary\u002FFonts\u002FMenlo.ttc` (index 1)\n- ≤ 2 accent colors, ~40% empty space, minimal chrome\n- Result: terminal \u002F retro tech feel\n\nThis is one style. If the brand is warm and serif, use that. If it's colorful and playful, use that. If the user handed you a style guide, follow it. If they didn't, propose one and confirm.\n\n**Parallel sub-agent brief** — each animation is one sub-agent spawned via the `Agent` tool. Each prompt is self-contained (sub-agents have no parent context). Include:\n\n1. One-sentence goal: *\"Build ONE animation: [spec]. Nothing else.\"*\n2. Absolute output path (`\u003Cedit>\u002Fanimations\u002Fslot_\u003Cid>\u002Frender.mp4`)\n3. Exact technical spec: resolution, fps, codec, pix_fmt, CRF, duration\n4. Style palette as concrete values (RGB tuples, hex, or reference to a design system)\n5. Font path with index\n6. Frame-by-frame timeline (what happens when, with easing)\n7. Anti-list (\"no chrome, no extras, no titles unless specified\")\n8. Code pattern reference (copy helpers inline, don't import across slots)\n9. Deliverable checklist (script, render, verify duration via ffprobe, report)\n10. **\"Do not ask questions. If anything is ambiguous, pick the most obvious interpretation and proceed.\"**\n\nOne sub-agent = one file (unique filenames, parallel agents don't overwrite each other).\n\n## Output spec\n\nMatch the source unless the user asked for something specific. Common targets: `1920×1080@24` cinematic, `1920×1080@30` screen content, `1080×1920@30` vertical social, `3840×2160@24` 4K cinema, `1080×1080@30` square. `render.py` defaults the scale to 1080p from any source; pass `--filter` or edit the extract command for other targets. Worth asking the user which delivery format matters.\n\n## EDL format\n\n```json\n{\n  \"version\": 1,\n  \"sources\": {\"C0103\": \"\u002Fabs\u002Fpath\u002FC0103.MP4\", \"C0108\": \"\u002Fabs\u002Fpath\u002FC0108.MP4\"},\n  \"ranges\": [\n    {\"source\": \"C0103\", \"start\": 2.42, \"end\": 6.85,\n     \"beat\": \"HOOK\", \"quote\": \"...\", \"reason\": \"Cleanest delivery, stops before slip at 38.46.\"},\n    {\"source\": \"C0108\", \"start\": 14.30, \"end\": 28.90,\n     \"beat\": \"SOLUTION\", \"quote\": \"...\", \"reason\": \"Only take without the false start.\"}\n  ],\n  \"grade\": \"warm_cinematic\",\n  \"overlays\": [\n    {\"file\": \"edit\u002Fanimations\u002Fslot_1\u002Frender.mp4\", \"start_in_output\": 0.0, \"duration\": 5.0}\n  ],\n  \"subtitles\": \"edit\u002Fmaster.srt\",\n  \"total_duration_s\": 87.4\n}\n```\n\n`grade` is a preset name or raw ffmpeg filter. `overlays` are rendered animation clips. `subtitles` is optional and applied LAST.\n\n## Memory — `project.md`\n\nAppend one section per session at `\u003Cedit>\u002Fproject.md`:\n\n```markdown\n## Session N — YYYY-MM-DD\n\n**Strategy:** one paragraph describing the approach\n**Decisions:** take choices, cuts, grades, animations + why\n**Reasoning log:** one-line rationale for non-obvious decisions\n**Outstanding:** deferred items\n```\n\nOn startup, read `project.md` if it exists and summarize the last session in one sentence before asking whether to continue.\n\n## Anti-patterns\n\nThings that consistently fail regardless of style:\n\n- **Hierarchical pre-computed codec formats** with USABILITY \u002F tone tags \u002F shot layers. Over-engineering. Derive from the transcript at decision time.\n- **Hand-tuned moment-scoring functions.** The LLM picks better than any heuristic you'll write.\n- **Whisper SRT \u002F phrase-level output.** Loses sub-second gap data. Always word-level verbatim.\n- **Running Whisper locally on CPU.** Slow and it normalizes fillers. Use hosted Scribe.\n- **Burning subtitles into base before compositing overlays.** Overlays hide them. (Hard Rule 1.)\n- **Single-pass filtergraph when you have overlays.** Double re-encodes. Use per-segment extract → concat.\n- **Linear animation easing.** Looks robotic. Always cubic.\n- **Hard audio cuts at segment boundaries.** Audible pops. (Hard Rule 3.)\n- **Typing text centered on the partial string.** Text slides left as it grows.\n- **Sequential sub-agents for multiple animations.** Always parallel.\n- **Editing before confirming the strategy.** Never.\n- **Re-transcribing cached sources.** Immutable outputs of immutable inputs.\n- **Assuming what kind of video it is.** Look first, ask second, edit last.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,48,55,155,161,167,344,349,355,373,385,391,404,540,575,581,722,750,756,993,999,1093,1099,1124,1129,1138,1144,1149,1158,1164,1183,1220,1245,1290,1303,1315,1321,1347,1357,1393,1402,1424,1429,1435,1447,1455,1460,1511,1569,1602,1607,1615,1688,1706,1724,1771,1790,1800,1810,1883,1888,1905,1981,1986,1992,2052,2058,2872,2896,2907,2919,3038,3050,3056,3061,3194],{"type":41,"tag":42,"props":43,"children":44},"element","h1",{"id":4},[45],{"type":46,"value":47},"text","Video Use",{"type":41,"tag":49,"props":50,"children":52},"h2",{"id":51},"principle",[53],{"type":46,"value":54},"Principle",{"type":41,"tag":56,"props":57,"children":58},"ol",{},[59,80,90,100,110,135,145],{"type":41,"tag":60,"props":61,"children":62},"li",{},[63,69,71,78],{"type":41,"tag":64,"props":65,"children":66},"strong",{},[67],{"type":46,"value":68},"LLM reasons from raw transcript + on-demand visuals.",{"type":46,"value":70}," The only derived artifact that earns its keep is a packed phrase-level transcript (",{"type":41,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":46,"value":77},"takes_packed.md",{"type":46,"value":79},"). Everything else — filler tagging, retake detection, shot classification, emphasis scoring — you derive at decision time.",{"type":41,"tag":60,"props":81,"children":82},{},[83,88],{"type":41,"tag":64,"props":84,"children":85},{},[86],{"type":46,"value":87},"Audio is primary, visuals follow.",{"type":46,"value":89}," Cut candidates come from speech boundaries and silence gaps. Drill into visuals only at decision points.",{"type":41,"tag":60,"props":91,"children":92},{},[93,98],{"type":41,"tag":64,"props":94,"children":95},{},[96],{"type":46,"value":97},"Ask → confirm → execute → iterate → persist.",{"type":46,"value":99}," Never touch the cut until the user has confirmed the strategy in plain English.",{"type":41,"tag":60,"props":101,"children":102},{},[103,108],{"type":41,"tag":64,"props":104,"children":105},{},[106],{"type":46,"value":107},"Generalize.",{"type":46,"value":109}," Do not assume what kind of video this is. Look at the material, ask the user, then edit.",{"type":41,"tag":60,"props":111,"children":112},{},[113,118,120,126,128,133],{"type":41,"tag":64,"props":114,"children":115},{},[116],{"type":46,"value":117},"Artistic freedom is the default.",{"type":46,"value":119}," Every specific value, preset, font, color, duration, pitch structure, and technique in this document is a ",{"type":41,"tag":121,"props":122,"children":123},"em",{},[124],{"type":46,"value":125},"worked example",{"type":46,"value":127}," from one proven video — not a mandate. Read them to understand what's possible and why each worked. Then make your own taste calls based on what the material actually is and what the user actually wants. ",{"type":41,"tag":64,"props":129,"children":130},{},[131],{"type":46,"value":132},"The only things you MUST do are in the Hard Rules section below.",{"type":46,"value":134}," Everything else is yours.",{"type":41,"tag":60,"props":136,"children":137},{},[138,143],{"type":41,"tag":64,"props":139,"children":140},{},[141],{"type":46,"value":142},"Invent freely.",{"type":46,"value":144}," If the material calls for a technique not described here — split-screen, picture-in-picture, lower-third identity cards, reaction cuts, speed ramps, freeze frames, crossfades, match cuts, L-cuts, J-cuts, speed ramps over breath, whatever — build it. The helpers are ffmpeg and PIL. They can do anything the format supports. Do not wait for permission.",{"type":41,"tag":60,"props":146,"children":147},{},[148,153],{"type":41,"tag":64,"props":149,"children":150},{},[151],{"type":46,"value":152},"Verify your own output before showing it to the user.",{"type":46,"value":154}," If you wouldn't ship it, don't present it.",{"type":41,"tag":49,"props":156,"children":158},{"id":157},"hard-rules-production-correctness-non-negotiable",[159],{"type":46,"value":160},"Hard Rules (production correctness — non-negotiable)",{"type":41,"tag":162,"props":163,"children":164},"p",{},[165],{"type":46,"value":166},"These are the things where deviation produces silent failures or broken output. They are not taste, they are correctness. Memorize them.",{"type":41,"tag":56,"props":168,"children":169},{},[170,180,198,216,232,250,260,270,280,290,308,318],{"type":41,"tag":60,"props":171,"children":172},{},[173,178],{"type":41,"tag":64,"props":174,"children":175},{},[176],{"type":46,"value":177},"Subtitles are applied LAST in the filter chain",{"type":46,"value":179},", after every overlay. Otherwise overlays hide captions. Silent failure.",{"type":41,"tag":60,"props":181,"children":182},{},[183,196],{"type":41,"tag":64,"props":184,"children":185},{},[186,188,194],{"type":46,"value":187},"Per-segment extract → lossless ",{"type":41,"tag":72,"props":189,"children":191},{"className":190},[],[192],{"type":46,"value":193},"-c copy",{"type":46,"value":195}," concat",{"type":46,"value":197},", not single-pass filtergraph. Otherwise you double-encode every segment when overlays are added.",{"type":41,"tag":60,"props":199,"children":200},{},[201,206,208,214],{"type":41,"tag":64,"props":202,"children":203},{},[204],{"type":46,"value":205},"30ms audio fades at every segment boundary",{"type":46,"value":207}," (",{"type":41,"tag":72,"props":209,"children":211},{"className":210},[],[212],{"type":46,"value":213},"afade=t=in:st=0:d=0.03,afade=t=out:st={dur-0.03}:d=0.03",{"type":46,"value":215},"). Otherwise audible pops at every cut.",{"type":41,"tag":60,"props":217,"children":218},{},[219,230],{"type":41,"tag":64,"props":220,"children":221},{},[222,224],{"type":46,"value":223},"Overlays use ",{"type":41,"tag":72,"props":225,"children":227},{"className":226},[],[228],{"type":46,"value":229},"setpts=PTS-STARTPTS+T\u002FTB",{"type":46,"value":231}," to shift the overlay's frame 0 to its window start. Otherwise you see the middle of the animation during the overlay window.",{"type":41,"tag":60,"props":233,"children":234},{},[235,240,242,248],{"type":41,"tag":64,"props":236,"children":237},{},[238],{"type":46,"value":239},"Master SRT uses output-timeline offsets",{"type":46,"value":241},": ",{"type":41,"tag":72,"props":243,"children":245},{"className":244},[],[246],{"type":46,"value":247},"output_time = word.start - segment_start + segment_offset",{"type":46,"value":249},". Otherwise captions misalign after segment concat.",{"type":41,"tag":60,"props":251,"children":252},{},[253,258],{"type":41,"tag":64,"props":254,"children":255},{},[256],{"type":46,"value":257},"Never cut inside a word.",{"type":46,"value":259}," Snap every cut edge to a word boundary from the Scribe transcript.",{"type":41,"tag":60,"props":261,"children":262},{},[263,268],{"type":41,"tag":64,"props":264,"children":265},{},[266],{"type":46,"value":267},"Pad every cut edge.",{"type":46,"value":269}," Working window: 30–200ms. Scribe timestamps drift 50–100ms — padding absorbs the drift. Tighter for fast-paced, looser for cinematic.",{"type":41,"tag":60,"props":271,"children":272},{},[273,278],{"type":41,"tag":64,"props":274,"children":275},{},[276],{"type":46,"value":277},"Word-level verbatim ASR only.",{"type":46,"value":279}," Never SRT\u002Fphrase mode (loses sub-second gap data). Never normalized fillers (loses editorial signal).",{"type":41,"tag":60,"props":281,"children":282},{},[283,288],{"type":41,"tag":64,"props":284,"children":285},{},[286],{"type":46,"value":287},"Cache transcripts per source.",{"type":46,"value":289}," Never re-transcribe unless the source file itself changed.",{"type":41,"tag":60,"props":291,"children":292},{},[293,298,300,306],{"type":41,"tag":64,"props":294,"children":295},{},[296],{"type":46,"value":297},"Parallel sub-agents for multiple animations.",{"type":46,"value":299}," Never sequential. Spawn N at once via the ",{"type":41,"tag":72,"props":301,"children":303},{"className":302},[],[304],{"type":46,"value":305},"Agent",{"type":46,"value":307}," tool; total wall time ≈ slowest one.",{"type":41,"tag":60,"props":309,"children":310},{},[311,316],{"type":41,"tag":64,"props":312,"children":313},{},[314],{"type":46,"value":315},"Strategy confirmation before execution.",{"type":46,"value":317}," Never touch the cut until the user has approved the plain-English plan.",{"type":41,"tag":60,"props":319,"children":320},{},[321,334,336,342],{"type":41,"tag":64,"props":322,"children":323},{},[324,326,332],{"type":46,"value":325},"All session outputs in ",{"type":41,"tag":72,"props":327,"children":329},{"className":328},[],[330],{"type":46,"value":331},"\u003Cvideos_dir>\u002Fedit\u002F",{"type":46,"value":333},".",{"type":46,"value":335}," Never write inside the ",{"type":41,"tag":72,"props":337,"children":339},{"className":338},[],[340],{"type":46,"value":341},"video-use\u002F",{"type":46,"value":343}," project directory.",{"type":41,"tag":162,"props":345,"children":346},{},[347],{"type":46,"value":348},"Everything else in this document is a worked example. Deviate whenever the material calls for it.",{"type":41,"tag":49,"props":350,"children":352},{"id":351},"directory-layout",[353],{"type":46,"value":354},"Directory layout",{"type":41,"tag":162,"props":356,"children":357},{},[358,360,365,367,372],{"type":46,"value":359},"The skill lives in ",{"type":41,"tag":72,"props":361,"children":363},{"className":362},[],[364],{"type":46,"value":341},{"type":46,"value":366},". User footage lives wherever they put it. All session outputs go into ",{"type":41,"tag":72,"props":368,"children":370},{"className":369},[],[371],{"type":46,"value":331},{"type":46,"value":333},{"type":41,"tag":374,"props":375,"children":379},"pre",{"className":376,"code":378,"language":46},[377],"language-text","\u003Cvideos_dir>\u002F\n├── \u003Csource files, untouched>\n└── edit\u002F\n    ├── project.md               ← memory; appended every session\n    ├── takes_packed.md          ← phrase-level transcripts, the LLM's primary reading view\n    ├── edl.json                 ← cut decisions\n    ├── transcripts\u002F\u003Cname>.json  ← cached raw Scribe JSON\n    ├── animations\u002Fslot_\u003Cid>\u002F    ← per-animation source + render + reasoning\n    ├── clips_graded\u002F            ← per-segment extracts with grade + fades\n    ├── master.srt               ← output-timeline subtitles\n    ├── downloads\u002F               ← yt-dlp outputs\n    ├── verify\u002F                  ← debug frames \u002F timeline PNGs\n    ├── preview.mp4\n    └── final.mp4\n",[380],{"type":41,"tag":72,"props":381,"children":383},{"__ignoreMap":382},"",[384],{"type":46,"value":378},{"type":41,"tag":49,"props":386,"children":388},{"id":387},"setup",[389],{"type":46,"value":390},"Setup",{"type":41,"tag":162,"props":392,"children":393},{},[394,396,402],{"type":46,"value":395},"First-time install lives in ",{"type":41,"tag":72,"props":397,"children":399},{"className":398},[],[400],{"type":46,"value":401},"install.md",{"type":46,"value":403}," (clone, deps, ffmpeg, skill registration, API key). Don't re-run it every session; on cold start just verify:",{"type":41,"tag":405,"props":406,"children":407},"ul",{},[408,442,461,482,487,498,527],{"type":41,"tag":60,"props":409,"children":410},{},[411,417,419,425,427,432,434,440],{"type":41,"tag":72,"props":412,"children":414},{"className":413},[],[415],{"type":46,"value":416},"ELEVENLABS_API_KEY",{"type":46,"value":418}," resolves — either in the environment or in ",{"type":41,"tag":72,"props":420,"children":422},{"className":421},[],[423],{"type":46,"value":424},".env",{"type":46,"value":426}," at the video-use repo root. If missing, ask the user to paste one and write it to ",{"type":41,"tag":72,"props":428,"children":430},{"className":429},[],[431],{"type":46,"value":424},{"type":46,"value":433}," (never to the user's ",{"type":41,"tag":72,"props":435,"children":437},{"className":436},[],[438],{"type":46,"value":439},"\u003Cvideos_dir>",{"type":46,"value":441},").",{"type":41,"tag":60,"props":443,"children":444},{},[445,451,453,459],{"type":41,"tag":72,"props":446,"children":448},{"className":447},[],[449],{"type":46,"value":450},"ffmpeg",{"type":46,"value":452}," + ",{"type":41,"tag":72,"props":454,"children":456},{"className":455},[],[457],{"type":46,"value":458},"ffprobe",{"type":46,"value":460}," on PATH.",{"type":41,"tag":60,"props":462,"children":463},{},[464,466,472,474,480],{"type":46,"value":465},"Python deps installed (",{"type":41,"tag":72,"props":467,"children":469},{"className":468},[],[470],{"type":46,"value":471},"uv sync",{"type":46,"value":473}," or ",{"type":41,"tag":72,"props":475,"children":477},{"className":476},[],[478],{"type":46,"value":479},"pip install -e .",{"type":46,"value":481}," inside the repo).",{"type":41,"tag":60,"props":483,"children":484},{},[485],{"type":46,"value":486},"Node.js + npm available if the session needs HyperFrames or Remotion slots. HyperFrames currently requires Node.js 22+.",{"type":41,"tag":60,"props":488,"children":489},{},[490,496],{"type":41,"tag":72,"props":491,"children":493},{"className":492},[],[494],{"type":46,"value":495},"yt-dlp",{"type":46,"value":497},", HyperFrames, Remotion, Manim installed only on first use.",{"type":41,"tag":60,"props":499,"children":500},{},[501,503,509,511,517,519,525],{"type":46,"value":502},"First-use animation setup happens inside the slot directory, never at the video-use repo root. HyperFrames can be invoked with ",{"type":41,"tag":72,"props":504,"children":506},{"className":505},[],[507],{"type":46,"value":508},"npx --yes hyperframes ...",{"type":46,"value":510},"; Remotion can be scaffolded with ",{"type":41,"tag":72,"props":512,"children":514},{"className":513},[],[515],{"type":46,"value":516},"npx create-video@latest",{"type":46,"value":518}," or installed as a project-local dependency before using its ",{"type":41,"tag":72,"props":520,"children":522},{"className":521},[],[523],{"type":46,"value":524},"remotion render",{"type":46,"value":526}," command.",{"type":41,"tag":60,"props":528,"children":529},{},[530,532,538],{"type":46,"value":531},"This skill vendors ",{"type":41,"tag":72,"props":533,"children":535},{"className":534},[],[536],{"type":46,"value":537},"skills\u002Fmanim-video\u002F",{"type":46,"value":539},". Read its SKILL.md when building a Manim slot.",{"type":41,"tag":162,"props":541,"children":542},{},[543,545,551,553,559,561,567,568,574],{"type":46,"value":544},"Helpers (",{"type":41,"tag":72,"props":546,"children":548},{"className":547},[],[549],{"type":46,"value":550},"helpers\u002Ftranscribe.py",{"type":46,"value":552},", ",{"type":41,"tag":72,"props":554,"children":556},{"className":555},[],[557],{"type":46,"value":558},"helpers\u002Frender.py",{"type":46,"value":560},", etc.) live alongside this SKILL.md. Resolve their paths relative to the directory containing this file — the skill is typically symlinked at ",{"type":41,"tag":72,"props":562,"children":564},{"className":563},[],[565],{"type":46,"value":566},"~\u002F.claude\u002Fskills\u002Fvideo-use\u002F",{"type":46,"value":473},{"type":41,"tag":72,"props":569,"children":571},{"className":570},[],[572],{"type":46,"value":573},"~\u002F.codex\u002Fskills\u002Fvideo-use\u002F",{"type":46,"value":333},{"type":41,"tag":49,"props":576,"children":578},{"id":577},"helpers",[579],{"type":46,"value":580},"Helpers",{"type":41,"tag":405,"props":582,"children":583},{},[584,606,620,649,670,700],{"type":41,"tag":60,"props":585,"children":586},{},[587,596,598,604],{"type":41,"tag":64,"props":588,"children":589},{},[590],{"type":41,"tag":72,"props":591,"children":593},{"className":592},[],[594],{"type":46,"value":595},"transcribe.py \u003Cvideo>",{"type":46,"value":597}," — single-file Scribe call. ",{"type":41,"tag":72,"props":599,"children":601},{"className":600},[],[602],{"type":46,"value":603},"--num-speakers N",{"type":46,"value":605}," optional. Cached.",{"type":41,"tag":60,"props":607,"children":608},{},[609,618],{"type":41,"tag":64,"props":610,"children":611},{},[612],{"type":41,"tag":72,"props":613,"children":615},{"className":614},[],[616],{"type":46,"value":617},"transcribe_batch.py \u003Cvideos_dir>",{"type":46,"value":619}," — 4-worker parallel transcription. Use for multi-take.",{"type":41,"tag":60,"props":621,"children":622},{},[623,632,634,640,642,647],{"type":41,"tag":64,"props":624,"children":625},{},[626],{"type":41,"tag":72,"props":627,"children":629},{"className":628},[],[630],{"type":46,"value":631},"pack_transcripts.py --edit-dir \u003Cdir>",{"type":46,"value":633}," — ",{"type":41,"tag":72,"props":635,"children":637},{"className":636},[],[638],{"type":46,"value":639},"transcripts\u002F*.json",{"type":46,"value":641}," → ",{"type":41,"tag":72,"props":643,"children":645},{"className":644},[],[646],{"type":46,"value":77},{"type":46,"value":648}," (phrase-level, break on silence ≥ 0.5s).",{"type":41,"tag":60,"props":650,"children":651},{},[652,661,663,668],{"type":41,"tag":64,"props":653,"children":654},{},[655],{"type":41,"tag":72,"props":656,"children":658},{"className":657},[],[659],{"type":46,"value":660},"timeline_view.py \u003Cvideo> \u003Cstart> \u003Cend>",{"type":46,"value":662}," — filmstrip + waveform PNG. On-demand visual drill-down. ",{"type":41,"tag":64,"props":664,"children":665},{},[666],{"type":46,"value":667},"Not a scan tool",{"type":46,"value":669}," — use it at decision points, not constantly.",{"type":41,"tag":60,"props":671,"children":672},{},[673,682,684,690,692,698],{"type":41,"tag":64,"props":674,"children":675},{},[676],{"type":41,"tag":72,"props":677,"children":679},{"className":678},[],[680],{"type":46,"value":681},"render.py \u003Cedl.json> -o \u003Cout>",{"type":46,"value":683}," — per-segment extract → concat → overlays (PTS-shifted) → subtitles LAST. ",{"type":41,"tag":72,"props":685,"children":687},{"className":686},[],[688],{"type":46,"value":689},"--preview",{"type":46,"value":691}," for 720p fast. ",{"type":41,"tag":72,"props":693,"children":695},{"className":694},[],[696],{"type":46,"value":697},"--build-subtitles",{"type":46,"value":699}," to generate master.srt inline.",{"type":41,"tag":60,"props":701,"children":702},{},[703,712,714,720],{"type":41,"tag":64,"props":704,"children":705},{},[706],{"type":41,"tag":72,"props":707,"children":709},{"className":708},[],[710],{"type":46,"value":711},"grade.py \u003Cin> -o \u003Cout>",{"type":46,"value":713}," — ffmpeg filter chain grade. Presets + ",{"type":41,"tag":72,"props":715,"children":717},{"className":716},[],[718],{"type":46,"value":719},"--filter '\u003Craw>'",{"type":46,"value":721}," for custom.",{"type":41,"tag":162,"props":723,"children":724},{},[725,727,733,735,741,743,748],{"type":46,"value":726},"For animations, create ",{"type":41,"tag":72,"props":728,"children":730},{"className":729},[],[731],{"type":46,"value":732},"\u003Cedit>\u002Fanimations\u002Fslot_\u003Cid>\u002F",{"type":46,"value":734}," with ",{"type":41,"tag":72,"props":736,"children":738},{"className":737},[],[739],{"type":46,"value":740},"Bash",{"type":46,"value":742}," and spawn a sub-agent via the ",{"type":41,"tag":72,"props":744,"children":746},{"className":745},[],[747],{"type":46,"value":305},{"type":46,"value":749}," tool.",{"type":41,"tag":49,"props":751,"children":753},{"id":752},"the-process",[754],{"type":46,"value":755},"The process",{"type":41,"tag":56,"props":757,"children":758},{},[759,807,824,841,856,888,904,976],{"type":41,"tag":60,"props":760,"children":761},{},[762,767,769,774,776,782,784,790,792,797,799,805],{"type":41,"tag":64,"props":763,"children":764},{},[765],{"type":46,"value":766},"Inventory.",{"type":46,"value":768}," ",{"type":41,"tag":72,"props":770,"children":772},{"className":771},[],[773],{"type":46,"value":458},{"type":46,"value":775}," every source. ",{"type":41,"tag":72,"props":777,"children":779},{"className":778},[],[780],{"type":46,"value":781},"transcribe_batch.py",{"type":46,"value":783}," on the directory. ",{"type":41,"tag":72,"props":785,"children":787},{"className":786},[],[788],{"type":46,"value":789},"pack_transcripts.py",{"type":46,"value":791}," to produce ",{"type":41,"tag":72,"props":793,"children":795},{"className":794},[],[796],{"type":46,"value":77},{"type":46,"value":798},". Sample one or two ",{"type":41,"tag":72,"props":800,"children":802},{"className":801},[],[803],{"type":46,"value":804},"timeline_view",{"type":46,"value":806},"s for a visual first impression.",{"type":41,"tag":60,"props":808,"children":809},{},[810,815,817,822],{"type":41,"tag":64,"props":811,"children":812},{},[813],{"type":46,"value":814},"Pre-scan for problems.",{"type":46,"value":816}," One pass over ",{"type":41,"tag":72,"props":818,"children":820},{"className":819},[],[821],{"type":46,"value":77},{"type":46,"value":823}," to note verbal slips, obvious mis-speaks, or phrasings to avoid. Plain list, feed into the editor brief.",{"type":41,"tag":60,"props":825,"children":826},{},[827,832,834,839],{"type":41,"tag":64,"props":828,"children":829},{},[830],{"type":46,"value":831},"Converse.",{"type":46,"value":833}," Describe what you see in plain English. Ask questions ",{"type":41,"tag":121,"props":835,"children":836},{},[837],{"type":46,"value":838},"shaped by the material",{"type":46,"value":840},". Collect: content type, target length\u002Faspect, aesthetic\u002Fbrand direction, pacing feel, must-preserve moments, must-cut moments, animation and grade preferences, subtitle needs. Do not use a fixed checklist — the right questions are different every time.",{"type":41,"tag":60,"props":842,"children":843},{},[844,849,851],{"type":41,"tag":64,"props":845,"children":846},{},[847],{"type":46,"value":848},"Propose strategy.",{"type":46,"value":850}," 4–8 sentences: shape, take choices, cut direction, animation plan, grade direction, subtitle style, length estimate. ",{"type":41,"tag":64,"props":852,"children":853},{},[854],{"type":46,"value":855},"Wait for confirmation.",{"type":41,"tag":60,"props":857,"children":858},{},[859,864,866,872,874,879,881,887],{"type":41,"tag":64,"props":860,"children":861},{},[862],{"type":46,"value":863},"Execute.",{"type":46,"value":865}," Produce ",{"type":41,"tag":72,"props":867,"children":869},{"className":868},[],[870],{"type":46,"value":871},"edl.json",{"type":46,"value":873}," via the editor sub-agent brief. Drill into ",{"type":41,"tag":72,"props":875,"children":877},{"className":876},[],[878],{"type":46,"value":804},{"type":46,"value":880}," at ambiguous moments. Build animations in parallel sub-agents. Apply grade per-segment. Compose via ",{"type":41,"tag":72,"props":882,"children":884},{"className":883},[],[885],{"type":46,"value":886},"render.py",{"type":46,"value":333},{"type":41,"tag":60,"props":889,"children":890},{},[891,896,897,903],{"type":41,"tag":64,"props":892,"children":893},{},[894],{"type":46,"value":895},"Preview.",{"type":46,"value":768},{"type":41,"tag":72,"props":898,"children":900},{"className":899},[],[901],{"type":46,"value":902},"render.py --preview",{"type":46,"value":333},{"type":41,"tag":60,"props":905,"children":906},{},[907,912,914,919,921,926,928,951,955,957,962,964,967,969,974],{"type":41,"tag":64,"props":908,"children":909},{},[910],{"type":46,"value":911},"Self-eval (before showing the user).",{"type":46,"value":913}," Run ",{"type":41,"tag":72,"props":915,"children":917},{"className":916},[],[918],{"type":46,"value":804},{"type":46,"value":920}," on the ",{"type":41,"tag":64,"props":922,"children":923},{},[924],{"type":46,"value":925},"rendered output",{"type":46,"value":927}," (not the sources) at every cut boundary (±1.5s window). Check each image for:",{"type":41,"tag":405,"props":929,"children":930},{},[931,936,941,946],{"type":41,"tag":60,"props":932,"children":933},{},[934],{"type":46,"value":935},"Visual discontinuity \u002F flash \u002F jump at the cut",{"type":41,"tag":60,"props":937,"children":938},{},[939],{"type":46,"value":940},"Waveform spike at the boundary (audio pop that slipped past the 30ms fade)",{"type":41,"tag":60,"props":942,"children":943},{},[944],{"type":46,"value":945},"Subtitle hidden behind an overlay (Rule 1 violation)",{"type":41,"tag":60,"props":947,"children":948},{},[949],{"type":46,"value":950},"Overlay misaligned or showing wrong frames (Rule 4 violation)",{"type":41,"tag":952,"props":953,"children":954},"br",{},[],{"type":46,"value":956},"Also sample: first 2s, last 2s, and 2–3 mid-points — check grade consistency, subtitle readability, overall coherence. Run ",{"type":41,"tag":72,"props":958,"children":960},{"className":959},[],[961],{"type":46,"value":458},{"type":46,"value":963}," on the output to verify duration matches the EDL expectation.",{"type":41,"tag":952,"props":965,"children":966},{},[],{"type":46,"value":968},"If anything fails: fix → re-render → re-eval. ",{"type":41,"tag":64,"props":970,"children":971},{},[972],{"type":46,"value":973},"Cap at 3 self-eval passes",{"type":46,"value":975}," — if issues remain after 3, flag them to the user rather than looping forever. Only present the preview once the self-eval passes.",{"type":41,"tag":60,"props":977,"children":978},{},[979,984,986,992],{"type":41,"tag":64,"props":980,"children":981},{},[982],{"type":46,"value":983},"Iterate + persist.",{"type":46,"value":985}," Natural-language feedback, re-plan, re-render. Never re-transcribe. Final render on confirmation. Append to ",{"type":41,"tag":72,"props":987,"children":989},{"className":988},[],[990],{"type":46,"value":991},"project.md",{"type":46,"value":333},{"type":41,"tag":49,"props":994,"children":996},{"id":995},"cut-craft-techniques",[997],{"type":46,"value":998},"Cut craft (techniques)",{"type":41,"tag":405,"props":1000,"children":1001},{},[1002,1012,1022,1032,1063,1073,1083],{"type":41,"tag":60,"props":1003,"children":1004},{},[1005,1010],{"type":41,"tag":64,"props":1006,"children":1007},{},[1008],{"type":46,"value":1009},"Audio-first.",{"type":46,"value":1011}," Candidate cuts from word boundaries and silence gaps.",{"type":41,"tag":60,"props":1013,"children":1014},{},[1015,1020],{"type":41,"tag":64,"props":1016,"children":1017},{},[1018],{"type":46,"value":1019},"Preserve peaks.",{"type":46,"value":1021}," Laughs, punchlines, emphasis beats. Extend past punchlines to include reactions — the laugh IS the beat.",{"type":41,"tag":60,"props":1023,"children":1024},{},[1025,1030],{"type":41,"tag":64,"props":1026,"children":1027},{},[1028],{"type":46,"value":1029},"Speaker handoffs",{"type":46,"value":1031}," benefit from air between utterances. Common values: 400–600ms. Less for fast-paced, more for cinematic. Taste call.",{"type":41,"tag":60,"props":1033,"children":1034},{},[1035,1040,1041,1047,1048,1054,1055,1061],{"type":41,"tag":64,"props":1036,"children":1037},{},[1038],{"type":46,"value":1039},"Audio events as signals.",{"type":46,"value":768},{"type":41,"tag":72,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":46,"value":1046},"(laughs)",{"type":46,"value":552},{"type":41,"tag":72,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":46,"value":1053},"(sighs)",{"type":46,"value":552},{"type":41,"tag":72,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":46,"value":1060},"(applause)",{"type":46,"value":1062}," mark beats. Extend past them.",{"type":41,"tag":60,"props":1064,"children":1065},{},[1066,1071],{"type":41,"tag":64,"props":1067,"children":1068},{},[1069],{"type":46,"value":1070},"Silence gaps are cut candidates.",{"type":46,"value":1072}," Silences ≥400ms are usually the cleanest. 150–400ms phrase boundaries are usable with a visual check. \u003C150ms is unsafe (mid-phrase).",{"type":41,"tag":60,"props":1074,"children":1075},{},[1076,1081],{"type":41,"tag":64,"props":1077,"children":1078},{},[1079],{"type":46,"value":1080},"Example cut padding",{"type":46,"value":1082}," (the launch video shipped with this): 50ms before the first kept word, 80ms after the last. Tighter for montage energy, looser for documentary. Stay in the 30–200ms working window (Hard Rule 7).",{"type":41,"tag":60,"props":1084,"children":1085},{},[1086,1091],{"type":41,"tag":64,"props":1087,"children":1088},{},[1089],{"type":46,"value":1090},"Never reason audio and video independently.",{"type":46,"value":1092}," Every cut must work on both tracks.",{"type":41,"tag":49,"props":1094,"children":1096},{"id":1095},"the-packed-transcript-primary-reading-view",[1097],{"type":46,"value":1098},"The packed transcript (primary reading view)",{"type":41,"tag":162,"props":1100,"children":1101},{},[1102,1107,1109,1114,1116,1122],{"type":41,"tag":72,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":46,"value":789},{"type":46,"value":1108}," reads all ",{"type":41,"tag":72,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":46,"value":639},{"type":46,"value":1115}," and produces one markdown file where each take is a list of phrase-level lines, each prefixed with its ",{"type":41,"tag":72,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":46,"value":1121},"[start-end]",{"type":46,"value":1123}," time range. Phrases break on any silence ≥ 0.5s OR speaker change. This is the artifact the editor sub-agent reads to pick cuts — it gives word-boundary precision from text alone at 1\u002F10 the tokens of raw JSON.",{"type":41,"tag":162,"props":1125,"children":1126},{},[1127],{"type":46,"value":1128},"Example line:",{"type":41,"tag":374,"props":1130,"children":1133},{"className":1131,"code":1132,"language":46},[377],"## C0103  (duration: 43.0s, 8 phrases)\n  [002.52-005.36] S0 Ninety percent of what a web agent does is completely wasted.\n  [006.08-006.74] S0 We fixed this.\n",[1134],{"type":41,"tag":72,"props":1135,"children":1136},{"__ignoreMap":382},[1137],{"type":46,"value":1132},{"type":41,"tag":49,"props":1139,"children":1141},{"id":1140},"editor-sub-agent-brief-for-multi-take-selection",[1142],{"type":46,"value":1143},"Editor sub-agent brief (for multi-take selection)",{"type":41,"tag":162,"props":1145,"children":1146},{},[1147],{"type":46,"value":1148},"When the task is \"pick the best take of each beat across many clips,\" spawn a dedicated sub-agent with a brief shaped like this. The structure is load-bearing; the pitch-shape example is not.",{"type":41,"tag":374,"props":1150,"children":1153},{"className":1151,"code":1152,"language":46},[377],"You are editing a \u003Ctype> video. Pick the best take of each beat and \nassemble them chronologically by beat, not by source clip order.\n\nINPUTS:\n  - takes_packed.md (time-annotated phrase-level transcripts of all takes)\n  - Product\u002Fnarrative context: \u003C2 sentences from the user>\n  - Speaker(s): \u003Cname, role, delivery style note>\n  - Expected structure: \u003Cpick an archetype or invent one>\n  - Verbal slips to avoid: \u003Clist from the pre-scan pass>\n  - Target runtime: \u003Cseconds>\n\nCommon structural archetypes (pick, adapt, or invent):\n  - Tech launch \u002F demo:   HOOK → PROBLEM → SOLUTION → BENEFIT → EXAMPLE → CTA\n  - Tutorial:             INTRO → SETUP → STEPS → GOTCHAS → RECAP\n  - Interview:            (QUESTION → ANSWER → FOLLOWUP) repeat\n  - Travel \u002F event:       ARRIVAL → HIGHLIGHTS → QUIET MOMENTS → DEPARTURE\n  - Documentary:          THESIS → EVIDENCE → COUNTERPOINT → CONCLUSION\n  - Music \u002F performance:  INTRO → VERSE → CHORUS → BRIDGE → OUTRO\n  - Or invent your own.\n\nRULES:\n  - Start\u002Fend times must fall on word boundaries from the transcript.\n  - Pad cut boundaries (working window 30–200ms).\n  - Prefer silences ≥ 400ms as cut targets.\n  - Unavoidable slips are kept if no better take exists. Note them in \"reason\".\n  - If over budget, revise: drop a beat or trim tails. Report total and self-correct.\n\nOUTPUT (JSON array, no prose):\n  [{\"source\": \"C0103\", \"start\": 2.42, \"end\": 6.85, \"beat\": \"HOOK\",\n    \"quote\": \"...\", \"reason\": \"...\"}, ...]\n\nReturn the final EDL and a one-line total runtime check.\n",[1154],{"type":41,"tag":72,"props":1155,"children":1156},{"__ignoreMap":382},[1157],{"type":46,"value":1152},{"type":41,"tag":49,"props":1159,"children":1161},{"id":1160},"color-grade-when-requested",[1162],{"type":46,"value":1163},"Color grade (when requested)",{"type":41,"tag":162,"props":1165,"children":1166},{},[1167,1169,1174,1176,1181],{"type":46,"value":1168},"Your job is to ",{"type":41,"tag":64,"props":1170,"children":1171},{},[1172],{"type":46,"value":1173},"reason about the image",{"type":46,"value":1175},", not apply a preset. Look at a frame (via ",{"type":41,"tag":72,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":46,"value":804},{"type":46,"value":1182},"), decide what's wrong, adjust one thing, look again.",{"type":41,"tag":162,"props":1184,"children":1185},{},[1186,1188,1194,1196,1202,1204,1210,1212,1218],{"type":46,"value":1187},"Mental model is ASC CDL. Per channel: ",{"type":41,"tag":72,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":46,"value":1193},"out = (in * slope + offset) ** power",{"type":46,"value":1195},", then global saturation. ",{"type":41,"tag":72,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":46,"value":1201},"slope",{"type":46,"value":1203}," → highlights, ",{"type":41,"tag":72,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":46,"value":1209},"offset",{"type":46,"value":1211}," → shadows, ",{"type":41,"tag":72,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":46,"value":1217},"power",{"type":46,"value":1219}," → midtones.",{"type":41,"tag":162,"props":1221,"children":1222},{},[1223,1228,1229,1235,1237,1243],{"type":41,"tag":64,"props":1224,"children":1225},{},[1226],{"type":46,"value":1227},"Example filter chains",{"type":46,"value":207},{"type":41,"tag":72,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":46,"value":1234},"grade.py",{"type":46,"value":1236}," has ",{"type":41,"tag":72,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":46,"value":1242},"--list-presets",{"type":46,"value":1244},"; use them as starting points or mix your own):",{"type":41,"tag":405,"props":1246,"children":1247},{},[1248,1262,1276],{"type":41,"tag":60,"props":1249,"children":1250},{},[1251,1260],{"type":41,"tag":64,"props":1252,"children":1253},{},[1254],{"type":41,"tag":72,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":46,"value":1259},"warm_cinematic",{"type":46,"value":1261}," — retro\u002Ftechnical, subtle teal\u002Forange split, desaturated. Shipped in a real launch video. Safe for talking heads.",{"type":41,"tag":60,"props":1263,"children":1264},{},[1265,1274],{"type":41,"tag":64,"props":1266,"children":1267},{},[1268],{"type":41,"tag":72,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":46,"value":1273},"neutral_punch",{"type":46,"value":1275}," — minimal corrective: contrast bump + gentle S-curve. No hue shifts.",{"type":41,"tag":60,"props":1277,"children":1278},{},[1279,1288],{"type":41,"tag":64,"props":1280,"children":1281},{},[1282],{"type":41,"tag":72,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":46,"value":1287},"none",{"type":46,"value":1289}," — straight copy. Default when the user hasn't asked.",{"type":41,"tag":162,"props":1291,"children":1292},{},[1293,1295,1301],{"type":46,"value":1294},"For anything else — portraiture, nature, product, music video, documentary — invent your own chain. ",{"type":41,"tag":72,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":46,"value":1300},"grade.py --filter '\u003Craw ffmpeg>'",{"type":46,"value":1302}," accepts any filter string.",{"type":41,"tag":162,"props":1304,"children":1305},{},[1306,1308,1313],{"type":46,"value":1307},"Hard rules: apply ",{"type":41,"tag":64,"props":1309,"children":1310},{},[1311],{"type":46,"value":1312},"per-segment during extraction",{"type":46,"value":1314}," (not post-concat, which re-encodes twice). Never go aggressive without testing skin tones.",{"type":41,"tag":49,"props":1316,"children":1318},{"id":1317},"subtitles-when-requested",[1319],{"type":46,"value":1320},"Subtitles (when requested)",{"type":41,"tag":162,"props":1322,"children":1323},{},[1324,1326,1331,1333,1338,1340,1345],{"type":46,"value":1325},"Subtitles have three dimensions worth reasoning about: ",{"type":41,"tag":64,"props":1327,"children":1328},{},[1329],{"type":46,"value":1330},"chunking",{"type":46,"value":1332}," (1\u002F2\u002F3\u002Fsentence per line), ",{"type":41,"tag":64,"props":1334,"children":1335},{},[1336],{"type":46,"value":1337},"case",{"type":46,"value":1339}," (UPPER\u002FTitle\u002FNatural), and ",{"type":41,"tag":64,"props":1341,"children":1342},{},[1343],{"type":46,"value":1344},"placement",{"type":46,"value":1346}," (margin from bottom). The right combo depends on content.",{"type":41,"tag":162,"props":1348,"children":1349},{},[1350,1355],{"type":41,"tag":64,"props":1351,"children":1352},{},[1353],{"type":46,"value":1354},"Worked styles",{"type":46,"value":1356}," — pick, adapt, or invent:",{"type":41,"tag":162,"props":1358,"children":1359},{},[1360,1369,1371,1377,1379,1384,1386,1392],{"type":41,"tag":64,"props":1361,"children":1362},{},[1363],{"type":41,"tag":72,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":46,"value":1368},"bold-overlay",{"type":46,"value":1370}," — short-form tech launch, fast-paced social. 2-word chunks, UPPERCASE, break on punctuation, Helvetica 18 Bold, white-on-outline, ",{"type":41,"tag":72,"props":1372,"children":1374},{"className":1373},[],[1375],{"type":46,"value":1376},"MarginV=35",{"type":46,"value":1378},". ",{"type":41,"tag":72,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":46,"value":886},{"type":46,"value":1385}," ships with this as ",{"type":41,"tag":72,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":46,"value":1391},"SUB_FORCE_STYLE",{"type":46,"value":333},{"type":41,"tag":374,"props":1394,"children":1397},{"className":1395,"code":1396,"language":46},[377],"FontName=Helvetica,FontSize=18,Bold=1,\nPrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,BackColour=&H00000000,\nBorderStyle=1,Outline=2,Shadow=0,\nAlignment=2,MarginV=35\n",[1398],{"type":41,"tag":72,"props":1399,"children":1400},{"__ignoreMap":382},[1401],{"type":46,"value":1396},{"type":41,"tag":162,"props":1403,"children":1404},{},[1405,1414,1416,1422],{"type":41,"tag":64,"props":1406,"children":1407},{},[1408],{"type":41,"tag":72,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":46,"value":1413},"natural-sentence",{"type":46,"value":1415}," (if you invent this mode) — narrative, documentary, education. 4–7 word chunks, sentence case, break on natural pauses, ",{"type":41,"tag":72,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":46,"value":1421},"MarginV=60–80",{"type":46,"value":1423},", larger font for readability, slightly wider max-width. No shipped force_style — design one if you need it.",{"type":41,"tag":162,"props":1425,"children":1426},{},[1427],{"type":46,"value":1428},"Invent a third style if neither fits. Hard rules: subtitles LAST (Rule 1), output-timeline offsets (Rule 5).",{"type":41,"tag":49,"props":1430,"children":1432},{"id":1431},"animations-when-requested",[1433],{"type":46,"value":1434},"Animations (when requested)",{"type":41,"tag":162,"props":1436,"children":1437},{},[1438,1440,1445],{"type":46,"value":1439},"Animations match the content and the brand. ",{"type":41,"tag":64,"props":1441,"children":1442},{},[1443],{"type":46,"value":1444},"Get the palette, font, and visual language from the conversation",{"type":46,"value":1446}," — never assume a default. If the user hasn't told you, propose a palette in the strategy phase and wait for confirmation before building anything.",{"type":41,"tag":162,"props":1448,"children":1449},{},[1450],{"type":41,"tag":64,"props":1451,"children":1452},{},[1453],{"type":46,"value":1454},"Tool options:",{"type":41,"tag":162,"props":1456,"children":1457},{},[1458],{"type":46,"value":1459},"Pick the engine per animation slot. Do not default to Remotion just because the animation is web-adjacent.",{"type":41,"tag":405,"props":1461,"children":1462},{},[1463,1473,1483,1501],{"type":41,"tag":60,"props":1464,"children":1465},{},[1466,1471],{"type":41,"tag":64,"props":1467,"children":1468},{},[1469],{"type":46,"value":1470},"HyperFrames",{"type":46,"value":1472}," — Browser-native HTML\u002FCSS\u002FGSAP video compositions: product UI motion, website-to-video or mockup-to-video captures, kinetic typography, landing-page\u002Fstoryboard promos, data-driven UI states, transparent WebM overlays, and clips that need deterministic frame capture plus HyperFrames lint\u002Fvalidate\u002Frender checks. Best when the animation should be authored and verified like a web composition instead of a React component tree.",{"type":41,"tag":60,"props":1474,"children":1475},{},[1476,1481],{"type":41,"tag":64,"props":1477,"children":1478},{},[1479],{"type":46,"value":1480},"Remotion",{"type":46,"value":1482}," — React\u002FCSS compositions with component state, reusable React primitives, or an existing Remotion brand system. Best when the user specifically asks for React\u002FRemotion or when React composition is the simpler authoring model.",{"type":41,"tag":60,"props":1484,"children":1485},{},[1486,1491,1493,1499],{"type":41,"tag":64,"props":1487,"children":1488},{},[1489],{"type":46,"value":1490},"Manim",{"type":46,"value":1492}," — formal diagrams, state machines, equation derivations, graph morphs. Read ",{"type":41,"tag":72,"props":1494,"children":1496},{"className":1495},[],[1497],{"type":46,"value":1498},"skills\u002Fmanim-video\u002FSKILL.md",{"type":46,"value":1500}," and its references for depth.",{"type":41,"tag":60,"props":1502,"children":1503},{},[1504,1509],{"type":41,"tag":64,"props":1505,"children":1506},{},[1507],{"type":46,"value":1508},"PIL + PNG sequence + ffmpeg",{"type":46,"value":1510}," — simple overlay cards: counters, typewriter text, single bar reveals, progressive draws. Fast to iterate, any aesthetic you want. The launch video used this.",{"type":41,"tag":162,"props":1512,"children":1513},{},[1514,1516,1522,1523,1529,1531,1537,1538,1544,1546,1552,1553,1559,1561,1567],{"type":46,"value":1515},"For HyperFrames slots, scaffold the slot inside ",{"type":41,"tag":72,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":46,"value":1521},"edit\u002Fanimations\u002Fslot_\u003Cid>\u002F",{"type":46,"value":734},{"type":41,"tag":72,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":46,"value":1528},"npx --yes hyperframes init . --example blank --non-interactive --skip-skills",{"type":46,"value":1530},", build the HTML composition there, run the HyperFrames checks that fit the slot (",{"type":41,"tag":72,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":46,"value":1536},"lint",{"type":46,"value":552},{"type":41,"tag":72,"props":1539,"children":1541},{"className":1540},[],[1542],{"type":46,"value":1543},"validate",{"type":46,"value":1545},", and a draft render when practical), then produce the final overlay video with ",{"type":41,"tag":72,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":46,"value":1551},"npx --yes hyperframes render . -o render.mp4",{"type":46,"value":473},{"type":41,"tag":72,"props":1554,"children":1556},{"className":1555},[],[1557],{"type":46,"value":1558},"--format webm -o render.webm",{"type":46,"value":1560}," when alpha is required. Point the EDL overlay ",{"type":41,"tag":72,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":46,"value":1566},"file",{"type":46,"value":1568}," at the actual rendered path.",{"type":41,"tag":162,"props":1570,"children":1571},{},[1572,1574,1579,1581,1587,1589,1594,1596,1601],{"type":46,"value":1573},"For Remotion slots, keep the Remotion project isolated inside the same slot directory, scaffold with ",{"type":41,"tag":72,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":46,"value":516},{"type":46,"value":1580}," or install Remotion locally there, render the composition to ",{"type":41,"tag":72,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":46,"value":1586},"render.mp4",{"type":46,"value":1588}," with the project-local ",{"type":41,"tag":72,"props":1590,"children":1592},{"className":1591},[],[1593],{"type":46,"value":524},{"type":46,"value":1595}," command, and verify duration and dimensions with ",{"type":41,"tag":72,"props":1597,"children":1599},{"className":1598},[],[1600],{"type":46,"value":458},{"type":46,"value":333},{"type":41,"tag":162,"props":1603,"children":1604},{},[1605],{"type":46,"value":1606},"None is mandatory. Invent hybrids if useful (e.g., PIL background with a HyperFrames or Remotion layer on top).",{"type":41,"tag":162,"props":1608,"children":1609},{},[1610],{"type":41,"tag":64,"props":1611,"children":1612},{},[1613],{"type":46,"value":1614},"Duration rules of thumb, context-dependent:",{"type":41,"tag":405,"props":1616,"children":1617},{},[1618,1628,1650,1660,1678],{"type":41,"tag":60,"props":1619,"children":1620},{},[1621,1626],{"type":41,"tag":64,"props":1622,"children":1623},{},[1624],{"type":46,"value":1625},"Sync-to-narration explanations.",{"type":46,"value":1627}," A viewer needs to parse the content at 1×. Rough floor 3s, typical 5–7s for simple cards, 8–14s for complex diagrams. The launch video shipped at 5–7s per simple card.",{"type":41,"tag":60,"props":1629,"children":1630},{},[1631,1636,1638,1643,1645],{"type":41,"tag":64,"props":1632,"children":1633},{},[1634],{"type":46,"value":1635},"Beat-synced accents",{"type":46,"value":1637}," (music video, fast montage). 0.5–2s is fine — they're visual accents, not information. The \"readable at 1×\" rule becomes ",{"type":41,"tag":121,"props":1639,"children":1640},{},[1641],{"type":46,"value":1642},"\"recognizable at 1×\"",{"type":46,"value":1644},", not ",{"type":41,"tag":121,"props":1646,"children":1647},{},[1648],{"type":46,"value":1649},"\"fully parseable.\"",{"type":41,"tag":60,"props":1651,"children":1652},{},[1653,1658],{"type":41,"tag":64,"props":1654,"children":1655},{},[1656],{"type":46,"value":1657},"Hold the final frame ≥ 1s",{"type":46,"value":1659}," before the cut (universal).",{"type":41,"tag":60,"props":1661,"children":1662},{},[1663,1668,1670,1676],{"type":41,"tag":64,"props":1664,"children":1665},{},[1666],{"type":46,"value":1667},"Over voiceover:",{"type":46,"value":1669}," total duration ≥ ",{"type":41,"tag":72,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":46,"value":1675},"narration_length + 1s",{"type":46,"value":1677}," (universal).",{"type":41,"tag":60,"props":1679,"children":1680},{},[1681,1686],{"type":41,"tag":64,"props":1682,"children":1683},{},[1684],{"type":46,"value":1685},"Never parallel-reveal independent elements",{"type":46,"value":1687}," — the eye can't track two new things at once. One thing, pause, next thing.",{"type":41,"tag":162,"props":1689,"children":1690},{},[1691,1696,1698,1704],{"type":41,"tag":64,"props":1692,"children":1693},{},[1694],{"type":46,"value":1695},"Animation payoff timing (rule for sync-to-narration):",{"type":46,"value":1697}," get the payoff word's timestamp. Start the overlay ",{"type":41,"tag":72,"props":1699,"children":1701},{"className":1700},[],[1702],{"type":46,"value":1703},"reveal_duration",{"type":46,"value":1705}," seconds earlier so the landing frame coincides with the spoken payoff word. Without this sync the animation feels disconnected.",{"type":41,"tag":162,"props":1707,"children":1708},{},[1709,1714,1716,1722],{"type":41,"tag":64,"props":1710,"children":1711},{},[1712],{"type":46,"value":1713},"Easing",{"type":46,"value":1715}," (universal — never ",{"type":41,"tag":72,"props":1717,"children":1719},{"className":1718},[],[1720],{"type":46,"value":1721},"linear",{"type":46,"value":1723},", it looks robotic):",{"type":41,"tag":374,"props":1725,"children":1729},{"className":1726,"code":1727,"language":1728,"meta":382,"style":382},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","def ease_out_cubic(t):    return 1 - (1 - t) ** 3\ndef ease_in_out_cubic(t):\n    if t \u003C 0.5: return 4 * t ** 3\n    return 1 - (-2 * t + 2) ** 3 \u002F 2\n","python",[1730],{"type":41,"tag":72,"props":1731,"children":1732},{"__ignoreMap":382},[1733,1744,1753,1762],{"type":41,"tag":1734,"props":1735,"children":1738},"span",{"class":1736,"line":1737},"line",1,[1739],{"type":41,"tag":1734,"props":1740,"children":1741},{},[1742],{"type":46,"value":1743},"def ease_out_cubic(t):    return 1 - (1 - t) ** 3\n",{"type":41,"tag":1734,"props":1745,"children":1747},{"class":1736,"line":1746},2,[1748],{"type":41,"tag":1734,"props":1749,"children":1750},{},[1751],{"type":46,"value":1752},"def ease_in_out_cubic(t):\n",{"type":41,"tag":1734,"props":1754,"children":1756},{"class":1736,"line":1755},3,[1757],{"type":41,"tag":1734,"props":1758,"children":1759},{},[1760],{"type":46,"value":1761},"    if t \u003C 0.5: return 4 * t ** 3\n",{"type":41,"tag":1734,"props":1763,"children":1765},{"class":1736,"line":1764},4,[1766],{"type":41,"tag":1734,"props":1767,"children":1768},{},[1769],{"type":46,"value":1770},"    return 1 - (-2 * t + 2) ** 3 \u002F 2\n",{"type":41,"tag":162,"props":1772,"children":1773},{},[1774,1780,1782,1788],{"type":41,"tag":72,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":46,"value":1779},"ease_out_cubic",{"type":46,"value":1781}," for single reveals (slow landing). ",{"type":41,"tag":72,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":46,"value":1787},"ease_in_out_cubic",{"type":46,"value":1789}," for continuous draws.",{"type":41,"tag":162,"props":1791,"children":1792},{},[1793,1798],{"type":41,"tag":64,"props":1794,"children":1795},{},[1796],{"type":46,"value":1797},"Typing text anchor trick:",{"type":46,"value":1799}," center on the FULL string's width, not the partial-string width — otherwise text slides left during reveal.",{"type":41,"tag":162,"props":1801,"children":1802},{},[1803,1808],{"type":41,"tag":64,"props":1804,"children":1805},{},[1806],{"type":46,"value":1807},"Example palette",{"type":46,"value":1809}," (the launch video — one aesthetic among infinite):",{"type":41,"tag":405,"props":1811,"children":1812},{},[1813,1826,1847,1860,1873,1878],{"type":41,"tag":60,"props":1814,"children":1815},{},[1816,1818,1824],{"type":46,"value":1817},"Background ",{"type":41,"tag":72,"props":1819,"children":1821},{"className":1820},[],[1822],{"type":46,"value":1823},"(10, 10, 10)",{"type":46,"value":1825}," near-black",{"type":41,"tag":60,"props":1827,"children":1828},{},[1829,1831,1837,1839,1845],{"type":46,"value":1830},"Accent ",{"type":41,"tag":72,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":46,"value":1836},"#FF5A00",{"type":46,"value":1838}," \u002F ",{"type":41,"tag":72,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":46,"value":1844},"(255, 90, 0)",{"type":46,"value":1846}," orange",{"type":41,"tag":60,"props":1848,"children":1849},{},[1850,1852,1858],{"type":46,"value":1851},"Labels ",{"type":41,"tag":72,"props":1853,"children":1855},{"className":1854},[],[1856],{"type":46,"value":1857},"(110, 110, 110)",{"type":46,"value":1859}," dim gray",{"type":41,"tag":60,"props":1861,"children":1862},{},[1863,1865,1871],{"type":46,"value":1864},"Font: Menlo Bold at ",{"type":41,"tag":72,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":46,"value":1870},"\u002FSystem\u002FLibrary\u002FFonts\u002FMenlo.ttc",{"type":46,"value":1872}," (index 1)",{"type":41,"tag":60,"props":1874,"children":1875},{},[1876],{"type":46,"value":1877},"≤ 2 accent colors, ~40% empty space, minimal chrome",{"type":41,"tag":60,"props":1879,"children":1880},{},[1881],{"type":46,"value":1882},"Result: terminal \u002F retro tech feel",{"type":41,"tag":162,"props":1884,"children":1885},{},[1886],{"type":46,"value":1887},"This is one style. If the brand is warm and serif, use that. If it's colorful and playful, use that. If the user handed you a style guide, follow it. If they didn't, propose one and confirm.",{"type":41,"tag":162,"props":1889,"children":1890},{},[1891,1896,1898,1903],{"type":41,"tag":64,"props":1892,"children":1893},{},[1894],{"type":46,"value":1895},"Parallel sub-agent brief",{"type":46,"value":1897}," — each animation is one sub-agent spawned via the ",{"type":41,"tag":72,"props":1899,"children":1901},{"className":1900},[],[1902],{"type":46,"value":305},{"type":46,"value":1904}," tool. Each prompt is self-contained (sub-agents have no parent context). Include:",{"type":41,"tag":56,"props":1906,"children":1907},{},[1908,1925,1938,1943,1948,1953,1958,1963,1968,1973],{"type":41,"tag":60,"props":1909,"children":1910},{},[1911,1913],{"type":46,"value":1912},"One-sentence goal: ",{"type":41,"tag":121,"props":1914,"children":1915},{},[1916,1918,1923],{"type":46,"value":1917},"\"Build ONE animation: ",{"type":41,"tag":1734,"props":1919,"children":1920},{},[1921],{"type":46,"value":1922},"spec",{"type":46,"value":1924},". Nothing else.\"",{"type":41,"tag":60,"props":1926,"children":1927},{},[1928,1930,1936],{"type":46,"value":1929},"Absolute output path (",{"type":41,"tag":72,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":46,"value":1935},"\u003Cedit>\u002Fanimations\u002Fslot_\u003Cid>\u002Frender.mp4",{"type":46,"value":1937},")",{"type":41,"tag":60,"props":1939,"children":1940},{},[1941],{"type":46,"value":1942},"Exact technical spec: resolution, fps, codec, pix_fmt, CRF, duration",{"type":41,"tag":60,"props":1944,"children":1945},{},[1946],{"type":46,"value":1947},"Style palette as concrete values (RGB tuples, hex, or reference to a design system)",{"type":41,"tag":60,"props":1949,"children":1950},{},[1951],{"type":46,"value":1952},"Font path with index",{"type":41,"tag":60,"props":1954,"children":1955},{},[1956],{"type":46,"value":1957},"Frame-by-frame timeline (what happens when, with easing)",{"type":41,"tag":60,"props":1959,"children":1960},{},[1961],{"type":46,"value":1962},"Anti-list (\"no chrome, no extras, no titles unless specified\")",{"type":41,"tag":60,"props":1964,"children":1965},{},[1966],{"type":46,"value":1967},"Code pattern reference (copy helpers inline, don't import across slots)",{"type":41,"tag":60,"props":1969,"children":1970},{},[1971],{"type":46,"value":1972},"Deliverable checklist (script, render, verify duration via ffprobe, report)",{"type":41,"tag":60,"props":1974,"children":1975},{},[1976],{"type":41,"tag":64,"props":1977,"children":1978},{},[1979],{"type":46,"value":1980},"\"Do not ask questions. If anything is ambiguous, pick the most obvious interpretation and proceed.\"",{"type":41,"tag":162,"props":1982,"children":1983},{},[1984],{"type":46,"value":1985},"One sub-agent = one file (unique filenames, parallel agents don't overwrite each other).",{"type":41,"tag":49,"props":1987,"children":1989},{"id":1988},"output-spec",[1990],{"type":46,"value":1991},"Output spec",{"type":41,"tag":162,"props":1993,"children":1994},{},[1995,1997,2003,2005,2011,2013,2019,2021,2027,2029,2035,2037,2042,2044,2050],{"type":46,"value":1996},"Match the source unless the user asked for something specific. Common targets: ",{"type":41,"tag":72,"props":1998,"children":2000},{"className":1999},[],[2001],{"type":46,"value":2002},"1920×1080@24",{"type":46,"value":2004}," cinematic, ",{"type":41,"tag":72,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":46,"value":2010},"1920×1080@30",{"type":46,"value":2012}," screen content, ",{"type":41,"tag":72,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":46,"value":2018},"1080×1920@30",{"type":46,"value":2020}," vertical social, ",{"type":41,"tag":72,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":46,"value":2026},"3840×2160@24",{"type":46,"value":2028}," 4K cinema, ",{"type":41,"tag":72,"props":2030,"children":2032},{"className":2031},[],[2033],{"type":46,"value":2034},"1080×1080@30",{"type":46,"value":2036}," square. ",{"type":41,"tag":72,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":46,"value":886},{"type":46,"value":2043}," defaults the scale to 1080p from any source; pass ",{"type":41,"tag":72,"props":2045,"children":2047},{"className":2046},[],[2048],{"type":46,"value":2049},"--filter",{"type":46,"value":2051}," or edit the extract command for other targets. Worth asking the user which delivery format matters.",{"type":41,"tag":49,"props":2053,"children":2055},{"id":2054},"edl-format",[2056],{"type":46,"value":2057},"EDL format",{"type":41,"tag":374,"props":2059,"children":2063},{"className":2060,"code":2061,"language":2062,"meta":382,"style":382},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"version\": 1,\n  \"sources\": {\"C0103\": \"\u002Fabs\u002Fpath\u002FC0103.MP4\", \"C0108\": \"\u002Fabs\u002Fpath\u002FC0108.MP4\"},\n  \"ranges\": [\n    {\"source\": \"C0103\", \"start\": 2.42, \"end\": 6.85,\n     \"beat\": \"HOOK\", \"quote\": \"...\", \"reason\": \"Cleanest delivery, stops before slip at 38.46.\"},\n    {\"source\": \"C0108\", \"start\": 14.30, \"end\": 28.90,\n     \"beat\": \"SOLUTION\", \"quote\": \"...\", \"reason\": \"Only take without the false start.\"}\n  ],\n  \"grade\": \"warm_cinematic\",\n  \"overlays\": [\n    {\"file\": \"edit\u002Fanimations\u002Fslot_1\u002Frender.mp4\", \"start_in_output\": 0.0, \"duration\": 5.0}\n  ],\n  \"subtitles\": \"edit\u002Fmaster.srt\",\n  \"total_duration_s\": 87.4\n}\n","json",[2064],{"type":41,"tag":72,"props":2065,"children":2066},{"__ignoreMap":382},[2067,2076,2111,2209,2234,2328,2435,2525,2628,2637,2674,2699,2792,2800,2838,2864],{"type":41,"tag":1734,"props":2068,"children":2069},{"class":1736,"line":1737},[2070],{"type":41,"tag":1734,"props":2071,"children":2073},{"style":2072},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2074],{"type":46,"value":2075},"{\n",{"type":41,"tag":1734,"props":2077,"children":2078},{"class":1736,"line":1746},[2079,2084,2090,2095,2100,2106],{"type":41,"tag":1734,"props":2080,"children":2081},{"style":2072},[2082],{"type":46,"value":2083},"  \"",{"type":41,"tag":1734,"props":2085,"children":2087},{"style":2086},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[2088],{"type":46,"value":2089},"version",{"type":41,"tag":1734,"props":2091,"children":2092},{"style":2072},[2093],{"type":46,"value":2094},"\"",{"type":41,"tag":1734,"props":2096,"children":2097},{"style":2072},[2098],{"type":46,"value":2099},":",{"type":41,"tag":1734,"props":2101,"children":2103},{"style":2102},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2104],{"type":46,"value":2105}," 1",{"type":41,"tag":1734,"props":2107,"children":2108},{"style":2072},[2109],{"type":46,"value":2110},",\n",{"type":41,"tag":1734,"props":2112,"children":2113},{"class":1736,"line":1755},[2114,2118,2123,2127,2131,2136,2140,2146,2150,2154,2159,2165,2169,2174,2178,2183,2187,2191,2195,2200,2204],{"type":41,"tag":1734,"props":2115,"children":2116},{"style":2072},[2117],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2119,"children":2120},{"style":2086},[2121],{"type":46,"value":2122},"sources",{"type":41,"tag":1734,"props":2124,"children":2125},{"style":2072},[2126],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2128,"children":2129},{"style":2072},[2130],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2132,"children":2133},{"style":2072},[2134],{"type":46,"value":2135}," {",{"type":41,"tag":1734,"props":2137,"children":2138},{"style":2072},[2139],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2141,"children":2143},{"style":2142},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2144],{"type":46,"value":2145},"C0103",{"type":41,"tag":1734,"props":2147,"children":2148},{"style":2072},[2149],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2151,"children":2152},{"style":2072},[2153],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2155,"children":2156},{"style":2072},[2157],{"type":46,"value":2158}," \"",{"type":41,"tag":1734,"props":2160,"children":2162},{"style":2161},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2163],{"type":46,"value":2164},"\u002Fabs\u002Fpath\u002FC0103.MP4",{"type":41,"tag":1734,"props":2166,"children":2167},{"style":2072},[2168],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2170,"children":2171},{"style":2072},[2172],{"type":46,"value":2173},",",{"type":41,"tag":1734,"props":2175,"children":2176},{"style":2072},[2177],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2179,"children":2180},{"style":2142},[2181],{"type":46,"value":2182},"C0108",{"type":41,"tag":1734,"props":2184,"children":2185},{"style":2072},[2186],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2188,"children":2189},{"style":2072},[2190],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2192,"children":2193},{"style":2072},[2194],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2196,"children":2197},{"style":2161},[2198],{"type":46,"value":2199},"\u002Fabs\u002Fpath\u002FC0108.MP4",{"type":41,"tag":1734,"props":2201,"children":2202},{"style":2072},[2203],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2205,"children":2206},{"style":2072},[2207],{"type":46,"value":2208},"},\n",{"type":41,"tag":1734,"props":2210,"children":2211},{"class":1736,"line":1764},[2212,2216,2221,2225,2229],{"type":41,"tag":1734,"props":2213,"children":2214},{"style":2072},[2215],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2217,"children":2218},{"style":2086},[2219],{"type":46,"value":2220},"ranges",{"type":41,"tag":1734,"props":2222,"children":2223},{"style":2072},[2224],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2226,"children":2227},{"style":2072},[2228],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2230,"children":2231},{"style":2072},[2232],{"type":46,"value":2233}," [\n",{"type":41,"tag":1734,"props":2235,"children":2237},{"class":1736,"line":2236},5,[2238,2243,2247,2252,2256,2260,2264,2268,2272,2276,2280,2285,2289,2293,2298,2302,2306,2311,2315,2319,2324],{"type":41,"tag":1734,"props":2239,"children":2240},{"style":2072},[2241],{"type":46,"value":2242},"    {",{"type":41,"tag":1734,"props":2244,"children":2245},{"style":2072},[2246],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2248,"children":2249},{"style":2142},[2250],{"type":46,"value":2251},"source",{"type":41,"tag":1734,"props":2253,"children":2254},{"style":2072},[2255],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2257,"children":2258},{"style":2072},[2259],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2261,"children":2262},{"style":2072},[2263],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2265,"children":2266},{"style":2161},[2267],{"type":46,"value":2145},{"type":41,"tag":1734,"props":2269,"children":2270},{"style":2072},[2271],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2273,"children":2274},{"style":2072},[2275],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2277,"children":2278},{"style":2072},[2279],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2281,"children":2282},{"style":2142},[2283],{"type":46,"value":2284},"start",{"type":41,"tag":1734,"props":2286,"children":2287},{"style":2072},[2288],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2290,"children":2291},{"style":2072},[2292],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2294,"children":2295},{"style":2102},[2296],{"type":46,"value":2297}," 2.42",{"type":41,"tag":1734,"props":2299,"children":2300},{"style":2072},[2301],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2303,"children":2304},{"style":2072},[2305],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2307,"children":2308},{"style":2142},[2309],{"type":46,"value":2310},"end",{"type":41,"tag":1734,"props":2312,"children":2313},{"style":2072},[2314],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2316,"children":2317},{"style":2072},[2318],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2320,"children":2321},{"style":2102},[2322],{"type":46,"value":2323}," 6.85",{"type":41,"tag":1734,"props":2325,"children":2326},{"style":2072},[2327],{"type":46,"value":2110},{"type":41,"tag":1734,"props":2329,"children":2331},{"class":1736,"line":2330},6,[2332,2337,2342,2346,2350,2354,2359,2363,2367,2371,2376,2380,2384,2388,2393,2397,2401,2405,2410,2414,2418,2422,2427,2431],{"type":41,"tag":1734,"props":2333,"children":2334},{"style":2072},[2335],{"type":46,"value":2336},"     \"",{"type":41,"tag":1734,"props":2338,"children":2339},{"style":2142},[2340],{"type":46,"value":2341},"beat",{"type":41,"tag":1734,"props":2343,"children":2344},{"style":2072},[2345],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2347,"children":2348},{"style":2072},[2349],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2351,"children":2352},{"style":2072},[2353],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2355,"children":2356},{"style":2161},[2357],{"type":46,"value":2358},"HOOK",{"type":41,"tag":1734,"props":2360,"children":2361},{"style":2072},[2362],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2364,"children":2365},{"style":2072},[2366],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2368,"children":2369},{"style":2072},[2370],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2372,"children":2373},{"style":2142},[2374],{"type":46,"value":2375},"quote",{"type":41,"tag":1734,"props":2377,"children":2378},{"style":2072},[2379],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2381,"children":2382},{"style":2072},[2383],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2385,"children":2386},{"style":2072},[2387],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2389,"children":2390},{"style":2161},[2391],{"type":46,"value":2392},"...",{"type":41,"tag":1734,"props":2394,"children":2395},{"style":2072},[2396],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2398,"children":2399},{"style":2072},[2400],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2402,"children":2403},{"style":2072},[2404],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2406,"children":2407},{"style":2142},[2408],{"type":46,"value":2409},"reason",{"type":41,"tag":1734,"props":2411,"children":2412},{"style":2072},[2413],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2415,"children":2416},{"style":2072},[2417],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2419,"children":2420},{"style":2072},[2421],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2423,"children":2424},{"style":2161},[2425],{"type":46,"value":2426},"Cleanest delivery, stops before slip at 38.46.",{"type":41,"tag":1734,"props":2428,"children":2429},{"style":2072},[2430],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2432,"children":2433},{"style":2072},[2434],{"type":46,"value":2208},{"type":41,"tag":1734,"props":2436,"children":2438},{"class":1736,"line":2437},7,[2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2496,2500,2504,2508,2512,2516,2521],{"type":41,"tag":1734,"props":2440,"children":2441},{"style":2072},[2442],{"type":46,"value":2242},{"type":41,"tag":1734,"props":2444,"children":2445},{"style":2072},[2446],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2448,"children":2449},{"style":2142},[2450],{"type":46,"value":2251},{"type":41,"tag":1734,"props":2452,"children":2453},{"style":2072},[2454],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2456,"children":2457},{"style":2072},[2458],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2460,"children":2461},{"style":2072},[2462],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2464,"children":2465},{"style":2161},[2466],{"type":46,"value":2182},{"type":41,"tag":1734,"props":2468,"children":2469},{"style":2072},[2470],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2472,"children":2473},{"style":2072},[2474],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2476,"children":2477},{"style":2072},[2478],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2480,"children":2481},{"style":2142},[2482],{"type":46,"value":2284},{"type":41,"tag":1734,"props":2484,"children":2485},{"style":2072},[2486],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2488,"children":2489},{"style":2072},[2490],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2492,"children":2493},{"style":2102},[2494],{"type":46,"value":2495}," 14.30",{"type":41,"tag":1734,"props":2497,"children":2498},{"style":2072},[2499],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2501,"children":2502},{"style":2072},[2503],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2505,"children":2506},{"style":2142},[2507],{"type":46,"value":2310},{"type":41,"tag":1734,"props":2509,"children":2510},{"style":2072},[2511],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2513,"children":2514},{"style":2072},[2515],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2517,"children":2518},{"style":2102},[2519],{"type":46,"value":2520}," 28.90",{"type":41,"tag":1734,"props":2522,"children":2523},{"style":2072},[2524],{"type":46,"value":2110},{"type":41,"tag":1734,"props":2526,"children":2528},{"class":1736,"line":2527},8,[2529,2533,2537,2541,2545,2549,2554,2558,2562,2566,2570,2574,2578,2582,2586,2590,2594,2598,2602,2606,2610,2614,2619,2623],{"type":41,"tag":1734,"props":2530,"children":2531},{"style":2072},[2532],{"type":46,"value":2336},{"type":41,"tag":1734,"props":2534,"children":2535},{"style":2142},[2536],{"type":46,"value":2341},{"type":41,"tag":1734,"props":2538,"children":2539},{"style":2072},[2540],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2542,"children":2543},{"style":2072},[2544],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2546,"children":2547},{"style":2072},[2548],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2550,"children":2551},{"style":2161},[2552],{"type":46,"value":2553},"SOLUTION",{"type":41,"tag":1734,"props":2555,"children":2556},{"style":2072},[2557],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2559,"children":2560},{"style":2072},[2561],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2563,"children":2564},{"style":2072},[2565],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2567,"children":2568},{"style":2142},[2569],{"type":46,"value":2375},{"type":41,"tag":1734,"props":2571,"children":2572},{"style":2072},[2573],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2575,"children":2576},{"style":2072},[2577],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2579,"children":2580},{"style":2072},[2581],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2583,"children":2584},{"style":2161},[2585],{"type":46,"value":2392},{"type":41,"tag":1734,"props":2587,"children":2588},{"style":2072},[2589],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2591,"children":2592},{"style":2072},[2593],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2595,"children":2596},{"style":2072},[2597],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2599,"children":2600},{"style":2142},[2601],{"type":46,"value":2409},{"type":41,"tag":1734,"props":2603,"children":2604},{"style":2072},[2605],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2607,"children":2608},{"style":2072},[2609],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2611,"children":2612},{"style":2072},[2613],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2615,"children":2616},{"style":2161},[2617],{"type":46,"value":2618},"Only take without the false start.",{"type":41,"tag":1734,"props":2620,"children":2621},{"style":2072},[2622],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2624,"children":2625},{"style":2072},[2626],{"type":46,"value":2627},"}\n",{"type":41,"tag":1734,"props":2629,"children":2631},{"class":1736,"line":2630},9,[2632],{"type":41,"tag":1734,"props":2633,"children":2634},{"style":2072},[2635],{"type":46,"value":2636},"  ],\n",{"type":41,"tag":1734,"props":2638,"children":2640},{"class":1736,"line":2639},10,[2641,2645,2650,2654,2658,2662,2666,2670],{"type":41,"tag":1734,"props":2642,"children":2643},{"style":2072},[2644],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2646,"children":2647},{"style":2086},[2648],{"type":46,"value":2649},"grade",{"type":41,"tag":1734,"props":2651,"children":2652},{"style":2072},[2653],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2655,"children":2656},{"style":2072},[2657],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2659,"children":2660},{"style":2072},[2661],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2663,"children":2664},{"style":2161},[2665],{"type":46,"value":1259},{"type":41,"tag":1734,"props":2667,"children":2668},{"style":2072},[2669],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2671,"children":2672},{"style":2072},[2673],{"type":46,"value":2110},{"type":41,"tag":1734,"props":2675,"children":2677},{"class":1736,"line":2676},11,[2678,2682,2687,2691,2695],{"type":41,"tag":1734,"props":2679,"children":2680},{"style":2072},[2681],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2683,"children":2684},{"style":2086},[2685],{"type":46,"value":2686},"overlays",{"type":41,"tag":1734,"props":2688,"children":2689},{"style":2072},[2690],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2692,"children":2693},{"style":2072},[2694],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2696,"children":2697},{"style":2072},[2698],{"type":46,"value":2233},{"type":41,"tag":1734,"props":2700,"children":2702},{"class":1736,"line":2701},12,[2703,2707,2711,2715,2719,2723,2727,2732,2736,2740,2744,2749,2753,2757,2762,2766,2770,2775,2779,2783,2788],{"type":41,"tag":1734,"props":2704,"children":2705},{"style":2072},[2706],{"type":46,"value":2242},{"type":41,"tag":1734,"props":2708,"children":2709},{"style":2072},[2710],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2712,"children":2713},{"style":2142},[2714],{"type":46,"value":1566},{"type":41,"tag":1734,"props":2716,"children":2717},{"style":2072},[2718],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2720,"children":2721},{"style":2072},[2722],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2724,"children":2725},{"style":2072},[2726],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2728,"children":2729},{"style":2161},[2730],{"type":46,"value":2731},"edit\u002Fanimations\u002Fslot_1\u002Frender.mp4",{"type":41,"tag":1734,"props":2733,"children":2734},{"style":2072},[2735],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2737,"children":2738},{"style":2072},[2739],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2741,"children":2742},{"style":2072},[2743],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2745,"children":2746},{"style":2142},[2747],{"type":46,"value":2748},"start_in_output",{"type":41,"tag":1734,"props":2750,"children":2751},{"style":2072},[2752],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2754,"children":2755},{"style":2072},[2756],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2758,"children":2759},{"style":2102},[2760],{"type":46,"value":2761}," 0.0",{"type":41,"tag":1734,"props":2763,"children":2764},{"style":2072},[2765],{"type":46,"value":2173},{"type":41,"tag":1734,"props":2767,"children":2768},{"style":2072},[2769],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2771,"children":2772},{"style":2142},[2773],{"type":46,"value":2774},"duration",{"type":41,"tag":1734,"props":2776,"children":2777},{"style":2072},[2778],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2780,"children":2781},{"style":2072},[2782],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2784,"children":2785},{"style":2102},[2786],{"type":46,"value":2787}," 5.0",{"type":41,"tag":1734,"props":2789,"children":2790},{"style":2072},[2791],{"type":46,"value":2627},{"type":41,"tag":1734,"props":2793,"children":2795},{"class":1736,"line":2794},13,[2796],{"type":41,"tag":1734,"props":2797,"children":2798},{"style":2072},[2799],{"type":46,"value":2636},{"type":41,"tag":1734,"props":2801,"children":2803},{"class":1736,"line":2802},14,[2804,2808,2813,2817,2821,2825,2830,2834],{"type":41,"tag":1734,"props":2805,"children":2806},{"style":2072},[2807],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2809,"children":2810},{"style":2086},[2811],{"type":46,"value":2812},"subtitles",{"type":41,"tag":1734,"props":2814,"children":2815},{"style":2072},[2816],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2818,"children":2819},{"style":2072},[2820],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2822,"children":2823},{"style":2072},[2824],{"type":46,"value":2158},{"type":41,"tag":1734,"props":2826,"children":2827},{"style":2161},[2828],{"type":46,"value":2829},"edit\u002Fmaster.srt",{"type":41,"tag":1734,"props":2831,"children":2832},{"style":2072},[2833],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2835,"children":2836},{"style":2072},[2837],{"type":46,"value":2110},{"type":41,"tag":1734,"props":2839,"children":2841},{"class":1736,"line":2840},15,[2842,2846,2851,2855,2859],{"type":41,"tag":1734,"props":2843,"children":2844},{"style":2072},[2845],{"type":46,"value":2083},{"type":41,"tag":1734,"props":2847,"children":2848},{"style":2086},[2849],{"type":46,"value":2850},"total_duration_s",{"type":41,"tag":1734,"props":2852,"children":2853},{"style":2072},[2854],{"type":46,"value":2094},{"type":41,"tag":1734,"props":2856,"children":2857},{"style":2072},[2858],{"type":46,"value":2099},{"type":41,"tag":1734,"props":2860,"children":2861},{"style":2102},[2862],{"type":46,"value":2863}," 87.4\n",{"type":41,"tag":1734,"props":2865,"children":2867},{"class":1736,"line":2866},16,[2868],{"type":41,"tag":1734,"props":2869,"children":2870},{"style":2072},[2871],{"type":46,"value":2627},{"type":41,"tag":162,"props":2873,"children":2874},{},[2875,2880,2882,2887,2889,2894],{"type":41,"tag":72,"props":2876,"children":2878},{"className":2877},[],[2879],{"type":46,"value":2649},{"type":46,"value":2881}," is a preset name or raw ffmpeg filter. ",{"type":41,"tag":72,"props":2883,"children":2885},{"className":2884},[],[2886],{"type":46,"value":2686},{"type":46,"value":2888}," are rendered animation clips. ",{"type":41,"tag":72,"props":2890,"children":2892},{"className":2891},[],[2893],{"type":46,"value":2812},{"type":46,"value":2895}," is optional and applied LAST.",{"type":41,"tag":49,"props":2897,"children":2899},{"id":2898},"memory-projectmd",[2900,2902],{"type":46,"value":2901},"Memory — ",{"type":41,"tag":72,"props":2903,"children":2905},{"className":2904},[],[2906],{"type":46,"value":991},{"type":41,"tag":162,"props":2908,"children":2909},{},[2910,2912,2918],{"type":46,"value":2911},"Append one section per session at ",{"type":41,"tag":72,"props":2913,"children":2915},{"className":2914},[],[2916],{"type":46,"value":2917},"\u003Cedit>\u002Fproject.md",{"type":46,"value":2099},{"type":41,"tag":374,"props":2920,"children":2924},{"className":2921,"code":2922,"language":2923,"meta":382,"style":382},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Session N — YYYY-MM-DD\n\n**Strategy:** one paragraph describing the approach\n**Decisions:** take choices, cuts, grades, animations + why\n**Reasoning log:** one-line rationale for non-obvious decisions\n**Outstanding:** deferred items\n","markdown",[2925],{"type":41,"tag":72,"props":2926,"children":2927},{"__ignoreMap":382},[2928,2941,2950,2975,2996,3017],{"type":41,"tag":1734,"props":2929,"children":2930},{"class":1736,"line":1737},[2931,2936],{"type":41,"tag":1734,"props":2932,"children":2933},{"style":2072},[2934],{"type":46,"value":2935},"## ",{"type":41,"tag":1734,"props":2937,"children":2938},{"style":2142},[2939],{"type":46,"value":2940},"Session N — YYYY-MM-DD\n",{"type":41,"tag":1734,"props":2942,"children":2943},{"class":1736,"line":1746},[2944],{"type":41,"tag":1734,"props":2945,"children":2947},{"emptyLinePlaceholder":2946},true,[2948],{"type":46,"value":2949},"\n",{"type":41,"tag":1734,"props":2951,"children":2952},{"class":1736,"line":1755},[2953,2959,2965,2969],{"type":41,"tag":1734,"props":2954,"children":2956},{"style":2955},"--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold",[2957],{"type":46,"value":2958},"**",{"type":41,"tag":1734,"props":2960,"children":2962},{"style":2961},"--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold",[2963],{"type":46,"value":2964},"Strategy:",{"type":41,"tag":1734,"props":2966,"children":2967},{"style":2955},[2968],{"type":46,"value":2958},{"type":41,"tag":1734,"props":2970,"children":2972},{"style":2971},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2973],{"type":46,"value":2974}," one paragraph describing the approach\n",{"type":41,"tag":1734,"props":2976,"children":2977},{"class":1736,"line":1764},[2978,2982,2987,2991],{"type":41,"tag":1734,"props":2979,"children":2980},{"style":2955},[2981],{"type":46,"value":2958},{"type":41,"tag":1734,"props":2983,"children":2984},{"style":2961},[2985],{"type":46,"value":2986},"Decisions:",{"type":41,"tag":1734,"props":2988,"children":2989},{"style":2955},[2990],{"type":46,"value":2958},{"type":41,"tag":1734,"props":2992,"children":2993},{"style":2971},[2994],{"type":46,"value":2995}," take choices, cuts, grades, animations + why\n",{"type":41,"tag":1734,"props":2997,"children":2998},{"class":1736,"line":2236},[2999,3003,3008,3012],{"type":41,"tag":1734,"props":3000,"children":3001},{"style":2955},[3002],{"type":46,"value":2958},{"type":41,"tag":1734,"props":3004,"children":3005},{"style":2961},[3006],{"type":46,"value":3007},"Reasoning log:",{"type":41,"tag":1734,"props":3009,"children":3010},{"style":2955},[3011],{"type":46,"value":2958},{"type":41,"tag":1734,"props":3013,"children":3014},{"style":2971},[3015],{"type":46,"value":3016}," one-line rationale for non-obvious decisions\n",{"type":41,"tag":1734,"props":3018,"children":3019},{"class":1736,"line":2330},[3020,3024,3029,3033],{"type":41,"tag":1734,"props":3021,"children":3022},{"style":2955},[3023],{"type":46,"value":2958},{"type":41,"tag":1734,"props":3025,"children":3026},{"style":2961},[3027],{"type":46,"value":3028},"Outstanding:",{"type":41,"tag":1734,"props":3030,"children":3031},{"style":2955},[3032],{"type":46,"value":2958},{"type":41,"tag":1734,"props":3034,"children":3035},{"style":2971},[3036],{"type":46,"value":3037}," deferred items\n",{"type":41,"tag":162,"props":3039,"children":3040},{},[3041,3043,3048],{"type":46,"value":3042},"On startup, read ",{"type":41,"tag":72,"props":3044,"children":3046},{"className":3045},[],[3047],{"type":46,"value":991},{"type":46,"value":3049}," if it exists and summarize the last session in one sentence before asking whether to continue.",{"type":41,"tag":49,"props":3051,"children":3053},{"id":3052},"anti-patterns",[3054],{"type":46,"value":3055},"Anti-patterns",{"type":41,"tag":162,"props":3057,"children":3058},{},[3059],{"type":46,"value":3060},"Things that consistently fail regardless of style:",{"type":41,"tag":405,"props":3062,"children":3063},{},[3064,3074,3084,3094,3104,3114,3124,3134,3144,3154,3164,3174,3184],{"type":41,"tag":60,"props":3065,"children":3066},{},[3067,3072],{"type":41,"tag":64,"props":3068,"children":3069},{},[3070],{"type":46,"value":3071},"Hierarchical pre-computed codec formats",{"type":46,"value":3073}," with USABILITY \u002F tone tags \u002F shot layers. Over-engineering. Derive from the transcript at decision time.",{"type":41,"tag":60,"props":3075,"children":3076},{},[3077,3082],{"type":41,"tag":64,"props":3078,"children":3079},{},[3080],{"type":46,"value":3081},"Hand-tuned moment-scoring functions.",{"type":46,"value":3083}," The LLM picks better than any heuristic you'll write.",{"type":41,"tag":60,"props":3085,"children":3086},{},[3087,3092],{"type":41,"tag":64,"props":3088,"children":3089},{},[3090],{"type":46,"value":3091},"Whisper SRT \u002F phrase-level output.",{"type":46,"value":3093}," Loses sub-second gap data. Always word-level verbatim.",{"type":41,"tag":60,"props":3095,"children":3096},{},[3097,3102],{"type":41,"tag":64,"props":3098,"children":3099},{},[3100],{"type":46,"value":3101},"Running Whisper locally on CPU.",{"type":46,"value":3103}," Slow and it normalizes fillers. Use hosted Scribe.",{"type":41,"tag":60,"props":3105,"children":3106},{},[3107,3112],{"type":41,"tag":64,"props":3108,"children":3109},{},[3110],{"type":46,"value":3111},"Burning subtitles into base before compositing overlays.",{"type":46,"value":3113}," Overlays hide them. (Hard Rule 1.)",{"type":41,"tag":60,"props":3115,"children":3116},{},[3117,3122],{"type":41,"tag":64,"props":3118,"children":3119},{},[3120],{"type":46,"value":3121},"Single-pass filtergraph when you have overlays.",{"type":46,"value":3123}," Double re-encodes. Use per-segment extract → concat.",{"type":41,"tag":60,"props":3125,"children":3126},{},[3127,3132],{"type":41,"tag":64,"props":3128,"children":3129},{},[3130],{"type":46,"value":3131},"Linear animation easing.",{"type":46,"value":3133}," Looks robotic. Always cubic.",{"type":41,"tag":60,"props":3135,"children":3136},{},[3137,3142],{"type":41,"tag":64,"props":3138,"children":3139},{},[3140],{"type":46,"value":3141},"Hard audio cuts at segment boundaries.",{"type":46,"value":3143}," Audible pops. (Hard Rule 3.)",{"type":41,"tag":60,"props":3145,"children":3146},{},[3147,3152],{"type":41,"tag":64,"props":3148,"children":3149},{},[3150],{"type":46,"value":3151},"Typing text centered on the partial string.",{"type":46,"value":3153}," Text slides left as it grows.",{"type":41,"tag":60,"props":3155,"children":3156},{},[3157,3162],{"type":41,"tag":64,"props":3158,"children":3159},{},[3160],{"type":46,"value":3161},"Sequential sub-agents for multiple animations.",{"type":46,"value":3163}," Always parallel.",{"type":41,"tag":60,"props":3165,"children":3166},{},[3167,3172],{"type":41,"tag":64,"props":3168,"children":3169},{},[3170],{"type":46,"value":3171},"Editing before confirming the strategy.",{"type":46,"value":3173}," Never.",{"type":41,"tag":60,"props":3175,"children":3176},{},[3177,3182],{"type":41,"tag":64,"props":3178,"children":3179},{},[3180],{"type":46,"value":3181},"Re-transcribing cached sources.",{"type":46,"value":3183}," Immutable outputs of immutable inputs.",{"type":41,"tag":60,"props":3185,"children":3186},{},[3187,3192],{"type":41,"tag":64,"props":3188,"children":3189},{},[3190],{"type":46,"value":3191},"Assuming what kind of video it is.",{"type":46,"value":3193}," Look first, ask second, edit last.",{"type":41,"tag":3195,"props":3196,"children":3197},"style",{},[3198],{"type":46,"value":3199},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3201,"total":1746},[3202,3215],{"slug":3203,"name":3203,"fn":3204,"description":3205,"org":3206,"tags":3207,"stars":25,"repoUrl":26,"updatedAt":3214},"manim-video","create technical animations with Manim","Production pipeline for mathematical and technical animations using Manim Community Edition. Creates 3Blue1Brown-style explainer videos, algorithm visualizations, equation derivations, architecture diagrams, and data stories. Use when users request: animated explanations, math animations, concept visualizations, algorithm walkthroughs, technical explainers, 3Blue1Brown style videos, or any programmatic animation with geometric\u002Fmathematical content.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3208,3209,3210,3213],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":3211,"slug":3212,"type":15},"Mathematics","mathematics",{"name":23,"slug":24,"type":15},"2026-04-16T05:01:44.229054",{"slug":4,"name":4,"fn":5,"description":6,"org":3216,"tags":3217,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3218,3219,3220,3221],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"items":3223,"total":2794},[3224,3241,3254,3264,3275,3294,3301,3308,3325,3341,3365,3376],{"slug":8,"name":8,"fn":3225,"description":3226,"org":3227,"tags":3228,"stars":3238,"repoUrl":3239,"updatedAt":3240},"automate browser interactions","Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site\u002Fapp work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3229,3232,3235],{"name":3230,"slug":3231,"type":15},"Automation","automation",{"name":3233,"slug":3234,"type":15},"Browser Automation","browser-automation",{"name":3236,"slug":3237,"type":15},"Web Scraping","web-scraping",106789,"https:\u002F\u002Fgithub.com\u002Fbrowser-use\u002Fbrowser-use","2026-07-28T05:35:58.143842",{"slug":3242,"name":3242,"fn":3243,"description":3244,"org":3245,"tags":3246,"stars":3238,"repoUrl":3239,"updatedAt":3253},"cloud","use Browser Use Cloud API","Documentation reference for using Browser Use Cloud — the hosted API and SDK for browser automation. Use this skill whenever the user needs help with the Cloud REST API (v2 or v3), browser-use-sdk (Python or TypeScript), X-Browser-Use-API-Key authentication, cloud sessions, browser profiles, profile sync, CDP WebSocket connections, stealth browsers, residential proxies, CAPTCHA handling, webhooks, workspaces, skills marketplace, liveUrl streaming, pricing, or integration patterns (chat UI, subagent, adding browser tools to existing agents). Also trigger for questions about n8n\u002FMake\u002FZapier integration, Playwright\u002F Puppeteer\u002FSelenium on cloud infrastructure, or 1Password vault integration. Do NOT use this for the open-source Python library (Agent, Browser, Tools config) — use the open-source skill instead.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3247,3248,3250],{"name":3233,"slug":3234,"type":15},{"name":3249,"slug":1728,"type":15},"Python",{"name":3251,"slug":3252,"type":15},"REST API","rest-api","2026-04-06T18:06:10.225871",{"slug":3255,"name":3255,"fn":3256,"description":3257,"org":3258,"tags":3259,"stars":3238,"repoUrl":3239,"updatedAt":3263},"open-source","write browser-use Python code","Documentation reference for writing Python code using the browser-use open-source library. Use this skill whenever the user needs help with Agent, Browser, or Tools configuration, is writing code that imports from browser_use, asks about @sandbox deployment, supported LLM models, Actor API, custom tools, lifecycle hooks, MCP server setup, or monitoring\u002Fobservability with Laminar or OpenLIT. Also trigger for questions about browser-use installation, prompting strategies, or sensitive data handling. Do NOT use this for Cloud API\u002FSDK usage or pricing — use the cloud skill instead. Do NOT use this for directly automating a browser via CLI commands — use the browser-use skill instead.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3260,3261,3262],{"name":3230,"slug":3231,"type":15},{"name":3233,"slug":3234,"type":15},{"name":3249,"slug":1728,"type":15},"2026-04-06T18:06:14.102374",{"slug":3265,"name":3265,"fn":3266,"description":3267,"org":3268,"tags":3269,"stars":3238,"repoUrl":3239,"updatedAt":3274},"remote-browser","control a local browser from a sandbox","Controls a local browser from a sandboxed remote machine. Use when the agent is running in a sandbox (no GUI) and needs to navigate websites, interact with web pages, fill forms, take screenshots, or expose local dev servers via tunnels.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3270,3271],{"name":3233,"slug":3234,"type":15},{"name":3272,"slug":3273,"type":15},"Sandboxing","sandboxing","2026-04-06T18:06:12.842351",{"slug":3276,"name":3276,"fn":3277,"description":3278,"org":3279,"tags":3280,"stars":3238,"repoUrl":3239,"updatedAt":3293},"x402","configure x402 payments for Browser Use Cloud","Set up Browser Use Cloud payments with x402 — pay per request from a crypto wallet (USDC on Base mainnet), no signup or API key. Two setups it works out up front — \"just use it\" (set up a wallet so you or Claude Code can run cloud browser tasks paid from the wallet — Claude writes and runs throwaway scripts, nothing touches your codebase) or \"build it in\" (install the SDK and write the key + code into your project). Walks through wallet setup, funding, .env, and a ~$1 test run. Use when the user asks about x402, pay-per-use, USDC payments, or wants Browser Use Cloud without an API key. For the free-tier signup (reverse-CAPTCHA → API key), use `browser-use cloud signup` or the `cloud` skill instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3281,3282,3285,3286,3289,3292],{"name":3230,"slug":3231,"type":15},{"name":3283,"slug":3284,"type":15},"Base","base",{"name":3233,"slug":3234,"type":15},{"name":3287,"slug":3288,"type":15},"Payments","payments",{"name":3290,"slug":3291,"type":15},"Web3","web3",{"name":3276,"slug":3276,"type":15},"2026-06-02T07:51:20.889935",{"slug":3203,"name":3203,"fn":3204,"description":3205,"org":3295,"tags":3296,"stars":25,"repoUrl":26,"updatedAt":3214},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3297,3298,3299,3300],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":3211,"slug":3212,"type":15},{"name":23,"slug":24,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":3302,"tags":3303,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3304,3305,3306,3307],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"slug":3309,"name":3309,"fn":3310,"description":3311,"org":3312,"tags":3313,"stars":3322,"repoUrl":3323,"updatedAt":3324},"browser-use-terminal","automate web interactions via CLI","Direct browser control via the Browser Use Terminal CLI. Use when the user wants to automate, scrape, test, or interact with web pages — you drive the browser yourself with Python helpers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3314,3315,3318,3319],{"name":3233,"slug":3234,"type":15},{"name":3316,"slug":3317,"type":15},"CLI","cli",{"name":3249,"slug":1728,"type":15},{"name":3320,"slug":3321,"type":15},"Web Development","web-development",607,"https:\u002F\u002Fgithub.com\u002Fbrowser-use\u002Fterminal","2026-06-12T08:15:38.34797",{"slug":3326,"name":3326,"fn":3327,"description":3328,"org":3329,"tags":3330,"stars":3338,"repoUrl":3339,"updatedAt":3340},"cdp","drive Chrome via DevTools Protocol","Drive Chrome via the DevTools Protocol from JavaScript. Run JS snippets through the `browser-harness-js` CLI — it auto-spawns a long-lived bun HTTP server holding a fully-typed CDP `Session`, and every call (`browser-harness-js 'await session.Page.navigate(...)'`) executes against the same persistent connection. Session, active target, and globals survive across calls. Use when the user wants to automate, script, or inspect a Chrome browser via CDP — single tab or multi-tab, attach to existing Chrome or to a new one launched with --remote-debugging-port.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3331,3332,3335],{"name":3233,"slug":3234,"type":15},{"name":3333,"slug":3334,"type":15},"JavaScript","javascript",{"name":3336,"slug":3337,"type":15},"Testing","testing",473,"https:\u002F\u002Fgithub.com\u002Fbrowser-use\u002Fbrowser-harness-js","2026-04-21T04:55:40.331082",{"slug":3342,"name":3342,"fn":3343,"description":3344,"org":3345,"tags":3346,"stars":3362,"repoUrl":3363,"updatedAt":3364},"agents-sdk","build AI agents on Cloudflare Workers","Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, or chat applications. Covers Agent class, state management, callable RPC, Workflows integration, and React hooks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3347,3350,3353,3356,3359],{"name":3348,"slug":3349,"type":15},"Agents","agents",{"name":3351,"slug":3352,"type":15},"AI Infrastructure","ai-infrastructure",{"name":3354,"slug":3355,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":3357,"slug":3358,"type":15},"SDK","sdk",{"name":3360,"slug":3361,"type":15},"Serverless","serverless",255,"https:\u002F\u002Fgithub.com\u002Fbrowser-use\u002Fbrowsercode","2026-04-27T05:34:19.800431",{"slug":3366,"name":3366,"fn":3367,"description":3368,"org":3369,"tags":3370,"stars":3362,"repoUrl":3363,"updatedAt":3375},"browser-execute","execute browser automation tasks","Use ONLY when calling the `browser_execute` tool or driving a real browser via the Chrome DevTools Protocol. Required reading before the first `browser_execute` call in a session. Covers the three connection methods (local Chrome with remote debugging, isolated debug-port profile, Browser Use cloud), the in-process `session` \u002F `console` snippet model, attaching to a page target, common CDP commands, the per-project `.bcode\u002Fagent-workspace\u002F` for reusable scripts, and screenshot auto-attachment.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3371,3372],{"name":3233,"slug":3234,"type":15},{"name":3373,"slug":3374,"type":15},"Debugging","debugging","2026-07-31T05:55:46.960752",{"slug":3377,"name":3377,"fn":3378,"description":3379,"org":3380,"tags":3381,"stars":3362,"repoUrl":3363,"updatedAt":3392},"cloudflare","manage Cloudflare platform resources","Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3382,3383,3385,3388,3391],{"name":3351,"slug":3352,"type":15},{"name":3384,"slug":3377,"type":15},"Cloudflare",{"name":3386,"slug":3387,"type":15},"Database","database",{"name":3389,"slug":3390,"type":15},"Security","security",{"name":3360,"slug":3361,"type":15},"2026-04-27T05:34:21.032189"]