OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Browse a table and return only partway

An original SVG/code Remotion treatment with a complete manual DaVinci Resolve / Fusion construction guide. Two meaningful content variants share one framegraph. No source artwork, raster/video adaptation input or native Resolve project is shipped. Builder tests are not a rendered-quality approval.

Public kit: install and verify

The kit root contains core-publication-v08.zip, active-assets.zip, handoff.py, guide.json, this README, controls.csv, fusion-controls.csv, overlay-manifest.json, provenance.json and test_kit.py. The distributor supplies the pinned core and handoff helper; neither a private worker nor a repository checkout is required. No generator or prebuilt inputs helper is needed: both payloads are embedded in the recipe.

Both ZIPs start with project/. From the kit root, unpack core first, then the active overlay into the same kit root, not into project/ again:

python3 -m zipfile -e core-publication-v08.zip .
python3 -m zipfile -e active-assets.zip .
python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv
cmp controls.csv controls-regenerated.csv
PYTHONDONTWRITEBYTECODE=1 python3 test_kit.py --project project --core core-publication-v08.zip

Integrity contracts (SHA-256):

Artifact SHA-256
Core ZIP 307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de
Active ZIP e5c2e9d855a3e38e068d7a389ee138708ba1627cf8e31c1a957bcd7c3f5f1308
Recipe 15b25cdf8a6eb5a2dc1e79df8b68cd6d9f86740de59d3ccf10e78ae514f13283
Guide e728184dff27ded37611feb49d1b238f1c98c4ce5fa46e1408b31ee54c29d8f0
Handoff helper dedfeaefb89a3158c060f092d9393fe208a52f88b51e21e8bd06c8b272a25721

overlay-manifest.json binds every active recipe/SVG ZIP member and every guide/control/provenance artifact. The active ZIP has only this recipe and its 8 original SVGs, no core, dependencies or legacy art. source.localMedia is research metadata, not a requested input path.

Remotion: preflight, then authorized rendering

Read project/README.md and project/AGENT_GUIDE.md. Use Node >=22.18, Python 3.11+, FFmpeg/FFprobe and an explicitly installed supported Chromium. Preserve project/public/fonts/Geist.ttf and its OFL.txt; do not replace the font or silently shrink text. The core browser text-fit gate remains authoritative. Set REMOTION_BROWSER_EXECUTABLE if your installed browser is not discovered. No automatic browser download is required by these instructions.

From project/, the actual archived CLI is:

cd project
npm ci
node --experimental-strip-types --input-type=module -e '
import {prepareInput} from "./scripts/lib.mjs";
for (const variant of ["default", "adaptation"]) {
  const prepared = await prepareInput({projectRoot: process.cwd(), recipeId: "shopping-table-browse-partial-return", variant});
  console.log(variant, prepared.expected);
}
'
node --experimental-strip-types scripts/render.mjs --recipe shopping-table-browse-partial-return --variant default --out out/shopping-table-browse-partial-return-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe shopping-table-browse-partial-return --variant adaptation --out out/shopping-table-browse-partial-return-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/shopping-table-browse-partial-return-default.mp4
node --experimental-strip-types scripts/verify.mjs out/shopping-table-browse-partial-return-adaptation.mp4

Expected: 1920×1080, 60/1 fps, 271 frames, 271/60 seconds (4.516666667), zero audio streams. The renderer refuses an existing MP4 or its sibling manifest; choose a new basename instead of overwriting. Keep each generated .manifest.json with its output. These commands are for the authorized renderer: this builder did not encode or review candidate output.

Content substitutions

Default: four fictional desk lamps with original geometric illustrations. Adaptation: four fictional field bags with different silhouettes, names, units and comparison values. Prices are fictional credits, not market prices or recommendations.

Every slot, both literal payloads, consuming layers and field contracts appear under guide.json.editableSubstitutions. Keep the same number of rows/items, literal line breaks, aspect ratios and range/camera parenting. Character limits are not a font-fit guarantee. For custom SVGs use original permitted geometry, no <image>, raster data URI, external resource, script, embedded font or source frame. Inspect both content and framing after every edit.

From project/, create a complete Content object, not a partial override:

python3 - <<'PY'
import json
from pathlib import Path
recipe = json.loads(Path("recipes/shopping-table-browse-partial-return.json").read_text())
content = dict(recipe["defaults"])
content["product2"] = "Cone Study"
Path("custom.json").write_text(json.dumps(content, indent=2) + "\n")
PY
node --experimental-strip-types --input-type=module -e '
import {prepareInput} from "./scripts/lib.mjs";
console.log((await prepareInput({projectRoot: process.cwd(), recipeId: "shopping-table-browse-partial-return", contentPath: "custom.json"})).expected);
'
node --experimental-strip-types scripts/render.mjs --recipe shopping-table-browse-partial-return --content custom.json --out out/shopping-table-browse-partial-return-custom.mp4

--content and --variant are mutually exclusive. Relative content paths are resolved against the process working directory; the example deliberately runs inside project/. The frozen guide verifies the embedded variants. A changed recipe or SVG requires a revised hash contract; do not relabel it as this freeze.

Source clock, observation and adaptation

Film: Research and compare products with ChatGPT. Retained official-player publication: 2026-03-27, timestamp 2026-03-27T10:27:04-07:00. This is pinned local metadata, not a new live web verification. Selection window: September 5, 2024 through September 5, 2026 at 17:13:40.602033 UTC; no later publication is used.

Source interval [1640, 1911) at 60/1, with exact nominal source seconds [82/3, 637/20). Local frame zero = source 1640; last local frame 270 = source 1910. Excerpt offset is zero. Source-relative PTS and durations are retained verbatim in guide.json.sourceClock; every excerpt PTS was separately compared as a rational time. Absolute master PTS and coded-tail duration were not recovered. Do not round this clock or stretch it to another timeline rate.

Research excerpt SHA-256: dd1a9b125807d5af7eafcc0ab318e6bf26f85ad0910c625f22260f87fdd0c80f. The source master SHA is inherited, not freshly rehashed. The source/timing unit and related implementation file hashes are in provenance.json. Related Edit/ScrollMask and its partial Resolve guide supplied parenting/masking concepts, not a complete adapter.

Inspection: all 271 excerpt frames viewed statically as consecutively decoded 480×270 thumbnails, plus 3 selected 1920×1080 native-size stills. Contact sheets are not moving review or all-frame full-resolution inspection. No whole-film/new-coverage claim, native Resolve execution, exact source-quality approval or measured OpenAI props is made.

Authored choreography

  1. 0–17: authored near-stationary baseline. Table-content X includes its 26-pixel left inset; 18 starts the leftward travel. The phone, navigation and heading never travel with the table.
  2. The table reaches X −391 at 110, then accelerates through −401 at 112 and −572 at 120 to −678 at 132–133. These are chosen piecewise-linear samples of the observed phase shape, not an inferred finger gesture. The first larger authored increment is into local 113, one frame after the source target at 112.
  3. 134–155: small rightward recovery; later columns are visible without the attribute-label column. The larger rightward return begins at 156, reaching −418 at 180, −87 at 220 and 9 at 270.
  4. Final X 9 is 17 pixels left of initial X 26. Table Y stays zero. The source window ends immediately before the separately noted vertical movement at source 1911: do not add that next action or a loop reset.

Visible-state brackets are source observations/estimates; all numeric tracks are chosen adaptation values. guide.json.observationPolicy keeps those categories separate. The following samples are checkpoints to inspect, not assertions that a rendered output already passed:

Local frame Source frame Nominal source seconds Expected authored state
0 1640 27.333333 First product and part of second, attribute labels visible.
17 1657 27.616667 Last authored baseline frame.
18 1658 27.633333 First horizontal displacement.
40 1680 28.000000 Early travel; header stationary.
90 1730 28.833333 Later columns entering.
112 1752 29.200000 Source target: renewed larger step. Authored result: another five-pixel step; the larger increment follows at 113.
113 1753 29.216667 First larger authored leftward increment, one frame after the source target.
132 1772 29.533333 Far-left authored extreme.
133 1773 29.550000 Same extreme.
134 1774 29.566667 Recovery begins with later-column reading context.
139 1779 29.650000 Attribute labels remain outside aperture.
155 1795 29.916667 Small recovery before larger return.
156 1796 29.933333 Larger return begins.
180 1820 30.333333 Earlier columns re-enter.
220 1860 31.000000 Near starting columns, still displaced.
255 1895 31.583333 Decelerating final portion.
270 1910 31.833333 X residual −17px, Y unchanged; cutoff before next action.

Resolve / Fusion construction

  1. Create a 1920×1080, square-pixel composition at 60/1, local frames 0–270 inclusive. Set the actual rational cadence, not a rounded integer substitute. Do not add a final hold. Keep audio empty.
  2. Work on transparent 4096×4096 domains, with design pixel (0,0) placed at work pixel (1024,1024). Parent/child domains stay identical. Build the opaque RootPaper Background and nodes listed below in order; later siblings are foreground. guide.json.rootPipeline supplies its color/domain, final crop coordinates and MediaOut connection. nativePalette supplies normalized RGB values for editable colors in both variants; use opacity separately.
  3. For each layer build Construct → LocalMask → AnchorShift → ScaleRotate → Position → Gated → Merge.Foreground; the previous sibling feeds Merge.Background. For a group, Construct is its ordered child merges over a transparent background. Apply group alpha once after assembly.
  4. guide.json.fusionNodes names every tool, connection, parent, raw/static control, content binding and gate. svgSubgraphs enumerates every original SVG Rectangle/Ellipse/Polygon, color, alpha and merge order for both variants. Build those natively; do not rasterize SVGs or use source footage as Loaders.
  5. Bake the numeric rows in fusion-controls.csv at each integer local frame. Its AnchorShift/Position/ScaleRotate/Gated columns are derived below. controls.csv contains every raw property sample, including independent width/radius tracks. Neither CSV is a magically importable .setting file: transfer columns to the named native controls using frame-based keys.
  6. Install the licensed bundled Geist. Use Text+ for text, the explicit weight, pixel box, line advance, tracking and alignment in each node. Text+ Size fontSize/4096 is only an uncalibrated starting estimate, not a verified CSS conversion. Compare glyph footprint, baseline and fit natively before delivery. Retain literal line breaks and stepped character reveals. Never scale type down just to hide overflow.
  7. After the last root merge, crop exactly work pixels x=[1024,2944), y=[1024,2104) to 1920×1080; do not resize. Send to MediaOut. Keep anything outside the final crop until this final operation, except declared local masks.

Coordinates and interpolation

Treatment-specific hierarchy

The table-aperture is fixed inside phone-screen. Only table-content owns horizontal travel; its attribute labels, product images, names and values move together. The heading is a sibling of table-aperture. Keep the 580-pixel aperture even when content grows. There is no touch pointer, vertical track, completed rest proof or seamless-loop instruction.

RootPaper -> ordered root merges -> FinalCrop -> MediaOut
backdrop [rect] -> backdrop_Merge
backdrop-orbit [ellipse] -> backdrop-orbit_Merge
phone-outline [rect] -> phone-outline_Merge
phone-screen [group] -> phone-screen_Merge
  screen-paper [rect] -> screen-paper_Merge
  phone-clock [text] -> phone-clock_Merge
  battery-outline [rect] -> battery-outline_Merge
  battery-fill [rect] -> battery-fill_Merge
  outgoing-context [text] -> outgoing-context_Merge
  navigation-paper [rect] -> navigation-paper_Merge
  nav-menu-bg [rect] -> nav-menu-bg_Merge
  nav-line-1 [rect] -> nav-line-1_Merge
  nav-line-2 [rect] -> nav-line-2_Merge
  brand-pill [rect] -> brand-pill_Merge
  phone-brand [text] -> phone-brand_Merge
  nav-add [path] -> nav-add_Merge
  nav-more [ellipse] -> nav-more_Merge
  nav-rule [rect] -> nav-rule_Merge
  fixed-heading [text] -> fixed-heading_Merge
  table-aperture [group] -> table-aperture_Merge
    table-content [group] -> table-content_Merge
      attribute-heading [text] -> attribute-heading_Merge
      table-rule-0 [rect] -> table-rule-0_Merge
      attribute-1 [text] -> attribute-1_Merge
      table-rule-1 [rect] -> table-rule-1_Merge
      attribute-2 [text] -> attribute-2_Merge
      table-rule-2 [rect] -> table-rule-2_Merge
      attribute-3 [text] -> attribute-3_Merge
      table-rule-3 [rect] -> table-rule-3_Merge
      attribute-4 [text] -> attribute-4_Merge
      table-rule-4 [rect] -> table-rule-4_Merge
      attribute-5 [text] -> attribute-5_Merge
      product-art-1 [image] -> product-art-1_Merge
      product-name-1 [text] -> product-name-1_Merge
      product-price-1 [text] -> product-price-1_Merge
      product-value-1-1 [text] -> product-value-1-1_Merge
      product-value-1-2 [text] -> product-value-1-2_Merge
      product-value-1-3 [text] -> product-value-1-3_Merge
      product-value-1-4 [text] -> product-value-1-4_Merge
      product-value-1-5 [text] -> product-value-1-5_Merge
      product-art-2 [image] -> product-art-2_Merge
      product-name-2 [text] -> product-name-2_Merge
      product-price-2 [text] -> product-price-2_Merge
      product-value-2-1 [text] -> product-value-2-1_Merge
      product-value-2-2 [text] -> product-value-2-2_Merge
      product-value-2-3 [text] -> product-value-2-3_Merge
      product-value-2-4 [text] -> product-value-2-4_Merge
      product-value-2-5 [text] -> product-value-2-5_Merge
      product-art-3 [image] -> product-art-3_Merge
      product-name-3 [text] -> product-name-3_Merge
      product-price-3 [text] -> product-price-3_Merge
      product-value-3-1 [text] -> product-value-3-1_Merge
      product-value-3-2 [text] -> product-value-3-2_Merge
      product-value-3-3 [text] -> product-value-3-3_Merge
      product-value-3-4 [text] -> product-value-3-4_Merge
      product-value-3-5 [text] -> product-value-3-5_Merge
      product-art-4 [image] -> product-art-4_Merge
      product-name-4 [text] -> product-name-4_Merge
      product-price-4 [text] -> product-price-4_Merge
      product-value-4-1 [text] -> product-value-4-1_Merge
      product-value-4-2 [text] -> product-value-4-2_Merge
      product-value-4-3 [text] -> product-value-4-3_Merge
      product-value-4-4 [text] -> product-value-4-4_Merge
      product-value-4-5 [text] -> product-value-4-5_Merge
  signal-0 [rect] -> signal-0_Merge
  signal-1 [rect] -> signal-1_Merge
  signal-2 [rect] -> signal-2_Merge
  signal-3 [rect] -> signal-3_Merge

Animated controls

Every static numeric/text/shape control remains in guide.json.fusionNodes; this short table lists animated controls only. The complete raw key arrays and per-frame values are in the guide and CSVs.

Layer.property Keys Numeric minimum → maximum
table-content.x 22 -678 → 26

Differences and acceptance limits

Photographic products, real prices, source gradient material and precise phone styling are replaced. Product SVGs are original desk lamps or bags, not traces of appliances. Travel samples preserve phase order and an explicit 17-pixel residual, but are not fitted optical-flow measurements. Row-label loss at later columns is intentionally retained; a sticky label column would be a new editorial variant.

The builder has not executed Resolve or reviewed moving candidate output. Archive hashes, schema checks, sampled controls and custom-content preflights cannot validate native antialiasing, Text+ layout, browser shaping, occlusion readability or motion quality. Parent rendering and independent comparison are separate acceptance gates. Source quality remains false until that process explicitly establishes otherwise. No corpus or publication count is changed.

Optional provenance audits may resolve the repo: and accepted-stage: bindings in provenance.json against the retained research archive. Those historical sources are not needed to install, preflight, render or manually construct this public kit, and may never become adaptation inputs.