# Authoring and asset handoff

[Guide](guide.md) · [Engine recipes](engines.md) · [Verification](verification.md) · [Handoff template](templates/handoff.md)

**Preserve the editable source and prove the delivered result separately.** A runtime asset is not a complete authoring project. An export dialog reporting success is not evidence of visual fidelity, rights clearance or a reproducible build.

The seven families below are documentary workflows. The historical motion lab did not operate these original authoring/export pipelines. Its Rive runtime fixture and separate bounded Theatre Studio export exercise do not change that status. Use the recipes with an authorized editor/operator, then attach actual source-reopen and runtime evidence to the adopting project.

## The source/runtime contract

Choose the source format and intended runtime before detailed animation work. Keep a small chain: one source, one deliberate export, one runtime. Additional conversion stages need their own loss/fidelity checks.

| Contract | Record before handoff |
|---|---|
| Identity | Asset ID, owner, source revision, exact editor/exporter/runtime versions; who may approve changes |
| Rights | Provenance and permission for artwork, fonts, footage, music, templates, plugins and data; required notices; distribution scope |
| Geometry/time | Dimensions, pixel aspect, units, orientation, frame rate, time origin, range, markers, seed and fixture |
| Behavior | Exact artboard/object/state/input/event names; types/ranges/defaults; reset, invalid input and interruption |
| Export | Settings, intentional simplification/baking, unsupported features, asset references and diagnostics |
| Accessibility | Semantic HTML equivalent, reduced/static pose, keyboard actions, focus and optional-media controls |
| Reproduction | Relocated native-source reopen; clean export; exact-runtime decode/reload; start/interior/end and meaningful-state comparisons |
| Operations | Allowed network destinations, loading/cancellation, cache restoration, cleanup, bytes and measured performance conditions |

An asset cannot approve a new brand behavior. Match M15–M18 or another registered primitive; submit any new effect for review. M13 retains per-page approval. Keep essential copy and controls in HTML even when a source editor can embed text or interaction.

### Rights are layered

Separate **editor access**, **export entitlement**, **runtime software license**, **asset rights** and **deployment scope**. Clearing one does not clear the others. Publicly viewable/forkable artwork is not automatically commercially reusable. A font embedded in a vector asset or converted to outlines still needs appropriate rights.

Use the repository's [font license record](../../licenses/README.md). Self-host only approved WOFF2 files and preserve notices. PP Neue Machina remains excluded from public serving/redistribution until rights are confirmed; the public body fallback is Oxanium. Do not include editor caches, source maps, private paths or dependency trees in a public delivery.

## 1. Figma and Variables

**Choose for:** layout, token mapping, prototype states and visual review—not production animation execution.

1. Receive an editable file/revision and permitted local backup. Preserve review decisions and linked-library dependencies separately: a local copy omits comments/history and becomes a new disconnected file when reimported.[50]
2. Derive a disposable token adapter from `tokens.css`; never make a prototype collection the new source of truth. Separate brand primitives from transient state such as selected step or playback.
3. Use the documented native DTCG JSON import route when appropriate. Import duration values in seconds and font-family as one string; maintain a companion mapping for CSS fallback stacks, clamp expressions, easing and other unsupported composites.[48]
4. Dry-run normalized names and compare resolved values after import. Slash-normalized duplicate names may be ignored; do not judge success from a dialog alone.[48]
5. Author ordinary, changed-content, loading, error, reduced/static and narrow/wide-phone frames. Use explicit prototype actions and conditions. A clickthrough does not prove semantic HTML or keyboard behavior.
6. Export the selected mode data and a fresh source copy; reopen in a disposable context and compare names, types, aliases, dependencies and text wrapping against the input mapping. Record losses instead of silently flattening them.

**Access gate:** the captured Variables REST page is Enterprise-gated but conflicts internally on exact seat requirements (prose says Full seat; GET table says any organization member).[49] Check the current account's actual permission before automation. A documentation read does not establish access.

## 2. Rive Editor

**Choose for:** an original stateful vector illustration whose editable transition graph materially helps maintain the approved behavior.

1. Obtain native editable source and a `.rev` backup. Do not accept a playing `.riv` as a complete source handoff: backup retains information stripped from runtime export.[52]
2. Define exact artboard/state-machine/binding names and typed inputs. The host owns semantic selection, labels and user policy; the asset owns only illustration. Record reset, unknown events and interrupted transitions.
3. Build a minimal graph using only required features before polishing. Keep essential text in HTML; audit any embedded fonts/images separately.
4. Export runtime `.riv` and backup `.rev` from the same revision. Record the actual export options and current entitlement. Both export routes were documented as paid-plan features in the captured source.[51][52]
5. Reopen the backup independently; load runtime output with matching renderer/WASM; compare every meaningful state and invalid transition. A newer file may load in an older runtime while newer features are skipped.[51]
6. Test pending-load cancellation, missing local WASM, denied outside requests, reset and destroy with the [runtime recipe](engines.md#rive).

Official runtime MIT licensing is distinct from the editor/export gate and asset rights.[53] Do not manufacture a `.riv` and describe it as an editor export. Original authoring remains unexercised until those actual steps have evidence.

## 3. After Effects + Bodymovin / Lottie

**Choose for:** a finite vector sequence with a deliberately supported export subset, not a hidden application state machine.

1. Receive `.aep`, footage, fonts/rights, effects/plugins, exact versions, composition dimensions, pixel aspect, frame rate, frame bounds, markers and color settings. Preserve an editable-text source before any export preparation.
2. Freeze the revision and use Collect Files for the chosen dependencies. The resulting package includes a new project, footage/proxies and a report naming required files, effects and fonts; later edits to the original do not automatically update that collected copy.[56]
3. Enumerate masks/mattes, expressions, 3D, text, blend modes and images. Run a minimal export before final design. Bodymovin's documented workflow selects a composition and destination, then Render; images may accompany the JSON.[54]
4. Inspect diagnostics and decide per feature: preserve, simplify, bake intentionally or use video/still. The historical wiki documents an unsupported-feature report but was visibly last edited in 2020; it is a diagnostic lead, not a current exhaustive matrix.[55]
5. Select the exact web player/renderer and explicit autoplay/loop/segment behavior. Record frame-boundary conversion; do not mix editor-inclusive and runtime-exclusive ranges without a test.
6. Export to a clean output directory. Check relative asset paths, fonts/images, dimensions and frame range; compare editor references against decoded runtime start/interior/end, segment transitions and reduced stills.
7. Reopen the collected source with original paths unavailable. A runtime playback check and a source editability check are separate results.

Adobe access, exporter compatibility, third-party templates, stock, music and font rights must be cleared independently. A code-authored Lottie JSON is not proof that After Effects or Bodymovin was exercised. If packaging as dotLottie, retain the original export and compare both renders after conversion.

## 4. Cavalry

**Choose for:** procedural 2D relationships and legitimate variants that repay a native procedural source.

1. Record the actual edition/build and account entitlement before opening or converting source. The captured current site advertises free individual access; legacy Starter/Professional documentation describes restricted save/render behavior for Pro-feature files.[57][58] Do not merge those contexts into a single entitlement claim.
2. Preserve editable scene/project, referenced scenes, assets, script versions, data fixture and seed. Name useful parameters and define units/time origin; avoid a graph whose only reproducible input is the designer's machine state.
3. Test a small representative composition using native Lottie export via File or Render Manager.[59] Record what stays procedural, what is baked and which target features fail.
4. Budget for baking: the export documentation describes shape baking, unsupported filters/shaders and text exported as shapes rather than editable text.[59] If material fidelity needs blur/noise, choose a raster/video output deliberately rather than promise parity.
5. Export a clean artifact, reopen source in the matching edition, rerender the same fixture, and compare topology, masks, timing, text and size. Record export settings and any unsupported-feature losses.

Free software access is not a license to redistribute every imported asset. Current/legacy contract applicability and actual account access require verification before release; this guide does not perform account migration or editor setup.

## 5. Blender

**Choose for:** reusable geometry/material/animation assets when spatial inspection is justified and approved—not as a mandatory route to a motion figure.

1. Preserve `.blend`, editable modifiers/rigs, linked libraries, textures, caches, plugin versions and asset rights. Set named objects, origin, world scale, axes, intended camera and export collection in a working copy.
2. Pack eligible resources and save; packing takes effect on save, and some external resources such as videos/movie clips cannot be packed.[61] Inventory the rest and reopen from a relocated copy.
3. Prepare supported mesh/material/animation output. The pinned Blender 4.5 glTF reference describes supported forms and triangulation/vertex expansion at some boundaries; it is not evidence for every feature in a later installed editor.[60]
4. Bake unsupported procedural materials deliberately; record extensions and target support, clip names/ranges, root motion, color space and texture settings. Preserve a pre-bake source.
5. Export GLB or glTF plus all buffers/textures. Reimport to a fresh editor file and independently decode in the actual target runtime. Compare dimensions, scale/orientation, materials, transparency, clips and missing-extension behavior.
6. Measure delivered bytes, decoded texture/geometry cost and actual device frame cost; optimize the asset before adding rendering complexity. Ship a meaningful static poster/diagram.

Blender distinguishes its software license from creator-owned artwork/data; imported third-party content still needs its own permission.[62] A GLB is not a full editable Blender project. M13's page approval is not supplied by an asset export.

## 6. Spline

**Choose for:** editor-authored spatial interaction only when preserving its semantics and delivery model is a justified requirement.

1. Obtain editable source and a `.spline` local backup, which the documentation identifies as a local scene format.[65] Do not substitute a runtime `.splinecode` URL for a demonstrated editable backup.
2. Inventory objects, states/events, variables, camera, materials, assets and responsive behavior. Decide whether native Spline interaction must survive.
3. If selecting GLB/glTF, explicitly accept the loss boundary: captured guidance supports baked position/rotation/scale tracks but excludes states, events, interactivity, components and variables.[63]
4. If selecting self-hosted runtime output, verify current entitlement first; the captured self-hosted export page specifies Enterprise access.[64] Do not treat ordinary embed/code export as proof of that entitlement.
5. Export source and runtime independently. Audit all network destinations, runtime/WASM/assets and build requirements; test with outside requests denied rather than trusting “offline” labeling.
6. Reopen source, compare its editable structure, then exercise runtime state/reset/resize, pending load, missing assets, hidden/cache restoration and teardown. Preserve a no-WebGL explanation and DOM controls.

A runtime-controlled scene is not automatically keyboard accessible. A plan, source file and product terms must be checked before making rights or self-hosting claims for a particular delivery.

## 7. ShaderToy-format shader work

**Choose for:** original shader research and a host-input convention, not a commercial asset marketplace or complete production renderer.

1. Prefer original code. If adapting a shader, record the exact URL and revision, creator, explicit license, every pass and each texture/audio/cubemap dependency. The captured terms allow creator-selected licensing and display a noncommercial share-alike default, not blanket MIT permission.[66]
2. Preserve one source per pass plus the pass graph: inputs, target formats/sizes, feedback dependencies, clear/load policy, sampling and initialization. A screenshot or single fragment is not a complete feedback system.
3. Write an explicit host adapter. The documented image entry is `mainImage`; the host supplies inputs and handles pixel output. `fragCoord` uses pixel units and `iResolution` supplies surface resolution.[67] Verify other input names/types against the actual interface before implementation.
4. Declare target GLSL/WebGL version, precision, coordinate origin, CSS versus drawing-buffer size, time/delta/frame/reset, alpha/premultiplication and color space. Do not assume the source site's alpha semantics match a transparent web layer.
5. Compile in the actual host and compare deterministic time/input stills. Reset feedback, reject invalid dimensions/NaNs, test missing textures/extensions, shader compilation failure and context loss. Bound render work and provide a static counterpart.
6. Pause offscreen/hidden and release owned programs, shaders, buffers, textures and framebuffers. Audio passes require separate opt-in and rights review.

The historical ShaderToy documentation recovery was partial; no editor, shader-specific license or original host port was exercised. Unknown rights block commercial reuse. A new shader material also requires DSM review; it is not an M18 variant by analogy.

## Worked adaptation: instrument to editorial case study

This is an original **specification example**, not a claim of an exported asset, tested audience response or deployed customer result.

### Technical version: “Continuity, made inspectable”

**Task:** explain why an event arriving and a useful handoff being retained are different. Use a clearly labeled illustrative model, never fabricated uptime, throughput or live health data.

**Baseline:** semantic HTML, three labeled stages—Capture, Retain, Resume—and a static SVG figure. Native controls select a stage and toggle whether context is retained. The host owns `stage`, `hasContext`, playback preference and all copy. Invalid input preserves the last valid state; asset failure leaves the same explanation.

| Beat | Composition | Primitive and owner | Settled result |
|---|---|---|---|
| Entry | Asymmetric Oxanium title, short deck, ordinary controls | Static; no entrance gate | Whole model readable immediately |
| Capture | One route and its caption receive attention | M15; progress presentation only | Full route and a truthful illustrative status |
| Compare order | A separate “reorder stages for comparison” control changes a bounded inventory | M16; persistent DOM items | New semantic order; same focused node |
| Chapter emphasis | One short heading receives optional Replay | M17; transient visual treatment | Original selectable heading |
| Inspect relationship | A contained range control exposes an aperture/path relation | M18; direct scalar mapping | Numeric output and geometry agree |

Do not force all four beats into a small page. Keep only those necessary to explain the argument. M8/M1 remain eligible exact atmosphere/footer defaults, but a comparison-focused instrument can omit them to protect attention. No M10 page grid or fake M11 telemetry; no M13 without page approval.

### Editorial adaptation: “Designing a handoff that can be inspected”

The reader now needs a linear argument, not a persistent instrument. Change structure, not just styling:

- Replace stage selection with **Problem → Decision → Example → Limits** in document order.
- Replace the retention toggle with two static captioned figures: “With context” and “Without context.” Expose both consequences without interaction.
- Remove acquisition playback and reorder from the baseline. Keep the complete heading rather than a mandatory M17 replay. M18, if useful, becomes an optional figure after the static explanation.
- Use Oxanium body prose and relaxed reading rhythm; reserve Departure Mono for figure labels. Do not use license-gated PPNM for editorial impact.
- Use ordinary contents/anchor links and printable figures. At 700px and 390px, stack comparisons in reading order rather than shrinking the diagram or concealing prose.
- Put optional media behind a clearly labeled control, with poster, description and pause/stop; no automatic audio. Media failure must not affect the argument.

**Source choice:** Figma may supply layout/state review; Rive is conditional on original source/export access. AE/Cavalry may supply an optional fixed clip, not semantic state. Blender/Spline/ShaderToy are rejected for this brief unless a later requirement earns their complexity.

**Acceptance:** a reader can identify the distinction and both consequences with motion off, scripts blocked and in print. A reviewer checks orientation/readability and the actual target device; no conversion lift, award quality or user comprehension result is claimed until measured.

**Bad brief to reject:** “Use every engine, animate all text, start with a loader, add a GPU background and make it feel live.” Replace it with one task, one foreground cause/effect, a complete still, actual data provenance and an explicit verification budget.

## Sources

[48] https://help.figma.com/hc/en-us/articles/15343816063383-Modes-for-variables
[49] https://developers.figma.com/docs/rest-api/variables
[50] https://help.figma.com/hc/en-us/articles/8403626871063-Save-a-local-copy-of-files
[51] https://rive.app/docs/editor/exporting/exporting-for-runtime
[52] https://rive.app/docs/editor/exporting/exporting-for-backup
[53] https://rive.app/docs/runtimes/getting-started
[54] https://raw.githubusercontent.com/airbnb/lottie-web/master/README.md
[55] https://github.com/airbnb/lottie-web/wiki/Features
[56] https://helpx.adobe.com/after-effects/desktop/render-and-export/basics-of-rendering-and-exporting/basics-rendering-exporting.html
[57] https://cavalry.studio/en
[58] https://cavalry.studio/docs/tech-info/licensing/licence-types
[59] https://cavalry.studio/docs/user-interface/menus/window-menu/render-manager/lottie-export
[60] https://docs.blender.org/manual/en/4.5/addons/import_export/scene_gltf2.html
[61] https://docs.blender.org/manual/en/latest/files/blend/packed_data.html
[62] https://www.blender.org/about/license
[63] https://docs.spline.design/exporting-your-scene/files/exporting-as-gtlf-glb
[64] https://docs.spline.design/exporting-your-scene/web/exporting-as-self-hosted-project
[65] https://docs.spline.design/basics/faq
[66] https://www.shadertoy.com/terms
[67] https://www.shadertoy.com/howto
