OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Historical builder snapshot: 2026-09-15. Earlier README and handoff statements about being unrendered or unpublished describe that authoring stage. The current selected report verifies both content exports at 2026-09-15T06:56:14.114835+00:00; those earlier statements do not describe their current availability. Native Resolve execution and source-quality approval remain unverified.

Current selected render verification · Batch export report

Permission scope public R03

Read PUBLIC_SOURCE_OBSERVATIONS.md first, then PUBLIC_REPORT.md. Both are exact authorized public documents. Status: moving-review-outstanding. This is a same-ID packaging derivative of the already-rendered R03, not a new treatment, encode, visual repair or quality approval.

Permission scope — choose, hold, cut

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.

The active archive contains a flat list of regular file members (no directory entries, nested archives, symlinks or project/inputs/): one selected recipe and its active SVGs only. 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 9b886d651c68992eedaaf46db1a0931a7f9c15a98a46259f2c5f6b8133c35c59
Recipe 61fe77e40d26e40a5ee378994742a94a086a1205337f475e632f8a95722d7d17
Guide 0a1ffe95d9ff7f60ea3d1c39ec592b8792874e1110253092b3a0bdd1049d0ab1
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 6 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, 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: "permission-scope", variant});
  console.log(variant, prepared.expected);
}
'
node --experimental-strip-types scripts/render.mjs --recipe permission-scope --variant default --out out/permission-scope-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe permission-scope --variant adaptation --out out/permission-scope-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/permission-scope-default.mp4
node --experimental-strip-types scripts/verify.mjs out/permission-scope-adaptation.mp4

Expected: 1920×1080, 60/1 fps, 270 frames, 9/2 seconds (4.500000000), 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 packaging worker did not execute them. Existing parent R03 exports are bound in render-verification.json.

Content substitutions

Default: an eight-week workshop participation plan, workshop team, Mara Vale and Leo Birch, with original document/mountain badges. Adaptation: an eight-cycle seedling schedule, nursery team, Eden Moss and Noor Reed, with original botanical badges and a different plotted series. Project titles, headings, context rows, invitation copy, addresses, scope names and illustrations change together. All names and data are invented; .example addresses are non-operational. Permission labels illustrate a state transition, not a real authorization system.

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/permission-scope.json").read_text())
content = dict(recipe["defaults"])
content["projectTitle"] = "Weekend workshop"
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: "permission-scope", contentPath: "custom.json"})).expected);
'
node --experimental-strip-types scripts/render.mjs --recipe permission-scope --content custom.json --out out/permission-scope-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: Build and share apps in Codex. Retained official-player publication: 2026-06-02, timestamp 2026-06-02T09:29:33-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 [1500, 1770) at 60/1, with exact nominal source seconds [25, 59/2). Local frame zero = source 1500; last local frame 269 = source 1769. Excerpt offset is zero. The selected unit declares nominal native 60/1 but supplies no retained master/source-relative PTS clock: retained_source_clock stays null. The excerpt is separately probed at 1/15360 time base with PTS increments [256]. These encoded excerpt timestamps are not proof of the missing master clock. Absolute master PTS and master dimensions remain unknown. guide.json.encodedExcerptClock records actual retained-excerpt PTS, time base, frame durations and coded stream rate separately. Do not round the source nominal cadence, substitute an excerpt average rate, or stretch to another rate.

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

Current source-first coverage is exactly the coverage in PUBLIC_SOURCE_OBSERVATIONS.md and PUBLIC_REPORT.md. Legacy recipe/provenance inspection records are historical builder records, not additional current review. No new image or motion inspection occurred.

Authored choreography

  1. Local 0–10: hold the original centered title. 10–31: raise the title above the crop. The dashboard enters from below at 20 and settles at 35; the sharing panel begins at 31 and reaches opaque paper at35 with staged content completing at56.
  2. 56–94: hold the restricted scope with two members and inactive Done/Visit/Copy controls. 94–114: move only sharing-panel from (510,128), scale 1, to (234,-524), scale 1.62. The dashboard remains at (134,148); it does not magnify with the panel.
  3. 114–158: quiet restricted hold. At 159 expose the two-option menu with its lower restricted row checked. Grow and settle the menu by 169. Move the pointer to the upper row and reveal its hover backing at 186; do not change selection yet.
  4. 215: change the trigger label/icon to the broader team-link scope. Keep the old check for two frames; at 217 switch the menu check to its upper row. The menu retracts through 229 and disappears at 230. Hold the selected trigger and members through 248; no Done click occurs.
  5. 249: cut all interface layers to blank paper. At 250 show the left part of an original bracket; at 253 add the right part. Drift the empty pair left through 269. Stop without adding a word, logo, confirmation or extended final hold.

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 1500 25.000000 Centered original title.
20 1520 25.333333 Dashboard enters from below.
31 1531 25.516667 Panel starts; title leaving crop.
56 1556 25.933333 Panel fully visible; restricted access.
94 1594 26.566667 Last wide panel hold; pointer appears.
114 1614 26.900000 Panel-only close view settled.
158 1658 27.633333 Last closed-menu hold.
159 1659 27.650000 Two-option menu first visible.
186 1686 28.100000 Upper row hover begins; still restricted.
214 1714 28.566667 Trigger and check still restricted.
215 1715 28.583333 Trigger broadened; lower check lingers.
217 1717 28.616667 Upper check selected.
229 1729 28.816667 Last retracting-menu frame.
230 1730 28.833333 Menu absent; selected trigger persists.
248 1748 29.133333 Last interface frame; Done unclicked.
249 1749 29.150000 Blank cut frame.
250 1750 29.166667 Left bracket fragment only.
253 1753 29.216667 Both empty bracket fragments.
269 1769 29.483333 Unfinished next-title fragment at exact cutoff.

Resolve / Fusion construction

Use one V1 Fusion Composition, no audio or MediaIn footage. At local timeline origin 0 its In is 0, Out is 270 exclusive, and its length is 270 frames. If placed at timeline frame T, evaluate recipe frame as timeline frame minus T. If Fusion's Global Start is G, key recipe frame f at Fusion frame G+f. Neither offset changes the source mapping or adds handles. guide.json.resolveTracks records this contract. Do not retime, interpolate source frames or extend the pending action. Both content variants use the same clip and key schedule.

  1. Create a 1920×1080, square-pixel composition at 60/1, local frames 0–269 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 an 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

Root order is opening-title, dashboard-context, sharing-panel, unfinished-fragment. The sharing panel owns its project summary, invitation field, access states, two member rows, footer, menu and pointer; the dashboard is its root sibling. restricted-trigger ends at 215 and expanded-trigger begins at 215, but restricted-check ends at 217. scope-menu is the last substantive panel child before the pointer; its background and alpha are composed once. Its 640x150 text boxes stay fixed while its parent scales. Geometric avatar images are native SVG subgraphs, not portraits. All text boxes retain their full widths. FinalCrop hides the panel top after the push. The final title fragment is independent code geometry with no text completion.

RootPaper -> ordered root merges -> FinalCrop -> MediaOut
opening-title [group] -> opening-title_Merge
  opening-copy [text] -> opening-copy_Merge
dashboard-context [group] -> dashboard-context_Merge
  dashboard-vector [image] -> dashboard-vector_Merge
  dashboard-title [text] -> dashboard-title_Merge
  dashboard-subtitle [text] -> dashboard-subtitle_Merge
  nav-title [text] -> nav-title_Merge
  nav-rows [text] -> nav-rows_Merge
  dashboard-metric [text] -> dashboard-metric_Merge
  table-label [text] -> table-label_Merge
  table-rows [text] -> table-rows_Merge
sharing-panel [group] -> sharing-panel_Merge
  sharing-paper [rect] -> sharing-paper_Merge
  share-title [text] -> share-title_Merge
  close-mark [path] -> close-mark_Merge
  project-summary [rect] -> project-summary_Merge
  project-badge [image] -> project-badge_Merge
  project-name [text] -> project-name_Merge
  project-address [text] -> project-address_Merge
  invite-field [rect] -> invite-field_Merge
  invite-placeholder [text] -> invite-placeholder_Merge
  access-heading [text] -> access-heading_Merge
  restricted-trigger [group] -> restricted-trigger_Merge
    restricted-lock [group] -> restricted-lock_Merge
      restricted-lock-body [path] -> restricted-lock-body_Merge
      restricted-lock-hole [rect] -> restricted-lock-hole_Merge
    restricted-label [text] -> restricted-label_Merge
    restricted-chevron [path] -> restricted-chevron_Merge
  expanded-trigger [group] -> expanded-trigger_Merge
    expanded-team [path] -> expanded-team_Merge
    expanded-label [text] -> expanded-label_Merge
    expanded-chevron [path] -> expanded-chevron_Merge
  owner-avatar [image] -> owner-avatar_Merge
  owner-name [text] -> owner-name_Merge
  owner-address [text] -> owner-address_Merge
  owner-role [text] -> owner-role_Merge
  reader-avatar [image] -> reader-avatar_Merge
  reader-name [text] -> reader-name_Merge
  reader-address [text] -> reader-address_Merge
  reader-role [text] -> reader-role_Merge
  reader-chevron [path] -> reader-chevron_Merge
  copy-button [rect] -> copy-button_Merge
  copy-label [text] -> copy-label_Merge
  visit-button [rect] -> visit-button_Merge
  visit-label [text] -> visit-label_Merge
  done-button [rect] -> done-button_Merge
  done-label [text] -> done-label_Merge
  scope-menu [group] -> scope-menu_Merge
    menu-border [rect] -> menu-border_Merge
    menu-paper [rect] -> menu-paper_Merge
    menu-hover [rect] -> menu-hover_Merge
    menu-team-icon [path] -> menu-team-icon_Merge
    menu-expanded-label [text] -> menu-expanded-label_Merge
    menu-lock-icon [group] -> menu-lock-icon_Merge
      menu-lock-icon-body [path] -> menu-lock-icon-body_Merge
      menu-lock-icon-hole [rect] -> menu-lock-icon-hole_Merge
    menu-restricted-label [text] -> menu-restricted-label_Merge
    restricted-check [path] -> restricted-check_Merge
    expanded-check [path] -> expanded-check_Merge
  scope-pointer [group] -> scope-pointer_Merge
    scope-pointer-outline [path] -> scope-pointer-outline_Merge
    scope-pointer-mark [path] -> scope-pointer-mark_Merge
unfinished-fragment [group] -> unfinished-fragment_Merge
  fragment-left [path] -> fragment-left_Merge
  fragment-right [path] -> fragment-right_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
opening-title.y 3 -130 → 472
dashboard-context.y 2 148 → 1100
dashboard-context.opacity 2 0.22 → 1
sharing-panel.x 3 234 → 510
sharing-panel.y 4 -524 → 128
sharing-panel.scale 3 1 → 1.62
sharing-panel.opacity 3 0 → 1
share-title.opacity 2 0 → 1
close-mark.opacity 2 0 → 1
project-summary.opacity 2 0 → 1
project-badge.opacity 2 0 → 1
project-name.opacity 2 0 → 1
project-address.opacity 2 0 → 1
invite-field.opacity 2 0 → 1
invite-placeholder.opacity 2 0 → 1
access-heading.opacity 2 0 → 1
restricted-trigger.opacity 2 0 → 1
owner-avatar.opacity 2 0 → 1
owner-name.opacity 2 0 → 1
owner-address.opacity 2 0 → 1
owner-role.opacity 2 0 → 1
reader-avatar.opacity 2 0 → 1
reader-name.opacity 2 0 → 1
reader-address.opacity 2 0 → 1
reader-role.opacity 2 0 → 1
reader-chevron.opacity 2 0 → 1
copy-button.opacity 2 0 → 1
copy-label.opacity 2 0 → 1
visit-button.opacity 2 0 → 1
visit-label.opacity 2 0 → 1
done-button.opacity 2 0 → 1
done-label.opacity 2 0 → 1
scope-menu.x 4 112 → 160
scope-menu.y 4 518 → 538
scope-menu.scale 4 0.8 → 1
scope-menu.opacity 3 1 → 1
scope-pointer.x 5 256 → 503
scope-pointer.y 5 488 → 586
unfinished-fragment.x 2 716 → 912

Evidence and acceptance limits

No biggest supported gap was established separately for workshop-sharing and planting-sharing in the sampled current states. This does not mean perfection, improvement, a ranking or quality approval. Missing perceived moving footage, particularly focus frames 92–120 and menu interval [159, 230), remains explicit. Hash recognition of source-identical material limits complete blinding.

Each current content has exactly 114 distinct 320×180 thumbnails and four individual 1920×1080 stills at 45, 120, 215 and 218, already in that set. The frozen source-only study has exactly 111 thumbnails and 23 individual 960×540 stills. Metadata checks of 270 frames at 60/1 are not visual coverage.

The parent comparison reports 220 default and 225 adaptation changed decoded frames versus R02, including 196 and 201 outside frames 32–55. Matching authored controls outside that interval does not establish decoded isolation. Differences are not automatically codec noise, unintended motion or evidence of improvement. No movie, source master, review image or full-film asset is inside this kit.

Original recipe source metadata, all six SVGs, input content, core, helper and both control CSVs remain byte-identical to frozen R03. Guide changes concern public evidence/status metadata only. The handoff loads the original recipe; there is no replacement source wrapper. See bindings.json, review-binding.json and render-verification.json for package, review and actual-export pins.

Resolve guidance is manual construction, not a tested .drp/.setting import. No native Resolve execution, moving-source quality, calibrated-display or whole-film credit is granted. Browser shaping, native Text+ fit and movement still need separately authorized application-level verification. Installation and render commands above are reuse guidance only; none were run for this kit.