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.
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
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.