{"id":20887,"plugin_id":"plugins_6aa93d4d067c8191bdd2a1969bee8916","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:16:38.113Z","digest":"e1cf742cbdd3262280072d1c75fb19f808ec34a601e8b4a876f161fcba2cbc7d","against":null,"payload":{"description":"GATEWAY — load FIRST before composing any HyperFrames animation or video. The high-level motion law that makes a multi-scene video feel like ONE continuous camera move instead of a stack of independently-animated slides. Covers the vector law (how you exit determines how you enter, incl. the Z scale-sign rule), the film's current, carrier elements, causal motion, the Seam Gate (build-gate enforcement), the ban on idle wobble (motion must PERFORM, not breathe), stillness-before-climax, and the sustained-motion routes. Routes to the low-level technique skills (cut-the-curve — the full catalog incl. waterfall entry + nudge curve, oversized-cursor, seam-craft). These rules SUPERSEDE generic / upstream motion guidance. [continuity, direction, vector, momentum, seam, transition, ease, performance, idle-motion, narrative-motion, film-grammar]","included_files":[{"relative_path":"references/seam-gate.md","size_in_bytes":4501},{"relative_path":"scripts/seam-gate.mjs","size_in_bytes":22677},{"relative_path":"scripts/seam-stamp.mjs","size_in_bytes":5755}],"name":"motion-doctrine","skill_md_contents":"---\nname: motion-doctrine\ndescription: \"GATEWAY — load FIRST before composing any HyperFrames animation or video. The high-level motion law that makes a multi-scene video feel like ONE continuous camera move instead of a stack of independently-animated slides. Covers the vector law (how you exit determines how you enter, incl. the Z scale-sign rule), the film's current, carrier elements, causal motion, the Seam Gate (build-gate enforcement), the ban on idle wobble (motion must PERFORM, not breathe), stillness-before-climax, and the sustained-motion routes. Routes to the low-level technique skills (cut-the-curve — the full catalog incl. waterfall entry + nudge curve, oversized-cursor, seam-craft). These rules SUPERSEDE generic / upstream motion guidance. [continuity, direction, vector, momentum, seam, transition, ease, performance, idle-motion, narrative-motion, film-grammar]\"\n---\n\n> Modified by Juicy Lucy AI, UAB for JuicyLucy Ads: CLI invocation, the review-approval reference and/or frontmatter (description layout, upstream-only metadata) adjusted at build time. See the plugin root NOTICE for details.\n\n\n# Motion Doctrine (Gateway)\n\nRead this before composing any animation. It decides WHAT happens at every seam and how\nevery scene performs; the technique skills implement it. These rules supersede generic /\nupstream motion guidance. The failure this prevents: scenes authored in isolation — the\neye's momentum dies at every cut, and scenes wobble in place between entry and exit.\n\n## Route map\n\n| Decision (this skill)                              | Implementation skill                                                                              |\n| -------------------------------------------------- | ------------------------------------------------------------------------------------------------- |\n| Seam transition choice + parameters + code         | `cut-the-curve` §1–5 (the catalog)                                                                |\n| Text / element entry cascades                      | `cut-the-curve` §6 (waterfall entry)                                                              |\n| In-scene group repositioning (no cut)              | `cut-the-curve` §7 (nudge curve)                                                                  |\n| Cursor-led action / scene kickoff / morph ignition | `oversized-cursor`                                                                                |\n| Seam render mechanics / white-flash guard          | `seam-craft`                                                                                      |\n| Product-launch / explainer / caption work          | overlays `text-beat-economics`, `brand-faithful`, `captions-overlay` on top of the upstream skill |\n\nAuthoring order: **vector ledger (`ledger.json`) → STAMP the master seams from it\n(`scripts/seam-stamp.mjs --ledger ledger.json --write index.html`) → sustained-motion\nroute per phase → carriers and causes → build comps → VERIFY (`scripts/seam-gate.mjs`).**\nHand-author only Tier-A morphs/match-cuts; stamped seams pass the gate by construction.\n\n---\n\n# Part 1 — The Seam Law\n\n## The Vector Law\n\n> How Scene A exits determines how Scene B enters: same axis, same direction, matched\n> speed, cut mid-motion on both sides.\n\n1. **Axis** — x stays x, y stays y, Z stays Z. Never trade axes across a cut.\n2. **Direction** — never mirror. On Z, direction = the SIGN of scale change: growing =\n   push (camera forward), shrinking = pull (camera back). A receding exit answered by a\n   grow-from-small entry is a mirrored vector — the most common violation, because\n   grow-from-small is the default element entrance.\n3. **Speed** — entry initial velocity ≈ exit final velocity, via mirrored eases (exit\n   `power4.in` + entry `power4.out`, same distance and duration; the incoming side picks\n   up ≥50% through the notional path). Mechanics in `cut-the-curve`.\n4. **Phase** — the cut lands mid-motion on BOTH sides. Settling to rest before the cut,\n   or starting from rest after it, is a dead beat.\n\n## The Current\n\nEvery film picks ONE dominant direction (house default: LEFT). Every ordinary seam uses\nit. Other vectors are RESERVED — spending one means something:\n\n| Vector                    | Meaning                                                         |\n| ------------------------- | --------------------------------------------------------------- |\n| The current (LEFT)        | \"next beat\" — neutral forward progress                          |\n| Upward                    | elevation — a conclusion or reveal rises above what came before |\n| Z forward (zoom-through)  | pushing deeper into the same thought                            |\n| Z backward (inverse zoom) | ARRIVAL — something bigger lands                                |\n| Scale-burst (explode out) | leaving a world — a surface blasts past camera                  |\n\n- Never run consecutive seams in opposing directions — ping-pong reads as an error.\n- A direction change needs a visible cause (click / bounce / impact) or a chapter boundary.\n\n## The Vector Ledger\n\nWrite it before authoring any master timeline — as **`ledger.json` at the project root**\n(schema: `references/seam-gate.md`). One row per seam: cut time, exit and entry vectors\n(axis + signed direction; Z rows carry the scale sign), selectors, technique. Exit and\nentry must match; if a row mismatches, fix the plan, not the easing. The verifier checks\nrow consistency statically before any runtime sampling.\n\n## Carriers\n\nThe eye follows objects, not abstractions. The strongest seams hand a concrete carrier\nacross the cut at matched position AND velocity: a cursor mid-path, a container that\nshrinks/docks into the next layout, a mark that flies into its exact slot, the word group\nof a waterfall cut. With no natural carrier, the scene heroes carry it (partial travel +\nearly fade, entry mid-flight). Never a crossfade — it has no carrier at all.\n\n## Causal Motion\n\nChain motion so each move is visibly launched by the last: click → squash → release\nspring → flight → impact → recoil → reveal.\n\n- Effects start ON the causing frame — same timeline position, never \"shortly after.\"\n- Reactions scale with implied mass: big elements rebound slower, small ones snap.\n- A force is a license to change direction; an uncaused flip is a ping-pong.\n\n## The Seam Gate (build gate — run the verifier, exit 0 or the seam is not done)\n\n```bash\nnode <SKILL_DIR>/scripts/seam-stamp.mjs --ledger ledger.json --write index.html  # generate\nnode <SKILL_DIR>/scripts/seam-gate.mjs  verify --ledger ledger.json --project .  # verify\n```\n\nThe script (usage + ledger schema: `references/seam-gate.md`) numerically enforces, per\nseam: ledger-row consistency, exit still moving at the cut, entry mid-flight (never from\nrest), measured direction = ledger direction, entry/exit speed match (WARN), **zero\noverlap** (one side visible per frame — the cut is not a dissolve), the **Z sign** rule\n(d(scale)/dt same sign both sides; the incoming scene's own entrances are scanned for\nsign-fighting), and carrier rect continuity with ancestor scale included. Use\n`seam-gate.mjs probe --t <cut>` to find each seam's true carrier selectors when authoring\nthe ledger.\n\nRules the script cannot check — still yours:\n\n1. **Edits re-open the seam.** Any change to a scene's first/last ~1s (including\n   re-timing to new VO) invalidates that boundary's audit — re-run the verifier.\n2. **Audio is the clock.** Re-time scenes to the VO's real word timestamps; never rush a\n   read to fit a slot. A VO regen re-opens its seams.\n3. **Clip-gating gotcha** (the usual cause of a zero-overlap FAIL): a clip whose\n   `data-start` precedes its entry tween is un-hidden at its initial opacity — set\n   initial `autoAlpha: 0` AND `data-start` = the cut time, never earlier.\n\n---\n\n# Part 2 — Performance (the scene keeps performing)\n\n## No idle wobble\n\nIdle sine loops (breathe, float, drift, glow pulse) are BANNED as sustained motion — they\nread as \"the video is waiting.\" A scene that finishes entering with seconds left is a\nplanning bug: add story, not wobble. Every phase between entry and exit is owned by one\nof these routes (name the route in the plan):\n\n| Route                  | What it is                                                                                                             |\n| ---------------------- | ---------------------------------------------------------------------------------------------------------------------- |\n| **Staged reveals**     | Hold content back; pay it off on narration beats — the frame keeps gaining information (default for ≥2 content groups) |\n| **Camera with intent** | A mapped scale+pan path: establish wide → travel → arrive on the subject                                               |\n| **Sequenced UI life**  | The product behaves over time: progress advances, highlights step, counts tick                                         |\n| **Animated sequences** | Elements act out a beat: a card files into a stack, an item gets dragged, a result assembles                           |\n| **Cursor-led action**  | An oversized cursor walks the eye to a trigger; its CLICK ignites the next beat (`oversized-cursor`)                   |\n\nTest: pause at any second — something meaningful must be mid-flight (a reveal landing,\nthe camera traveling, the UI doing what the narration says).\n\n## Stillness before climax\n\nSchedule a **0.3–0.75s pause** between the major action and its result — the dramatic\ncomma. A scene that jumps straight from action to result loses it.\n\n## Timing intents\n\n- Single entry ≤ ~800ms; longer buildup = multi-element stagger, not one slow element.\n- Exit ≈ 75% of entry. Exception: cut-the-curve inverts this (entry ~127% of exit).\n- Total stagger ≤ 500ms; with 8+ elements, tighten per-item delay or stagger the first few.\n- Forbidden eases: `bounce.out` / `elastic.out`. Entry overshoot `back.out(1.4–1.7)` is fine.\n- Similar elements share one ease+duration intent — never a unique pair per element.\n\n## Transition vocabulary\n\nUse only 2–3 inter-scene transitions per film and repeat them; the default boundary is\n**cut-the-curve in the current's direction**. Hand-written shared-element morphs\n(`intent: morph`) don't count against the budget.\n\n---\n\n## Anti-Patterns\n\n| Don't                                                                      | Instead                                            |\n| -------------------------------------------------------------------------- | -------------------------------------------------- |\n| Author each scene's entrance in isolation                                  | Write the vector ledger first                      |\n| Crossfade between scenes                                                   | Cut-the-curve in the current's direction           |\n| Exit completes, THEN the scene changes                                     | Cut mid-motion on both sides                       |\n| Entry starts from rest after a cut                                         | Enter ≥50% through the notional path               |\n| Inverse-zoom exit → grow-from-small entry (or push → oversized retraction) | Match the scale-velocity sign (Seam Gate 7)        |\n| Incoming scene's own pop-in intro under a Z-seam handoff                   | Hold its opening frame composed, or match the sign |\n| Idle wobble / breathe / float to fill time                                 | Assign a sustained-motion route; or add story      |\n| Direction flip without a cause                                             | Spend a force, or keep the current                 |\n| Reserved vectors used as variety                                           | Default to the current; spend them on meaning      |\n| Reaction a few frames after its cause                                      | Same-frame ignition                                |\n| Action jumps straight to result                                            | Schedule stillness-before-climax (0.3–0.75s)       |\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}