Make Paper Collage Video
Build an editable video while keeping the human in charge of concept, style/voice, preview judgment, rights, and external publication. Use production.json as the resume source of truth.
Start With One Small State Read
Treat the current directory as a workspace only when
package.jsonexposesproject:new,project:resume,project:preview, andproject:render. Otherwise read references/setup.md, bootstrap a writable workspace, and run its doctor. If this Skill was injected from a versioned plugin-cache path that no longer exists, stop and report a stale task snapshot — do not scan for or silently select the highest cached version; start a new host session/task so the loader formally exposes the installed version.Inspect
git status --shortin Git workspaces and preserve unrelated changes.For an existing slug, run only:
npm run project:resume -- <slug>Continue from
control.modeand the remaining work items. Do not repeat recorded approvals or read full history unless diagnosing state.For a new project, derive a lowercase hyphenated slug and run
project:new.
Load Only the Current Stage Reference
- Workspace creation or doctor failure: references/setup.md
- Provider discovery, confirmation, change, or output recording: references/providers.md
- Duration, scenes, rhythmic storyboard, or production-profile planning: references/story-planning.md
- Per-beat animation choice, effect routing, pose families, graphics, or directing budget: references/motion-directing.md
- Arbitrary 3D subject travel, tangent auto-orientation, optical-depth projection, bound locomotion loops, or world-bounded camera follow: references/path-locomotion-3d.md
- Whole-film action grammar, beat performance roles, motion approval fingerprints, or motion-language-card review: references/motion-contract-v1.md
- Any rear/subject/front separation, relative layer motion, source package, reveal envelope, or oversized seamless travelling environment: references/layer-complete-assets.md
- Any rigid vessel/frame with changing internal contents, fill levels, gauges, cavities, duplicated surfaces, or container-state alignment: references/canonical-containers.md
- Narration resync, scene tails, intentional quiet holds, pacing, or dead-air failures: references/timing-continuity.md
- Concept/style/preview decisions, rights, or external action: references/approval-gates.md
- Image review, depth, motion, subtitles, or delivery tuning: references/quality-motion.md
- Recurring identities, functional mechanisms, topology-sensitive subjects, or explanatory diagrams: references/semantic-contracts.md
- Editing project/state files or diagnosing validation: references/project-contract.md
- Audio edit points, typography, annotations, data SVG, responsive directing, or advanced transitions: references/editorial-system-v9.md
- Tool-only image generation, recovery, or an
auto-continueblocker: references/execution-control.md
Do not load every reference up front.
Apply Reversible Defaults
- Keep 30 fps, a general Chinese-language audience, and the configured fictional narrator unless the brief requires otherwise. Do not silently default a title-only request to one aspect ratio or one visual style: the intake gate owns both.
- Preserve user-specified duration and scene count independently; infer only missing values.
- Recommend
balanced, but never select it invisibly. Showdraft,balanced, andfull-depthas轻量成片,均衡动画, and完整纵深. Treat each profile ceiling as planning capacity, not spend authorization. The scenario card and combined decision must name an exactbudgetDecision.imageAttemptLimitno greater than that ceiling and no lower than the complete scenario estimate; this narrower human-approved cap is what the attempt ledger enforces. - A one-scene
full-depthstory still reserves two independent pose-sheet families when its required action belongs to two recurring identities. Never merge unrelated characters into one state sheet simply to conform to a scene-count heuristic. - Do not clone a real person, use unclear third-party rights, publish, upload, or send externally without separate authorization.
- Ask only for missing information that materially changes the subject, factual position, rights boundary, delivery format, or material cost.
New Project: Intake, Then Three Scenarios
At capability-review, use the current host model only to prepare a provisional brief and concept; do not call an unconfirmed external or paid provider.
Read
providers.md,story-planning.md,motion-directing.md, andapproval-gates.md.Immediately run
project:intake -- <slug> --json. Render every returnedvisualStylePresetimage in the conversation before asking; the catalog is dynamic, so never assume a fixed count or hard-code style ids. Then use the host's Ask Question UI, when available, for exactly three selectors:16:9or9:16; one of the returned visual styles; and text-only parallax preferenceauto|prefer|minimal. Use a compact structured text fallback only when the host has no Ask Question UI.分层视差is not another visual style. Do not ask for production profile or cost in this popup. Record the answer withproject:intake; confirmation freezes the catalog's executablestyleProfileintoproject.jsonand materializesthemefrom it. Do not hand-edit either snapshot afterward.Run
provider:status -- <slug> --compact-jsononce and inspect actual callable host tools. Using only the current host model, write one common story skeleton and all threeplanning-scenariosinputs. If the user explicitly supplied duration or scene count, preserve it in every option. Otherwise binddraft→concise,balanced→standard, andfull-depth→expanded. Each option must show its duration, scene count, beat rhythm, character/prop state families, rear/mid/front/near plan, parallax and ambient plan, free local-motion targets, exact expected image calls, proposed approved cap, hard ceiling, local derivatives, avoided calls, actual provider recommendation/cost basis, factual/rights risks, and final-film effect. Runproject:scenarios -- <slug> --input=<scenarios.json> --json; this is still provider-free.Present all three scenario cards together. Recommend
balancedbut let the human choose. This single decision is the combined story-scope/concept/profile/budget/provider approval, so each card must already contain the information above; do not add another routine confirmation after the selection.After the human selects a card, continue automatically: run
project:plan -- <slug> --scenario=<draft|balanced|full-depth>, fillbrief.md, and author the selected schema-v12 storyboard. The plan carries a scenario fingerprint andprofilePromise— ceilings block overspend, the promise blocks a high-cost profile from quietly shipping low depth. The shared scenario must enumerate story-criticalsemanticActions; every option routes each one to an actual registered state, local-motion target, or layer package.Motion and scene authoring
- Read
motion-contract-v1.md; author one structured whole-filmmotionDirection; assign every beat aperformanceRoleplusproofTimeId— never descriptivestyle.motionLanguageprose. - Author one scene record per planned scene, one v9
editorialauthoring contract, and exactly onesceneTransitions[]boundary per adjacent pair. - Read
editorial-system-v9.mdfor actual-audio edit points, reusable typography, annotations, data SVG, responsive plans, or advanced transitions; never substitute estimated narration or TTS latency for final local-audio timing. - For each boundary, declare
intentandrationale; normally omittreatmentsoproject:storyboardroutes the intent through the Style Profile'stransitionSetdeterministically. Comic-inspired profiles use ordinary cuts/wipes/dips/slides/irises/shutters — never a simulated vertically-scrolling comic canvas. - Classify each beat's visible change and author orthogonal
treatmentsfor motion, persistent visibility, composition relationship, graphic mechanism, semantic risk, importance, and necessity. - Before rear/subject/front source generation, read
layer-complete-assets.md; chooserigid-lockedorbounded-relative; author the stable source package, complete layer roles, depth order, source strategy, and three responsive reveal envelopes.registered-depth-stackonly for a truly layer-complete finite family — an opaque flat master is never a source for relative member motion. - For a tracked subject traveling through a persistent horizontal world, route
world-traveltolooping-environmentplusscroll-world-x; author ordered far/mid/ground/near strip intents and before/seam/after proof times; declare either anactiveFromcue or a completefrozen=trueworld lock. After compilation, runproject:world-topology-proof -- <slug>before requesting any looping-world image. Every such request must carry the current proof binding; a missing, failed, or stale provider-free proof stops attempt reservation. - When narration names successive animals/people/objects that the traveler meets in one continuous world, author
scene.encounters[]. Each contract binds exactly one narration cue and one world-anchored target to orderedenter,approach,answer, andexitbeats. The target must cross the world physically and remain present between those phases; visibility/opacity events are not a valid encounter lifecycle. - For a state-sequence subject traveling through arbitrary screen directions and optical depth in one coherent finite world, read
path-locomotion-3d.md. Author one independentpath-locomotiontreatment withchangeClass=path-travel, one matching looping state family, onepath-locomotionspatial contract, and an explicitcameraFollowobject ornull. Never duplicate the route as camera/scale keyframes or generate eight directional pose families when tangent rotation preserves the silhouette; when optical travel materially changes the silhouette, author registered planar/toward/away loops and bind them with one velocity-drivenpathViewBinding. - Never hand-author compiler-derived
motionContract, summaries, fingerprints, source-package totals, style-proof plans, sheet grids, or repeated world copies. Every scene needs at least three ordered beats and three proof moments, including a final state afterat=0.82.project:storyboardrejects motion-language inconsistency, budget overflow, andprofilePromiseunder-delivery.
Canonical containers
- When one rigid bottle, tank, gauge, cavity, or bezel keeps the same outer frame while its contents change, read
canonical-containers.mdand author onecanonical-containerintent, compiling to one clean plate, one unique canonical frame, one complete content-state sheet, one shared interior polygon, and one authoritative internal surface. Never model the same fill as separate water/waterline nodes or redraw the frame per state.
Sound and camera IDs
beat.soundCueis only for a discrete event sound effect; narration only ever belongs toscene.narration— the compiler rejects the removedaudioCuefield so the two can't be conflated.- Camera treatments use the single target id
scene-camera; scene-number aliases likescene-04-cameraare invalid. - Never render dialogue, exposition, or narration as speech balloons in generated images — spoken content belongs to audio plus subtitles. A rare, short, editable
graphic.role=visual-sfxtypography node may reinforce a discrete impact/motion sound only when it binds the same beat'ssoundCue, stays within the Profile's per-scene count/duration range, begins hidden, and has explicit show/emphasis/hide events. Environmental sound (wind, rain, traffic, crowd) stays audio-only — never turn it into persistent decorative words.
Spatial contracts
- In the same pass, add root
spatialContracts[]whenever a hero must touch a surface, stay locked while seated, clear subtitles, pass behind/in front of a named layer, preserve a causal setup across adjacent scenes, sustain locomotion through a proof window, move horizontally while a registered pose is active, or follow a curved two-dimensional route. - Grounding: binds the real subject anchor (prefer a registered state anchor), explicit support polyline, tolerances, proof ids, optional foreground paint relation, optional subtitle clearance.
- Continuity: binds adjacent endpoints, world/subject/prop families, framing/camera tolerances, and both scenes' grounding contracts.
- Gait: the generic locomotion-cadence contract for walking/running/flying/swimming — binds at least two registered states, minimum changes per second, and whether cycling must continue through the window end.
travel-facing: binds the ordered proof window, signed horizontal direction, minimum travel, exact expected facing, and rationale. Everytraverse-preset state-sequence target requires one plus a matchinggaitcontract for the same scene/node, including intentional reverse or sideways-looking travel — never merely because an in-place pose usessettle.path-locomotion: binds one 3D cubic route, start/turn/end proofs, the registered locomotion states and cadence, minimum screen/depth travel, required toward/away directions, projection-scale delta, direction-sector coverage, heading-error and turn-rate limits, plus the exact path/camera/world relation. It replaces separatetravel-facingandgaitrecords for that same route because it proves both inside one contract.
- Read
If the compiled storyboard preserves the approved scenario's exact state families and registered source packages and stays inside its complete expected-call count, treat the prior card selection as the attributable approval; do not ask again. Write one selection JSON containing
scenarioDecision,planDecision,budgetDecision, the compiledsourcePackageDecision, and provider selections copied exactly from the approved card, then run:npm run project:confirm-concept -- <slug> --input=<selection.json>The command rejects any state-family/source-package/card drift. If compilation changes a material promise, return to the same scenario gate with the revised exact card. Otherwise this records all providers plus
capabilities-ready,brief-ready, andapprove-concept. Never call an image provider before this command has recorded the exact cap. The story-specific style sample at the next gate is already counted in the scenario estimate and cap.
If a custom provider or incompatible explicit duration/scenes cannot be resolved in the combined decision, remain at the gate and ask one concise question.
Style and Fictional Voice Gate
At style-review, create the fewest representative source families needed by the compiler-owned styleProofPlan and only enough fictional speech to judge the voice. Run project:style-proof; it must cover the plan's highest semantic-risk classes, each concrete coupled relationship, and state-sequence behavior instead of mechanically selecting one highest score — a low-risk film with none of those facets still gets one baseline:representative target, and one source package may cover several risks when the plan records that reuse.
- Bind every target, the complete plan fingerprint, and both motion-contract fingerprints, then render 3–5 seconds through real v12 composition nodes.
- Every selected target, including a
freetarget, must produce a non-empty structured composite with current full-frame/crop/debug evidence. - A selected spatial-contract target must also execute its deterministic contract proof and draw the contract-specific debug overlay; endpoint crops without a passing
spatialProofcannot satisfy the style gate. - Registered or semantic targets also require their quality-compatible member evidence and recorded checks. Inspect full-resolution relationship crops and the pattern-specific evidence from
quality-motion.md; a registered depth stack requires family-level reconstruction and responsive envelope extremes. - Show
motion-language-card.jsonbeside the provider/model, voice identity, sample artifacts, and known cost — it exposes the whole-film grammar, pacing, camera/transition/ambient strategy, per-scene phrase roles, final holds, exceptions, and approval fingerprint.
After explicit approval, run:
Before any style image call, classify its semantic risk. If it is not decorative, author and lock semantic-contracts.json as described in semantic-contracts.md; do not treat the prompt as the contract. Use schema-v8 image requests with the current project's exact styleProfileBinding, include every bound directive verbatim in the prompt, declare all profile-required asset checks, and choose an explicit output surface; a layer-aware request must also carry the exact compiled layerPackageBinding. Reserve quota-consuming attempts before invoking a host image provider.
npm run project:advance -- <slug> approve-style-voice --note="<explicit decision>"
approve-style-voice refuses any selected treatment whose style-proof composite is missing, empty, stale, or incomplete, or whose proof does not bind the current motion contract. It records the human note and exact motion approval in motion-approval.json. Registered/semantic targets additionally require their participating assets and composites to have current passed checks. This strengthens the existing gate; it does not add another human wait. Directing-only revisions may preserve the approval fingerprint while invalidating exact proof; semantic role/grammar/proof/intent/Profile changes return here.
Never substitute a real-person clone. Treat cloning as a separate opt-in requiring licensed audio and transcript authorization.
Produce in Batches
At asset-production:
Group checkpoints by recoverable batch or location, not by every file. Keep provider provenance per asset.
Classify every image as
decorative,identity-critical,topology-critical,mechanism-critical, ordiagram-critical. Bind every critical request to a ready reusable semantic contract and its evidence targets. Keep recurring-charactergenerationFamilyseparate from composition mask/source families.Route relationships before generation: persistent
inside/on/held-by/worn-bycontact usessupported-subject; a shared shoreline/horizon/edge usesregistered-environment; only independent elements usefree. If no pattern represents the approved meaning, extend the reusable contract before bulk generation.Execute each compiled layer source package exactly as described in
layer-complete-assets.md.- A
registered-layer-sheetis one 2×2 provider root containing reference plus three complete layers, declared asoutputSurface.mode=layer-sheet: reference/rear are opaque, while subject/front use real alpha or, by default for a host image model without reliable native alpha, one explicitly declared flat chroma-key color. - For provider-native chroma cells, declare
keyPlane.mode=provider-native-observedandpolicyId=flat-v1— never require the model to reproduce one exact RGB triplet. The runtime must prove one stable, connected, boundary-covering key plane, record requested and observed colors plus the observation fingerprint, and use only the observed color for deterministic keying. - Record the provider-native RGB sheet unchanged; put separator removal, explicit source-cell rectangles, keying, scaling, and key metadata inside the schema-v2
registered-familyspec, then runassets:derive-registered-family. That CLI owns the three canvas-preserving local derivatives, manifest provenance, completeness, lifecycle, keying fingerprint, and optional group patching. context-preserving-layer-editsremains one complete reference plus three edits that each retain that full reference context. Never use masks on a flat composed master to claim a hidden clean plate or full silhouette. If only a flat source exists, keep the familyrigid-lockedand limit motion to the whole source/group/camera.
- A
Execute each compiled canonical container exactly as described in
canonical-containers.md. Generate and record only its clean plate, unique canonical frame, and complete contents-only state sheet; then runassets:derive-canonical-container. The deterministic processor owns the shared interior mask, center/bottom registration, state metrics, terminal-fill checks, lifecycle, family fingerprint, and optional three-slot group patch. It rejects independently drifting members, duplicate authoritative surfaces, an opaque fake-alpha frame/sheet, excessive repair, and an incomplete terminal state.Create schema-v8 requests and try
provider:reusebefore paid or slow generation. Bind the frozen executable Style Profile exactly; changing the profile, its directives, or its fingerprint invalidates request reuse. Follow bothstoryboard.directingSummary.generationBudget.sourcePackagePlansandposeSheetPlans, including their compiled per-state facings. Every multi-state identity/prop family still gets one registered 2×2 or 3×2stateSheetBindingprovider request, never one call per state. Bind one active identity-reference asset, an anchor policy, and per-state facing/anchors. Process it withassets:process-state-sheet; preserve one shared registration canvas for every state and retain the generated per-state anchor overlays. When a reviewed source state is correct except for left/right orientation, the state-sheet spec may apply a deterministichorizontal-mirrororientation transform to that complete registered cell, invert its anchors, record source/output facing and provenance, and avoid another provider call. When clean provider gutters prove a pose crossed a nominal equal-grid edge, an explicit non-overlapping source-rectangle extraction may deterministically re-register the complete sheet onto that shared canvas; record every source rectangle and placement. Never generate or splice an isolated replacement layer or state.Validate a request with
provider:request validatebefore invoking it.- When a provider is known to return a native canvas instead of the requested delivery canvas, declare root
providerSourcewith minimum dimensions, aspect tolerance, and exact deterministic target canvas. Record the untouched provider output first, then runassets:normalize-provider-source; never resize it in place or claim the normalized derivative was the provider result. - Before a host provider-generation/edit call, run
provider:attempt reserve; use the returned canonical invocation and pass its attempt id toprovider:record— the record command inherits provider/model from that attempt.provider:runreserves automatically for command adapters. - Close abandoned attempts explicitly; never erase the ledger. If a succeeded attempt was closed but manifest writing failed, use
provider:recover-record; do not reserve or count it again. - A rejected output may become a source only through
provider:recover-rejected-source: run--checkfirst, require the unchanged historical request/output, consumed rejected attempt, declared source SHA, and passing observed key-plane evidence. Analpharequest returned as an opaque neutral baked transparency checkerboard may instead use the boundedbaked-checkerboard-alpha/checkerboard-alpha-v1observation. Then record lifecyclerecovery-sourcewithout changing or appending the attempt ledger. It remains a rejected attempt and is never reclassified as succeeded. - Use
provider:attempt summaryfor read-only auditing; it must show the profile ceiling, human-approved cap, usage, reservations, and remaining capacity. Never invoke against a missing approval or the profile ceiling alone. Rejected, abandoned, and unused provider results still count when quota was consumed. - When the human explicitly increases the image budget after concept approval, run
project:increase-image-budget -- <slug> --limit=<exact-total-cap> --note=<decision>before reserving another attempt. The command records an append-only old/new/usage/ceiling audit chain and may only increase the cap within the current profile hard ceiling. Never hand-editapprovedImageBudget. - Record the untouched provider-native registered sheet as the provider root; registered sheet cell crops, separator removal, keying, scaling, masks, alpha extractions, and exact reuse are fingerprinted local derivatives and do not consume another slot.
- When a provider is known to return a native canvas instead of the requested delivery canvas, declare root
Keep manifest-v4 lifecycle truthful: new records are
active; replacements preserve the prior record assuperseded. Mark rejected or context-only sources withproject:asset-lifecycle.- All provider and deterministic-derivative commands update
assets-manifest.jsonthrough one lock-protected read/mutate/validate/atomic-rename transaction. Parallel independent derivations are safe, but never hand-edit the manifest or build a second writer around a stale in-memory snapshot. - Run
project:quality prepareand inspect original-resolution evidence. Transparent members receive deterministic low-alpha band and connected-component topology analysis — detached rectangular fragments and hard rectangular silhouettes that follow a registered placement/crop boundary fail technical quality. Aregistered-depth-stackadditionally requires neutral reconstruction, reference comparison, checkerboard exploded members, and both extremes of all three responsive reveal envelopes; isolated-asset motion stress is not family proof. - When a top-level
supported-subjectorregistered-depth-stackexists only to bind a technical source family, declarerenderParticipation=derivation-only— never hide it withopacity=0. It cannot satisfy directing/profile promises or receive events/proofs/semantic targets; quality limits it to deterministic completeness/provenance/derivation checks while visible consumers own visual review. - Parallax rigs and motif fields remain composite targets. Never pass a semantic check merely to unblock production.
- All provider and deterministic-derivative commands update
Generate/import one narration file per scene so revisions stay local. Before each production voice call, add
timingBinding(storyboard scene id, allowed min/max media duration) to the request —provider:recordmeasures the take and rejects an unfit one before assembly.Node motion mechanics
- Implement the compiled plan exactly: node keyframes use parent-normalized additive
offsetX/offsetY; absolute placement stays intransform.x/transform.y; only camera keyframes retain pixelx/y. - A compiled
path-locomotiontarget is onestate-sequencewhosemotion.pathalone owns additivex/y, opticalz, projection, dynamic depth order, and path-tangent rotation. Keep ordinary keyframeoffsetX/offsetY/scale/rotationabsent, static rotation at zero, and idle limited tostill|breathe; bind the independently compiled looping state schedule to the same target. When camera follow is authored, use one oversized top-level world node and letcamera.followconsume the same resolved path. - Continuous treatments need real keyframe/idle motion on the named target:
traverseneeds a large world-relative path,swayneeds the sway idle primitive plus a bottom-biased motion pivot,parallax-cameraneedscamera.parallax.enabled=true, visible camera movement, and at least two distinct node depths. - Never lift a subject merely to clear subtitles: its alpha-tight visible bounds must clear the active subtitle exclusion zone while its declared foot/seat anchor still meets the support surface.
Occlusion and stacking
- A foreground inside one group cannot occlude a subject in a higher sibling stacking context. When a top-level visible
registered-depth-stackmust interleave with an external scene subject, usestackingContext=scene, keep the group carrier at identity, and assign unique memberzvalues that satisfy the spatial contract. - A
locked-contactsubject must not receive local float/drift, or inherit a different moving carrier from its support.
Looping worlds and routes
- A compiled
looping-environmentneeds a current passingworld-topology-proof.json, activelooping-strip-derivativemanifest records, oneworld-stripper compiled role with a truthful visible surface role, exactly one tracked subject plus declared participants, explicit screen/world anchor and near-occlusion bindings, andassets:derive-looping-stripsource/render seam evidence. The strip proof checks both edge equality and seam salience at the outer tile boundary;mirror-cropalso checks its internal mirror fold, at source and every render scale. A subject behind a sparse or low foreground may setrequireNearOverlap=false: z-order remains mandatory, but proof must not force decorative plants to cover the subject. Sparse foreground families may use deterministicdecorativeScatterregions/placements so reviewed plants or rocks are split, resized, flipped, and reordered before the seamless tile is derived. Never place repeated copies manually or let camera transforms move the viewport-sized strip carrier away from coverage. - For a sustained world such as a route, declare root
worlds[]plus each scene'scomposition.world: root strips bind the same declared source asset for every far/mid/ground/near role across scenes; each route traveler declares its inclusive safe-band proof window so an in-band racer may later make a formally checked offscreen exit; markers must be grounded in that band. - For causal competition/travel stories, declare
trajectoryContracts[]for state-at-proof, relative order, signed travel distance, monotonic forward travel (may settle without reversing), offscreen exit, and sequence order. Add acontinuityspatial contract when an outgoing result and incoming setup must reuse the same world/families/framing/grounding. Never rely on prose alone to prove overtaking, sleep/pass, wake/chase, collision/pickup, finish, or final stop.
Motif fields and state sequences
- A compiled motif field needs one matching deterministic
motif-fieldnode with the same preset/distribution/count/cycles/bounds/exclusionZonesand optionalworldBinding; userise-driftfor bottom-to-top bubbles. When the bubbles belong to a travellinglooping-environment, bind them to the intended strip role and keeprelativeDriftAmplitudesmall instead of letting camera motion carry the whole field. - Visibility treatments need a node
visibility.initialplus a matching persistent visibility event; graphic treatments need editabletextorshapenodes; coupled patterns need their registered group; every state family needs onestate-sequencenode with current identity, anchor, and facing evidence. - Sustained locomotion must meet its
gaitspatial contract — translating one frozen pose is not walking, running, flying, or swimming. When motion ends inside the scene, keepactiveStateIdscycling throughactiveUntil, then order any non-active brake/landing/contact states from exactlyactiveUntilonward, withholdStateIdas the final settled state. - Never emulate state replacement, a visibility lifecycle, depth parallax, a looping world, or a motif field with overlapping asset piles and opacity toggles.
Events
- Copy approved proof ids/times/assertions/stateAssertions exactly. Map every storyboard beat to one or more ordered
scene.events[]records, keeping visual and sound on the same event when they're one beat. Use the storyboard's approved proof id for critical visual/sound events. - For every compiled encounter, bind the four matching events with
event.encounter.contractIdand its phase. Only theanswerevent carries the contract's narration cue. Project validation rejects a wrong target, missing/duplicated phase, mistimed cue, or any visibility event that teleports the encountered target.
- Implement the compiled plan exactly: node keyframes use parent-normalized additive
Run
project:composition-proof; it synchronizes real narration duration, renders a subtitle-free composition surface, reuses only current surface-scoped fingerprints, renders changed relationship/semantic-contract/spatial-contract evidence, and creates per-member alpha/checkerboard/tight/alpha-band evidence plus family-aware layer-stack and canonical-container mask/progression/terminal proof.- Spatial debug frames draw the support polyline, resolved anchor/gap, subtitle zones, and pass/fail state; the proof also samples real state cadence, actual stacking paths, adjacent-scene families/framing, and alpha-tight subject/front bounds where required. A failing spatial or canonical-container proof stops the command.
- Subtitle-only runtime changes invalidate subtitle/final-frame evidence but do not invalidate unrelated composition evidence; a spatial contract that requests subtitle clearance deliberately binds the active responsive subtitle zone. Use
--forceonly for an intentional complete rerender. - Then run
project:quality <slug> scaffold, generate its fingerprint-boundcontact-sheet, inspect, and submit that same scaffold withrecord-batch. A changed report, target, proof, or evidence hash makes the scaffold/contact sheet stale and requires regeneration; when reviews remain, continue from the emitted incremental scaffold. Never treat a scaffold as an approval or display an unbound older contact sheet as current.
To inspect a proposed scene, use
project:scene-preview -- <slug> --scene=<sceneId>; it renders the actual current project scene, not a style sample. To combine adjacent narration while a merged scene is being authored, useproject:stitch-narration -- <slug> --scenes=<a,b,...> --target-scene=<new-id>and carry its provenance, SHA-256, text and subtitle offsets into the reviewed replacement scene. Useproject:budgetfor the one read-only total (human cap, profile ceiling, expected, used, reserved, remaining, avoided), andproject:render-statusfor persisted render lifecycle state. Never interpret quiet Remotion CLI output as a frame percentage.Read
timing-continuity.md, then seal the production set with one command:
npm run project:assets-ready -- <slug>
It synchronizes narration, caps padding tails when duration was inferred, derives visible subtitles, builds the deterministic timeline mix, automatically masters it to the declared LUFS/true-peak contract, encodes and measures both actual 96k preview AAC and 192k final AAC delivery surfaces, validates schema-v12 project/storyboard plus the approved motion contract and v9 editorial/state schedules/events/scene-boundary continuity, rejects stale proof and motion-approval fingerprints, enforces asset/composite/whole-film motion quality, validates subtitle transcript/timing/safe-area/font contracts, writes a fingerprinted assets-ready-seal.json, and advances to preview.
- Loudness gain, compression, limiting, and codec headroom are automatic technical operations, never a human gate.
- Direct
project:advance ... assets-readyis not a substitute — it only accepts that current seal. Inprevieworhuman-review, the same command is an idempotent recheck and does not advance again. - Explicit duration deficits block here; add real content or revise the approved target instead of padding. This stage cannot claim rendered audiovisual coverage because no artifact exists yet. Do not run separate sync/subtitles/validate commands first.
- A current seal also atomically marks pending/in-progress
directing-revision-*work items completed, because the storyboard/project execution sync has now passed the canonical validation surface. Any unrelated unfinished item, or a blocked directing revision, stops assets-ready; preview approval and both render modes reject every unresolved work item rather than silently bypassing it. - A directing revision must attribute responsive placement, cue, binding, and scene-directing changes to the exact affected scene ids; only a genuinely global editorial change such as active profile, media, timebase, or responsive-profile policy invalidates every scene.
- Run
project:preview. Its first preflight rejects a stale assets-ready seal or unresolved work item before narration sync, audio encoding, quality work, or frame rendering. Its post-render report is the first authoritative silence/low-motion union check and extracts one encoded subtitle frame per narrated scene. Fresh and audio-only renders both mux the exact already-measured delivery AAC stream; the renderer reuses an unchanged artifact, or reuses the existing video stream when only audio inputs/gain changed. Any visual fingerprint change forces a full frame render, followed by the same authoritative audio mux. Repair failures and continue autonomously until it reacheshuman-review.
Normal production commands update projects/<slug>/production-metrics.json. Treat AI-review and provider-attempt durations as end-to-end session windows, not provider-only inference time; do not infer token usage. Run project:metrics -- <slug> once when comparing completed projects or diagnosing a slowdown, rather than polling it during production.
If a confirmed provider becomes unavailable, preserve the stage and report the exact missing capability. Never invent artifacts or silently switch paid services.
Preview, Final, and Publication
At human-review, show preview.mp4, contact-sheet.jpg, subtitle-contact-sheet.jpg when narration exists, transition-contact-sheet.jpg when the film has scene boundaries, and report.json, separating technical results from creative judgment. Confirm continuityAnalysis.passed and subtitleProof.passed; the report rejects unapproved intervals that are both silent and low-motion, while the subtitle sheet is the encoded-frame review surface rather than OCR proof. Record revision feedback in review.md and request-preview-revision; after explicit approval run:
npm run project:advance -- <slug> approve-preview --note="<explicit decision>"
When the human requests a directing-only revision, export/edit the current compiled storyboard and run project:revise-preview-directing -- <slug> --input=<storyboard.json>. Use --source=asset-production only for explicit human feedback received after style approval but before assets are sealed; otherwise its default preview source requires the recorded preview revision request. The command accepts timing, treatments, proof timing, and legal scene-boundary changes; it rejects changes to the approved arc, style, scene/beat meaning, or proof assertions, recompiles against the approved motion budget, invalidates derived preview/final evidence, and creates one execution-sync work item per affected scene. It does not call a provider or silently change the production profile. A visibility-event proof may show its settled persistent state any time after the event begins and before the same target's next visibility change.
When the recorded human feedback explicitly changes scene meaning, narration, or deliberate stillness, use a schema-v1 authorization and run `project:revise-preview-semantic -- --input=<st
…(truncated)