motionloom 2.3.0 → 2.5.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 (113) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README.md +97 -11
  3. package/ROADMAP.md +8 -5
  4. package/SKILL.md +24 -5
  5. package/agent-card.json +34 -5
  6. package/agent-surfaces.json +1 -1
  7. package/artifact-adapter-registry.json +53 -0
  8. package/bin/motionloom.mjs +43 -6
  9. package/capability-registry.json +308 -0
  10. package/docs/CHECKLIST.md +16 -0
  11. package/docs/STATUS.md +2 -2
  12. package/docs/apple-distribution.md +24 -0
  13. package/docs/architecture/apple/cloudkit.md +18 -0
  14. package/docs/architecture/apple/contracts.md +9 -0
  15. package/docs/architecture/apple/implementation-status-2026-08-16.md +55 -0
  16. package/docs/architecture/apple/studio.md +35 -0
  17. package/docs/audits/data/deep-stress-latest.json +65 -65
  18. package/docs/releases/2.4.0.md +31 -0
  19. package/docs/releases/2.5.0.md +31 -0
  20. package/docs/releases/npm-publish-from-workstation.md +19 -8
  21. package/docs/research/agent-skill-ecosystem-notes.md +47 -0
  22. package/docs/research/ai-animation-tools-2026-notes.md +81 -0
  23. package/docs/research/ai-animation-tools-2026-report.md +168 -0
  24. package/docs/research/ai-pilot-ingest-notes.md +29 -0
  25. package/docs/research/ai-repository-benchmark-2026-08-16.md +75 -0
  26. package/examples/agent-consumer/ai-pilot-scout/CHATGPT-HANDOFF.md +70 -0
  27. package/examples/agent-consumer/ai-pilot-scout/CODEX-HANDOFF.md +80 -0
  28. package/examples/agent-consumer/ai-pilot-scout/README.md +39 -0
  29. package/examples/agent-consumer/ai-pilot-scout/chatgpt-geometry-correction-prompt.md +55 -0
  30. package/examples/agent-consumer/ai-pilot-scout/chatgpt-pose-generation-prompt.md +78 -0
  31. package/examples/agent-consumer/ai-pilot-scout/partial-handoff.json +73 -0
  32. package/examples/agent-consumer/artifact-intake/hero-motion-controls.json +15 -0
  33. package/examples/agent-consumer/artifact-intake/hero-motion-export.json +14 -0
  34. package/examples/agent-consumer/artifact-intake/hero-motion-provenance.json +20 -0
  35. package/examples/agent-consumer/artifact-intake/hero-motion-receipt.json +16 -0
  36. package/examples/agent-consumer/asset-consistency/assets/forest-back.png +0 -0
  37. package/examples/agent-consumer/asset-consistency/assets/forest-front.png +0 -0
  38. package/examples/agent-consumer/asset-consistency/assets/forest-mid.png +0 -0
  39. package/examples/agent-consumer/asset-consistency/assets/hero-atlas.png +0 -0
  40. package/examples/agent-consumer/asset-consistency/assets/hero-frame-00.png +0 -0
  41. package/examples/agent-consumer/asset-consistency/assets/hero-frame-01.png +0 -0
  42. package/examples/agent-consumer/asset-consistency/assets/hero-frame-02.png +0 -0
  43. package/examples/agent-consumer/asset-consistency/assets/hero-frame-03.png +0 -0
  44. package/examples/agent-consumer/asset-consistency/forest-layered-map.json +53 -0
  45. package/examples/agent-consumer/asset-consistency/hero-atlas-contract.json +24 -0
  46. package/examples/agent-consumer/asset-consistency/hero-identity.json +51 -0
  47. package/examples/agent-consumer/asset-consistency/hero-walk-action-set.json +27 -0
  48. package/examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json +63 -0
  49. package/examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json +13 -0
  50. package/examples/agent-consumer/rive-package-gate/README.md +20 -0
  51. package/examples/agent-consumer/runtime-candidate/hero-walk-candidate.json +18 -0
  52. package/examples/agent-consumer/runtime-pilot/action-set.json +19 -0
  53. package/examples/agent-consumer/runtime-pilot/asset-identity.json +44 -0
  54. package/examples/agent-consumer/runtime-pilot/candidate.json +21 -0
  55. package/examples/agent-consumer/runtime-pilot/controls.json +35 -0
  56. package/examples/agent-consumer/runtime-pilot/export.json +17 -0
  57. package/examples/agent-consumer/runtime-pilot/provenance.json +38 -0
  58. package/examples/agent-consumer/runtime-pilot/receipt.json +30 -0
  59. package/package.json +58 -4
  60. package/references/browser-review-contract.md +7 -1
  61. package/references/intelligence-core.md +22 -1
  62. package/rig-adapter-registry.json +39 -0
  63. package/schemas/action-set.schema.json +42 -0
  64. package/schemas/artifact-adapter-registry.schema.json +16 -0
  65. package/schemas/asset-identity.schema.json +117 -0
  66. package/schemas/asset-provenance.schema.json +1 -1
  67. package/schemas/atlas-contract.schema.json +48 -0
  68. package/schemas/control-track.schema.json +18 -0
  69. package/schemas/export-manifest.schema.json +19 -0
  70. package/schemas/frame-geometry.schema.json +79 -0
  71. package/schemas/generation-receipt.schema.json +20 -0
  72. package/schemas/layered-map.schema.json +75 -0
  73. package/schemas/rig-adapter-registry.schema.json +14 -0
  74. package/schemas/rig-compatibility.schema.json +53 -0
  75. package/schemas/rive-package-manifest.schema.json +43 -0
  76. package/schemas/runtime-candidate.schema.json +48 -0
  77. package/schemas/scene-manifest.schema.json +18 -0
  78. package/scripts/artifact-intake.py +408 -0
  79. package/scripts/asset-consistency.py +517 -0
  80. package/scripts/asset-provenance.py +8 -3
  81. package/scripts/attestation.py +8 -0
  82. package/scripts/build-ai-pilot.py +504 -0
  83. package/scripts/evidence-verifier.py +18 -9
  84. package/scripts/intelligence.py +85 -18
  85. package/scripts/isolate-alpha-background.py +147 -0
  86. package/scripts/quality-gate.py +88 -2
  87. package/scripts/report.py +85 -0
  88. package/scripts/resolve-task-bundle.py +84 -0
  89. package/scripts/review-hook.py +26 -4
  90. package/scripts/rig-compatibility.py +251 -0
  91. package/scripts/rive-package-gate.py +245 -0
  92. package/scripts/runtime-candidate.py +301 -0
  93. package/scripts/setup.mjs +54 -26
  94. package/src/output/runtime-pilot-framer/asset-provenance.json +38 -0
  95. package/src/output/runtime-pilot-framer/browser-review.json +20 -0
  96. package/src/output/runtime-pilot-framer/framer-motion/runtime-telemetry.json +103 -0
  97. package/src/output/runtime-pilot-framer/manifest.json +31 -0
  98. package/src/output/runtime-pilot-framer/motion-spec.json +25 -0
  99. package/src/output/runtime-pilot-framer/runtime-evidence.json +96 -0
  100. package/src/output/runtime-pilot-framer/runtime-telemetry.json +100 -0
  101. package/src/output/runtime-pilot-framer/scene.jsx +52 -0
  102. package/src/output/runtime-pilot-framer/snapshot/.render-meta.json +9 -0
  103. package/src/output/runtime-pilot-framer/snapshot/frame-00.png +0 -0
  104. package/src/output/runtime-pilot-framer/snapshot/frame-100.png +0 -0
  105. package/src/output/runtime-pilot-framer/snapshot/frame-50.png +0 -0
  106. package/tests/scripts/run_tests.py +151 -0
  107. package/tests/scripts/test_ai_pilot_builder.py +128 -0
  108. package/tests/scripts/test_alpha_isolation.py +60 -0
  109. package/tests/scripts/test_artifact_intake.py +146 -0
  110. package/tests/scripts/test_asset_consistency.py +199 -0
  111. package/tests/scripts/test_rig_compatibility.py +105 -0
  112. package/tests/scripts/test_rive_package_gate.py +101 -0
  113. package/tests/scripts/test_runtime_candidate.py +95 -0
@@ -38,25 +38,42 @@ const PYTHON_COMMANDS = {
38
38
  "visual-truth": "scripts/visual-truth.py",
39
39
  "remediation-learning": "scripts/remediation-learning.py",
40
40
  "asset-provenance": "scripts/asset-provenance.py",
41
+ "asset-consistency": "scripts/asset-consistency.py",
42
+ "artifact-intake": "scripts/artifact-intake.py",
43
+ "runtime-candidate": "scripts/runtime-candidate.py",
44
+ "rig-compatibility": "scripts/rig-compatibility.py",
45
+ "rive-package-gate": "scripts/rive-package-gate.py",
46
+ "pilot-build": "scripts/build-ai-pilot.py",
47
+ "alpha-isolate": "scripts/isolate-alpha-background.py",
41
48
  };
42
49
 
43
50
  const NODE_COMMANDS = {
51
+ init: "scripts/setup.mjs",
44
52
  setup: "scripts/setup.mjs",
45
53
  status: "scripts/setup.mjs",
46
54
  repair: "scripts/setup.mjs",
47
55
  };
48
56
 
57
+ const COMMAND_ALIASES = {
58
+ capability: { script: "scripts/intelligence.py", args: ["capabilities"] },
59
+ };
60
+
49
61
  function printHelp() {
50
- console.log(`MotionLoom 2.2.0 — project-aware animation production and evidence contracts
62
+ console.log(`MotionLoom 2.4.0 — project-aware animation production and evidence contracts
51
63
 
52
64
  Usage:
53
65
  motionloom <command> [args...]
54
66
 
55
- Commands:
67
+ Start here:
68
+ init One safe project setup; no animation gate runs
69
+ status Short read-only readiness report
56
70
  doctor Validate the installed Skill package
71
+
72
+ Use when an animation task needs it:
57
73
  analyze Run project analysis and refresh Project Memory
58
74
  memory Initialize, inspect, refresh, recover or validate memory
59
75
  intelligence Build or validate Intelligence Core artifacts
76
+ capability Export or select evidence-bound runtime capabilities
60
77
  attestation Build/validate canonical signed-attestation artifacts
61
78
  verify-attestation Verify an attestation against a trust policy
62
79
  evidence-verify Verify runtime evidence externally
@@ -73,8 +90,14 @@ Commands:
73
90
  visual-truth Build or validate provenance-bound visual comparisons
74
91
  remediation-learning Record or summarize user-confirmed remediation and benchmark history
75
92
  asset-provenance Validate, classify or report asset origin and production readiness
76
- setup Install and bootstrap MotionLoom in the current project
77
- status Read-only project readiness report
93
+ asset-consistency Validate frame geometry, atlas contamination and layered-map contracts
94
+ artifact-intake Bind generation controls, provenance, adapter metadata and exported bytes
95
+ runtime-candidate Bind intake exports to consistency contracts before runtime testing
96
+ rig-compatibility Validate rig bones, sockets, actions, events and runtime adapter evidence
97
+ rive-package-gate Verify a real .riv package, runtime proof and provenance before testing
98
+ pilot-build Build a review-only hash-bound AI scout pilot from true-alpha PNG sources
99
+ alpha-isolate Isolate an edge-connected flat background; block residual edge contamination
100
+ setup Alias for init (kept for compatibility)
78
101
  repair Re-apply safe missing setup pieces
79
102
 
80
103
  Cross-platform examples:
@@ -85,9 +108,16 @@ Cross-platform examples:
85
108
  --status accepted --summary "Use ease-out for UI entry" --user-confirmed
86
109
  motionloom discovery check --root . --json
87
110
  motionloom discovery install-matrix --root . --json
111
+ motionloom capability card --format json
88
112
  motionloom visual-truth validate --root . --input src/output/<scene>/visual-truth.json
89
113
  motionloom remediation-learning summary --history artifacts/remediation-history.jsonl --json
90
114
  motionloom asset-provenance check --input <asset-provenance.json> --root <scene-dir> --mode runtime --json
115
+ motionloom asset-consistency validate --kind frame-geometry --input <frame-geometry.json> --root <scene-dir> --json
116
+ motionloom artifact-intake intake --root <asset-dir> --registry artifact-adapter-registry.json \\
117
+ --receipt <generation-receipt.json> --controls <control-track.json> --export-manifest <export-manifest.json> --json
118
+ motionloom alpha-isolate <opaque.png> <isolated.png> --report <alpha-report.json>
119
+ motionloom rive-package-gate validate --root <package-dir> --registry rig-adapter-registry.json \\
120
+ --input <rive-package-manifest.json> --strict --json
91
121
 
92
122
  The CLI never grants approval or opens a pull request by itself. User review
93
123
  and explicit repository side-effect confirmation remain separate gates.
@@ -100,7 +130,8 @@ if (!command || command === "help" || command === "--help" || command === "-h")
100
130
  process.exit(0);
101
131
  }
102
132
 
103
- const script = NODE_COMMANDS[command] || PYTHON_COMMANDS[command];
133
+ const alias = COMMAND_ALIASES[command];
134
+ const script = alias?.script || NODE_COMMANDS[command] || PYTHON_COMMANDS[command];
104
135
  if (!script) {
105
136
  console.error(`Unknown MotionLoom command: ${command}`);
106
137
  printHelp();
@@ -108,7 +139,13 @@ if (!script) {
108
139
  }
109
140
 
110
141
  const executable = script.endsWith(".mjs") ? process.execPath : PYTHON;
111
- const delegatedArgs = NODE_COMMANDS[command] && command !== "setup" ? [command, ...args] : args;
142
+ const delegatedArgs = alias
143
+ ? [...alias.args, ...args]
144
+ : NODE_COMMANDS[command] && !["setup", "init"].includes(command)
145
+ ? [command, ...args]
146
+ : command === "init"
147
+ ? ["init", ...args]
148
+ : args;
112
149
  const result = spawnSync(executable, [resolve(ROOT, script), ...delegatedArgs], {
113
150
  cwd: ROOT,
114
151
  stdio: "inherit",
@@ -0,0 +1,308 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "registry_id": "registry-motionloom-2.5.0",
4
+ "generated_at": "2026-08-17T05:39:24Z",
5
+ "selection_policy": {
6
+ "require_verified": true,
7
+ "allow_scaffold_only": false,
8
+ "max_evidence_age_seconds": 604800
9
+ },
10
+ "capabilities": [
11
+ {
12
+ "id": "runtime.lottie-json",
13
+ "kind": "renderer",
14
+ "status": "verified",
15
+ "adapter_version": "2.5.0",
16
+ "inputs": [
17
+ "project-context",
18
+ "motion-spec",
19
+ "source-binding"
20
+ ],
21
+ "outputs": [
22
+ "runtime-evidence"
23
+ ],
24
+ "compatibility": {
25
+ "browsers": [
26
+ "chromium"
27
+ ],
28
+ "os": [
29
+ "linux"
30
+ ],
31
+ "node": ">=22"
32
+ },
33
+ "last_verified_at": "2026-08-17T05:39:24Z",
34
+ "evidence": [
35
+ {
36
+ "path": "scripts/runtime-adapters.mjs",
37
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
38
+ "kind": "ci"
39
+ }
40
+ ],
41
+ "limitations": [
42
+ "Capability evidence is refreshed by runtime:test."
43
+ ],
44
+ "fallback": "",
45
+ "risk_level": "low",
46
+ "side_effect_level": "local_write"
47
+ },
48
+ {
49
+ "id": "runtime.dotlottie-package",
50
+ "kind": "packager",
51
+ "status": "verified",
52
+ "adapter_version": "2.5.0",
53
+ "inputs": [
54
+ "project-context",
55
+ "motion-spec",
56
+ "source-binding"
57
+ ],
58
+ "outputs": [
59
+ "runtime-evidence"
60
+ ],
61
+ "compatibility": {
62
+ "browsers": [
63
+ "chromium"
64
+ ],
65
+ "os": [
66
+ "linux"
67
+ ],
68
+ "node": ">=22"
69
+ },
70
+ "last_verified_at": "2026-08-17T05:39:24Z",
71
+ "evidence": [
72
+ {
73
+ "path": "scripts/runtime-adapters.mjs",
74
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
75
+ "kind": "ci"
76
+ }
77
+ ],
78
+ "limitations": [
79
+ "Capability evidence is refreshed by runtime:test."
80
+ ],
81
+ "fallback": "",
82
+ "risk_level": "low",
83
+ "side_effect_level": "local_write"
84
+ },
85
+ {
86
+ "id": "runtime.svg-cutout-rig",
87
+ "kind": "renderer",
88
+ "status": "verified",
89
+ "adapter_version": "2.5.0",
90
+ "inputs": [
91
+ "project-context",
92
+ "motion-spec",
93
+ "source-binding"
94
+ ],
95
+ "outputs": [
96
+ "runtime-evidence"
97
+ ],
98
+ "compatibility": {
99
+ "browsers": [
100
+ "chromium"
101
+ ],
102
+ "os": [
103
+ "linux"
104
+ ],
105
+ "node": ">=22"
106
+ },
107
+ "last_verified_at": "2026-08-17T05:39:24Z",
108
+ "evidence": [
109
+ {
110
+ "path": "scripts/runtime-adapters.mjs",
111
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
112
+ "kind": "ci"
113
+ }
114
+ ],
115
+ "limitations": [
116
+ "Capability evidence is refreshed by runtime:test."
117
+ ],
118
+ "fallback": "",
119
+ "risk_level": "low",
120
+ "side_effect_level": "local_write"
121
+ },
122
+ {
123
+ "id": "runtime.rive",
124
+ "kind": "runtime-adapter",
125
+ "status": "verified",
126
+ "adapter_version": "2.5.0",
127
+ "inputs": [
128
+ "project-context",
129
+ "motion-spec",
130
+ "source-binding"
131
+ ],
132
+ "outputs": [
133
+ "runtime-evidence"
134
+ ],
135
+ "compatibility": {
136
+ "browsers": [
137
+ "chromium"
138
+ ],
139
+ "os": [
140
+ "linux"
141
+ ],
142
+ "node": ">=22"
143
+ },
144
+ "last_verified_at": "2026-08-17T05:39:24Z",
145
+ "evidence": [
146
+ {
147
+ "path": "scripts/runtime-adapters.mjs",
148
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
149
+ "kind": "ci"
150
+ }
151
+ ],
152
+ "limitations": [
153
+ "Capability evidence is refreshed by runtime:test."
154
+ ],
155
+ "fallback": "",
156
+ "risk_level": "low",
157
+ "side_effect_level": "local_write"
158
+ },
159
+ {
160
+ "id": "runtime.gsap",
161
+ "kind": "runtime-adapter",
162
+ "status": "verified",
163
+ "adapter_version": "2.5.0",
164
+ "inputs": [
165
+ "project-context",
166
+ "motion-spec",
167
+ "source-binding"
168
+ ],
169
+ "outputs": [
170
+ "runtime-evidence"
171
+ ],
172
+ "compatibility": {
173
+ "browsers": [
174
+ "chromium"
175
+ ],
176
+ "os": [
177
+ "linux"
178
+ ],
179
+ "node": ">=22"
180
+ },
181
+ "last_verified_at": "2026-08-17T05:39:24Z",
182
+ "evidence": [
183
+ {
184
+ "path": "scripts/runtime-adapters.mjs",
185
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
186
+ "kind": "ci"
187
+ }
188
+ ],
189
+ "limitations": [
190
+ "Capability evidence is refreshed by runtime:test."
191
+ ],
192
+ "fallback": "",
193
+ "risk_level": "low",
194
+ "side_effect_level": "local_write"
195
+ },
196
+ {
197
+ "id": "runtime.framer-motion",
198
+ "kind": "runtime-adapter",
199
+ "status": "verified",
200
+ "adapter_version": "2.5.0",
201
+ "inputs": [
202
+ "project-context",
203
+ "motion-spec",
204
+ "source-binding"
205
+ ],
206
+ "outputs": [
207
+ "runtime-evidence"
208
+ ],
209
+ "compatibility": {
210
+ "browsers": [
211
+ "chromium"
212
+ ],
213
+ "os": [
214
+ "linux"
215
+ ],
216
+ "node": ">=22"
217
+ },
218
+ "last_verified_at": "2026-08-17T05:39:24Z",
219
+ "evidence": [
220
+ {
221
+ "path": "scripts/runtime-adapters.mjs",
222
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
223
+ "kind": "ci"
224
+ }
225
+ ],
226
+ "limitations": [
227
+ "Capability evidence is refreshed by runtime:test."
228
+ ],
229
+ "fallback": "",
230
+ "risk_level": "low",
231
+ "side_effect_level": "local_write"
232
+ },
233
+ {
234
+ "id": "runtime.spine",
235
+ "kind": "renderer",
236
+ "status": "scaffold_only",
237
+ "adapter_version": "2.5.0",
238
+ "inputs": [
239
+ "project-context",
240
+ "motion-spec",
241
+ "source-binding"
242
+ ],
243
+ "outputs": [
244
+ "runtime-evidence"
245
+ ],
246
+ "compatibility": {
247
+ "browsers": [
248
+ "chromium"
249
+ ],
250
+ "os": [
251
+ "linux"
252
+ ],
253
+ "node": ">=22"
254
+ },
255
+ "last_verified_at": "2026-08-17T05:39:24Z",
256
+ "evidence": [
257
+ {
258
+ "path": "scripts/runtime-adapters.mjs",
259
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
260
+ "kind": "ci"
261
+ }
262
+ ],
263
+ "limitations": [
264
+ "Scaffold only; do not use for production acceptance."
265
+ ],
266
+ "fallback": "runtime.lottie-json",
267
+ "risk_level": "high",
268
+ "side_effect_level": "local_write"
269
+ },
270
+ {
271
+ "id": "runtime.threejs",
272
+ "kind": "renderer",
273
+ "status": "scaffold_only",
274
+ "adapter_version": "2.5.0",
275
+ "inputs": [
276
+ "project-context",
277
+ "motion-spec",
278
+ "source-binding"
279
+ ],
280
+ "outputs": [
281
+ "runtime-evidence"
282
+ ],
283
+ "compatibility": {
284
+ "browsers": [
285
+ "chromium"
286
+ ],
287
+ "os": [
288
+ "linux"
289
+ ],
290
+ "node": ">=22"
291
+ },
292
+ "last_verified_at": "2026-08-17T05:39:24Z",
293
+ "evidence": [
294
+ {
295
+ "path": "scripts/runtime-adapters.mjs",
296
+ "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
297
+ "kind": "ci"
298
+ }
299
+ ],
300
+ "limitations": [
301
+ "Scaffold only; do not use for production acceptance."
302
+ ],
303
+ "fallback": "runtime.lottie-json",
304
+ "risk_level": "high",
305
+ "side_effect_level": "local_write"
306
+ }
307
+ ]
308
+ }
package/docs/CHECKLIST.md CHANGED
@@ -28,10 +28,26 @@ A scene is only ready for the confirm-into-PR step when every item below passes.
28
28
  - [ ] `ai_generated` assets may be runtime-ready but are not production-eligible; `unknown` assets are blocked.
29
29
  - [ ] `artist_authored` is backed by a verifiable human/artist record and is not merely an Agent-authored field.
30
30
 
31
+ ## Asset consistency
32
+ - [ ] Multi-frame actions declare an `identity` and `action-set` contract when the asset has shared character/style identity or loop/event requirements.
33
+ - [ ] `frame-geometry` measures the real PNG bytes: canvas size, alpha bounds, frame SHA-256, pivot/footline drift and opaque pixels outside each frame rect.
34
+ - [ ] Sprite atlases declare non-overlapping regions, explicit rotation policy and transparent pixels outside regions; contamination is blocking in strict runs.
35
+ - [ ] Layered maps declare unique layer IDs/z-order, intentional parallax order, tile seam policy, layer/world bounds and camera-safe bounds.
36
+ - [ ] Consistency output is stored with the task evidence and remains separate from provenance authority, production eligibility and user approval.
37
+
38
+ ## Provider-neutral intake and runtime candidate
39
+ - [ ] Every Agent/internal-skill/provider output used by the scene has a hash-bound generation receipt, control track and export manifest; no receipt stores secrets or self-asserts approval.
40
+ - [ ] The selected artifact adapter is declared in `artifact-adapter-registry.json`; `scaffold` or `static-validated` status is not presented as runtime verification or production eligibility.
41
+ - [ ] `runtime-candidate.json` binds the intake bundle to the matching asset identity, action-set and frame geometry/atlas/map contracts; mismatched refs or hashes block the candidate.
42
+ - [ ] A rigmed or motion-capture candidate declares skeleton, sockets, action/event coverage, export target and adapter evidence in `rig-compatibility.json`.
43
+ - [ ] Artifact Intake, runtime candidate and rig findings are present in the task handoff/Dev Lab rail and visibly retain `review_required` until the user records a decision.
44
+
31
45
  ## PR readiness
32
46
  - [ ] Snapshot PNGs exist for 0/50/100%.
33
47
  - [ ] `visual-truth.json` binds real baseline/candidate frames to source, manifest and available runtime/Motion IR hashes; `approval` remains `false`.
34
48
  - [ ] `motion-spec.json` is bound to the exact `project-context.json` hash (implements == planned).
35
49
  - [ ] Dev Lab URL tested on mobile viewport and desktop.
36
50
  - [ ] The production provenance check passes with `--mode production` and reports `production_eligible: true`.
51
+ - [ ] If `manifest.json` declares `consistency_ref`, `quality-gate.py --require-asset-consistency` passes for its declared `consistency_kind`.
52
+ - [ ] If `manifest.json` declares an Artifact Intake bundle, `quality-gate.py --require-artifact-intake` passes and the selected adapter/runtime evidence meets the requested mode.
37
53
  - [ ] `production_approved` and browser-review approval are recorded only from the user's explicit review; attestation approval remains `false`.
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.3.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 and a browser-based Dev Lab review contract. The protected manual release workflow verifies package/changelog/release-note alignment before publication.
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.3.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.
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.
@@ -0,0 +1,24 @@
1
+ # Apple distribution boundary
2
+
3
+ The current `MotionLoomStudio` build is an unsigned local alpha. GitHub CI builds packages and checks iOS Simulator compatibility; it does not sign, upload, submit or distribute an application.
4
+
5
+ | Channel | Required external inputs | Current state |
6
+ | --- | --- | --- |
7
+ | Local macOS alpha | Xcode and a user-selected project folder | Implemented and manually launchable. |
8
+ | iOS Simulator review UI | Xcode simulator runtime and an Xcode app target that embeds `MotionLoomReviewUI` | Library cross-compilation is verified; the signed target remains intentionally uncreated. |
9
+ | TestFlight | Apple Developer Program membership, bundle identifier, signing, App Store Connect app record and a user approval to upload | Not initiated. |
10
+ | Mac App Store / iOS App Store | The TestFlight requirements plus app metadata, privacy details and an explicit human submission decision | Not initiated. |
11
+
12
+ TestFlight distribution is handled through App Store Connect and requires the app owner to control signing and submission; MotionLoom’s CI must stay read-only until an owner explicitly decides to introduce that workflow.[1]
13
+
14
+ ## Before a TestFlight decision
15
+
16
+ 1. Create a final bundle identifier and an Apple-owned iCloud container; do not reuse development identifiers accidentally.
17
+ 2. Create the iOS/macOS Xcode app targets and add `MotionLoomContracts`, `MotionLoomReview`, `MotionLoomReviewUI` and, on macOS, `MotionLoomMacBridge` as local packages.
18
+ 3. Complete privacy labels and explain that CloudKit is limited to review metadata if sync is enabled.
19
+ 4. Test review JSON handoff with a real candidate on a physical iPhone/iPad and macOS.
20
+ 5. Make a separate explicit decision before uploading any build, inviting testers or submitting for review.
21
+
22
+ ## References
23
+
24
+ [1]: https://developer.apple.com/testflight/ "Apple Developer — TestFlight"
@@ -0,0 +1,18 @@
1
+ # CloudKit review metadata boundary
2
+
3
+ `MotionLoomReviewSync` is intentionally **local-first**. A review is written to a local outbox before it can be uploaded. The CloudKit adapter uploads only a metadata projection after `MotionLoomContractDecoder.verify` confirms that task ID, candidate ID and both evidence digests match the review launch descriptor.
4
+
5
+ | Data class | Local outbox | Private CloudKit database | Explicitly excluded |
6
+ | --- | --- | --- | --- |
7
+ | Human review decision and annotations | Yes | Metadata projection only | No production approval field exists. |
8
+ | Task/candidate IDs and evidence hashes | Yes | Yes | No raw runtime artifact bytes. |
9
+ | Source asset, texture, `.riv`, `.lottie`, project repository or secrets | No | No | Never synchronized by this adapter. |
10
+ | GitHub/PR/npm/App Store operations | No | No | Must remain an explicit human-controlled workflow outside CloudKit. |
11
+
12
+ The default database is the user’s private CloudKit database. Before enabling a production container, the app project needs a user-owned container identifier, the iCloud capability entitlement, an App ID and an explicit privacy review. The source package does **not** supply a container identifier, entitlement, Apple team ID, signing profile or server token.
13
+
14
+ Apple describes CloudKit as a framework for storing and syncing app data through the user’s iCloud account; this design deliberately narrows that scope to review metadata and does not treat CloudKit as the source of truth for source assets or repository state.[1]
15
+
16
+ ## References
17
+
18
+ [1]: https://developer.apple.com/icloud/cloudkit/ "Apple Developer — CloudKit"
@@ -0,0 +1,9 @@
1
+ # Apple contract boundary
2
+
3
+ The Apple application is an inspection and human-review surface. It reads canonical MotionLoom artifacts and writes only a human review decision bound to the selected task, candidate and evidence digests. It does not duplicate Python validator policy, create provenance, grant `production_approved`, set `OPEN_PR=1`, open a pull request or publish a package.
4
+
5
+ `contracts/apple/review-launch-descriptor.schema.json` defines the minimum identity-bound information a macOS or iOS review surface may accept. A descriptor is rejected when its schema version is unsupported, it has unknown fields, identifiers are invalid, an artifact root is missing, or runtime/candidate evidence digests are absent.
6
+
7
+ `contracts/apple/review-decision.schema.json` defines a record made only after explicit human action. The only allowed decisions are `request_changes`, `reviewed_no_decision` and `approve_for_next_human_step`. None is production approval. A later policy-controlled workflow may consume a record only after independently verifying the same task, candidate and evidence identity.
8
+
9
+ The initial fixtures bind to `runtime-pilot-001`. They are decoder and identity fixtures, not an approval fixture and not a claim that the candidate is production eligible.
@@ -0,0 +1,55 @@
1
+ # MotionLoom Apple alpha — implementation status
2
+
3
+ **Ngày kiểm tra:** 16-08-2026
4
+ **Phạm vi:** macOS Studio alpha, iOS/iPadOS Review companion, review contracts, local-first sync foundation và native CI.
5
+ **Trạng thái source:** hoàn thành và đã kiểm thử local; chưa commit, push, ký hoặc phát hành.
6
+
7
+ ## Kết luận
8
+
9
+ MotionLoom hiện có một lớp app Apple native-first bám đúng mô hình **artifact-first, runtime-evidence và human-governed** của repository. Lớp mới không thay thế CLI Node/Python, runtime adapters hoặc Dev Lab; nó biến evidence đã có thành Project Inspector, Timeline Desk và review surface native cho macOS/iOS.
10
+
11
+ > App không có khả năng cấp `production_approved`, tự chạy shell tùy ý, tự tạo PR, push Git, publish npm hay submit App Store. Các hành động này tiếp tục nằm ngoài native surface và phải qua cơ chế review/quyền hiện hữu.
12
+
13
+ | Thành phần | Đầu ra đã tạo | Trạng thái |
14
+ | --- | --- | --- |
15
+ | Canonical contracts | `contracts/apple/review-launch-descriptor.schema.json`, `review-decision.schema.json` và fixture hash-bound runtime-pilot | Đã hoàn thành; reject unknown fields và không biểu diễn production approval. |
16
+ | Contract runtime | `apps/apple/Packages/MotionLoomContracts` | Đã hoàn thành; Swift decoder fail-closed, migration version và identity binding. |
17
+ | Review core | `apps/apple/Packages/MotionLoomReview` | Đã hoàn thành; timeline, annotation, ba human review decisions và export review JSON deterministic. |
18
+ | Project bridge | `apps/apple/Packages/MotionLoomMacBridge` | Đã hoàn thành; security-scoped folder access, allow-list inspection commands, chặn path/URL không tin cậy. |
19
+ | macOS Studio | `apps/apple/MotionLoomStudio` và target `MotionLoomStudio` | Đã build và launch unsigned; có Project Inspector, Timeline Desk và native web surface mở Dev Lab review URL. |
20
+ | iOS/iPadOS companion | `apps/apple/MotionLoomReviewApp`, `MotionLoomReviewUI` và target `MotionLoomReview` | Đã build unsigned cho iPhone Simulator SDK; chỉ đọc evidence, scrub timeline, annotate và tạo review decision. |
21
+ | Đồng bộ review | `apps/apple/Packages/MotionLoomReviewSync` | Đã hoàn thành local-first outbox; chỉ đưa metadata review identity-bound vào sync adapter. |
22
+ | CI và hướng dẫn | `.github/workflows/apple.yml`, `apps/apple/scripts/emit-ios-simulator-destination.sh`, các tài liệu Apple | Đã hoàn thành; CI không ký, không publish và dùng dynamic simulator SDK destination. |
23
+
24
+ ## Trust boundary giữ nguyên
25
+
26
+ Các package Swift dùng canonical contract và fixture từ repository thay vì sao chép policy validator sang Swift. `MotionLoomContracts` giới hạn review decision ở các trạng thái review của con người; `MotionLoomReview` chỉ export review record; `MotionLoomMacBridge` chỉ có lệnh inspection trong allow-list. CloudKit adapter cũng chỉ nhận review metadata đã identity-bound, không nhận source asset, repository, secret, production authority hoặc capability nâng quyền.
27
+
28
+ Mac app có thể mở project folder và xuất handoff review; iOS app có thể đọc candidate/evidence và ghi note theo timeline. Cả hai app không làm thay nhiệm vụ của Agent: Agent tiếp tục tạo/sửa artifact, chạy validator và render runtime thật; người dùng review trên native app rồi tạo data để Agent tiếp tục xử lý.
29
+
30
+ ## Kiểm thử đã chạy trên Mac
31
+
32
+ | Kiểm tra | Kết quả |
33
+ | --- | --- |
34
+ | `pnpm test` từ repository root | **PASS** — toàn bộ regression suite, gồm Apple contract và signed attestation. |
35
+ | `pnpm run docs:check` | **PASS**. |
36
+ | `swift test` cho Contracts, Review, MacBridge, ReviewUI và ReviewSync | **PASS**. |
37
+ | `xcodebuild` unsigned target `MotionLoomStudio` với SDK macOS | **PASS**; Studio đã launch local. |
38
+ | `xcodebuild` unsigned target `MotionLoomReview` với SDK iPhone Simulator | **PASS**. |
39
+ | `git diff --check` | **PASS**. |
40
+
41
+ Trong quá trình acceptance trên macOS, regression cũ phát hiện giả định path không phù hợp với alias hệ thống `/var -> /private/var`. Các chỉnh sửa giới hạn trong `scripts/evidence-verifier.py`, `scripts/intelligence.py` và `scripts/attestation.py`: chỉ parent alias hệ thống này được xử lý đúng trên macOS; symlink tại hoặc bên trong scene, task, evidence, repository và replay roots vẫn bị reject. Toàn bộ regression suite đã pass sau thay đổi này.
42
+
43
+ ## Blocker còn lại ngoài source code
44
+
45
+ | Hạng mục | Lý do chưa thực hiện | Điều kiện để hoàn thành |
46
+ | --- | --- | --- |
47
+ | iOS UI smoke trên simulator | Xcode đang có iPhone Simulator SDK để compile nhưng chưa có device runtime khả dụng để boot. | Cài một iOS Simulator runtime trong Xcode Settings, sau đó boot device và chạy UI smoke. |
48
+ | CloudKit sync live | Cần container thuộc Apple Developer account và entitlement có quyền của chủ sở hữu. | Chủ sở hữu tạo/chọn CloudKit container, quyết định retention/privacy và bật entitlement trong Xcode. |
49
+ | Ký/TestFlight/App Store | Cần Apple Developer Team, App IDs, bundle identifiers, signing và quyết định submit của chủ sở hữu. | Cấu hình signing, tạo archive, rồi chủ sở hữu duyệt upload TestFlight. |
50
+
51
+ Các blocker trên không làm source alpha bị lỗi; chúng là quyền tài khoản và hạ tầng bên ngoài mà MotionLoom không tự tạo hoặc tự chấp nhận thay người dùng.
52
+
53
+ ## Bước tiếp theo sau khi commit/push được duyệt
54
+
55
+ Sau khi source được commit và push riêng, công việc hợp lý tiếp theo là cài iOS Simulator runtime, chạy UI smoke của Review companion, thiết kế CloudKit container review-only và chỉ sau đó mới cân nhắc beta TestFlight. Không nên thêm production approval, Git push hay asset upload capability vào app trước khi vòng review iOS đã được kiểm chứng trên device/simulator.
@@ -0,0 +1,35 @@
1
+ # MotionLoom Studio alpha
2
+
3
+ MotionLoom Studio is a **native macOS inspection and review surface**, not a replacement for the cross-platform MotionLoom CLI, its Python validators, runtime adapters or Dev Lab. The Studio presents verified task/candidate/evidence identity and helps a human create a review handoff.
4
+
5
+ | Surface | Responsibility | Prohibited actions |
6
+ | --- | --- | --- |
7
+ | Project Inspector | User selects a scoped project folder, then launches a small allow-list of local inspections. | Arbitrary shell, `git push`, `OPEN_PR=1`, npm publish and PR creation. |
8
+ | Timeline Desk | Scrub review timecodes, open the existing Dev Lab candidate and collect annotations. | Treating a preview or heuristic as approval. |
9
+ | Evidence | Shows task/candidate identity and SHA-256 digests before review. | Loading a candidate whose identity binding is not valid. |
10
+ | Export Human Review | Writes a deterministic review JSON for an Agent or maintainer to act on later. | Writing `production_approved` or modifying a repository. |
11
+
12
+ The app uses `ProjectAccessScope` to confine read/write operations to an explicitly selected project root. It invokes the CLI through an argument vector and a closed command enum, never a shell string. macOS security-scoped bookmarks are supported for a later sandboxed/notarized build, but the alpha remains unsigned and local.
13
+
14
+ ## Local verification
15
+
16
+ ```bash
17
+ cd apps/apple/Packages/MotionLoomContracts && swift test
18
+ cd ../MotionLoomReview && swift test
19
+ cd ../MotionLoomMacBridge && swift test
20
+ cd ../MotionLoomReviewUI && swift test
21
+ cd ../MotionLoomReviewSync && swift test
22
+ cd ../../MotionLoomStudio && swift build
23
+ swift run MotionLoomStudio
24
+ ```
25
+
26
+ To verify the companion library against the installed iOS Simulator SDK without signing an app bundle:
27
+
28
+ ```bash
29
+ destination="$(mktemp)"
30
+ apps/apple/scripts/emit-ios-simulator-destination.sh "$destination"
31
+ (cd apps/apple/Packages/MotionLoomReviewUI && swift build --destination "$destination")
32
+ rm -f "$destination"
33
+ ```
34
+
35
+ > A successful native build, attestation or quality gate is **not** human approval. The only review records emitted by the app are `request_changes`, `reviewed_no_decision`, and `approve_for_next_human_step`.