// work/transcripts/A004C003.json "words": [ { "word": " Hey", "start": 1.02, "end": 1.50 }, { "word": " it's", "start": 1.90, "end": 2.04 }, { "word": " Sark", "start": 2.04, "end": 2.24 }, { "word": " from", "start": 2.24, "end": 2.42 }, { "word": " the", "start": 2.42, "end": 2.54 }, { "word": " Claude", "start": 2.54, "end": 2.86 }, { "word": " Code", "start": 2.86, "end": 3.12 }, { "word": " team", "start": 3.12, "end": 3.38 } ]
// final-edit.json — every cut, with its reasoning written down { "scene": 1, "title": "Part 1: Intro", "candidate_takes": ["C001", "C002", "C003", "C004", "C017 (re-shoot)"], "selection_rationale": "C017 is incomplete — 5.8s dead pause mid-sentence, disqualified. C003 is the cleanest complete take: zero ums, clean ending.", "clips": [{ "clip": "A004C003", "start": 1.89, "end": 60.81, "first_words": "Hey everyone, it's Thariq..." }] }, { "scene": 2, "title": "Thought Partner", "picked": "C010" of 6 takes — "only one fully on script" }, { "scene": 3, "title": "Goals & Verification", "picked": "C012" of 3 — "cut-in sits in the silent gap" }, { "scene": 4, "title": "Be More Ambitious", "picked": "C015" of 3 takes }
# one frame-accurate cut per pick ffmpeg -ss 1.89 -to 60.81 \ -i A004C003.MP4 → cuts/seg1.mp4 # then join the four picks ffmpeg -f concat -i concat.txt \ -c copy fable5-final.mp4
// KeypointLedger.tsx — the real component // Beat 2: right column lights up, left grays + strikes const beat2 = interpolate(frame, [beat2At, beat2At + 12], [0, 1], { easing: EASE_OUT }); <div style={{...text, color: cream, opacity: 1 - beat2}}> “Is Claude doing the work right?” </div> <div style={{...text, opacity: beat2, textDecoration: 'line-through'}}>
// anim.tsx — global timing knobs (frames @ 24fps) // tweak these first export const TIMING = { reveal: 13, // element entrance stagger: 4, // gap between siblings overlayIn: 10, // panel slide-in (~430ms) overlayOut: 8, // fade-out emphasisDelay: 3, // clay words tick in late }; export const EASE_OUT = Easing.bezier(0.16, 1, 0.3, 1);
// FinalEdit.tsx — overlays land on the word CUES = [ // "…it's Thariq from the Claude Code team" { id: 'lower-third', at: 1.2, dur: 4.5 }, // "Is Claude doing the right work?" { id: 'keypoint', at: 12.2, dur: 25.6 }, { id: 'three-ways', at: 43.0, dur: 15.8 }, ];
<KeypointLedger
beat2At={295} />Footage by a camera. Taste by Thariq. Everything in between, by the agent the video is about.