motionloom 2.0.0 → 2.2.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/.agents/skills/motionloom/SKILL.md +14 -0
- package/.claude/skills/motionloom.md +5 -0
- package/.codex/skills/motionloom.md +11 -0
- package/AGENTS.md +17 -0
- package/CHANGELOG.md +68 -0
- package/CODE_OF_CONDUCT.md +19 -0
- package/CONTRIBUTING.md +65 -0
- package/README.md +193 -134
- package/ROADMAP.md +36 -0
- package/SECURITY.md +28 -0
- package/SKILL.md +57 -9
- package/SUPPORT.md +23 -0
- package/agent-card.json +42 -6
- package/agent-surfaces.json +79 -0
- package/bin/motionloom.mjs +33 -5
- package/docs/AGENT-INTEGRATION.md +47 -0
- package/docs/CHECKLIST.md +2 -1
- package/docs/STATUS.md +33 -0
- package/docs/audits/2.1.0-deep-stress-evaluation.md +97 -0
- package/docs/audits/ci-replay-remediation-2026-08-13.md +33 -0
- package/docs/audits/data/2.1.0-deep-stress-6900.json +329 -0
- package/docs/audits/data/deep-stress-latest.json +329 -0
- package/docs/audits/external-project-corpus-2026-08-13.md +26 -0
- package/docs/releases/2.1.0.md +23 -0
- package/docs/releases/2.2.0.md +35 -0
- package/docs/releases/npm-publish-from-workstation.md +6 -6
- package/examples/agent-consumer/README.md +18 -0
- package/examples/agent-consumer/fixture-manifest.json +82 -0
- package/package.json +69 -28
- package/references/agent-interoperability.md +29 -0
- package/references/intelligence-core.md +5 -1
- package/schemas/agent-surfaces.schema.json +78 -0
- package/schemas/project-memory.schema.json +180 -0
- package/schemas/remediation-history.schema.json +23 -0
- package/schemas/scene-manifest.schema.json +1 -0
- package/schemas/visual-truth.schema.json +80 -0
- package/scripts/analyze.py +56 -0
- package/scripts/capture-runtime-telemetry.py +119 -0
- package/scripts/devlab.py +126 -0
- package/scripts/discovery.py +257 -0
- package/scripts/docs-audit.py +112 -0
- package/scripts/eval-intelligence.py +23 -0
- package/scripts/eval-projects.py +156 -0
- package/scripts/intelligence.py +106 -6
- package/scripts/pr.py +151 -0
- package/scripts/prepack-clean.mjs +37 -0
- package/scripts/project-memory.py +483 -0
- package/scripts/project_memory_loader.py +31 -0
- package/scripts/quality-gate.py +43 -3
- package/scripts/release-verify.py +52 -0
- package/scripts/remediation-learning.py +326 -0
- package/scripts/render.py +65 -0
- package/scripts/report.py +60 -2
- package/scripts/review-hook.py +13 -2
- package/scripts/skill-doctor.py +12 -2
- package/scripts/to-dotlottie.mjs +26 -20
- package/scripts/visual-truth.py +310 -0
- package/src/core/analyzer.py +174 -25
- package/src/output/browser-review-smoke/manifest.json +1 -0
- package/src/output/browser-review-smoke/visual-truth.json +68 -0
- package/tests/evals/intelligence-cases.json +10 -0
- package/tests/evals/project-corpus.json +51 -0
- package/tests/scripts/run_tests.py +111 -1
- package/tests/scripts/test_project_memory.py +129 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"audit": "motionloom-deep-stress",
|
|
4
|
+
"generated_at": "2026-08-13T10:13:55.979988Z",
|
|
5
|
+
"seed": 20260813,
|
|
6
|
+
"requested_iterations": 5000,
|
|
7
|
+
"actual_iterations": 6900,
|
|
8
|
+
"fixture": {
|
|
9
|
+
"task_id": "browser-review-smoke-task",
|
|
10
|
+
"scene": "browser-review-smoke"
|
|
11
|
+
},
|
|
12
|
+
"summary": {
|
|
13
|
+
"passed": 6900,
|
|
14
|
+
"failed": 0,
|
|
15
|
+
"pass_rate": 1.0,
|
|
16
|
+
"false_positive": 0,
|
|
17
|
+
"false_negative": 0,
|
|
18
|
+
"clean_contracts_preserved": true,
|
|
19
|
+
"faults_rejected_without_false_negative": true,
|
|
20
|
+
"approval_false_invariant_preserved": true
|
|
21
|
+
},
|
|
22
|
+
"metrics": {
|
|
23
|
+
"canonical-json-metamorphic": {
|
|
24
|
+
"attempts": 600,
|
|
25
|
+
"passed": 600,
|
|
26
|
+
"failed": 0,
|
|
27
|
+
"false_positive": 0,
|
|
28
|
+
"false_negative": 0,
|
|
29
|
+
"codes": {
|
|
30
|
+
"equal": 600
|
|
31
|
+
},
|
|
32
|
+
"p50_ms": 0.018526,
|
|
33
|
+
"p95_ms": 0.019782,
|
|
34
|
+
"max_ms": 0.034744,
|
|
35
|
+
"pass_rate": 1.0
|
|
36
|
+
},
|
|
37
|
+
"dsse-ed25519-roundtrip": {
|
|
38
|
+
"attempts": 250,
|
|
39
|
+
"passed": 250,
|
|
40
|
+
"failed": 0,
|
|
41
|
+
"false_positive": 0,
|
|
42
|
+
"false_negative": 0,
|
|
43
|
+
"codes": {
|
|
44
|
+
"verified": 250
|
|
45
|
+
},
|
|
46
|
+
"p50_ms": 0.127995,
|
|
47
|
+
"p95_ms": 0.141972,
|
|
48
|
+
"max_ms": 0.244296,
|
|
49
|
+
"pass_rate": 1.0
|
|
50
|
+
},
|
|
51
|
+
"dsse-ed25519-tamper": {
|
|
52
|
+
"attempts": 250,
|
|
53
|
+
"passed": 250,
|
|
54
|
+
"failed": 0,
|
|
55
|
+
"false_positive": 0,
|
|
56
|
+
"false_negative": 0,
|
|
57
|
+
"codes": {
|
|
58
|
+
"invalid-signature": 250
|
|
59
|
+
},
|
|
60
|
+
"p50_ms": 0.131456,
|
|
61
|
+
"p95_ms": 0.144911,
|
|
62
|
+
"max_ms": 0.257528,
|
|
63
|
+
"pass_rate": 1.0
|
|
64
|
+
},
|
|
65
|
+
"statement-contract": {
|
|
66
|
+
"attempts": 600,
|
|
67
|
+
"passed": 600,
|
|
68
|
+
"failed": 0,
|
|
69
|
+
"false_positive": 0,
|
|
70
|
+
"false_negative": 0,
|
|
71
|
+
"codes": {
|
|
72
|
+
"valid": 200,
|
|
73
|
+
"rejected": 400
|
|
74
|
+
},
|
|
75
|
+
"p50_ms": 0.007304,
|
|
76
|
+
"p95_ms": 0.008605,
|
|
77
|
+
"max_ms": 0.063033,
|
|
78
|
+
"pass_rate": 1.0
|
|
79
|
+
},
|
|
80
|
+
"attestation-verifier-boundary": {
|
|
81
|
+
"attempts": 1500,
|
|
82
|
+
"passed": 1500,
|
|
83
|
+
"failed": 0,
|
|
84
|
+
"false_positive": 0,
|
|
85
|
+
"false_negative": 0,
|
|
86
|
+
"codes": {
|
|
87
|
+
"0": 375,
|
|
88
|
+
"11": 375,
|
|
89
|
+
"14": 375,
|
|
90
|
+
"13": 375
|
|
91
|
+
},
|
|
92
|
+
"p50_ms": 0.300549,
|
|
93
|
+
"p95_ms": 0.484133,
|
|
94
|
+
"max_ms": 0.866072,
|
|
95
|
+
"pass_rate": 1.0
|
|
96
|
+
},
|
|
97
|
+
"strict-quality-gate-clean": {
|
|
98
|
+
"attempts": 400,
|
|
99
|
+
"passed": 400,
|
|
100
|
+
"failed": 0,
|
|
101
|
+
"false_positive": 0,
|
|
102
|
+
"false_negative": 0,
|
|
103
|
+
"codes": {
|
|
104
|
+
"accepted": 400
|
|
105
|
+
},
|
|
106
|
+
"p50_ms": 25.817357,
|
|
107
|
+
"p95_ms": 28.37167,
|
|
108
|
+
"max_ms": 35.746459,
|
|
109
|
+
"pass_rate": 1.0
|
|
110
|
+
},
|
|
111
|
+
"intelligence-p1-clean": {
|
|
112
|
+
"attempts": 400,
|
|
113
|
+
"passed": 400,
|
|
114
|
+
"failed": 0,
|
|
115
|
+
"false_positive": 0,
|
|
116
|
+
"false_negative": 0,
|
|
117
|
+
"codes": {
|
|
118
|
+
"accepted": 400
|
|
119
|
+
},
|
|
120
|
+
"p50_ms": 19.18085,
|
|
121
|
+
"p95_ms": 21.672868,
|
|
122
|
+
"max_ms": 29.969583,
|
|
123
|
+
"pass_rate": 1.0
|
|
124
|
+
},
|
|
125
|
+
"replay-hash-clean": {
|
|
126
|
+
"attempts": 475,
|
|
127
|
+
"passed": 475,
|
|
128
|
+
"failed": 0,
|
|
129
|
+
"false_positive": 0,
|
|
130
|
+
"false_negative": 0,
|
|
131
|
+
"codes": {
|
|
132
|
+
"clean": 475
|
|
133
|
+
},
|
|
134
|
+
"p50_ms": 7.51816,
|
|
135
|
+
"p95_ms": 7.916555,
|
|
136
|
+
"max_ms": 11.545468,
|
|
137
|
+
"pass_rate": 1.0
|
|
138
|
+
},
|
|
139
|
+
"semantic-lint-clean": {
|
|
140
|
+
"attempts": 475,
|
|
141
|
+
"passed": 475,
|
|
142
|
+
"failed": 0,
|
|
143
|
+
"false_positive": 0,
|
|
144
|
+
"false_negative": 0,
|
|
145
|
+
"codes": {
|
|
146
|
+
"clean": 475
|
|
147
|
+
},
|
|
148
|
+
"p50_ms": 0.024703,
|
|
149
|
+
"p95_ms": 0.03313,
|
|
150
|
+
"max_ms": 0.08727,
|
|
151
|
+
"pass_rate": 1.0
|
|
152
|
+
},
|
|
153
|
+
"continuity-clean": {
|
|
154
|
+
"attempts": 475,
|
|
155
|
+
"passed": 475,
|
|
156
|
+
"failed": 0,
|
|
157
|
+
"false_positive": 0,
|
|
158
|
+
"false_negative": 0,
|
|
159
|
+
"codes": {
|
|
160
|
+
"clean": 475
|
|
161
|
+
},
|
|
162
|
+
"p50_ms": 0.024346,
|
|
163
|
+
"p95_ms": 0.033119,
|
|
164
|
+
"max_ms": 0.052678,
|
|
165
|
+
"pass_rate": 1.0
|
|
166
|
+
},
|
|
167
|
+
"approval-invariant": {
|
|
168
|
+
"attempts": 475,
|
|
169
|
+
"passed": 475,
|
|
170
|
+
"failed": 0,
|
|
171
|
+
"false_positive": 0,
|
|
172
|
+
"false_negative": 0,
|
|
173
|
+
"codes": {
|
|
174
|
+
"approval=false": 475
|
|
175
|
+
},
|
|
176
|
+
"p50_ms": 0.063713,
|
|
177
|
+
"p95_ms": 0.080847,
|
|
178
|
+
"max_ms": 0.1211,
|
|
179
|
+
"pass_rate": 1.0
|
|
180
|
+
},
|
|
181
|
+
"fault-graph-task-id": {
|
|
182
|
+
"attempts": 100,
|
|
183
|
+
"passed": 100,
|
|
184
|
+
"failed": 0,
|
|
185
|
+
"false_positive": 0,
|
|
186
|
+
"false_negative": 0,
|
|
187
|
+
"codes": {
|
|
188
|
+
"rejected": 100
|
|
189
|
+
},
|
|
190
|
+
"p50_ms": 13.765242,
|
|
191
|
+
"p95_ms": 15.757552,
|
|
192
|
+
"max_ms": 17.026196,
|
|
193
|
+
"pass_rate": 1.0
|
|
194
|
+
},
|
|
195
|
+
"fault-motion-ir-scene": {
|
|
196
|
+
"attempts": 100,
|
|
197
|
+
"passed": 100,
|
|
198
|
+
"failed": 0,
|
|
199
|
+
"false_positive": 0,
|
|
200
|
+
"false_negative": 0,
|
|
201
|
+
"codes": {
|
|
202
|
+
"rejected": 100
|
|
203
|
+
},
|
|
204
|
+
"p50_ms": 2.148835,
|
|
205
|
+
"p95_ms": 2.448147,
|
|
206
|
+
"max_ms": 2.860418,
|
|
207
|
+
"pass_rate": 1.0
|
|
208
|
+
},
|
|
209
|
+
"fault-provenance-task-id": {
|
|
210
|
+
"attempts": 100,
|
|
211
|
+
"passed": 100,
|
|
212
|
+
"failed": 0,
|
|
213
|
+
"false_positive": 0,
|
|
214
|
+
"false_negative": 0,
|
|
215
|
+
"codes": {
|
|
216
|
+
"rejected": 100
|
|
217
|
+
},
|
|
218
|
+
"p50_ms": 0.857105,
|
|
219
|
+
"p95_ms": 1.049827,
|
|
220
|
+
"max_ms": 1.36859,
|
|
221
|
+
"pass_rate": 1.0
|
|
222
|
+
},
|
|
223
|
+
"fault-replay-path-escape": {
|
|
224
|
+
"attempts": 100,
|
|
225
|
+
"passed": 100,
|
|
226
|
+
"failed": 0,
|
|
227
|
+
"false_positive": 0,
|
|
228
|
+
"false_negative": 0,
|
|
229
|
+
"codes": {
|
|
230
|
+
"rejected": 100
|
|
231
|
+
},
|
|
232
|
+
"p50_ms": 8.091177,
|
|
233
|
+
"p95_ms": 9.353946,
|
|
234
|
+
"max_ms": 10.112846,
|
|
235
|
+
"pass_rate": 1.0
|
|
236
|
+
},
|
|
237
|
+
"fault-p1-fix-plan-hash": {
|
|
238
|
+
"attempts": 100,
|
|
239
|
+
"passed": 100,
|
|
240
|
+
"failed": 0,
|
|
241
|
+
"false_positive": 0,
|
|
242
|
+
"false_negative": 0,
|
|
243
|
+
"codes": {
|
|
244
|
+
"rejected": 100
|
|
245
|
+
},
|
|
246
|
+
"p50_ms": 0.730294,
|
|
247
|
+
"p95_ms": 0.866361,
|
|
248
|
+
"max_ms": 1.132574,
|
|
249
|
+
"pass_rate": 1.0
|
|
250
|
+
},
|
|
251
|
+
"fault-p1-wrong-scene": {
|
|
252
|
+
"attempts": 100,
|
|
253
|
+
"passed": 100,
|
|
254
|
+
"failed": 0,
|
|
255
|
+
"false_positive": 0,
|
|
256
|
+
"false_negative": 0,
|
|
257
|
+
"codes": {
|
|
258
|
+
"rejected": 100
|
|
259
|
+
},
|
|
260
|
+
"p50_ms": 0.675249,
|
|
261
|
+
"p95_ms": 0.807189,
|
|
262
|
+
"max_ms": 1.103894,
|
|
263
|
+
"pass_rate": 1.0
|
|
264
|
+
},
|
|
265
|
+
"fault-continuity-structure": {
|
|
266
|
+
"attempts": 100,
|
|
267
|
+
"passed": 100,
|
|
268
|
+
"failed": 0,
|
|
269
|
+
"false_positive": 0,
|
|
270
|
+
"false_negative": 0,
|
|
271
|
+
"codes": {
|
|
272
|
+
"rejected": 100
|
|
273
|
+
},
|
|
274
|
+
"p50_ms": 0.066832,
|
|
275
|
+
"p95_ms": 0.081028,
|
|
276
|
+
"max_ms": 0.100648,
|
|
277
|
+
"pass_rate": 1.0
|
|
278
|
+
},
|
|
279
|
+
"fault-semantic-structure": {
|
|
280
|
+
"attempts": 100,
|
|
281
|
+
"passed": 100,
|
|
282
|
+
"failed": 0,
|
|
283
|
+
"false_positive": 0,
|
|
284
|
+
"false_negative": 0,
|
|
285
|
+
"codes": {
|
|
286
|
+
"rejected": 100
|
|
287
|
+
},
|
|
288
|
+
"p50_ms": 0.064075,
|
|
289
|
+
"p95_ms": 0.081449,
|
|
290
|
+
"max_ms": 0.116428,
|
|
291
|
+
"pass_rate": 1.0
|
|
292
|
+
},
|
|
293
|
+
"fault-attestation-approval": {
|
|
294
|
+
"attempts": 100,
|
|
295
|
+
"passed": 100,
|
|
296
|
+
"failed": 0,
|
|
297
|
+
"false_positive": 0,
|
|
298
|
+
"false_negative": 0,
|
|
299
|
+
"codes": {
|
|
300
|
+
"10": 100
|
|
301
|
+
},
|
|
302
|
+
"p50_ms": 0.204615,
|
|
303
|
+
"p95_ms": 0.265782,
|
|
304
|
+
"max_ms": 0.341527,
|
|
305
|
+
"pass_rate": 1.0
|
|
306
|
+
},
|
|
307
|
+
"fault-attestation-payload": {
|
|
308
|
+
"attempts": 100,
|
|
309
|
+
"passed": 100,
|
|
310
|
+
"failed": 0,
|
|
311
|
+
"false_positive": 0,
|
|
312
|
+
"false_negative": 0,
|
|
313
|
+
"codes": {
|
|
314
|
+
"11": 100
|
|
315
|
+
},
|
|
316
|
+
"p50_ms": 0.262104,
|
|
317
|
+
"p95_ms": 0.301103,
|
|
318
|
+
"max_ms": 0.414031,
|
|
319
|
+
"pass_rate": 1.0
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
"failures": [],
|
|
323
|
+
"interpretation": {
|
|
324
|
+
"logical_trials": "Each trial executes a real repository validator/helper against canonical fixture bytes or a controlled mutation; this is not a claim that 5,000 browser renders were performed.",
|
|
325
|
+
"false_positive": "A clean canonical case was rejected.",
|
|
326
|
+
"false_negative": "A controlled tamper, binding, revocation or invalid-contract case was accepted."
|
|
327
|
+
},
|
|
328
|
+
"wall_time_s": 25.354826
|
|
329
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# External Project Corpus Evidence — 2026-08-13
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
This is a labeled analyzer evaluation, not a claim that MotionLoom has been validated across the entire animation ecosystem. The runner reads explicit checkouts only; it does not install dependencies, execute external project code, or treat an absent checkout as a pass.
|
|
6
|
+
|
|
7
|
+
## Reproducibility
|
|
8
|
+
|
|
9
|
+
The evaluation used `python3 scripts/eval-projects.py` with the default bounded scan policy: at most 2,500 files, 25,000,000 bytes and 10 seconds per project. The first-party repository was evaluated from the local MotionLoom checkout. External checkouts were placed under `external/` in a temporary workspace and pinned to the following observed commits.
|
|
10
|
+
|
|
11
|
+
| Case | Source | Observed revision | Result | Signals checked |
|
|
12
|
+
|---|---|---|---|---|
|
|
13
|
+
| MotionLoom | [lenhonbp/MotionLoom](https://github.com/lenhonbp/MotionLoom) | local checkout | PASS | `name=motionloom` |
|
|
14
|
+
| Motion One | [motiondivision/motion](https://github.com/motiondivision/motion) | `adaf7a4e5368d704ea350669f6ac674fb26ff270` | PASS | `name=motion-one`, `framework=motion` |
|
|
15
|
+
| GSAP | [greensock/GSAP](https://github.com/greensock/GSAP) | `13e2b790546426a1a2e0e9b409f3f8dc6d6611f2` | PASS | `framework=gsap` |
|
|
16
|
+
| Rive React | [rive-app/rive-react](https://github.com/rive-app/rive-react) | `c05ec1842324a4a61d01f8e49dfd2ac2c37ae72c` | PASS | `name=rive-react`, `framework=rive` |
|
|
17
|
+
|
|
18
|
+
The final report was `status=pass`, with 3/3 required external projects available and 4/4 total cases passing. All four scans reported `scan_truncated=false` under the stated budgets.
|
|
19
|
+
|
|
20
|
+
## Interpretation
|
|
21
|
+
|
|
22
|
+
The package-identity precedence change is material. Motion One is a monorepo whose root workspace contains GSAP tooling; a dependency-only detector labeled it GSAP. Rive React similarly contains React dependencies but should expose a Rive runtime signal. MotionLoom now prefers an exact package identity (`motion`, `motion-one`, `framer-motion`, Rive packages) before generic dependency fallback, while retaining the bounded scan metadata.
|
|
23
|
+
|
|
24
|
+
This evidence supports a **small, reproducible analyzer corpus signal**. It does not prove animation quality, runtime correctness, visual fidelity, accessibility, licensing compliance, or first-pass acceptance. Those remain separate gates requiring runtime evidence, Dev Lab review and explicit user confirmation.
|
|
25
|
+
|
|
26
|
+
When external checkouts are not supplied, the same command intentionally reports `insufficient_evidence`; CI uses `--allow-insufficient` for visibility without converting missing product evidence into a green product claim.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
MotionLoom 2.1.0 adds durable, relocatable **Project Memory** and a cross-platform execution layer for Ubuntu, macOS and Windows. The memory restores project identity, motion decisions, rejected patterns, remediation outcomes, runtime policy and freshness state after long periods without animation work or after an Agent context reset. It remains project context rather than approval: stale, invalid or cross-project memory is never treated as permission to generate, confirm or open a PR.
|
|
4
|
+
|
|
5
|
+
## Added
|
|
6
|
+
|
|
7
|
+
The release adds `schemas/project-memory.schema.json`, the `memory init`, `inspect`, `validate`, `refresh`, `recover`, `record-decision` and `record-outcome` lifecycle, atomic writes, canonical integrity checking, stable exit codes and a loader API for other MotionLoom scripts. Durable outcomes require `--user-confirmed`; unreviewed outcomes cannot become learning signals. Project identity binds to a normalized Git remote when available and falls back to the package/project name, so the memory is not tied to an absolute checkout path.
|
|
8
|
+
|
|
9
|
+
The integrity contract treats `project.root_path` as runtime metadata. A relocated checkout can be rebound to its current path during recovery without invalidating the durable payload, while meaningful direct edits still fail the integrity guard. Recovery also refreshes the current repository and package metadata atomically. Cross-project recovery remains fail-closed through identity comparison.
|
|
10
|
+
|
|
11
|
+
The npm CLI now routes memory, analyze, Dev Lab, render, PR preflight and runtime telemetry commands through platform-neutral Node/Python entrypoints. The implementation avoids Bash-only orchestration, hard-coded temporary paths, shell-string execution and system `zip`/`unzip` requirements in the user-facing workflow. The CI workflow includes an Ubuntu/macOS/Windows matrix for the cross-platform contract.
|
|
12
|
+
|
|
13
|
+
## Verified behavior
|
|
14
|
+
|
|
15
|
+
The release acceptance suite passes Python compilation, Project Memory recovery/relocation contracts, the full regression harness, intelligence evaluation, Skill Doctor, report contract, strict quality gate with browser review/intelligence/P1/benchmark/telemetry/attestation requirements, npm packaging dry-run and the Animation Dev Lab production build. The relocation fixture covers Unicode and space-containing paths, Git remote identity, user-confirmed decisions/outcomes, stale context detection and current-path rebinding.
|
|
16
|
+
|
|
17
|
+
`npm publish --dry-run --access public` produces the intended public tarball `motionloom-2.1.0.tgz` with package version `2.1.0`. Actual publication must be performed from the maintainer workstation using the authenticated npm account; this sandbox run does not publish the package.
|
|
18
|
+
|
|
19
|
+
## Trust boundary and remaining scope
|
|
20
|
+
|
|
21
|
+
Project Memory is a continuity and context mechanism, not a user-review substitute. It does not approve animation quality, visual fidelity, accessibility, source licensing, runtime evidence or PR side effects. Dev Lab review, artifact binding, attestation verification and explicit user confirmation remain required before any PR operation.
|
|
22
|
+
|
|
23
|
+
Visual comparison with provenance-labeled fixtures, append-only benchmark history, multi-project/browser/device corpus and remediation metrics for first-pass acceptance and rerender avoidance remain the next roadmap slice. The Dev Lab build still reports a bundle-size advisory for the main JavaScript chunk; it is a performance warning, not an acceptance failure.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# MotionLoom 2.2.0
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
MotionLoom 2.2.0 turns the project-aware animation Skill into a more portable Agent production contract. This release candidate adds canonical discovery surfaces, consumer fixtures, cross-platform installation evidence, provenance-bound Visual Truth, append-only Remediation Learning and a CI replay remediation that fails closed without confusing stale evidence with user approval.
|
|
6
|
+
|
|
7
|
+
## Added
|
|
8
|
+
|
|
9
|
+
### Agent interoperability and installation
|
|
10
|
+
|
|
11
|
+
The package now exposes one canonical `SKILL.md` through `.agents/skills`, `.claude`, `.codex` and `AGENTS.md`. The discovery manifest and schema describe source kind, version, canonical files, compatibility and verification commands. The `motionloom discovery check`, `source` and `install-matrix` commands are cross-platform and do not require network access for local contract checks.
|
|
12
|
+
|
|
13
|
+
The consumer fixture manifest covers Lottie/dotLottie, Rive, GSAP, Framer Motion, body rigs and multi-scene continuity. Ubuntu, macOS and Windows are represented as explicit installation-matrix targets rather than an unverified portability claim.
|
|
14
|
+
|
|
15
|
+
### Visual Truth
|
|
16
|
+
|
|
17
|
+
`visual-truth.json` binds baseline and candidate frame hashes, dimensions, scene/task identity, source and manifest provenance, runtime evidence and Motion IR where available. The validator emits deterministic comparison signals and region-level explanations for review. A changed frame produces `review_required`; it never becomes automatic approval.
|
|
18
|
+
|
|
19
|
+
### Remediation Learning
|
|
20
|
+
|
|
21
|
+
The append-only, hash-chained remediation history stores user-confirmed outcomes and deterministic benchmark records. Summaries expose correction count, first-pass acceptance, success rate, issue-class outliers and benchmark pass rate. Unconfirmed outcomes cannot enter acceptance metrics.
|
|
22
|
+
|
|
23
|
+
## Fixed
|
|
24
|
+
|
|
25
|
+
The Quality workflow now rebuilds the exact task-bound replay bundle after runtime, report and attestation artifacts are generated and before the context-bound quality gate. Regression coverage exercises tamper rejection and canonical replay rebuild, preventing stale generated hashes from causing a false CI rejection.
|
|
26
|
+
|
|
27
|
+
## Verified behavior
|
|
28
|
+
|
|
29
|
+
The release candidate passes the full regression harness, docs audit, Skill Doctor, skill-creator validator, runtime adapter smoke, discovery and installation matrix checks, Visual Truth validation, Remediation Learning validation, quality attestation with Visual Truth required, npm package dry-run, Python syntax compilation and diff hygiene. The mainline commit carrying the replay fix also passed Quality, Documentation and Package Hygiene, and Security workflows on GitHub.
|
|
30
|
+
|
|
31
|
+
## Trust boundary and remaining scope
|
|
32
|
+
|
|
33
|
+
This release does not infer approval from visual metrics, heuristics, signatures, attestations or benchmark scores. The user must inspect the Dev Lab review candidate and explicitly approve before PR preparation. Commit, push, tag creation, GitHub Release creation and npm publication remain separate explicit side effects.
|
|
34
|
+
|
|
35
|
+
The next evidence priority is paired evaluation across additional real animation projects to measure first-pass acceptance, correction count, time-to-fix and rerender avoidance without presenting synthetic scores as human approval.
|
|
@@ -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.2.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
|
|
|
@@ -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.2.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,15 @@ 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
|
-
The version `2.
|
|
61
|
+
The version `2.2.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
62
|
|
|
63
63
|
## 6. Verify the registry publication
|
|
64
64
|
|
|
65
|
-
Run the following commands and confirm that they return `2.
|
|
65
|
+
Run the following commands and confirm that they return `2.2.0` and a tarball URL:
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
68
|
npm view motionloom version --registry=https://registry.npmjs.org/
|
|
69
|
-
npm view motionloom@2.
|
|
69
|
+
npm view motionloom@2.2.0 name version license dist.tarball dist.shasum --json \
|
|
70
70
|
--registry=https://registry.npmjs.org/
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -76,7 +76,7 @@ Then test installation in a clean temporary directory:
|
|
|
76
76
|
TMP_DIR="$(mktemp -d)"
|
|
77
77
|
cd "$TMP_DIR"
|
|
78
78
|
npm init --yes
|
|
79
|
-
npm install motionloom@2.
|
|
79
|
+
npm install motionloom@2.2.0
|
|
80
80
|
motionloom --help
|
|
81
81
|
motionloom doctor
|
|
82
82
|
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Agent consumer fixtures
|
|
2
|
+
|
|
3
|
+
This example set is a small, machine-readable map of how an Agent should consume MotionLoom. It is intentionally not a fake demo application and it does not claim user approval. Each case points to a repository artifact or a real runtime harness and states its evidence level.
|
|
4
|
+
|
|
5
|
+
Run the offline contract checks first:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
motionloom discovery check --root . --json
|
|
9
|
+
python3 tests/scripts/test_consumer_fixtures.py
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
For the browser-backed runtime cases, install the repository dependencies and run:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
npm run runtime:test
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The real runtime harness emits deterministic scrub points at 0/50/100% for Rive, GSAP and Framer Motion. The Lottie and dotLottie cases are asset/package contracts; they must not be described as runtime-verified unless corresponding runtime evidence exists in the task bundle. The body-rig and continuity cases exercise structure and cross-scene semantics.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"fixture_set": "agent-consumer-smoke",
|
|
4
|
+
"purpose": "Show Agents how to select an animation capability, locate evidence and preserve review boundaries.",
|
|
5
|
+
"repository_root": "..",
|
|
6
|
+
"cases": [
|
|
7
|
+
{
|
|
8
|
+
"id": "lottie-json-source-bound",
|
|
9
|
+
"framework": "lottie",
|
|
10
|
+
"category": "asset-runtime",
|
|
11
|
+
"source": "src/output/browser-review-smoke/animation.json",
|
|
12
|
+
"manifest": "src/output/browser-review-smoke/manifest.json",
|
|
13
|
+
"verification": "python3 scripts/validate-lottie.py src/output/browser-review-smoke/animation.json",
|
|
14
|
+
"evidence_level": "asset-contract",
|
|
15
|
+
"expected": "source_binding and Lottie structural validation; runtime acceptance still requires runtime evidence"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "dotlottie-package",
|
|
19
|
+
"framework": "dotlottie",
|
|
20
|
+
"category": "asset-package",
|
|
21
|
+
"source": "src/output/browser-review-smoke/animation.json",
|
|
22
|
+
"manifest": "src/output/browser-review-smoke/manifest.json",
|
|
23
|
+
"verification": "node scripts/to-dotlottie.mjs --scene-dir src/output/browser-review-smoke --output <temporary-output>/animation.lottie",
|
|
24
|
+
"evidence_level": "package-contract",
|
|
25
|
+
"expected": "manifest.json selects the initial animation and the archive validates without system zip"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "rive-runtime",
|
|
29
|
+
"framework": "rive",
|
|
30
|
+
"category": "browser-runtime",
|
|
31
|
+
"source": "tests/runtime-harness/main.jsx",
|
|
32
|
+
"evidence": "artifacts/runtime-adapters/rive/runtime-evidence.json",
|
|
33
|
+
"verification": "RUNTIME_FRAMEWORKS=rive npm run runtime:test",
|
|
34
|
+
"evidence_level": "runtime-verified-fixture",
|
|
35
|
+
"expected": "real browser adapter, ready=true, runtime state and 0/50/100 snapshots"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "gsap-runtime",
|
|
39
|
+
"framework": "gsap",
|
|
40
|
+
"category": "browser-runtime",
|
|
41
|
+
"source": "tests/runtime-harness/main.jsx",
|
|
42
|
+
"evidence": "artifacts/runtime-adapters/gsap/runtime-evidence.json",
|
|
43
|
+
"verification": "RUNTIME_FRAMEWORKS=gsap npm run runtime:test",
|
|
44
|
+
"evidence_level": "runtime-verified-fixture",
|
|
45
|
+
"expected": "real browser adapter, ready=true, runtime state and 0/50/100 snapshots"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "framer-motion-runtime",
|
|
49
|
+
"framework": "framer-motion",
|
|
50
|
+
"category": "browser-runtime",
|
|
51
|
+
"source": "tests/runtime-harness/main.jsx",
|
|
52
|
+
"evidence": "artifacts/runtime-adapters/framer-motion/runtime-evidence.json",
|
|
53
|
+
"verification": "RUNTIME_FRAMEWORKS=framer-motion npm run runtime:test",
|
|
54
|
+
"evidence_level": "runtime-verified-fixture",
|
|
55
|
+
"expected": "real browser adapter, ready=true, runtime state and 0/50/100 snapshots"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "body-rig",
|
|
59
|
+
"framework": "svg-cutout-rig",
|
|
60
|
+
"category": "body-animation",
|
|
61
|
+
"source": "assets/library/avatar-base.svg",
|
|
62
|
+
"verification": "python3 src/rig/cutout_rig.py build --input assets/library/avatar-base.svg --output <temporary-output>/rigged.svg",
|
|
63
|
+
"evidence_level": "structure-verified-fixture",
|
|
64
|
+
"expected": "named anatomy, pivot markers and parent-first hierarchy remain inspectable"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "continuity-multiscene",
|
|
68
|
+
"framework": "framework-neutral",
|
|
69
|
+
"category": "continuity",
|
|
70
|
+
"source": "tests/fixtures/continuity-multiscene",
|
|
71
|
+
"evidence": "tests/fixtures/continuity-multiscene/continuity-report.json",
|
|
72
|
+
"verification": "python3 scripts/intelligence.py continuity validate --report tests/fixtures/continuity-multiscene/continuity-report.json",
|
|
73
|
+
"evidence_level": "semantic-structure-fixture",
|
|
74
|
+
"expected": "scene-01 and scene-02 share continuity while scene-02-drift remains an explicit negative case"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"review_boundary": {
|
|
78
|
+
"approval": false,
|
|
79
|
+
"user_review_required": true,
|
|
80
|
+
"pr_side_effects": "explicit-confirmation"
|
|
81
|
+
}
|
|
82
|
+
}
|