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.
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
RootPaperBackground and nodes listed below in order; later siblings are foreground.guide.json.rootPipelinesupplies its color/domain, final crop coordinates and MediaOut connection.nativePalettesupplies normalized RGB values for editable colors in both variants; use opacity separately. - For each layer build
Construct → LocalMask → AnchorShift → ScaleRotate → Position → Gated → Merge.Foreground; the previous sibling feedsMerge.Background. For a group,Constructis its ordered child merges over a transparent background. Apply group alpha once after assembly. guide.json.fusionNodesnames every tool, connection, parent, raw/static control, content binding and gate.svgSubgraphsenumerates 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.- Bake the numeric rows in
fusion-controls.csvat each integer local frame. Its AnchorShift/Position/ScaleRotate/Gated columns are derived below.controls.csvcontains every raw property sample, including independent width/radius tracks. Neither CSV is an importable.settingfile: transfer columns to the named native controls using frame-based keys. - 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/4096is 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. - 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
- Code: parent-local pixels, +X right, +Y down, rotation clockwise. Origin defaults to (0,0), not the layer center. A group width/height is neither a child scale nor an implicit clip. Only declared overflow/clip masks clip.
- Fusion normalized point =
((x+1024)/4096, 1-(y+1024)/4096). For a mask with top-left (x,y) and size (w,h), use center((x+w/2+1024)/4096, 1-(y+h/2+1024)/4096)and size(w/4096,h/4096). - Exact uniform layer transform:
p' = t + o + Rcw(angle)*scale*(p-o). Letc=(1024,1024)in design space. AnchorShift translates byc-o; ScaleRotate uses center/pivot (0.5,0.5), Size=scale and Angle=−rotation; Position translates byt+o-c. Translation(dx,dy)means Transform Center(0.5+dx/4096,0.5-dy/4096). Do not also put layer X/Y on a mask and double it. - Apply overflow and clip in the layer's local coordinates before its own
transform. Rounded rectangle radius r uses the union of central rectangles
(r,0,w-2r,h),(0,r,w,h-2r)and four radius-r circles at inset corners. Clamp union alpha; do not add paint opacity. r=0 is one rectangle. CSS border is inward: outer stroke-color mask, then fill inset by strokeWidth with inner radiusmax(0,r-strokeWidth). Ellipses use their actual width/height. - SVG contain factor =
min(boxWidth/viewBoxWidth,boxHeight/viewBoxHeight); centered leftover margins are added before the layer transform. Polygon vertices are explicit source SVG numbers, not hand-traced film shapes. - Every track uses the global local frame, including children that start
later. Keys clamp outside their range. The left key owns easing:
linear
t, smootht*t*(3-2*t), hold stays at its left value until the right key's frame. Use per-frame baked keys, not an approximate native ease preset. - Merge Blend = active gate × local opacity. A child is visible only while all ancestor gates are active. Do not multiply parent opacity into each child: parent alpha belongs after its completed child composite.
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.