motionloom 2.0.0 → 2.1.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/CODE_OF_CONDUCT.md +19 -0
  3. package/CONTRIBUTING.md +65 -0
  4. package/README.md +187 -134
  5. package/ROADMAP.md +32 -0
  6. package/SECURITY.md +27 -0
  7. package/SKILL.md +33 -8
  8. package/SUPPORT.md +23 -0
  9. package/agent-card.json +21 -6
  10. package/bin/motionloom.mjs +23 -5
  11. package/docs/STATUS.md +33 -0
  12. package/docs/audits/2.1.0-deep-stress-evaluation.md +97 -0
  13. package/docs/audits/data/2.1.0-deep-stress-6900.json +329 -0
  14. package/docs/audits/data/deep-stress-latest.json +329 -0
  15. package/docs/audits/external-project-corpus-2026-08-13.md +26 -0
  16. package/docs/releases/2.1.0.md +23 -0
  17. package/docs/releases/npm-publish-from-workstation.md +6 -6
  18. package/package.json +52 -26
  19. package/references/intelligence-core.md +1 -1
  20. package/schemas/project-memory.schema.json +180 -0
  21. package/scripts/analyze.py +56 -0
  22. package/scripts/capture-runtime-telemetry.py +119 -0
  23. package/scripts/devlab.py +126 -0
  24. package/scripts/docs-audit.py +96 -0
  25. package/scripts/eval-intelligence.py +23 -0
  26. package/scripts/eval-projects.py +156 -0
  27. package/scripts/intelligence.py +106 -6
  28. package/scripts/pr.py +150 -0
  29. package/scripts/prepack-clean.mjs +37 -0
  30. package/scripts/project-memory.py +483 -0
  31. package/scripts/project_memory_loader.py +31 -0
  32. package/scripts/release-verify.py +52 -0
  33. package/scripts/render.py +65 -0
  34. package/scripts/report.py +44 -2
  35. package/scripts/review-hook.py +13 -2
  36. package/scripts/skill-doctor.py +12 -2
  37. package/scripts/to-dotlottie.mjs +26 -20
  38. package/src/core/analyzer.py +174 -25
  39. package/tests/evals/intelligence-cases.json +10 -0
  40. package/tests/evals/project-corpus.json +51 -0
  41. package/tests/scripts/run_tests.py +52 -1
  42. 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-13T08:44:23.535422Z",
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.018963,
33
+ "p95_ms": 0.027028,
34
+ "max_ms": 0.215561,
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.128048,
47
+ "p95_ms": 0.144034,
48
+ "max_ms": 0.163253,
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.130132,
61
+ "p95_ms": 0.140209,
62
+ "max_ms": 0.178904,
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.007181,
76
+ "p95_ms": 0.008413,
77
+ "max_ms": 0.059516,
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.303064,
93
+ "p95_ms": 0.505011,
94
+ "max_ms": 0.842255,
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": 24.511679,
107
+ "p95_ms": 29.717216,
108
+ "max_ms": 45.587579,
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": 17.860905,
121
+ "p95_ms": 21.976583,
122
+ "max_ms": 32.027403,
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": 8.02739,
135
+ "p95_ms": 10.20982,
136
+ "max_ms": 13.31553,
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.044806,
149
+ "p95_ms": 0.062948,
150
+ "max_ms": 0.120889,
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.036813,
163
+ "p95_ms": 0.053581,
164
+ "max_ms": 0.1014,
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.103737,
177
+ "p95_ms": 0.148545,
178
+ "max_ms": 0.202869,
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": 14.465091,
191
+ "p95_ms": 16.091659,
192
+ "max_ms": 16.891256,
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.367015,
205
+ "p95_ms": 2.776738,
206
+ "max_ms": 3.812271,
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.913747,
219
+ "p95_ms": 1.226514,
220
+ "max_ms": 1.544532,
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.533108,
233
+ "p95_ms": 10.344097,
234
+ "max_ms": 11.235017,
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.827828,
247
+ "p95_ms": 1.029271,
248
+ "max_ms": 1.439878,
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.710469,
261
+ "p95_ms": 1.010883,
262
+ "max_ms": 1.146831,
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.069471,
275
+ "p95_ms": 0.091397,
276
+ "max_ms": 0.11505,
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.068215,
289
+ "p95_ms": 0.095822,
290
+ "max_ms": 0.118719,
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.220256,
303
+ "p95_ms": 0.316655,
304
+ "max_ms": 0.349047,
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.284957,
317
+ "p95_ms": 0.388469,
318
+ "max_ms": 0.452502,
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.883117
329
+ }
@@ -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.