OpenAI Film Fieldnotes

Download complete editable project · Read review limits

Visit the cited source, then return to the preserved answer

Draft manual Resolve/Fusion construction guide. This is one original-asset treatment with two content variants, not two examples. Native Resolve execution and moving-source fidelity remain unverified. No imported or tested .drp is included. The browser, answer and deck are editable illustrations, not a real product demonstration.

Source and native clock

Official reference: 8bAtx3WuRZw, Connect internal knowledge from Google Drive, published May 8, 2025. The selected fresh complete rendition is 1920×1080 at 24000/1001 fps, with time base 1/24000 and 1001 ticks per frame. Selection: [2058,2469), 411 frames, duration 411411/24000 = 17.142125 seconds. Local zero is source frame 2058 at absolute PTS 2060058; the exclusive end is 2471469 ticks. docs/source-timing.json records every actual integer PTS and the rebased excerpt PTS. The separate 960×540 silent research excerpt preserves all 411 frame positions. Its re-encoding and downsampling are not original-source pixel identity. Fresh rendition hashes do not identify an absent historical master or establish original-upload resolution.

The parent inspected source contact samples, not the whole moving film. Source boundary observations are distinct from authored metrics. The controls below are a reconstruction: pointer routes, camera scale, easing, opacity, optical blur, typography and geometry are not recovered product measurements or latency.

Editable content contract

Choose inputs/default.json (workshop) or inputs/adaptation.json (garden). Both change the answer, source records and all three deck slides. Keep these relationships: sourceTitles[0] labels the first citation, external tab and deck; three slideTitles pair with successive groups of three slideLines; the same answer and rail content returns after the external visit. The variants do not change timing or count as additional choreography.

Required scalars: brand (12 characters), answerTitle and sectionTitle (30 each), composer (44), and accent/warm/ink as six-digit hex colors. Lists are exact: answerLines 3×56, quoteLines 3×56, closingLines 2×56, sourceTitles 4×30, sourceSnippets 4×48, slideTitles 3×32 and slideLines 9×62. Unknown fields, control characters, markup, missing items and malformed colors are rejected.

The bundled licensed Geist font is loaded before capture. Actual width budgets are checked at the authored size and weight: brand 21/600 within 155 px; answer headings 30/600 within 790; answer/quote/closing lines 22/400 within 790; composer 20/400 within 730; source titles 18/600 within 305; source snippets 14/400 within 315; slide titles 34/600 within 1000; slide lines 23/400 within 1000. These are layout constraints, not arbitrary-copy readability approval. Oversize copy is rejected rather than shrunk. Recheck Text+ metrics in Resolve independently.

Composition and coordinates

Create a silent 1920×1080 square-pixel composition at 24000/1001, local frames 0–410. Do not round to 24, add a lead-in, append a hold or dissolve to black. The next source camera move begins outside this selection. Keep all source footage outside the editable build; use it only for comparison.

All coordinates below are pixels from top-left with Y down. For normalized Fusion coordinates use X=pixelX/1920 and Y=1−pixelY/1080; rectangles convert through their centers. Confirm the installed node's coordinate convention. World point after camera = (cameraScale×X+cameraX, cameraScale×Y+cameraY). The camera origin is (0,0); do not substitute a default center-pivot transform. Set Fusion global frame = composition start + CSV local frame.

Rebuild with Background, Rectangle masks, Text+, Merge and Transform nodes. Import public/art/document.svg as editable permitted artwork, or rebuild its simple folded-page path. A pointer is an original vector path in Scene.tsx. All other chrome, text, deck slides and thumbnails are code-built geometry. Use the supplied MP4 as a visual target for the manual rebuild, not as a flattened replacement for editable layers.

Layer graph

  1. Put the original teal/sand or green/clay gradient on the canvas. A browser group occupies (100,55), 1720×970, with a 10 px rounded clip and shadow. The shadow is behind the browser, not an overlay on the answer. Browser tabs and address strip remain above either application body.
  2. Build the first tab and address strip at the browser top. At local 194 add a second tab and make it active. At 345 activate the first tab; keep the second tab visible. Do not dissolve both applications together.
  3. The answer group starts at browser-local (answerX,120), width 810. Its title is followed by three bullet lines, a section heading at Y=250, a three-line quoted block at Y=315, two closing lines at Y=485, Sources at Y=557, then the action row at Y=604. The quote has its own left rule. These offsets belong to the answer group, not to separate screen-fixed text layers.
  4. The composer shares answerX and sits 30 px above the browser bottom. It is 810×96 with a rounded outline. Its placeholder, source chip and send symbol remain empty of new typing throughout this treatment.
  5. The citations rail is browser-local right=18, top=128, width=350. Use four source rows followed by related records. The first record labels the deck. The rail fades in while answerX moves from 510 to 310. Rail text must not push beyond the browser clip. The rail remains logically open during the external visit, though that application body is not visible.
  6. Replace the answer body with blank white for local 194–206 while retaining browser chrome and the pointer. At 207 replace that blank body with the editor. This thirteen-frame loading interval is intentional, not a missing render or a dissolve. Do not shorten it to an instantaneous document cut.
  7. The deck editor has a title/menu row, a toolbar, a seven-thumbnail column at local (24,178), a 1160×646 slide canvas at (344,225), and a notes strip. The toolbar occupies local Y=143–169 using a 26 px border-box height; the thumbnail column starts at Y=178, leaving a 9 px gap. Thumbnail rectangles are 149×75, separated by 17 px. Their contents remain empty until local 226, then gain original schematic line marks. Main slide content is already visible before those thumbnails populate.
  8. Main slides use one title and three lines each. Change both the selected thumbnail outline and the main slide atomically at 259 and 281. Do not animate individual bullet entrances or add an unobserved slide transition.
  9. At 345 restore the exact authored answer and open-rail records. This is a hard application/tab switch, not a camera move. The reconstruction reuses its same content records; it is not evidence of backend state persistence or exact source scroll-position equality.
  10. Place the pointer above application bodies but inside the common camera group. Arrow and hand shapes are original vectors. The click-target path is authored: Sources around (710,741), first citation around (1530,268), deck thumbnail 2 around (200,331), thumbnail 3 around (200,425), first tab around (242,81). Match these to the rebuilt hit regions, not source pixels.

Frame controls

node --experimental-strip-types scripts/controls.mjs regenerates docs/controls.csv. Each row gives local/source frame, camera scale/X/Y/blur, rail opacity, answerX, tab/loading gates, thumbnail readiness, slide index and pointer X/Y/shape. Use the CSV values for every native frame; a generic default Fusion spline is not equivalent. Continuous ramps use clamped smoothstep t²(3−2t). Discrete states use stepped keys, never interpolation.

Local frames Source frames Authored state and observed boundary
0–11 2058–2069 Wide settled answer footer.
12–21 2070–2079 Footer push: scale 1→2.3, translation (0,0)→(−500,−1030).
21–66 2079–2124 Close Sources reading/hover hold.
67–80 2125–2138 Pull back to scale 1 and zero translation.
80–88 2138–2146 Rail opacity 0→1; answerX 510→310. First faint rail observed at 2139.
88–163 2146–2221 Wide answer plus rail; pointer travels to the first source.
164–182 2222–2240 Citation push: scale 1→1.95, translation (0,0)→(−1735,−120).
182–193 2240–2251 Close first-citation hold.
194–206 2252–2264 Second tab active; white loading body, same camera.
207 2265 Main deck editor first appears.
208–226 2266–2284 Return wide; thumbnail placeholders populate at 226.
226–258 2284–2316 First slide.
259–280 2317–2338 Second slide.
281–344 2339–2402 Third slide; pointer travels to the first browser tab.
345–410 2403–2468 Hard return to answer plus still-open rail; no follow-up typing.

Camera blur is an authored 0→3→0 CSS blur lobe over each camera move, using 3×sin(π×clamped linear progress). It approximates attention during the source movement, not the source's directional optical motion blur. A Resolve Gaussian Blur is only a manual approximation; calibrate it visually. Source intermediate motion and these chosen easing curves have not received a fidelity pass.

Checks and limitations

Verify the unmodified kit first with python3 verify_package.py; then follow the project README. The tests check exact interval, every numeric control row, strict content schema, loading span, camera holds, slide gates, returned answer layout, and media/manifest tampering. Existing matching pinned dependencies were used; no fresh dependency installation is claimed.

Inspect both actual MP4s at native cadence, including entry, all hard switches, text width, target alignment, blank loading interval and returned layout. Static samples and successful decoding are not perceived moving review. The principal remaining differences are schematic browser/editor detail, original typography and data, estimated framing and pointer paths, simplified thumbnail imagery, and CSS blur rather than calibrated source motion blur. There is no native Resolve validation, tested Text+ parity, independent review, moving-source approval or finished all-hands production in this package.