OpenAI Film Fieldnotes

Candidate construction guide · native Resolve not tested

Historical builder snapshot: 2026-09-14. 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-14T02:20:33.205891+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

Skill artifact disclosure — reserve space above input

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 11db12dc0de1553ea25988f8ff097c20147a3a204eabfd8451c46530c13bd341
Recipe 4ea22ecb90dac179743fa2fe4712cddab6a4bb04e713f038c63dce9b398b9cf9
Guide f8af5339edd2fb19d59a2fc4b899647d434dc6af809bbd21c9174ac0b661a5ef
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 2 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: "skill-artifact-disclosure", variant});
  console.log(variant, prepared.expected);
}
'
node --experimental-strip-types scripts/render.mjs --recipe skill-artifact-disclosure --variant default --out out/skill-artifact-disclosure-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe skill-artifact-disclosure --variant adaptation --out out/skill-artifact-disclosure-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/skill-artifact-disclosure-default.mp4
node --experimental-strip-types scripts/verify.mjs out/skill-artifact-disclosure-adaptation.mp4

Expected: 1920×1080, 30000/1001 fps, 150 frames, 1001/200 seconds (5.005000000), 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: a workshop-checklist request, workshop helper, workshop download label and original document badge. Adaptation: a planting-checklist request, planting helper, planting download label and an original leaf badge. The two equal-length answer sentences and download labels use the same reveal schedule without shrinking type. Prompt, notice, preview identity and supporting copy change, while the Draft/loading state stays unfinished. Download labels are illustrative text, not files promised by this kit; no skill implementation or working Install action is included.

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/skill-artifact-disclosure.json").read_text())
content = dict(recipe["defaults"])
content["previewTitle"] = "Weekend helper"
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: "skill-artifact-disclosure", contentPath: "custom.json"})).expected);
'
node --experimental-strip-types scripts/render.mjs --recipe skill-artifact-disclosure --content custom.json --out out/skill-artifact-disclosure-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: ChatGPT skills in beta for ChatGPT Business & Enterprise. Retained official-player publication: 2026-03-13, timestamp 2026-03-13T13:08:30-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 [390, 540) at 30000/1001, with exact nominal source seconds [13013/1000, 9009/500). Local frame zero = source 390; last local frame 149 = source 539. Excerpt offset is zero. The selected unit declares nominal native 30000/1001 but supplies no retained master/source-relative PTS clock: retained_source_clock stays null. The excerpt is separately probed at 1/30000 time base with PTS increments [1001]. 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: 4f11cbd6f64bcf5095d30915759aeff387b968480123ab80784c2bc93eb9209f. The source master SHA is inherited, not freshly rehashed. The source/timing unit and related implementation file hashes are in provenance.json. Related Edit/SplitResult and its partial Resolve guide supplied parenting/masking concepts, not a complete adapter.

Inspection: all 150 excerpt frames viewed statically as consecutively decoded 480×270 thumbnails, plus 8 selected 960×540 native-size stills. The 1920×1080 output canvas is an authored delivery choice; excerpt dimensions are not a master probe. 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. Local 0–43: retain the cropped preceding request and a quiet Planning state. The small cursor leaves by 16. Composer placeholder changes to Follow up at 27 but the composer does not move.
  2. 44: reveal the used-helper notice and one faint residual thinking frame. 45–77: reveal the answer by characters in a fixed 1500-pixel-wide box. No caret or typing cursor is added. The ordinary placeholder returns at 44.
  3. 78–81: reveal the download label separately. At 87 add the compact artifact preview at y=720 behind the anchored composer at y=812. At 89 add the downward hint; at 90 retain unfinished trailing punctuation. At 110 add a small code-like chip without claiming its exact source timing.
  4. 87–140: hold the compact preview with its lower Draft content partly occluded and a dim Install control. No successful install, click pulse or loaded-details state appears.
  5. 141–149: disclose Loading helper details and expand the preview from 112 to 184 pixels while conversation y moves from 0 to -184. The composer remains (158,812), 1600x216. The navigation hint fades independently. Stop with Draft/loading, inactive Install and active stop indicator; do not resolve the pending action.

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 390 13.013000 Quiet wait and fixed input.
15 405 13.513500 Pointer nearly outside crop.
27 417 13.913900 Follow-up placeholder; composer fixed.
43 433 14.447767 Last primary thinking frame.
44 434 14.481133 Notice and faint residual thinking.
45 435 14.514500 Answer first characters.
77 467 15.582233 Answer complete; link not yet visible.
78 468 15.615600 Link reveal starts.
81 471 15.715700 Link complete.
86 476 15.882533 Last frame without preview.
87 477 15.915900 Compact preview appears behind composer.
90 480 16.016000 Preview, navigation hint and unfinished punctuation.
110 500 16.683333 Small code-like chip appears.
140 530 17.684333 Last compact hold.
141 531 17.717700 Loading line appears as space opens.
146 536 17.884533 Expanded preview; input anchor unchanged.
149 539 17.984633 Draft/loading at exact cutoff; no completed action.

Resolve / Fusion construction

Use one V1 Fusion Composition, no audio or MediaIn footage. At local timeline origin 0 its In is 0, Out is 150 exclusive, and its length is 150 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 30000/1001, local frames 0–149 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

conversation owns the clipped preceding request, wait/notice/answer/link, trailing code/punctuation and artifact-preview. anchored-composer is a later root sibling and occludes the preview, never a child of the scrolling conversation. artifact-preview has overflow:hidden and a growing local mask; no text width or font size changes. Its loading line starts at global local frame 141, not 141 frames after preview start. The conversation shift applies once to all its children. scroll-hint is a root sibling, not a moving conversation element. departing-hand and departing-pointer are mutually exclusive early overlays. Install stays dim and the composer stop square persists. There is no native skill backend, link opening or generated replacement of source footage.

RootPaper -> ordered root merges -> FinalCrop -> MediaOut
conversation [group] -> conversation_Merge
  prior-bubble [rect] -> prior-bubble_Merge
  prior-request [text] -> prior-request_Merge
  thinking-label [text] -> thinking-label_Merge
  helper-notice [text] -> helper-notice_Merge
  residual-thinking [text] -> residual-thinking_Merge
  answer-line [text] -> answer-line_Merge
  download-line [text] -> download-line_Merge
  trailing-markup [group] -> trailing-markup_Merge
    code-chip-paper [rect] -> code-chip-paper_Merge
    code-chip [text] -> code-chip_Merge
    unfinished-punctuation [text] -> unfinished-punctuation_Merge
  artifact-preview [group] -> artifact-preview_Merge
    preview-paper [rect] -> preview-paper_Merge
    artifact-icon [image] -> artifact-icon_Merge
    preview-title [text] -> preview-title_Merge
    preview-draft [text] -> preview-draft_Merge
    preview-loading [text] -> preview-loading_Merge
    install-disabled [rect] -> install-disabled_Merge
    install-label [text] -> install-label_Merge
scroll-hint [group] -> scroll-hint_Merge
  hint-paper [ellipse] -> hint-paper_Merge
  hint-arrow [path] -> hint-arrow_Merge
anchored-composer [group] -> anchored-composer_Merge
  composer-paper [rect] -> composer-paper_Merge
  prompt-initial [text] -> prompt-initial_Merge
  prompt-followup [text] -> prompt-followup_Merge
  prompt-return [text] -> prompt-return_Merge
  add-mark [path] -> add-mark_Merge
  mode-disc [ellipse] -> mode-disc_Merge
  mode-hand [rect] -> mode-hand_Merge
  mode-hand-short [rect] -> mode-hand-short_Merge
  mode-label [text] -> mode-label_Merge
  mode-chevron [path] -> mode-chevron_Merge
  microphone [path] -> microphone_Merge
  stop-circle [ellipse] -> stop-circle_Merge
  stop-square [rect] -> stop-square_Merge
departing-hand [group] -> departing-hand_Merge
  departing-hand-outline [path] -> departing-hand-outline_Merge
  departing-hand-mark [path] -> departing-hand-mark_Merge
departing-pointer [group] -> departing-pointer_Merge
  departing-pointer-outline [path] -> departing-pointer-outline_Merge
  departing-pointer-mark [path] -> departing-pointer-mark_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
conversation.y 5 -184 → 0
unfinished-punctuation.x 2 0 → 68
artifact-preview.height 4 112 → 184
preview-paper.height 4 112 → 184
scroll-hint.opacity 3 0.15 → 1
departing-pointer.x 2 1692 → 1930
departing-pointer.y 2 584 → 654

Differences and acceptance limits

Largest gap: text streaming, the few-frame layout displacement and compact-preview occlusion are authored approximations of static native-cadence observations, not recovered application reflow. Original equal-length sentences, geometric icon and simplified input controls replace source wording/branding. The small trailing code-chip timing is estimated. The excerpt ends while details still load; the adapter intentionally cannot show a completed installation or final response. Native Text+ glyph parity and moving-output quality remain unverified.

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.