motionloom 2.3.0 → 2.4.0
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.
- package/CHANGELOG.md +24 -1
- package/README.md +78 -11
- package/ROADMAP.md +8 -5
- package/SKILL.md +24 -5
- package/agent-card.json +31 -5
- package/agent-surfaces.json +1 -1
- package/artifact-adapter-registry.json +53 -0
- package/bin/motionloom.mjs +29 -5
- package/docs/CHECKLIST.md +16 -0
- package/docs/STATUS.md +2 -2
- package/docs/audits/data/deep-stress-latest.json +65 -65
- package/docs/releases/2.4.0.md +31 -0
- package/docs/releases/npm-publish-from-workstation.md +19 -8
- package/docs/research/agent-skill-ecosystem-notes.md +47 -0
- package/docs/research/ai-animation-tools-2026-notes.md +81 -0
- package/docs/research/ai-animation-tools-2026-report.md +168 -0
- package/docs/research/ai-pilot-ingest-notes.md +29 -0
- package/examples/agent-consumer/ai-pilot-scout/CHATGPT-HANDOFF.md +70 -0
- package/examples/agent-consumer/ai-pilot-scout/CODEX-HANDOFF.md +80 -0
- package/examples/agent-consumer/ai-pilot-scout/README.md +39 -0
- package/examples/agent-consumer/ai-pilot-scout/chatgpt-geometry-correction-prompt.md +55 -0
- package/examples/agent-consumer/ai-pilot-scout/chatgpt-pose-generation-prompt.md +78 -0
- package/examples/agent-consumer/ai-pilot-scout/partial-handoff.json +73 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-controls.json +15 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-export.json +14 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-provenance.json +20 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-receipt.json +16 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-back.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-front.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-mid.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-atlas.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-00.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-01.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-02.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-03.png +0 -0
- package/examples/agent-consumer/asset-consistency/forest-layered-map.json +53 -0
- package/examples/agent-consumer/asset-consistency/hero-atlas-contract.json +24 -0
- package/examples/agent-consumer/asset-consistency/hero-identity.json +51 -0
- package/examples/agent-consumer/asset-consistency/hero-walk-action-set.json +27 -0
- package/examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json +63 -0
- package/examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json +13 -0
- package/examples/agent-consumer/rive-package-gate/README.md +20 -0
- package/examples/agent-consumer/runtime-candidate/hero-walk-candidate.json +18 -0
- package/examples/agent-consumer/runtime-pilot/action-set.json +19 -0
- package/examples/agent-consumer/runtime-pilot/asset-identity.json +44 -0
- package/examples/agent-consumer/runtime-pilot/candidate.json +21 -0
- package/examples/agent-consumer/runtime-pilot/controls.json +35 -0
- package/examples/agent-consumer/runtime-pilot/export.json +17 -0
- package/examples/agent-consumer/runtime-pilot/provenance.json +38 -0
- package/examples/agent-consumer/runtime-pilot/receipt.json +30 -0
- package/package.json +56 -4
- package/references/browser-review-contract.md +7 -1
- package/references/intelligence-core.md +22 -1
- package/rig-adapter-registry.json +39 -0
- package/schemas/action-set.schema.json +42 -0
- package/schemas/artifact-adapter-registry.schema.json +16 -0
- package/schemas/asset-identity.schema.json +117 -0
- package/schemas/asset-provenance.schema.json +1 -1
- package/schemas/atlas-contract.schema.json +48 -0
- package/schemas/control-track.schema.json +18 -0
- package/schemas/export-manifest.schema.json +19 -0
- package/schemas/frame-geometry.schema.json +79 -0
- package/schemas/generation-receipt.schema.json +20 -0
- package/schemas/layered-map.schema.json +75 -0
- package/schemas/rig-adapter-registry.schema.json +14 -0
- package/schemas/rig-compatibility.schema.json +53 -0
- package/schemas/rive-package-manifest.schema.json +43 -0
- package/schemas/runtime-candidate.schema.json +48 -0
- package/schemas/scene-manifest.schema.json +18 -0
- package/scripts/artifact-intake.py +408 -0
- package/scripts/asset-consistency.py +517 -0
- package/scripts/asset-provenance.py +8 -3
- package/scripts/build-ai-pilot.py +504 -0
- package/scripts/isolate-alpha-background.py +147 -0
- package/scripts/quality-gate.py +88 -2
- package/scripts/report.py +85 -0
- package/scripts/resolve-task-bundle.py +84 -0
- package/scripts/review-hook.py +26 -4
- package/scripts/rig-compatibility.py +251 -0
- package/scripts/rive-package-gate.py +245 -0
- package/scripts/runtime-candidate.py +301 -0
- package/scripts/setup.mjs +54 -26
- package/src/output/runtime-pilot-framer/asset-provenance.json +38 -0
- package/src/output/runtime-pilot-framer/browser-review.json +20 -0
- package/src/output/runtime-pilot-framer/framer-motion/runtime-telemetry.json +103 -0
- package/src/output/runtime-pilot-framer/manifest.json +31 -0
- package/src/output/runtime-pilot-framer/motion-spec.json +25 -0
- package/src/output/runtime-pilot-framer/runtime-evidence.json +96 -0
- package/src/output/runtime-pilot-framer/runtime-telemetry.json +100 -0
- package/src/output/runtime-pilot-framer/scene.jsx +52 -0
- package/src/output/runtime-pilot-framer/snapshot/.render-meta.json +9 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-00.png +0 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-100.png +0 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-50.png +0 -0
- package/tests/scripts/run_tests.py +107 -0
- package/tests/scripts/test_ai_pilot_builder.py +128 -0
- package/tests/scripts/test_alpha_isolation.py +60 -0
- package/tests/scripts/test_artifact_intake.py +146 -0
- package/tests/scripts/test_asset_consistency.py +199 -0
- package/tests/scripts/test_rig_compatibility.py +105 -0
- package/tests/scripts/test_rive_package_gate.py +101 -0
- package/tests/scripts/test_runtime_candidate.py +95 -0
package/docs/STATUS.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release posture
|
|
6
6
|
|
|
7
|
-
MotionLoom's repository source and package manifest are prepared for **2.
|
|
7
|
+
MotionLoom's repository source and package manifest are prepared for **2.4.0 release metadata**. The publication state of the npm registry and GitHub Release/tag must be verified against the latest release workflow rather than inferred from this document. The repository has a cross-platform CLI, one-command project onboarding, durable Project Memory, Agent interoperability surfaces, artifact-first handoff, runtime evidence, Visual Truth, Remediation Learning, signed attestation, AI-first asset provenance, a truthful code-authored runtime lane and a browser-based Dev Lab review contract. The protected manual release workflow verifies package/changelog/release-note alignment before publication.
|
|
8
8
|
|
|
9
9
|
The repository is **engineering-ready for continued integration work**, not a universal production certification for every animation framework or every host project. CI status must be read from the latest GitHub Actions run, not inferred from historical audit prose.
|
|
10
10
|
|
|
@@ -30,4 +30,4 @@ Use the following order when sources disagree:
|
|
|
30
30
|
|
|
31
31
|
## Known next work
|
|
32
32
|
|
|
33
|
-
The bounded analyzer has now been exercised against a labeled external corpus; see the [dated evidence note](audits/external-project-corpus-2026-08-13.md). The highest-value remaining evidence work is paired product evaluation across more real projects and verification of the 2.
|
|
33
|
+
The bounded analyzer has now been exercised against a labeled external corpus; see the [dated evidence note](audits/external-project-corpus-2026-08-13.md). The highest-value remaining evidence work is paired product evaluation across more real projects and verification of the 2.4.0 version–tag–GitHub Release–npm provenance chain. Missing external projects are reported as `insufficient_evidence`, never as a pass. None of these items should weaken the user-review gate or convert heuristic warnings into approval.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
3
|
"audit": "motionloom-deep-stress",
|
|
4
|
-
"generated_at": "2026-08-
|
|
4
|
+
"generated_at": "2026-08-14T18:59:00.435638Z",
|
|
5
5
|
"seed": 20260813,
|
|
6
6
|
"requested_iterations": 5000,
|
|
7
7
|
"actual_iterations": 6900,
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"codes": {
|
|
30
30
|
"equal": 600
|
|
31
31
|
},
|
|
32
|
-
"p50_ms": 0.
|
|
33
|
-
"p95_ms": 0.
|
|
34
|
-
"max_ms": 0.
|
|
32
|
+
"p50_ms": 0.01868,
|
|
33
|
+
"p95_ms": 0.022651,
|
|
34
|
+
"max_ms": 0.041323,
|
|
35
35
|
"pass_rate": 1.0
|
|
36
36
|
},
|
|
37
37
|
"dsse-ed25519-roundtrip": {
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"codes": {
|
|
44
44
|
"verified": 250
|
|
45
45
|
},
|
|
46
|
-
"p50_ms": 0.
|
|
47
|
-
"p95_ms": 0.
|
|
48
|
-
"max_ms": 0.
|
|
46
|
+
"p50_ms": 0.129434,
|
|
47
|
+
"p95_ms": 0.145666,
|
|
48
|
+
"max_ms": 0.186531,
|
|
49
49
|
"pass_rate": 1.0
|
|
50
50
|
},
|
|
51
51
|
"dsse-ed25519-tamper": {
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"codes": {
|
|
58
58
|
"invalid-signature": 250
|
|
59
59
|
},
|
|
60
|
-
"p50_ms": 0.
|
|
61
|
-
"p95_ms": 0.
|
|
62
|
-
"max_ms": 0.
|
|
60
|
+
"p50_ms": 0.131737,
|
|
61
|
+
"p95_ms": 0.155588,
|
|
62
|
+
"max_ms": 0.218171,
|
|
63
63
|
"pass_rate": 1.0
|
|
64
64
|
},
|
|
65
65
|
"statement-contract": {
|
|
@@ -72,9 +72,9 @@
|
|
|
72
72
|
"valid": 200,
|
|
73
73
|
"rejected": 400
|
|
74
74
|
},
|
|
75
|
-
"p50_ms": 0.
|
|
76
|
-
"p95_ms": 0.
|
|
77
|
-
"max_ms": 0.
|
|
75
|
+
"p50_ms": 0.007154,
|
|
76
|
+
"p95_ms": 0.008546,
|
|
77
|
+
"max_ms": 0.06488,
|
|
78
78
|
"pass_rate": 1.0
|
|
79
79
|
},
|
|
80
80
|
"attestation-verifier-boundary": {
|
|
@@ -89,9 +89,9 @@
|
|
|
89
89
|
"14": 375,
|
|
90
90
|
"13": 375
|
|
91
91
|
},
|
|
92
|
-
"p50_ms": 0.
|
|
93
|
-
"p95_ms": 0.
|
|
94
|
-
"max_ms": 0.
|
|
92
|
+
"p50_ms": 0.297953,
|
|
93
|
+
"p95_ms": 0.485624,
|
|
94
|
+
"max_ms": 0.742145,
|
|
95
95
|
"pass_rate": 1.0
|
|
96
96
|
},
|
|
97
97
|
"strict-quality-gate-clean": {
|
|
@@ -103,9 +103,9 @@
|
|
|
103
103
|
"codes": {
|
|
104
104
|
"accepted": 400
|
|
105
105
|
},
|
|
106
|
-
"p50_ms": 25.
|
|
107
|
-
"p95_ms":
|
|
108
|
-
"max_ms":
|
|
106
|
+
"p50_ms": 25.03624,
|
|
107
|
+
"p95_ms": 26.647454,
|
|
108
|
+
"max_ms": 36.626597,
|
|
109
109
|
"pass_rate": 1.0
|
|
110
110
|
},
|
|
111
111
|
"intelligence-p1-clean": {
|
|
@@ -117,9 +117,9 @@
|
|
|
117
117
|
"codes": {
|
|
118
118
|
"accepted": 400
|
|
119
119
|
},
|
|
120
|
-
"p50_ms":
|
|
121
|
-
"p95_ms":
|
|
122
|
-
"max_ms":
|
|
120
|
+
"p50_ms": 18.137953,
|
|
121
|
+
"p95_ms": 18.818408,
|
|
122
|
+
"max_ms": 22.29844,
|
|
123
123
|
"pass_rate": 1.0
|
|
124
124
|
},
|
|
125
125
|
"replay-hash-clean": {
|
|
@@ -131,9 +131,9 @@
|
|
|
131
131
|
"codes": {
|
|
132
132
|
"clean": 475
|
|
133
133
|
},
|
|
134
|
-
"p50_ms":
|
|
135
|
-
"p95_ms":
|
|
136
|
-
"max_ms":
|
|
134
|
+
"p50_ms": 8.196194,
|
|
135
|
+
"p95_ms": 8.346516,
|
|
136
|
+
"max_ms": 9.307598,
|
|
137
137
|
"pass_rate": 1.0
|
|
138
138
|
},
|
|
139
139
|
"semantic-lint-clean": {
|
|
@@ -145,9 +145,9 @@
|
|
|
145
145
|
"codes": {
|
|
146
146
|
"clean": 475
|
|
147
147
|
},
|
|
148
|
-
"p50_ms": 0.
|
|
149
|
-
"p95_ms": 0.
|
|
150
|
-
"max_ms": 0.
|
|
148
|
+
"p50_ms": 0.02188,
|
|
149
|
+
"p95_ms": 0.025799,
|
|
150
|
+
"max_ms": 0.048701,
|
|
151
151
|
"pass_rate": 1.0
|
|
152
152
|
},
|
|
153
153
|
"continuity-clean": {
|
|
@@ -159,9 +159,9 @@
|
|
|
159
159
|
"codes": {
|
|
160
160
|
"clean": 475
|
|
161
161
|
},
|
|
162
|
-
"p50_ms": 0.
|
|
163
|
-
"p95_ms": 0.
|
|
164
|
-
"max_ms": 0.
|
|
162
|
+
"p50_ms": 0.023042,
|
|
163
|
+
"p95_ms": 0.026202,
|
|
164
|
+
"max_ms": 0.045252,
|
|
165
165
|
"pass_rate": 1.0
|
|
166
166
|
},
|
|
167
167
|
"approval-invariant": {
|
|
@@ -173,9 +173,9 @@
|
|
|
173
173
|
"codes": {
|
|
174
174
|
"approval=false": 475
|
|
175
175
|
},
|
|
176
|
-
"p50_ms": 0.
|
|
177
|
-
"p95_ms": 0.
|
|
178
|
-
"max_ms": 0.
|
|
176
|
+
"p50_ms": 0.056737,
|
|
177
|
+
"p95_ms": 0.067291,
|
|
178
|
+
"max_ms": 0.099394,
|
|
179
179
|
"pass_rate": 1.0
|
|
180
180
|
},
|
|
181
181
|
"fault-graph-task-id": {
|
|
@@ -187,9 +187,9 @@
|
|
|
187
187
|
"codes": {
|
|
188
188
|
"rejected": 100
|
|
189
189
|
},
|
|
190
|
-
"p50_ms":
|
|
191
|
-
"p95_ms":
|
|
192
|
-
"max_ms":
|
|
190
|
+
"p50_ms": 14.317844,
|
|
191
|
+
"p95_ms": 14.713064,
|
|
192
|
+
"max_ms": 15.184861,
|
|
193
193
|
"pass_rate": 1.0
|
|
194
194
|
},
|
|
195
195
|
"fault-motion-ir-scene": {
|
|
@@ -201,9 +201,9 @@
|
|
|
201
201
|
"codes": {
|
|
202
202
|
"rejected": 100
|
|
203
203
|
},
|
|
204
|
-
"p50_ms": 2.
|
|
205
|
-
"p95_ms": 2.
|
|
206
|
-
"max_ms": 2.
|
|
204
|
+
"p50_ms": 2.077654,
|
|
205
|
+
"p95_ms": 2.140575,
|
|
206
|
+
"max_ms": 2.284035,
|
|
207
207
|
"pass_rate": 1.0
|
|
208
208
|
},
|
|
209
209
|
"fault-provenance-task-id": {
|
|
@@ -215,9 +215,9 @@
|
|
|
215
215
|
"codes": {
|
|
216
216
|
"rejected": 100
|
|
217
217
|
},
|
|
218
|
-
"p50_ms": 0.
|
|
219
|
-
"p95_ms":
|
|
220
|
-
"max_ms":
|
|
218
|
+
"p50_ms": 0.849407,
|
|
219
|
+
"p95_ms": 0.886464,
|
|
220
|
+
"max_ms": 0.94938,
|
|
221
221
|
"pass_rate": 1.0
|
|
222
222
|
},
|
|
223
223
|
"fault-replay-path-escape": {
|
|
@@ -229,9 +229,9 @@
|
|
|
229
229
|
"codes": {
|
|
230
230
|
"rejected": 100
|
|
231
231
|
},
|
|
232
|
-
"p50_ms": 8.
|
|
233
|
-
"p95_ms":
|
|
234
|
-
"max_ms":
|
|
232
|
+
"p50_ms": 8.246496,
|
|
233
|
+
"p95_ms": 8.347693,
|
|
234
|
+
"max_ms": 9.112055,
|
|
235
235
|
"pass_rate": 1.0
|
|
236
236
|
},
|
|
237
237
|
"fault-p1-fix-plan-hash": {
|
|
@@ -243,9 +243,9 @@
|
|
|
243
243
|
"codes": {
|
|
244
244
|
"rejected": 100
|
|
245
245
|
},
|
|
246
|
-
"p50_ms": 0.
|
|
247
|
-
"p95_ms": 0.
|
|
248
|
-
"max_ms":
|
|
246
|
+
"p50_ms": 0.735113,
|
|
247
|
+
"p95_ms": 0.772903,
|
|
248
|
+
"max_ms": 0.896587,
|
|
249
249
|
"pass_rate": 1.0
|
|
250
250
|
},
|
|
251
251
|
"fault-p1-wrong-scene": {
|
|
@@ -257,9 +257,9 @@
|
|
|
257
257
|
"codes": {
|
|
258
258
|
"rejected": 100
|
|
259
259
|
},
|
|
260
|
-
"p50_ms": 0.
|
|
261
|
-
"p95_ms": 0.
|
|
262
|
-
"max_ms":
|
|
260
|
+
"p50_ms": 0.709162,
|
|
261
|
+
"p95_ms": 0.732217,
|
|
262
|
+
"max_ms": 0.772478,
|
|
263
263
|
"pass_rate": 1.0
|
|
264
264
|
},
|
|
265
265
|
"fault-continuity-structure": {
|
|
@@ -271,9 +271,9 @@
|
|
|
271
271
|
"codes": {
|
|
272
272
|
"rejected": 100
|
|
273
273
|
},
|
|
274
|
-
"p50_ms": 0.
|
|
275
|
-
"p95_ms": 0.
|
|
276
|
-
"max_ms": 0.
|
|
274
|
+
"p50_ms": 0.098924,
|
|
275
|
+
"p95_ms": 0.10896,
|
|
276
|
+
"max_ms": 0.126946,
|
|
277
277
|
"pass_rate": 1.0
|
|
278
278
|
},
|
|
279
279
|
"fault-semantic-structure": {
|
|
@@ -285,9 +285,9 @@
|
|
|
285
285
|
"codes": {
|
|
286
286
|
"rejected": 100
|
|
287
287
|
},
|
|
288
|
-
"p50_ms": 0.
|
|
289
|
-
"p95_ms": 0.
|
|
290
|
-
"max_ms": 0.
|
|
288
|
+
"p50_ms": 0.094954,
|
|
289
|
+
"p95_ms": 0.102869,
|
|
290
|
+
"max_ms": 0.109556,
|
|
291
291
|
"pass_rate": 1.0
|
|
292
292
|
},
|
|
293
293
|
"fault-attestation-approval": {
|
|
@@ -299,9 +299,9 @@
|
|
|
299
299
|
"codes": {
|
|
300
300
|
"10": 100
|
|
301
301
|
},
|
|
302
|
-
"p50_ms": 0.
|
|
303
|
-
"p95_ms": 0.
|
|
304
|
-
"max_ms": 0.
|
|
302
|
+
"p50_ms": 0.224069,
|
|
303
|
+
"p95_ms": 0.2494,
|
|
304
|
+
"max_ms": 0.264081,
|
|
305
305
|
"pass_rate": 1.0
|
|
306
306
|
},
|
|
307
307
|
"fault-attestation-payload": {
|
|
@@ -313,9 +313,9 @@
|
|
|
313
313
|
"codes": {
|
|
314
314
|
"11": 100
|
|
315
315
|
},
|
|
316
|
-
"p50_ms": 0.
|
|
317
|
-
"p95_ms": 0.
|
|
318
|
-
"max_ms": 0.
|
|
316
|
+
"p50_ms": 0.283996,
|
|
317
|
+
"p95_ms": 0.310437,
|
|
318
|
+
"max_ms": 0.370236,
|
|
319
319
|
"pass_rate": 1.0
|
|
320
320
|
}
|
|
321
321
|
},
|
|
@@ -325,5 +325,5 @@
|
|
|
325
325
|
"false_positive": "A clean canonical case was rejected.",
|
|
326
326
|
"false_negative": "A controlled tamper, binding, revocation or invalid-contract case was accepted."
|
|
327
327
|
},
|
|
328
|
-
"wall_time_s": 25.
|
|
328
|
+
"wall_time_s": 25.466197
|
|
329
329
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# MotionLoom 2.4.0
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
MotionLoom 2.4.0 adds a **runtime-first, code-authored** path for agents that need to prove animation behavior without misclassifying a code scene as an artist-authored or AI-generated visual asset. The reference Framer Motion pilot moves through Artifact Intake, runtime rendering, integrity verification and identity-bound Dev Lab review while maintaining the existing human-governed release boundary.
|
|
6
|
+
|
|
7
|
+
## Added
|
|
8
|
+
|
|
9
|
+
### Truthful runtime-first provenance
|
|
10
|
+
|
|
11
|
+
The Artifact Intake and provenance surfaces now recognize `code_authored` runtime scenes explicitly. Source code, controls, export data and provenance are hash-bound, but this evidence only permits runtime review. It never grants `artist_authored`, `production_eligible`, `production_approved` or PR authorization.
|
|
12
|
+
|
|
13
|
+
### Framer Motion end-to-end reference candidate
|
|
14
|
+
|
|
15
|
+
The repository includes `runtime-pilot-framer`, a code-authored Framer Motion scene rendered by the production adapter at 0%, 50% and 100%. The candidate includes runtime telemetry, an evidence-verifier report, a local-only attestation with `approval: false`, and an identity-bound review handoff for the MotionLoom Dev Lab.
|
|
16
|
+
|
|
17
|
+
### Identity-bound Quality task resolution
|
|
18
|
+
|
|
19
|
+
Quality CI resolves the task bundle by the scene declared in `task.json`, instead of requiring a historical `artifacts/<scene>-task` naming convention. The resolver fails closed for absent, ambiguous or mismatched bindings, and its regression coverage includes a task ID that intentionally differs from the scene slug.
|
|
20
|
+
|
|
21
|
+
## Fixed
|
|
22
|
+
|
|
23
|
+
The Quality workflow no longer fails during runtime telemetry capture for a correctly bound task bundle whose directory name differs from its scene name. All task-aware steps now consume the resolver map rather than reconstructing task paths independently.
|
|
24
|
+
|
|
25
|
+
## Verified behavior
|
|
26
|
+
|
|
27
|
+
Before publication, the target is validated with the full regression harness, `doctor`, documentation audit, Skill validation, package dry-run, diff hygiene and the GitHub Quality, Documentation & Package Hygiene, Security Analysis and Dev Lab Build workflows.
|
|
28
|
+
|
|
29
|
+
## Trust boundary
|
|
30
|
+
|
|
31
|
+
The code-authored lane is **runtime-ready, not production-ready**. Runtime evidence, signature verification, task binding and Dev Lab staging do not replace human visual review. The default remains local-only: MotionLoom does not commit, push, open a pull request, tag a release or publish to npm without the relevant explicit user or maintainer action.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Publish MotionLoom to npm from your workstation
|
|
2
2
|
|
|
3
|
-
This guide publishes the prepared `motionloom@2.
|
|
3
|
+
This guide publishes the prepared `motionloom@2.4.0` package from your own computer. The npm password, authenticator code and access token must stay on your computer; never paste them into chat, GitHub issues or repository files.
|
|
4
4
|
|
|
5
5
|
## 1. Install prerequisites
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@ git pull --ff-only origin main
|
|
|
25
25
|
git log -1 --oneline
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
The latest commit must be the npm packaging release announced in the task. Do not publish from an older checkout or from a different fork.
|
|
28
|
+
The latest commit must be the npm packaging release announced in the task. Do not publish from an older checkout or from a different fork. This repository declares `pnpm` as its package manager and intentionally does not ship a `package-lock.json`; do **not** run `npm ci` in the repository. The release verifier and package dry-run do not require a dependency install. If a full workspace install is needed, use the declared package manager with `pnpm install --frozen-lockfile`.
|
|
29
29
|
|
|
30
30
|
## 3. Authenticate npm locally
|
|
31
31
|
|
|
@@ -48,7 +48,7 @@ npm pack --dry-run --json --ignore-scripts
|
|
|
48
48
|
npm publish --dry-run --access public
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
The dry-run should report `motionloom@2.
|
|
51
|
+
The dry-run should report `motionloom@2.4.0`, public access, and the current package file list. Do not hard-code a historical file count: inspect the JSON output and compare it with the checked-in package allowlist. The prepack hook removes generated Python bytecode before packaging. Do not publish if the dry-run shows private keys, `.env` files, `artifacts/`, `dev-lab/` or `__pycache__/` entries.
|
|
52
52
|
|
|
53
53
|
## 5. Publish the package
|
|
54
54
|
|
|
@@ -58,15 +58,17 @@ When the dry-run is correct and `npm whoami` shows the intended account, publish
|
|
|
58
58
|
npm publish --access public
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
Do not add `--provenance` unless the local npm client and its CI/provider integration explicitly support automatic npm provenance. Some workstation setups report `Automatic provenance generation not supported for provider: null`; in that case the package itself is still valid, and the supported fallback for this release is the command above without `--provenance`. Never retry by changing the version or by bypassing the package verification steps.
|
|
62
|
+
|
|
63
|
+
The version `2.4.0` becomes immutable on npm after a successful publish. If npm reports that the version already exists, stop and verify the registry instead of trying to overwrite it.
|
|
62
64
|
|
|
63
65
|
## 6. Verify the registry publication
|
|
64
66
|
|
|
65
|
-
Run the following commands and confirm that they return `2.
|
|
67
|
+
Run the following commands and confirm that they return `2.4.0` and a tarball URL:
|
|
66
68
|
|
|
67
69
|
```bash
|
|
68
70
|
npm view motionloom version --registry=https://registry.npmjs.org/
|
|
69
|
-
npm view motionloom@2.
|
|
71
|
+
npm view motionloom@2.4.0 name version license dist.tarball dist.shasum --json \
|
|
70
72
|
--registry=https://registry.npmjs.org/
|
|
71
73
|
```
|
|
72
74
|
|
|
@@ -76,7 +78,7 @@ Then test installation in a clean temporary directory:
|
|
|
76
78
|
TMP_DIR="$(mktemp -d)"
|
|
77
79
|
cd "$TMP_DIR"
|
|
78
80
|
npm init --yes
|
|
79
|
-
npm install motionloom@2.
|
|
81
|
+
npm install motionloom@2.4.0
|
|
80
82
|
motionloom --help
|
|
81
83
|
motionloom doctor
|
|
82
84
|
```
|
|
@@ -85,4 +87,13 @@ The CLI should print the MotionLoom command surface. `motionloom doctor` should
|
|
|
85
87
|
|
|
86
88
|
## Troubleshooting
|
|
87
89
|
|
|
88
|
-
If `npm whoami` returns `ENEEDAUTH`, repeat `npm login` on the same computer and registry. If
|
|
90
|
+
If `npm whoami` returns `ENEEDAUTH`, repeat `npm login` on the same computer and registry. If `npm ci` reports that no `package-lock.json` exists, skip it and use the release verifier directly; this repository is pnpm-managed. If `npm publish --provenance` reports that the provider is `null` or unsupported, retry `npm publish --access public` without that flag. If publishing returns `E404` on the `PUT` request, do not change the package name or version yet. First run these read-only checks against the public registry:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm config get registry
|
|
94
|
+
npm whoami --registry=https://registry.npmjs.org/
|
|
95
|
+
npm view motionloom name version maintainers --json --registry=https://registry.npmjs.org/
|
|
96
|
+
npm access list collaborators motionloom --json --registry=https://registry.npmjs.org/
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The `npm whoami` result must be the intended publisher, and the collaborators result must show that account with publish-capable access. A mismatch usually means the workstation is authenticated as a different npm user, is using a stale token, or the package is owned by another account or team. Re-authenticate only on the workstation with `npm logout` followed by `npm login --registry=https://registry.npmjs.org/`; never paste the token into chat. If the account is correct but publish access is absent, the package owner must grant the account read-write access or publish from the owner account. If publishing returns `E403`, check package ownership, organization publish permission and 2FA policy; do not disable security controls. If the package name is already claimed by an account you do not control, stop and do not rename this release without an explicit release decision. Never place an npm token in `package.json`, `.npmrc` committed to Git, shell history or chat.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Ghi chú evidence: kỹ năng nội bộ và Agent Skills đa nền tảng
|
|
2
|
+
|
|
3
|
+
**Ngày khảo sát:** 15 tháng 8 năm 2026
|
|
4
|
+
|
|
5
|
+
## ImageGen nội bộ
|
|
6
|
+
|
|
7
|
+
Skill `imagegen` hiện có của Agent là một bộ hướng dẫn routing/production cho visual deliverable. Với game asset, skill đặt tiêu chí là silhouette tái sử dụng, perspective nhất quán và clean edges; với transparent asset, tiêu chí gồm alpha sạch, subject đầy đủ, không colored fringe hoặc background/shadow không mong muốn. Skill yêu cầu phân biệt creation/editing mang tính semantic với image processing thuần deterministic, và yêu cầu lightweight validation trước delivery.
|
|
8
|
+
|
|
9
|
+
Điều này tạo một boundary rõ cho MotionLoom: ImageGen có thể là **nguồn tạo hoặc chỉnh visual asset**, còn MotionLoom nhận output cùng metadata, đo alpha/geometry/atlas/runtime và quản lý evidence/review. Không được giả định ImageGen tự phát hành seed, model version, license, rig map hoặc production approval. Vì không có API/credential contract trong core MotionLoom, adapter ban đầu phải là `scaffold` receipt importer, không phải provider invoker.
|
|
10
|
+
|
|
11
|
+
## Codex Skills
|
|
12
|
+
|
|
13
|
+
OpenAI mô tả Skill là bundle có version gồm file và `SKILL.md`, hỗ trợ local shell hoặc hosted container, và tương thích Agent Skills standard. Khi skill được mount, model nhìn metadata rồi quyết định kích hoạt; tài liệu cũng yêu cầu xem Skill là code/instruction đặc quyền, kiểm tra trước khi tích hợp và đặt approval cho high-impact action. [1]
|
|
14
|
+
|
|
15
|
+
MotionLoom cần tiếp tục giữ `SKILL.md`, artifacts và local-only default, đồng thời chỉ nhận generator metadata từ một skill đã được user/project cài đặt. Một skill descriptor không phải bằng chứng rằng output asset đã được tạo đúng hoặc được người dùng phê duyệt.
|
|
16
|
+
|
|
17
|
+
## Claude Code Skills
|
|
18
|
+
|
|
19
|
+
Claude Code mô tả Skill là thư mục có `SKILL.md`, có thể được load khi relevant hoặc gọi trực tiếp; built-in skills như `/debug`, `/code-review` và `/verify` cũng là prompt-based orchestration. Tài liệu đặc biệt có giá trị với MotionLoom ở ý tưởng ghi lại run/verify recipe trong project skill để agent sau đó lặp lại workflow đã thành công thay vì suy đoán lại environment. [2]
|
|
20
|
+
|
|
21
|
+
MotionLoom đã đi theo cùng hướng với Project Memory và `setup/status/repair`. Adapter registry sẽ chỉ lưu provider capability/evidence, không tự động chạy một external skill hay mở PR.
|
|
22
|
+
|
|
23
|
+
## Gemini CLI Skills
|
|
24
|
+
|
|
25
|
+
Gemini CLI cũng dùng Agent Skills standard với lifecycle discovery → activation → consent → injection → execution. Tài liệu nêu built-in, extension, user và workspace tiers; `.agents/skills/` được dùng làm alias interoperable. Activation cần consent và skill folder trở thành permitted path sau approval. [3]
|
|
26
|
+
|
|
27
|
+
Điều này củng cố hai yêu cầu cho MotionLoom: registry phải mô tả **capability** thay vì vendor prompt; và skill/adapter có side effect phải có explicit user approval. MotionLoom nên phát hành artifacts portable tại workspace/package level, nhưng không được trở thành một catalog tải/chạy skills tùy ý.
|
|
28
|
+
|
|
29
|
+
## Contract decision
|
|
30
|
+
|
|
31
|
+
Adapter registry sẽ dùng các giá trị sau:
|
|
32
|
+
|
|
33
|
+
| Field | Quyết định |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `adapter_id` | Tên capability ổn định, ví dụ `local-fixture` hoặc `internal-imagegen`, không phải claim về ownership/model quality. |
|
|
36
|
+
| `kind` | `fixture`, `internal_skill`, `external_provider` hoặc `manual_import`. |
|
|
37
|
+
| `status` | `verified`, `scaffold` hoặc `blocked`, chỉ `verified` khi có regression và runtime evidence đúng phạm vi. |
|
|
38
|
+
| `invocation_mode` | `none`, `manual`, `agent-mediated` hoặc `api`; core validator không thực thi invocation. |
|
|
39
|
+
| `cost_class` | `included`, `metered`, `external`, `unknown`; informational only, không phải billing proof. |
|
|
40
|
+
| `evidence_requirements` | Receipt, output hashes, source/provenance reference và runtime evidence tùy output kind. |
|
|
41
|
+
| `approval` | Luôn external/user; registry/receipt không chứa quyền mở PR hay production approval. |
|
|
42
|
+
|
|
43
|
+
## References
|
|
44
|
+
|
|
45
|
+
[1]: https://developers.openai.com/api/docs/guides/tools-skills "OpenAI API — Skills"
|
|
46
|
+
[2]: https://code.claude.com/docs/en/skills "Claude Code — Skills"
|
|
47
|
+
[3]: https://geminicli.com/docs/cli/skills/ "Gemini CLI — Agent Skills"
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# AI Animation and Asset Tools — Research Notes
|
|
2
|
+
|
|
3
|
+
> Working research notes. Claims below are discovery leads from official-site search results and must be verified by opening the source pages before inclusion in the final report.
|
|
4
|
+
|
|
5
|
+
## Initial source leads
|
|
6
|
+
|
|
7
|
+
| Tool / family | Official URL | Discovery lead to verify |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| PixelLab | https://www.pixellab.ai/ | AI pixel-art game assets, animated characters, sprite sheets and environments. |
|
|
10
|
+
| PixelLab API | https://www.pixellab.ai/pixellab-api | API-oriented generation of characters, animations and environments for procedural/live asset creation. |
|
|
11
|
+
| Runway | https://runway.com/product | Text-to-video and image-to-video generation, plus image generation/editing. |
|
|
12
|
+
| DeepMotion | https://www.deepmotion.com/ | Browser-based AI motion capture and body tracking that produces 3D animation from video. |
|
|
13
|
+
| Rokoko Vision | https://www.rokoko.com/products/vision | Video-to-3D animation through an AI mocap solver. |
|
|
14
|
+
| Scenario | https://www.scenario.com/ | Style-consistent game asset generation and animated video positioning; workflow details require verification. |
|
|
15
|
+
| Leonardo AI | https://leonardo.ai/news/how-to-generate-a-full-game-asset-suite-with-leonardo-ai | Game asset ideation, iteration and refinement workflow; official article requires verification. |
|
|
16
|
+
| Ludo.ai | https://ludo.ai/features/sprite-generator | Sprite generation and animation workflow; official feature page requires verification. |
|
|
17
|
+
| GameLab Studio | https://gamelabstudio.co/ | AI sprite-sheet and transparent animation generation; official claims require verification. |
|
|
18
|
+
|
|
19
|
+
## Planned comparison dimensions
|
|
20
|
+
|
|
21
|
+
1. Input controls: text, reference image, video, pose/motion reference, style training or project memory.
|
|
22
|
+
2. Output model: raster frames, sprite sheet, atlas, 2D rig, 3D skeleton animation, video, vector/timeline or runtime component.
|
|
23
|
+
3. Temporal/identity consistency: seed, reference locking, character/style model, pose control, frame geometry and loop controls.
|
|
24
|
+
4. Production integration: export formats, API/CLI, engine/runtime adapters, metadata, versioning and deterministic replay.
|
|
25
|
+
5. Human governance: provenance, license/source records, review checkpoints, editability and approval boundaries.
|
|
26
|
+
6. MotionLoom relevance: which capability belongs in project memory, contracts, analyzers, runtime evidence, Dev Lab or handoff.
|
|
27
|
+
|
|
28
|
+
## Verified findings — PixelLab
|
|
29
|
+
|
|
30
|
+
Source pages opened:
|
|
31
|
+
|
|
32
|
+
- https://www.pixellab.ai/
|
|
33
|
+
- https://www.pixellab.ai/docs/tools/animate-with-skeletons
|
|
34
|
+
|
|
35
|
+
The official product page exposes separate workflows for one-click animation, skeleton-based animation and text-described animation. It also lists 4/8 directional rotation, reference-based style consistency, true inpainting, scenes, tilesets and UI elements. The animation copy explicitly targets walking, running, attacking and custom sprite-sheet animations. The page also positions scene animation as text-described motion for animated environments and dynamic backgrounds.
|
|
36
|
+
|
|
37
|
+
The skeleton documentation page is currently a product/tutorial-style page rather than a full API specification. It confirms the product surface includes skeleton controls, automatic character animation and reference-driven generation, but it does not yet provide enough public detail to claim deterministic skeleton export, frame hashing, atlas metadata or runtime bindings. Those remain questions for MotionLoom to verify at the artifact/export boundary instead of inferring them from visual output.
|
|
38
|
+
|
|
39
|
+
Initial design lesson: a useful AI asset tool separates **character identity/style editing**, **motion authoring**, **directional rotation**, **environment/tileset generation** and **inpainting** into distinct operations. MotionLoom should model these as explicit artifact stages and contracts, not as one generic "generate animation" action.
|
|
40
|
+
|
|
41
|
+
The official PixelLab API page exposes a more structured pipeline than the homepage alone suggests. It separates image generation, image operations, animation, rotation, inpainting/editing, map/tileset generation, character/object state management and prompt enhancement. Relevant animation operations include text animation, text animation v3 with optional start/end frames and up to 16 frames, skeleton animation, skeleton estimation, character animation and animation editing. It also exposes interpolation between images/animations and outfit transfer across frames. Character and object operations are persisted as reusable entities with later states and animations, which is a useful identity-first model.
|
|
42
|
+
|
|
43
|
+
The API page also reveals concrete limits and options such as transparent output, forced palettes, init images, inpainting, direction/view controls, maximum canvas/frame sizes and explicit frame counts. These are implementation facts for PixelLab's API surface, not evidence that every output is production-safe. MotionLoom should treat them as source metadata and then measure the returned artifacts independently.
|
|
44
|
+
|
|
45
|
+
The official style-reference guide states that users add one or more style reference images, describe the desired asset and generate multiple variations. It describes a grid/frame-output relationship based on the largest reference-image dimension and exposes a large reference-image count at small sizes. The important lesson is that style consistency is reference-conditioned and parameterized by output geometry; it is not merely a textual prompt convention. MotionLoom's identity manifest, palette/camera/scale fields and frame-geometry analyzer are the natural verification layer after such a generator.
|
|
46
|
+
|
|
47
|
+
## Verified findings — Runway and DeepMotion
|
|
48
|
+
|
|
49
|
+
Runway's official Gen-4 research page describes a reference-conditioned video workflow: visual references plus instructions are used to create images/videos while maintaining consistent characters, locations, objects, style, mood and cinematographic elements across scenes and perspectives. It emphasizes that this is achieved without fine-tuning or additional training. For MotionLoom, the transferable idea is a reusable **reference bundle** and scene-level identity rather than re-prompting a character from scratch for every shot. The non-transferable assumption is that visual consistency alone proves a game-ready frame contract; raster bounds, sockets, timing and runtime evidence still need independent checks.
|
|
50
|
+
|
|
51
|
+
DeepMotion's official homepage exposes two distinct products/workflows: SayMotion for text-to-3D animation and Animate 3D for video-to-3D animation. It also exposes an Animate 3D API surface in the site navigation. The key architectural lesson is the separation between **motion source acquisition** (text or video) and **3D animation output**. MotionLoom should model body animation as a source-bound motion artifact with rig/skeleton compatibility, retargeting metadata and runtime evidence, not as an opaque generated clip.
|
|
52
|
+
|
|
53
|
+
Rokoko Vision 3.0's official page describes a four-step workflow: upload a video, generate 3D motion, edit/view/loop the capture in Rokoko Studio, upload a character for retargeting, then export to FBX or BVH for tools such as Blender, Unity and Unreal. This is a strong reference for MotionLoom's body-rig path because it makes cleanup, looping, skeleton choice and export explicit stages after AI inference. The page also links integrations and motion-data workflows, reinforcing that the generated result is an editable motion artifact rather than only a rendered video.
|
|
54
|
+
|
|
55
|
+
Luma's official Ray3.2 page positions multi-keyframe control, Modify Video and Motion/Structure settings as first-class controls. The page exposes FAQ topics for preserving actor/performance, lip-sync/dialogue timing, source-video frame rate, footage suitability and keyframe counts. Even where the page does not expose all answers in static extraction, the architecture is clear: preserve source motion/structure while changing appearance, and use explicit keyframes to direct continuity. MotionLoom can learn the separation between source motion, structural constraints and appearance transformation, while still requiring its own runtime telemetry and artifact checks.
|
|
56
|
+
|
|
57
|
+
Scenario's official platform page describes an AI creative infrastructure spanning image, video, audio and 3D, with a custom-model workflow that trains on 5–100 reference images, supports custom LoRA models and embeds brand/style guidance. It also exposes visual multi-step workflows, batch generation, reusable templates, API and MCP integration. The page lists concrete game-oriented workflows such as splitting a character/object/scene into isolated components, pose transfer and character variation, 2D animation rigging sheets, 3D auto-rigging and concept-to-game-ready 3D. The lesson for MotionLoom is to treat an AI tool as an orchestrated graph of reusable steps and agents, not only a single model call. Any claims about Scenario's internal model quality or production readiness still require artifact-level validation.
|
|
58
|
+
|
|
59
|
+
The previously discovered Adobe Firefly Video Model blog URL returned HTTP 404 when opened, so it is excluded as evidence for this report. Adobe Firefly remains a candidate source for a later pass using a currently valid official product or help page; no unsupported claim is made from the stale search snippet.
|
|
60
|
+
|
|
61
|
+
Cascadeur's official AI-tools documentation is unusually explicit about the division of labor. It lists AutoPosing, Inbetweening, AutoInterpolation and Video Mocap as ML-based tools, while separating AutoPhysics, Ragdoll, Animation Unbaking and Fulcrum Motion Cleaning as non-ML tools. AutoPosing predicts a pose from activated manipulators and their locations; Inbetweening predicts motion between keyed poses using pose, timing, keyframe count and style; AutoInterpolation predicts interpolation/kinematics types; Video Mocap extracts actor poses and applies them to a rigged character. Cascadeur also states that its tools assist rather than replace the animator, and that users' animations are not collected for training. This is a strong model for MotionLoom's human-governed boundary: AI proposes or fills motion, deterministic tools clean/measure it, and the user remains the authority for acceptance.
|
|
62
|
+
|
|
63
|
+
The current Adobe Firefly Help URL was found through official search results but returned no extractable page content in this browser session. It is therefore not treated as fully verified evidence here. The candidate workflow is camera-motion transfer from a reference video with a start frame, but this requires a future successful page extraction before being used for a strong claim.
|
|
64
|
+
|
|
65
|
+
Kinetix's current official homepage describes video-to-animation models for 3D character animation and points to integration into Unity Muse, an in-game Emote Creator for OVERDARE, and AI-assisted animation in Adobe Mixamo. This is relevant because the output is positioned as reusable in-game 3D animation, not merely a video render, and because moderation is mentioned for the player-generated emote workflow. The official publication URL suggested by the page returned 404, so no additional technical claim is taken from it.
|
|
66
|
+
|
|
67
|
+
## Cross-tool pipeline synthesis
|
|
68
|
+
|
|
69
|
+
Across the verified sources, the strongest tools do not rely on one prompt-to-final-output step. They expose a sequence of controls and artifacts:
|
|
70
|
+
|
|
71
|
+
| Pipeline layer | Patterns observed | MotionLoom implication |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Identity/style | Reference images, custom style models, init images, palettes, persisted characters/objects | Keep identity manifest, reference hashes, palette/camera/scale and derivation chain as first-class inputs. |
|
|
74
|
+
| Motion source | Text action description, skeleton/pose controls, keyed poses, video performance or camera-motion reference | Bind the source type and source hash to the motion spec; do not treat generated pixels as the only source of truth. |
|
|
75
|
+
| Temporal construction | Explicit frame counts, start/end frames, inbetweening, interpolation, multi-keyframes, animation-to-animation editing | Expand action-set with source keyframes, timing, loop seam and editable intermediate evidence. |
|
|
76
|
+
| Spatial/rig mapping | Skeleton estimation, retargeting, 2D rig sheets, 3D auto-rigging, camera/direction/projection controls | Add rig compatibility, socket map, anchor/pivot and coordinate-system metadata before runtime rendering. |
|
|
77
|
+
| Cleanup/measurement | Studio cleanup, looping, physics tools, inpainting, frame editing, palette/geometry limits | Separate deterministic cleanup and measurement from model generation; fail closed on contamination/drift. |
|
|
78
|
+
| Packaging/runtime | Sprite sheets, FBX/BVH, game-engine integration, API/MCP, reusable templates and persisted states | Make export contract, runtime adapter and Dev Lab evidence mandatory for claims of readiness. |
|
|
79
|
+
| Governance | Licensed training data disclosures, moderation, style ownership, human review and approval boundaries | Keep provenance and user approval separate; record source/license/model details without self-asserted authority. |
|
|
80
|
+
|
|
81
|
+
This synthesis suggests that MotionLoom's differentiator should not be another generator. It should be the **artifact compiler and review governor between generators and real runtimes**: accept outputs from multiple tools, normalize their source/identity/motion metadata, measure the artifacts, render them in the target runtime, and return a user-facing evidence bundle before any PR action.
|