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.
Context, title hold, then recentering icon phrases
Concrete source-bound vector adaptation. Authoring-time mechanical checks only; no source-quality approval. Parent renders and independent review are separate.
Download and run
Run from the extracted kit root. Required files: guide.json, README.md, handoff.py, controls.csv, overlay-manifest.json, core-publication-v08.zip, active-assets.zip. Optional self-contained test: test_kit.py. No private worker, prepared project, generator, inspection image, sidecar or external helper documentation is required.
Install the accepted core first, then the selected active override. Never substitute legacy assets-001.zip; that historical archive can contain raster media. Start with no project/ directory:
test ! -e project
unzip core-publication-v08.zip
unzip -o active-assets.zip
python3 handoff.py verify --guide guide.json --project project
python3 handoff.py frames --guide guide.json --project project > controls-regenerated.csv
cd project
npm ci
npm ci and movie rendering are reader/parent steps. This builder ran neither. The font and license arrive in the core. From project/:
node --experimental-strip-types scripts/catalog.mjs show workspace-icon-phrases --contract
node --experimental-strip-types scripts/render.mjs --help
node --experimental-strip-types scripts/verify.mjs --help
node --experimental-strip-types scripts/render.mjs --recipe workspace-icon-phrases --variant default --out out/workspace-icon-phrases-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe workspace-icon-phrases --variant adaptation --out out/workspace-icon-phrases-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/workspace-icon-phrases-default.mp4
node --experimental-strip-types scripts/verify.mjs out/workspace-icon-phrases-adaptation.mp4
For custom content, first create the complete editable file from this selected recipe, then edit only its values (including accurate SVG dimensions and rights):
node --input-type=module -e "import {readFileSync,mkdirSync,writeFileSync} from 'node:fs'; const recipe=JSON.parse(readFileSync('recipes/workspace-icon-phrases.json','utf8')); mkdirSync('inputs',{recursive:true}); writeFileSync('inputs/workspace-icon-phrases-custom.json',JSON.stringify(recipe.defaults,null,2)+'\n',{flag:'wx'});"
Edit project/inputs/workspace-icon-phrases-custom.json from the kit root. Keep field caps and fixed geometry; run the actual font gate when rendering. From project/:
node --experimental-strip-types scripts/render.mjs --recipe workspace-icon-phrases --content inputs/workspace-icon-phrases-custom.json --out out/workspace-icon-phrases-custom.mp4
node --experimental-strip-types scripts/verify.mjs out/workspace-icon-phrases-custom.mp4
Do not combine --variant with --content. This archive uses --out, not --output; no --fps or --duration override belongs to this treatment. From the kit root, the optional tests need only the extracted project and downloaded handoff:
python3 test_kit.py --project project
Tests are source/preflight checks, not render or native Resolve approval. controls-regenerated.csv is a generated output, not a missing file.
Exact binding
- Active archive SHA-256:
3733667df9060e1ab1723fcb39370a1b9c0b83e9ae1e754fbba958b83c30289c - Accepted core SHA-256:
307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de - Recipe SHA-256:
182a6014210457a08dbe8630e34d23a70a0dd31ee543330b7d5e21be912c84fd - Queue unit SHA-256:
86703b4e60944f642d840fd5e221d2523974115058611738899858723bbb8ca5 overlay-manifest.jsonis the complete runtime whitelist with sizes and per-file hashes. Both content variants are embedded in the one selected recipe.
Source and native clock
Official research reference: Introducing workspace agents in ChatGPT; source URL https://www.youtube.com/watch?v=yyvVUEPSCu0. Published 2026-04-22. Metadata authority, response hash, retrieval date and inherited master hash are pinned separately in guide.json.
Exact half-open source bounds: [3060,3420); 360 selected frames at 60/1. All retained excerpt frames are selected; no trim required. Local f maps to source index start+f. Nominal seconds=(start+f)*denominator/numerator.
Not supplied. Nominal frame/rational-FPS seconds are arithmetic labels, not recovered absolute master PTS. Do not silently replace the separately retained rounded samples with nominal times.
Fresh decoded excerpt time base: 1/15360. Every integer PTS and duration, independently retained rounded source-relative time, exact source selection and provenance are in guide.json. Excerpt timing does not prove absolute master PTS.
Every selected native index viewed in a static480x270 cell. Four explicitly listed960x540 stills per piece viewed in detail. Not moving review, a master-resolution pass or an output inspection. No external source window or critic findings supplied these controls. The original source media are research only, never active assets.
Source observations versus choices
- Conversation close-up with small framing drift cuts to clean typography at local55. Source people, mascots and interface data are reference only. Local indices: 0,54,55.
- First line adds whole words at55,61,71. Second line starts with a partial phrase at95, extends through98,101,108,111 and completes at115. Native95 confirms an incomplete word, not a full-line fade. Local indices: 55,61,71,95,98,101,108,111,115.
- Completed two-line title holds through205; first icon-and-phrase row replaces it at206. Local indices: 115,205,206.
- First row shifts up before the second row appears at273. Third arrives at345. All rows remain, with final stack settling truncated at359; no extra final hold is in-window. Local indices: 267,272,273,344,345,359.
Adaptation differences
- Default is a garden team exchange and planting workflow; adaptation is a print studio exchange and edition workflow. Context lasts0..54, then cuts without dissolve.
- Third row starts345; parent is still approaching its off-window target at360. Keys beyond the last output sample describe a truncated continuation, not extra frames.
- Original leaf/calendar/book and archive/beaker/compass symbols replace dimensional source mascots. The UI is original copy, not a product simulation.
- 140px title,78px labels,216px row pitch and x560 stack are chosen at1920x1080. Second-line glyph counts cap at17 at115 for permitted copy.
- All positions, easing and vector material choices are authored approximations, not official measured controls. Source observations and nominal/source PTS authorities remain separate.
- One treatment with two content variants. No source images, logos, brand data, audio or photographic claims.
Editable Remotion construction
Install the selected recipe under project/recipes/. The accepted Treatment framegraph reads groups, text, vector-image slots and native shapes from it. Layer order is back-to-front. Start/end gates use the global local frame, not frame minus layer.start. Edit fields and both embedded content objects; do not alter source bounds or reuse the historical builder timing.
All numeric tracks below are chosen implementation values. Held string prefixes live in the node controls; they do not resize their text boxes. The original SVGs have separate vector elements and local gradients; no image element or linked media is allowed.
Resolve / Fusion manual build
Create1920x1080 at 60/1 fps, V1 Fusion composition[0,360), timeline timecode01:00:00:00. No audio. There is no supplied or validated native .setting macro.
Recipe coordinates are top-left pixels, local to parent. For a local domain W,H and pivot ox,oy, place the transform pivot at(ox/W,1-oy/H). Translate by(x/W,-y/H) in that parent domain after local scaling/rotation; use the explicit affine mapping below rather than assuming canvas dimensions for every nested group.
p_parent = (x,y) + origin + R_clockwise(rotation) * diag(scalescaleX,scalescaleY) * (p_local-origin). Merge children before applying this once per group. Convert final top-left pixels to Fusion normalized(x/W,1-y/H). Fusion angle convention must be calibrated against positive clockwise recipe rotation.
Left-key smooth=uu(3-2*u), linear=u, hold until next key. Never Auto. All tracks sampled on global recipe-local time.
Normal Over with transparent outside shape; group opacity after child composition; local clip and SVG clipPath before local transform. No image/video Loader or black/Screen workaround.
- Create one1920x1080 Fusion Composition on Edit V1, no audio tracks. Set the exact guide rational timeline cadence before insertion. The timeline GUI may label24000/1001 as23.976; keep the rational value in the delivery contract. Set length to the listed nativeFrameCount, local0 through count-1. Do not import the research excerpt.
- Use one explicit Background_Paper and ordered Over Merge chain. Treat JSON layer IDs as node names and fusionNodes parentLayerId as nesting ownership. A group contains a transparent RGBA local domain, ordered child Merges, then its own Transform and one opacity multiplier. Never apply parent travel separately to already transformed children.
- Reconstruct each active SVG from svgConstruction in guide.json. Use Background plus Rectangle/Ellipse/Polygon/Bezier masks; preserve viewBox, exact path controls, fill/stroke and gradient stops. Keep separate editable shape nodes in XML order; the orb uses two fills intersected with its circle alpha. No Loader of a bitmap or video. SVG import is optional, not required to obtain editable native nodes.
- Use bundled Geist for Text+. Enter defaults or adaptation values from contentContract. Text values remain editable, with fixed recipe width/height and no auto-wrap/shrink. Match pixel font size, weight, line height and alignment through a native baseline/width check; no numeric claim that Text+ Size equals CSS px. The supplied source-only browser gate does not certify Fusion typography.
- Set each layer gate start inclusive and end exclusive. When using clip trims, local Fusion time must still evaluate the global recipe-local clock: add the clip In before sampling. Use held StyledText prefixes for reveal.steps, with no interpolation of glyph counts. A disappearing group cuts all children together.
- For numeric tracks use controls.csv per-native-frame values, or exact left-key interpolation: linear u; smooth uu(3-2*u); hold returns left value strictly until next key. No Auto spline, overshoot, cross-dissolve or optical-flow interpolation. Evaluate keys beyond duration only to derive the truncated last in-window sample.
- Keep alpha transparent outside vector shapes. SVG fill/stroke opacity and gradient stop-opacity multiply their own coverage; Merge with Normal/Over, not Screen or black-keying. Clip the final canvas only; explicit inset masks, if present, apply in local pixels before that group transform. Do not shrink live text widths as a reveal mechanism.
- Build conversation-context from context-rail, five Text+ leaves and two vector icons. Its x travels0 to-12 across0..54. Gate the entire group[0,55); title is a sibling, not its child. This invented exchange is not a real product behavior claim.
- Build title-parent at x140, width1640. Its y holds430 through71 then smoothsteps to396 at95. title-line-one uses140px type and three whole-word gates55/61/71; title-line-two at local y168 uses character counts5/6/7/9/11/17 at95/98/101/108/111/115. Both hold through205 and cut206.
- Build phrase-stack at x560, size1260x576. Add row-1/2/3 at y0/216/432, gates206/273/345. Each merges a128px icon and78px label at x210,y8 in a1040x100 text box. Row opacity .2 to1 over fiveframes is an adaptation choice.
- Move only phrase-stack y:470 through264; smooth to362 at278; hold through336; smooth toward254 at366. Last output index359 is before completion. Earlier rows stay in place relative to the shared parent while each new row joins. Do not replace this with independent fixed row pop-ins.
- Check every listed source-bound checkpoint and adjacent frames against the scalar contract. Inspect an actual parent render and native Resolve output separately before any fidelity/equivalence claim. Default, adaptation and custom passing here are content/framegraph/font preflights only.
Complete node hierarchy and track ownership
Each row is one authored layer, with its native subgroup tools. Follow the sibling Merge order and parent IDs; guide.json contains full literal controls, local box, effective gates, mask order, text values and SVG construction trees. Child groups are transparent until their active children contribute alpha. A dormant child never makes a parent visible.
| Layer | Parent | Kind | Local gate | Native tools |
|---|---|---|---|---|
paper |
ROOT |
rect | [0, 360] | Background with Rectangle/Ellipse mask, Inside-border ring if stroke is present, Blur if present, Local Transform, Over Merge |
conversation-context |
ROOT |
group | [0, 55] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
context-rail |
conversation-context |
rect | [0, 55] | Background with Rectangle/Ellipse mask, Inside-border ring if stroke is present, Blur if present, Local Transform, Over Merge |
context-copy-0 |
conversation-context |
text | [0, 55] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
context-copy-1 |
conversation-context |
text | [0, 55] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
context-copy-2 |
conversation-context |
text | [0, 55] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
context-copy-3 |
conversation-context |
text | [0, 55] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
context-copy-4 |
conversation-context |
text | [0, 55] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
context-icon-a |
conversation-context |
image | [0, 55] | Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge |
context-icon-b |
conversation-context |
image | [0, 55] | Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge |
title-parent |
ROOT |
group | [55, 206] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
title-line-one |
title-parent |
text | [55, 206] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
title-line-two |
title-parent |
text | [95, 206] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
phrase-stack |
ROOT |
group | [206, 360] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
row-1 |
phrase-stack |
group | [206, 360] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
row-icon-1 |
row-1 |
image | [206, 360] | Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge |
row-copy-1 |
row-1 |
text | [206, 360] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
row-2 |
phrase-stack |
group | [273, 360] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
row-icon-2 |
row-2 |
image | [273, 360] | Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge |
row-copy-2 |
row-2 |
text | [273, 360] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
row-3 |
phrase-stack |
group | [345, 360] | Transparent RGBA working domain, Ordered child Merges, Rounded Rectangle/Polygon alpha intersection if required, Transform, Group opacity, Over Merge |
row-icon-3 |
row-3 |
image | [345, 360] | Native vector subgroup reconstructed from svgConstruction, Fit Transform, Local Transform, Over Merge |
row-copy-3 |
row-3 |
text | [345, 360] | Text+ in bundled Geist, Set explicit newline layout, Stepped StyledText or Write On gate when present, Local Transform, Over Merge |
Exact numerical controls
Coordinates are local pixels. Keys are frame:value easing; constant values remain held. Whole-group origin and nonnumeric controls are in the adjacent node contract in guide.json. controls.csv enumerates every native value, including inactive rows (see active column).
| Layer | Property | Value / keys |
|---|---|---|
paper |
x |
0 |
paper |
y |
0 |
paper |
width |
1920 |
paper |
height |
1080 |
conversation-context |
x |
0:0 linear; 54:-12 hold |
conversation-context |
y |
0 |
conversation-context |
width |
1920 |
conversation-context |
height |
1080 |
context-rail |
x |
0 |
context-rail |
y |
0 |
context-rail |
width |
355 |
context-rail |
height |
1080 |
context-copy-0 |
x |
645 |
context-copy-0 |
y |
58 |
context-copy-0 |
width |
1235 |
context-copy-0 |
height |
84 |
context-copy-1 |
x |
645 |
context-copy-1 |
y |
151 |
context-copy-1 |
width |
1235 |
context-copy-1 |
height |
84 |
context-copy-2 |
x |
645 |
context-copy-2 |
y |
410 |
context-copy-2 |
width |
1235 |
context-copy-2 |
height |
84 |
context-copy-3 |
x |
645 |
context-copy-3 |
y |
530 |
context-copy-3 |
width |
1235 |
context-copy-3 |
height |
84 |
context-copy-4 |
x |
645 |
context-copy-4 |
y |
621 |
context-copy-4 |
width |
1235 |
context-copy-4 |
height |
84 |
context-icon-a |
x |
492 |
context-icon-a |
y |
54 |
context-icon-a |
width |
130 |
context-icon-a |
height |
130 |
context-icon-b |
x |
492 |
context-icon-b |
y |
402 |
context-icon-b |
width |
130 |
context-icon-b |
height |
130 |
title-parent |
x |
140 |
title-parent |
y |
55:430 hold; 71:430 smooth; 95:396 hold |
title-parent |
width |
1640 |
title-parent |
height |
350 |
title-line-one |
x |
0 |
title-line-one |
y |
0 |
title-line-one |
width |
1640 |
title-line-one |
height |
170 |
title-line-two |
x |
0 |
title-line-two |
y |
168 |
title-line-two |
width |
1640 |
title-line-two |
height |
170 |
phrase-stack |
x |
560 |
phrase-stack |
y |
206:470 hold; 264:470 smooth; 278:362 hold; 336:362 smooth; 366:254 hold |
phrase-stack |
width |
1260 |
phrase-stack |
height |
576 |
row-1 |
x |
0 |
row-1 |
y |
0 |
row-1 |
width |
1220 |
row-1 |
height |
144 |
row-1 |
opacity |
206:0.2 smooth; 211:1 hold |
row-icon-1 |
x |
0 |
row-icon-1 |
y |
0 |
row-icon-1 |
width |
128 |
row-icon-1 |
height |
128 |
row-copy-1 |
x |
210 |
row-copy-1 |
y |
8 |
row-copy-1 |
width |
1040 |
row-copy-1 |
height |
100 |
row-2 |
x |
0 |
row-2 |
y |
216 |
row-2 |
width |
1220 |
row-2 |
height |
144 |
row-2 |
opacity |
273:0.2 smooth; 278:1 hold |
row-icon-2 |
x |
0 |
row-icon-2 |
y |
0 |
row-icon-2 |
width |
128 |
row-icon-2 |
height |
128 |
row-copy-2 |
x |
210 |
row-copy-2 |
y |
8 |
row-copy-2 |
width |
1040 |
row-copy-2 |
height |
100 |
row-3 |
x |
0 |
row-3 |
y |
432 |
row-3 |
width |
1220 |
row-3 |
height |
144 |
row-3 |
opacity |
345:0.2 smooth; 350:1 hold |
row-icon-3 |
x |
0 |
row-icon-3 |
y |
0 |
row-icon-3 |
width |
128 |
row-icon-3 |
height |
128 |
row-copy-3 |
x |
210 |
row-copy-3 |
y |
8 |
row-copy-3 |
width |
1040 |
row-copy-3 |
height |
100 |
Original SVG whitelist and construction
These are the complete default+adaptation active image dependencies. Each SVG is supplied in active-assets.zip at project/public/svgConstruction XML tree; use the per-element attributes, transforms, gradient stops and clipPath alpha. No generated source or private script is required.
| Active SVG path | SHA-256 |
|---|---|
art/workspace-icon-phrases/icon-1-adaptation.svg |
843d6e3baff17f85a13daf8103ed0c10f38c200d9184607bca2b02d812d5e3a9 |
art/workspace-icon-phrases/icon-1-default.svg |
bb31613b93a757fcc90c7faeb9a53393249e6e48138561b894981b521bdb4c04 |
art/workspace-icon-phrases/icon-2-adaptation.svg |
22983d3f1790663ff176e7eaad140bb781096287480fc5565c86cd6a68e2ca43 |
art/workspace-icon-phrases/icon-2-default.svg |
b0e58bdedeb744009362cbc52a0a3d1e39f9db11bb1fae31f238574efa0b617b |
art/workspace-icon-phrases/icon-3-adaptation.svg |
ade8e3d8e617557100fa8bf8b23343c784e6489efc1861296e89837410fcd116 |
art/workspace-icon-phrases/icon-3-default.svg |
829f4ea0cec79519832aeaff834dae7914a571095d74de0034d0b33bf90a4260 |
Checkpoints and regression limits
| Local | Source | Required condition |
|---|---|---|
| 0 | 3060 | Original conversation closeup. |
| 54 | 3114 | Last conversation frame; small parent drift. |
| 55 | 3115 | Cut to first title word. |
| 61 | 3121 | Second whole word. |
| 71 | 3131 | Third whole word. |
| 94 | 3154 | No second line yet. |
| 95 | 3155 | Second-line five-character prefix. |
| 101 | 3161 | Seven-character prefix. |
| 115 | 3175 | Full replacement title. |
| 205 | 3265 | Last frame of long title hold. |
| 206 | 3266 | First icon row; title gone. |
| 264 | 3324 | First recentering move starts. |
| 272 | 3332 | One row yielding space. |
| 273 | 3333 | Second row starts. |
| 278 | 3338 | Two-row position reached. |
| 336 | 3396 | Three-row re-centering starts. |
| 344 | 3404 | Only two rows. |
| 345 | 3405 | Third row starts. |
| 359 | 3419 | Three rows; parent has not finished its continuing settle. |
The tests verify installed core/recipe/artifact pins, exact flat ZIP whitelist, active SVG closure, node ownership, every numerical control and CSV row, real archived CLI options and default/adaptation/custom prepareInput bindings. The frozen font receipt checks actual full-text widths; parent renders still need their normal font gate. No passing scalar test establishes visual fidelity.
Largest remaining gap: Source-specific mascot depth, exact type spacing and conversation framing are replaced by original flat SVG symbols and invented editorial content; micro-settling curves are chosen, not source-measured.
- Source-specific mascot depth, exact type spacing and conversation framing are replaced by original flat SVG symbols and invented editorial content; micro-settling curves are chosen, not source-measured.
- Source quality unresolved. No moving, blind-win, native Resolve execution or application-equivalence claim.
- No renderer, encoder, npm install, dependency copy, source-master download or deployment by this builder. Parent work is separate.
- All native indices were statically inspected; fitted sheets are not moving review. Absolute source PTS are unavailable.
- Public files work from the kit download. Private inspection/generator files are not run prerequisites.
- Text length caps are not guaranteed glyph-width bounds; actual full-string font gate must pass without shrink.
- One treatment and two original content variants, not multiple examples.