@impractical-ai/motion 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,6 +51,19 @@ Gather from the user (ask only for what's missing):
51
51
  - **Value prop** (required): one or two sentences on what ships and why it matters.
52
52
  - Optional: their product's front-end code, a brand URL, screen recordings.
53
53
 
54
+ Before `create_video`, write a compact creative contract. This is a planning
55
+ record, not a new scene format:
56
+
57
+ - audience
58
+ - the single idea the viewer should remember
59
+ - the visual moment that proves it without explanatory copy
60
+ - how the reference's hierarchy/pacing will be translated rather than copied
61
+ - the real product source (and whether anything must be reconstructed)
62
+ - opening, proof, and payoff
63
+
64
+ When the local quality-loop experiment is enabled, pass that contract as
65
+ `creativeContract` to `create_video`. The tool will reject an unplanned start.
66
+
54
67
  If they gave a brand URL and no kit exists yet:
55
68
 
56
69
  brand_list
@@ -93,8 +106,8 @@ Craft, briefly — the full language is `guidance.motionDirection` in the
93
106
  `motion_context` result. That copy is live and versioned; this summary is a
94
107
  snapshot, so when the two disagree, the tool result wins.
95
108
 
96
- - **Beat it out before writing code.** Every beat needs a time, a thing on
97
- screen, and a move. A beat with no move is not a beat.
109
+ - **Beat it out before writing code.** Every beat needs a time, a visible
110
+ subject, and a narrative purpose. An intentional reading hold is valid.
98
111
  - **Text enters on `rise`** — `text.reveal(el, 'rise')` on `promo-out`, lines
99
112
  ~0.2s apart. Do *not* default type to `'blur'`: word-by-word de-blur reads as
100
113
  out-of-focus, and across a stagger it turns to mush. Blur is for whole-frame
@@ -105,9 +118,10 @@ snapshot, so when the two disagree, the tool result wins.
105
118
  dives only. Never leave an ease unspecified; never put `ease-in-*` on an
106
119
  entrance. The promo subset: `promo-out`, `promo-soft`, `promo-inout`,
107
120
  `promo-in`, `launch-out`.
108
- - **Fast**: entrances 0.4–0.6s, exits shorter, staggers ~0.2s apart, nothing
109
- over 1s but a deliberate hold drift or slow push.
110
- - **Nothing is ever static.** Every hold carries a slow drift or camera push.
121
+ - **Decisive**: entrances 0.4–0.6s, exits shorter, staggers ~0.2s apart.
122
+ Longer movement needs a narrative reason; important states may hold still.
123
+ - Budget one primary and at most one supporting motion. Keep backgrounds stable
124
+ unless their movement is explicitly authored.
111
125
  - Hold long enough to read. A beat that looks legible scrubbing the timeline is
112
126
  usually still too fast on screen.
113
127
  - Cut hard between sections; crossfading backgrounds reads as cheap.
@@ -169,9 +183,42 @@ nearly free.
169
183
  shows text clipped, an element off-frame, or a blank region, fix it and look
170
184
  again. This is the difference between shipping a video and shipping a guess.
171
185
 
186
+ When the `get_motion` tool is available (the local motion lab experiment),
187
+ prefer it as the first look after every preview build:
188
+
189
+ get_motion { draftId: "..." } // whole scene
190
+ get_motion { draftId: "...", from: 4.8, to: 6.4 } // one weak window
191
+
192
+ Static frames measure composition; `get_motion` measures motion — dense
193
+ contact sheets where the difference between adjacent tiles IS the motion,
194
+ plus measured pixel change per interval, dead-air spans, and the timeline's
195
+ actual tweens with any that run without producing visible change. Fix what it
196
+ flags, then use `get_frames` for composition close-ups.
197
+
198
+ With the quality loop also enabled, the final review is two-part and export
199
+ requires both on the same revision: `get_frames { reviewMode: "final" }` for
200
+ composition and legibility at native resolution, and
201
+ `get_motion { draftId, reviewMode: "final" }` for full-duration motion
202
+ coverage at one frame in five.
203
+
204
+ For a new launch video, build and review the proof beat before completing the
205
+ rest. When the local quality loop is enabled:
206
+
207
+ get_frames { draftId: "...", times: [/* proof beat */], reviewMode: "proof" }
208
+
209
+ For the final pass, review at least eight representative timestamps including
210
+ `t=0` and the settled closing frame:
211
+
212
+ get_frames { draftId: "...", times: [/* whole timeline */], reviewMode: "final" }
213
+
214
+ The final critic scores the visible result—not the code or effort—on narrative
215
+ clarity, visual proof, product authenticity, composition, legibility, pacing,
216
+ reference fidelity, and technical integrity. Use timestamped evidence. A weak
217
+ score is a revision brief, not permission to describe the cut as “clean.”
218
+
172
219
  ## 5. Export and hand off
173
220
 
174
- export_video { draftId: "..." }
221
+ export_video { draftId: "...", qualityReview?: {/* required by local quality loop */} }
175
222
  job_status { jobIds: ["<returned job id>"], wait: true }
176
223
  studio_link { projectId: "...", slug: "..." }
177
224