Candidate construction guide · native Resolve not tested
Review native document changes without accepting everything
Concrete original SVG/code kit; mechanically testable, unrendered by this builder. Parent renders and independent source-first critique are separate. Source quality remains unresolved; no completed-example or variant-as-example credit.
Source and adaptation
Exact source: Introducing Prism, a free workspace for scientists to write and collaborate on research, publication date 2026-01-27; source frames [960,1440), 60/1 fps, 480 frames, 1920x1080 design canvas.
Publication metadata, source-master hash and source frame mapping are inherited from the pinned queue, not a new online metadata or master verification. The retained source excerpt is research only; it is not an active dependency or part of the overlay.
Largest known gap: The original research fixture replaces source LaTeX and product identity; bundled Geist replaces the native monospaced type. Source reframing blur, fine syntax metrics, caret cadence and row reflow are approximated, not calibrated in rendered output or native Resolve.
480 consecutive retained excerpt frames decoded and statically viewed in 20 indexed sheets at480x270 per cell; 9 selected frames viewed at960x540. This is not moving review or master-resolution inspection.
Source observations
- interface; local frames [0, 14, 15, 25, 60, 120, 146]: The excerpt starts already close on a dark code editor with line numbers and a thin white preview strip at right. A proofreading prompt finishes and at15 the bottom assistant panel expands upward. The prompt becomes a right-aligned bubble, a thinking status sits left, and an empty composer caret blinks during the long wait. No new document appears during this apparently still interval.
- diff; local frames [146, 147, 150, 160, 180, 192]: At147 red deletion and green insertion bands replace the plain editor state, with multiple local Undo/Keep pairs and a proposed-changes panel below. A fast vertical reframing follows; it is blurred during150..160 and settles near180..192. Changes are attached to code lines, not floating editorial callouts.
- hold-detail; local frames [192, 216, 240, 255]: The diff remains visible for a substantial hold; small background light changes persist. The upper changed line is partly cropped by the sticky editor header. This is not an all-changes-accepted state.
- scroll; local frames [256, 270, 290, 300, 312, 332, 348]: Pointer movement accompanies a document scroll up and then back down. Header and assistant bottom edge stay anchored while diff rows, line numbers and lower code move together. The first full red/green pair becomes visible again on the return.
- pointer; local frames [348, 360, 384, 400, 420, 437, 461]: After the return hold the pointer moves upward/right through the changed code to the first Keep control. Several diff rows remain pending. The pause on the control is part of the source interval, not permission to shorten it.
- partial-acceptance; local frames [461, 462, 463, 470, 479]: At463 only the first changed pair is accepted: its red row and local action controls disappear, the retained line remains neutral, and lower rows reflow upward. The remaining three red/green proposals and their Keep controls persist through479. Do not end with a global accept-all result.
Intentional differences
- Default is an original roof-garden sampling note; adaptation is an original sound-studio sampling note. Document name, proofreading request, four before/after edits, methods and proposed-change list change coherently. Both are fictional prose fixtures, not scientific claims or captured product output.
- Original code-native rows replace source LaTeX and app identity. Geist is the unchanged core font, not the source monospaced font. Line boxes are explicit; no syntax engine or product integration is implied.
- Deletion/insertion row backgrounds, local controls, file tab, pointer and assistant panel are separate editable layers. Gradient background and document icon are original SVG; no source video/still is an active dependency.
- The native60fps480-frame source interval is unchanged. Cut at147 follows the retained source. The source first accepts at463; this authored candidate accepts at462, one frame early. Chosen scroll distances, caret blink keys, isotropic blur and reflow curve are adaptation estimates, not official timing parameters.
- Only the first proposal is accepted. Three proposals remain through479. Do not relabel this as a completed proofreading operation or add an end card.
Run from the download
Start in a fresh extracted kit root with exactly these runtime files:
guide.json
README.md
handoff.py
controls.csv
overlay-manifest.json
core-publication-v08.zip
active-assets.zip
Use Python3.11+, Node22.18+, npm, unzip, FFmpeg/FFprobe and an existing supported Chromium. The core pins Remotion4.0.520 and the runtime lockfile. Set REMOTION_BROWSER_EXECUTABLE to your local Chromium if discovery fails. No private checkout, preparation script, authoring generator or inspection archive is required.
The core and active overlay both contain project/... members. Apply the selected overlay AFTER the core. The legacy assets-001.zip archives are not this kit; do not install them. The core font and its license remain required even though all active image/video media is SVG/code.
set -eu
test ! -e project
python3 -c "import hashlib,pathlib; assert hashlib.sha256(pathlib.Path('core-publication-v08.zip').read_bytes()).hexdigest() == '307fb6b927e35e6d73779652873d994f5c3e36cb7deba65f22fa64748057a0de', 'Core checksum mismatch'"
python3 -c "import hashlib,json,pathlib; manifest=json.loads(pathlib.Path('overlay-manifest.json').read_text()); assert hashlib.sha256(pathlib.Path('active-assets.zip').read_bytes()).hexdigest() == manifest['archiveSha256'], 'Overlay checksum mismatch'"
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)
Run the exact archived CLIs from project/. These are user-run commands, not a claim that the author rendered. No --fps, --duration or --output option is supported; cadence and duration come from the recipe.
cd project
node --experimental-strip-types scripts/catalog.mjs show prism-native-diff --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 prism-native-diff --variant default --out out/prism-native-diff-default.mp4
node --experimental-strip-types scripts/render.mjs --recipe prism-native-diff --variant adaptation --out out/prism-native-diff-adaptation.mp4
node --experimental-strip-types scripts/verify.mjs out/prism-native-diff-default.mp4
node --experimental-strip-types scripts/verify.mjs out/prism-native-diff-adaptation.mp4
cd ..
Keep each output manifest next to its movie. The CLI refuses to overwrite an output or sibling manifest. Verification is provenance/technical checking, not source-fidelity approval. New editorial holds would change the requested bounded example and are not part of this kit.
Edit the complete Content object
Create the file from the installed recipe, never from a stale example or a partial object. This refuses to overwrite an existing custom file:
cd project
node --input-type=module -e "import {readFileSync,mkdirSync,writeFileSync} from 'node:fs'; const recipe=JSON.parse(readFileSync('recipes/prism-native-diff.json','utf8')); mkdirSync('inputs',{recursive:true}); writeFileSync('inputs/prism-native-diff-custom.json',JSON.stringify(recipe.defaults,null,2)+'\n',{flag:'wx'});"
cd ..
Edit project/inputs/prism-native-diff-custom.json, respecting every field and the limits in guide.json. Both variants are original illustrative content, not real product behavior. For image slots, keep the declared viewBox/aspect and SVG-only dependency rules. Then:
cd project
node --experimental-strip-types scripts/render.mjs --recipe prism-native-diff --content inputs/prism-native-diff-custom.json --out out/prism-native-diff-custom.mp4
cd ..
Construction steps
- Start in the downloaded kit root. Verify core-publication-v08.zip and active-assets.zip against the pinned SHA-256 values, then unpack core first and the selected active overlay second with overwrite enabled. Both have project/... member paths. No legacy assets archive, inspection image or private preparation file is needed.
- Run unchanged handoff.py verify and frames from the kit root before editing. This checks the recipe and both SVG variants and exports native-frame numerical controls, not visual quality. The complete editable recipe is installed at project/recipes/
.json. - In Fusion create a1920x1080 square-pixel composition at60fps with inclusive range0..479. Global local frame0 maps to the source start specified in guide.json. Do not add handles, transition frames, retiming or an ending hold.
- Build every group as a transparent local RGBA domain, merge children in listed order, intersect local clipping masks, then transform and apply group alpha once before Over compositing into the parent. Every child key uses the same global frame f; layer start is a gate, not a new clock.
- Rebuild the original SVGs from svgConstruction: all element attributes, paths, viewBoxes, gradient stops and alpha are preserved. Use native filled Polygon/Bezier/Ellipse subgroups, not a rasterized interface or source photo. Original source imagery is research only.
- Use the core Geist font and the stated pixel boxes, weight, lineHeight and explicit newlines. No auto-shrink or line wrapping is supported. Text+ Size/baseline and native blur need application calibration; nothing here claims a tested .comp/.drp or pixel-equivalent native result.
- Choose the full original content object: default is garden-note.tex with roof-garden sampling prose; adaptation is studio-note.tex with sound-studio sampling prose. Each has four explicit before/after corrections, a matching prompt, methods and proposed-change list. This is an illustrative document, not native product execution or a scientific result.
- Build context-field at2048x1152, x-64→-24 and y-36→-12 over0..479 smoothstep. Add separate window-shadow=(112,900,1800,150),alpha.28,CSS blur30px. Native Gaussian blur is an uncalibrated counterpart, not numerically identical.
- Create window-camera atx118,width1920,height1050,radius22, dark fill, overflow hidden. y=-92 through147,10 at160,0 at184 with smoothstep on the moving segments; then hold. Its right edge deliberately exceeds the canvas. A white preview strip starts localx1712,width400; only the narrow left part is visible at the canvas right.
- Create plain-document as a separate gate[0,147). Build each row with line-number and text nodes, original before1..before4 copy, closing commands and method lines. Initial upper lines are cropped by the window/canvas, not removed from the text source. The exact negative document origin is in the hierarchy. The thin active-line outline is a native inside-border rectangle, not an inserted diff.
- Keep sticky-header, file-tab and file-icon outside document-scroll. Header=(0,0,1692,102), file tab=(132,20,280,62), radius22, inside2px border; original documentArt at(150,32,30,40). Header follows window-camera but never the document scroll. The initial negative window y crops most of it; reframing brings it into view.
- Initial composer plate=(42,928,1626,96),radius44, gate[0,15). Prompt text=(76,956,1480,45),25px; character counts56 at0,61 at7,90 at11. At15 replace it with thinking-panel, x42,width1626,y892→704,height132→320 over15..25 smoothstep, radius26, clipped. The prompt becomes a right-aligned bubble; no second document is invented during the wait.
- Inside thinking-panel bubble=(790,80,806,76), text=(808,102,770,37),21px. Thinking dot=(24,181,18,18); alpha.35 at15,1 at36,.4 at66,1 at96,.4 at126,.8 at146, smoothstep. Status text is a separate muted node. Empty-composer=(62,938,1590,70) from25; caret=(88,960,2,29), alpha1 on[25,49),0 on[49,79),1 on[79,109),0 on[109,139),1 on[139,147). These are chosen approximation keys, not source-measured blink timings.
- At147 switch plain-document/thinking/composer off and diff-viewport on. Diff-viewport=(30,100,1640,915), overflow hidden. It contains document-scroll, not the sticky header or pointer. A separate proposed-changes panel appears at(42,670,1626,354); its y670→1008 over147..184 smoothstep leaves only its top edge in frame after settling.
- document-scroll y=-90 at147,26 at158,0 at184, held to255; then-120 at300 and66 at348, held to479. Use smoothstep between moving keys. Its blur0 at147→5 at154→0 at178 is linear and isotropic; source fast vertical blur is not reproduced exactly. Do not apply this blur to the fixed header, pointer or entire canvas.
- Create four proposals as separate groups atlocal y76,206,350,556. Row heights are34,34,70,34 respectively. Each has a muted red deletion band then a green insertion band atx86,width1518; textx92,width1494,font24,lineHeight1.35. Each insertion has its own green line number atx16. The two-line third proposal retains both explicit lines; never flatten the four proposals to a texture.
- For every pending proposal, place Undo atx1320,width130 and Keep atx1450,width132, both40px tall,radius20, at y2*rowHeight+8. Labels begin7px lower,20px Geist,centered. These action rows are children of their proposal and therefore scroll/reflow with it. Colors are chosen muted red#3f242d,green#253c2e,Keep#155b2e and light-green label#8bdba1, not sampled official tokens.
- Proposal1 gate is[147,462); proposals2..4 gate[147,480) under remaining-proposals. Closing commands and method text are also under remaining-proposals. Before462 its y is0. At462 start a smoothstep y0→-78 by474, then hold: lower proposals and lower document text reflow together when the first deletion/action region is removed.
- At462 replace only proposal1 with accepted-first-line and accepted-first-number at(92,76) and(16,76), neutral text without red/green bands or buttons. First correction is retained, not blanked. Do not hide remaining-proposals, change their colors to neutral or trigger an accept-all state.
- Keep review-pointer outside document-scroll but inside window-camera. It is a code-native24x30 arrow path M2 2 L3 23 L9 18 L14 28 L18 26 L13 16 L21 15 Z, white fill, dark1.4px viewBox stroke, round joins, fitted to30x44. Gate[256,480). Exact x/y tracks are in controls.csv and fusionNodes; it arrives at(1530,334) at438 and holds there through462 before moving slightly to(1538,370) by479.
- Pointer movement, document scroll, panel movement and window reframing are separate branches. Preserve the long settled diff hold184..255 and the pause on Keep438..461. No speedup is authorized. Subtle field drift and caret/status motion are not proof of real-time product latency.
- Check local146/147 for the document-state cut,154 for blur,184 for settled reframing,255/300/348 for scroll and return,461/462 for first-only acceptance,474/479 for lower-row reflow completion with three pending proposals. Final output must not imply the whole note was approved.
Fusion hierarchy and controls
This is an application-unverified construction map, not a .comp or .drp import. No native Resolve output exists from this worker. The full controls, exact paths, materials and text are in guide.json; the per-frame numeric sampler is controls.csv.
Use Background_Canvas -> the ordered root Merge chain -> MediaOut1. Build every group on transparent RGBA before its parent transform. A group fill is behind all of its children. Each row identifies the exact recipe node, parent, half-open local gate and local pixel box. Do not flatten the whole interface into an image.
| Layer / tool | Parent | Local gate | x; y; width; height |
|---|---|---|---|
| context-field / image | Canvas | [0,480) | 0:-64 smooth; 479:-24 hold; 0:-36 smooth; 479:-12 hold; 2048; 1152 |
| window-shadow / rect | Canvas | [0,480) | 112; 900; 1800; 150 |
| window-camera / group | Canvas | [0,480) | 118; 0:-92 hold; 147:-92 smooth; 160:10 smooth; 184:0 hold; 1920; 1050 |
| preview-strip / rect | window-camera | [0,480) | 1712; 0; 400; 1050 |
| preview-rule / rect | window-camera | [0,480) | 1730; 86; 330; 2 |
| plain-document / group | window-camera | [0,147) | 30; -64; 1640; 1080 |
| plain-prelude / text | plain-document | [0,147) | 16; 0; 1570; 78 |
| plain-number-1 / text | plain-document | [0,147) | 16; 96; 58; 74 |
| plain-row-1 / text | plain-document | [0,147) | 90; 96; 1510; 78 |
| plain-number-2 / text | plain-document | [0,147) | 16; 156; 58; 74 |
| plain-row-2 / text | plain-document | [0,147) | 90; 156; 1510; 78 |
| plain-number-3 / text | plain-document | [0,147) | 16; 224; 58; 74 |
| plain-row-3 / text | plain-document | [0,147) | 90; 224; 1510; 78 |
| plain-number-4 / text | plain-document | [0,147) | 16; 326; 58; 74 |
| plain-row-4 / text | plain-document | [0,147) | 90; 326; 1510; 78 |
| plain-active-line / rect | plain-document | [0,147) | 86; 324; 1518; 37 |
| plain-closing / text | plain-document | [0,147) | 16; 380; 1580; 186 |
| plain-method / text | plain-document | [0,147) | 16; 580; 1580; 190 |
| diff-viewport / group | window-camera | [147,480) | 30; 100; 1640; 915 |
| document-scroll / group | diff-viewport | [147,480) | 0; 147:-90 smooth; 158:26 smooth; 184:0 hold; 255:0 smooth; 300:-120 smooth; 348:66 hold; 1640; 1240 |
| diff-prelude / text | document-scroll | [147,480) | 16; 0; 1560; 70 |
| proposal-1 / group | document-scroll | [147,462) | 0; 76; 1620; 120 |
| delete-band-1 / rect | proposal-1 | [147,462) | 86; 0; 1518; 34 |
| insert-band-1 / rect | proposal-1 | [147,462) | 86; 34; 1518; 34 |
| delete-text-1 / text | proposal-1 | [147,462) | 92; 1; 1494; 36 |
| insert-text-1 / text | proposal-1 | [147,462) | 92; 35; 1494; 36 |
| diff-number-1 / text | proposal-1 | [147,462) | 16; 35; 56; 36 |
| undo-button-1 / rect | proposal-1 | [147,462) | 1320; 76; 130; 40 |
| keep-button-1 / rect | proposal-1 | [147,462) | 1450; 76; 132; 40 |
| undo-label-1 / text | proposal-1 | [147,462) | 1330; 83; 110; 28 |
| keep-label-1 / text | proposal-1 | [147,462) | 1460; 83; 112; 28 |
| accepted-first-line / text | document-scroll | [462,480) | 92; 76; 1494; 36 |
| accepted-first-number / text | document-scroll | [462,480) | 16; 76; 56; 36 |
| remaining-proposals / group | document-scroll | [147,480) | 0; 147:0 hold; 462:0 smooth; 474:-78 hold; 1640; 1170 |
| proposal-2 / group | remaining-proposals | [147,480) | 0; 206; 1620; 120 |
| delete-band-2 / rect | proposal-2 | [147,480) | 86; 0; 1518; 34 |
| insert-band-2 / rect | proposal-2 | [147,480) | 86; 34; 1518; 34 |
| delete-text-2 / text | proposal-2 | [147,480) | 92; 1; 1494; 36 |
| insert-text-2 / text | proposal-2 | [147,480) | 92; 35; 1494; 36 |
| diff-number-2 / text | proposal-2 | [147,480) | 16; 35; 56; 36 |
| undo-button-2 / rect | proposal-2 | [147,480) | 1320; 76; 130; 40 |
| keep-button-2 / rect | proposal-2 | [147,480) | 1450; 76; 132; 40 |
| undo-label-2 / text | proposal-2 | [147,480) | 1330; 83; 110; 28 |
| keep-label-2 / text | proposal-2 | [147,480) | 1460; 83; 112; 28 |
| proposal-3 / group | remaining-proposals | [147,480) | 0; 350; 1620; 192 |
| delete-band-3 / rect | proposal-3 | [147,480) | 86; 0; 1518; 70 |
| insert-band-3 / rect | proposal-3 | [147,480) | 86; 70; 1518; 70 |
| delete-text-3 / text | proposal-3 | [147,480) | 92; 1; 1494; 72 |
| insert-text-3 / text | proposal-3 | [147,480) | 92; 71; 1494; 72 |
| diff-number-3 / text | proposal-3 | [147,480) | 16; 71; 56; 36 |
| undo-button-3 / rect | proposal-3 | [147,480) | 1320; 148; 130; 40 |
| keep-button-3 / rect | proposal-3 | [147,480) | 1450; 148; 132; 40 |
| undo-label-3 / text | proposal-3 | [147,480) | 1330; 155; 110; 28 |
| keep-label-3 / text | proposal-3 | [147,480) | 1460; 155; 112; 28 |
| proposal-4 / group | remaining-proposals | [147,480) | 0; 556; 1620; 120 |
| delete-band-4 / rect | proposal-4 | [147,480) | 86; 0; 1518; 34 |
| insert-band-4 / rect | proposal-4 | [147,480) | 86; 34; 1518; 34 |
| delete-text-4 / text | proposal-4 | [147,480) | 92; 1; 1494; 36 |
| insert-text-4 / text | proposal-4 | [147,480) | 92; 35; 1494; 36 |
| diff-number-4 / text | proposal-4 | [147,480) | 16; 35; 56; 36 |
| undo-button-4 / rect | proposal-4 | [147,480) | 1320; 76; 130; 40 |
| keep-button-4 / rect | proposal-4 | [147,480) | 1450; 76; 132; 40 |
| undo-label-4 / text | proposal-4 | [147,480) | 1330; 83; 110; 28 |
| keep-label-4 / text | proposal-4 | [147,480) | 1460; 83; 112; 28 |
| diff-closing / text | remaining-proposals | [147,480) | 16; 706; 1580; 172 |
| diff-method / text | remaining-proposals | [147,480) | 16; 912; 1580; 172 |
| sticky-header / rect | window-camera | [0,480) | 0; 0; 1692; 102 |
| header-menu / path | window-camera | [0,480) | 34; 34; 30; 30 |
| file-tab / rect | window-camera | [0,480) | 132; 20; 280; 62 |
| file-icon / image | window-camera | [0,480) | 150; 32; 30; 40 |
| file-name / text | window-camera | [0,480) | 196; 37; 206; 30 |
| header-tools / text | window-camera | [0,480) | 1512; 35; 144; 34 |
| initial-prompt-plate / rect | window-camera | [0,15) | 42; 928; 1626; 96 |
| initial-prompt / text | window-camera | [0,15) | 76; 956; 1480; 45 |
| thinking-panel / group | window-camera | [15,147) | 42; 15:892 smooth; 25:704 hold; 1626; 15:132 smooth; 25:320 hold |
| prompt-bubble / rect | thinking-panel | [15,147) | 790; 80; 806; 76 |
| submitted-prompt / text | thinking-panel | [15,147) | 808; 102; 770; 37 |
| thinking-dot / ellipse | thinking-panel | [15,147) | 24; 181; 18; 18 |
| thinking-status / text | thinking-panel | [15,147) | 52; 176; 500; 37 |
| empty-composer / rect | window-camera | [25,147) | 62; 938; 1590; 70 |
| composer-caret / rect | window-camera | [25,147) | 88; 960; 2; 29 |
| proposed-changes-panel / group | window-camera | [147,480) | 42; 147:670 smooth; 184:1008 hold; 1626; 354 |
| panel-grip / rect | proposed-changes-panel | [147,480) | 783; 10; 60; 5 |
| proposed-title / text | proposed-changes-panel | [147,480) | 26; 58; 810; 35 |
| proposed-list / text | proposed-changes-panel | [147,480) | 26; 105; 1030; 168 |
| review-pointer / pointer | window-camera | [256,480) | 256:1050 smooth; 300:992 smooth; 348:970 hold; 384:970 smooth; 420:1400 smooth; 438:1530 hold; 462:1530 smooth; 479:1538 hold; 256:770 smooth; 300:822 smooth; 348:648 hold; 384:648 smooth; 420:376 smooth; 438:334 hold; 462:334 smooth; 479:370 hold; 30; 44 |
Coordinates, easing and alpha
- Local x/y are pixels from the top-left of the parent, not the composition. All keys use the same native local frame f. For absolute source time use sourceStart+f, and for nominal seconds multiply by fpsDenominator/fpsNumerator. These are not measured master PTS.
- Use full1920x1080 transparent domains for local transforms, retaining offscreen material until the parent clipping stage. For these recipes any content permanently outside that local domain never returns into the visible window. Do not resize a group to its changing visible bounding box before parenting.
- For zero-rotation local origin(ox,oy), sx=scalescaleX and sy=scalescaleY: bx=x+ox-sxox, by=y+oy-syoy. Output pixels=(bx+sxinputX,by+syinputY). Full-frame Fusion centered Pivot=(0.5,0.5) then uses CenterX=bx/1920+sx/2; CenterY=1-by/1080-sy/2. Use independent X/Y Size if scales differ. For the payment spinner rotate its local80x80 domain about(40,40), Angle=-rotation for CSS clockwise motion, then place the rotated result; do not rotate around the full canvas center.
- For a local rectangle center use ((x+w/2)/1920,1-(y+h/2)/1080), Width=w/1920, Height=h/1080. For rounded corners preserve the radius in pixel geometry; reconstruct a Bezier rounded rectangle rather than treating the Fusion Corner Radius knob as pixels. Every SVG path/viewBox and native icon path is preserved in the guide.
- Left-key hold means the left value persists strictly before the next key, and the right value begins exactly at that key. Smooth means uu(3-2*u), not Resolve default Auto or the older cubic Bezier(.16,1,.3,1). Bake controls.csv values as native-frame keys when an analytic expression is inconvenient.
- Masks change alpha before Over compositing. overflow:hidden plus radius intersects the children with a local rounded rectangle; radius alone does not clip children. All clip.top/right/bottom/left values are local pixels, not percentages or a time offset. Visible inset bounds=(left,top,width-left-right,height-top-bottom). Intersect masks; do not use an effect mask that merely limits Transform influence.
- CSS rect borders lie inside their stated box. Native fallback uses an outer rounded mask minus an inset rounded mask of border thickness; do not expand the box with a centered outline. Whole-group opacity is applied once after child Over merges.
- Keep premultiplied RGBA consistent for Over. If a color operation needs straight alpha, unpremultiply then premultiply immediately around it. No arbitrary opacity compensation, Screen blend or black backing. The original SVG radial/linear gradients use local alpha stops.
- All blur controls are CSS pixel values. Fusion Gaussian radius/quality is not assumed equivalent; calibrate the separate shadow branches and document reframing at full output resolution. Transparent SVG gradient stops are not blur nodes. Disable motion blur; no exposure sampling is authored.
- Geist text uses explicit line breaks and listed pixel boxes. Resolve Text+ font size/baseline and SVG gradient appearance need actual application calibration. Do not claim identical rasterization from a numerical sampler pass. Use held StyledText strings for the exact character prefix schedule if Write On counts differently.
- Use no optical flow, dynamic zoom, retiming, transition handles or synthesized audio. No extra frames precede or follow the source window. Final output is clipped to1920x1080, not scaled to fit it.
Editable SVG materials
Every SVG is generated from scratch by generate_assets.py. That optional source file can reproduce assets byte-for-byte when supplied; it is not a runtime prerequisite. The active archive already contains the required SVGs. No tracing, bitmap conversion, source master, remote resource, SVG image node or embedded font is present.
Rebuild each SVG as a vector subgroup using svgConstruction in guide.json: all viewBoxes, element attributes, paths, gradient coordinates, stop colors and opacities are explicit. Resolve SVG imports may lose paint/gradient semantics; do not assume a successful import is equivalent. Native Background/Polygon/Ellipse material layers are the fallback, not a screenshot export.
| Active SVG path under project/public | SHA-256 |
|---|---|
| art/prism-native-diff/document-adaptation.svg | f44bee2685ea4204dfee216a0b56f571cd9a851c6cc0849d009a33a257289d0b |
| art/prism-native-diff/document-default.svg | 9c146b0b5774b39f9fa9a3967b5a57ff6cb06c0b246eeeb91cae0e81e57df2db |
| art/prism-native-diff/field-adaptation.svg | c1fc543a80c81b4bd9ad861df7a9bf7724173a0b9a20e34f2985f27e8fbab915 |
| art/prism-native-diff/field-default.svg | 2c6cc3f471311db94af8b88b88588eca34ac7da05d31afc760d136bb03b718c6 |
Checkpoints and regression gates
| Local / source frame | Expected implementation state |
|---|---|
| 0 / 960 | Before document with last prompt characters incomplete; no diff bands. |
| 14 / 974 | Last initial-composer frame; completed original prompt. |
| 15 / 975 | Thinking panel starts expanding upward; initial composer absent. |
| 25 / 985 | Expanded panel settled; empty composer and caret active. |
| 49 / 1009 | Caret switches off without removing the waiting panel. |
| 60 / 1020 | Waiting state with animated status alpha, caret off. |
| 79 / 1039 | Caret switches back on; document remains before-state. |
| 109 / 1069 | Caret off; no early diff or shortened waiting interval. |
| 120 / 1080 | Waiting state persists; no output success claim. |
| 139 / 1099 | Caret on again near end of wait. |
| 146 / 1106 | Last before/wait frame. |
| 147 / 1107 | Hard state cut to four red/green proposals and local review controls. |
| 150 / 1110 | Document scroll, blur and window reframe are in motion independently. |
| 154 / 1114 | Document-only blur reaches5px; header and pointer not blurred. |
| 180 / 1140 | Reframing nearly settled, all four proposals still pending. |
| 184 / 1144 | Windowy0, scroll0, blur0; bottom panel leaves a top edge. |
| 240 / 1200 | Diff hold; no proposal accepted. |
| 255 / 1215 | Last settled scroll frame before the upward move. |
| 256 / 1216 | Pointer branch starts; document scroll begins separately. |
| 270 / 1230 | Rows move upward under the stationary header. |
| 300 / 1260 | Scroll reaches-120; all pending proposal children move together. |
| 330 / 1290 | Scroll returning down; no acceptance. |
| 348 / 1308 | Scroll reaches66 and holds; first pair fully visible again. |
| 360 / 1320 | Pointer rests before moving toward the first Keep. |
| 384 / 1344 | Pointer begins the next approach; diff content unchanged. |
| 420 / 1380 | Pointer approaching first action row; four proposals remain. |
| 438 / 1398 | Pointer at1530,334 and held on first Keep target. |
| 461 / 1421 | Last frame with first deletion/insertion bands and first controls. |
| 462 / 1422 | Only first proposal accepted; neutral corrected line appears, remaining reflow starts. |
| 474 / 1434 | Remaining proposalsy-78; three red/green pairs and their controls persist. |
| 479 / 1439 | First corrected line retained, three proposals still pending; no accept-all ending. |
The focused test_guide.py is an authoring regression suite, not a required download step. It checks exact recipe/source/SVG pins, archive whitelist, deterministic SVG generation, hierarchy and masks, native/quarter-frame sampler agreement, all handoff rows, half-open cuts, content rejection and actual archived CLI options without rendering.
A human still needs to review parent-rendered default and adaptation outputs at native cadence, compare the source and validate the Fusion reconstruction. A contact sheet is not moving review.
Limits
- The original research fixture replaces source LaTeX and product identity; bundled Geist replaces the native monospaced type. Source reframing blur, fine syntax metrics, caret cadence and row reflow are approximated, not calibrated in rendered output or native Resolve.
- No output render/encode, npm dependency installation, moving-source review, audio assessment, blind test or native Resolve execution was performed by this builder.
- Full native source masters were unavailable. Retained excerpts have960x540 pixels; 1920x1080 source dimensions and master hashes are inherited queue metadata.
- All historical source-quality status remains unresolved. Mechanical readiness does not approve material, typography, motion, source fidelity or production use.
- The core includes a licensed Geist font. This is SVG/code-only active imagery, not an assertion that the entire runtime contains no binary files.
- Only selected recipe and active SVG files belong in the overlay. No old asset pack, source master, private worker, dependency tree or critic output belongs in it.
- Text fit requires the actual loaded browser font; field length caps and numeric tracks alone cannot establish readability.
- Both content variants demonstrate one treatment, not two new examples. No shared counts, catalog entries or publication state are modified.
Historical inputs and source masters are provenance only. The downloadable run steps use only the listed kit files and installed tools. The source-only builder pass precedes any fresh critic findings; it does not accept its own visual quality.