motionloom 2.4.0 → 2.5.1

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 CHANGED
@@ -4,6 +4,46 @@ All notable MotionLoom changes are documented here. The project follows semantic
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.5.1] - 2026-08-18
8
+
9
+ ### Fixed
10
+
11
+ - Preserve the caller's working directory through the npm CLI router, so default onboarding targets the consumer project instead of the installed package directory.
12
+ - Ship Dev Lab assets, the runtime harness, Python requirements and optional browser runtime dependencies in the npm tarball; verify the installed package from an isolated consumer project before release.
13
+ - Render Dev Lab metadata and checks with safe DOM APIs, enforce a same-origin script CSP, and reject invalid, terminal or expired browser-review candidates before enabling review.
14
+ - Restrict runtime evidence cleanup to a dedicated child of an explicit policy root and preserve caller data outside that boundary.
15
+ - Read the CLI version from `package.json` so displayed status stays aligned with release metadata.
16
+ - Publish from GitHub Actions through npm Trusted Publishing/OIDC with a pinned compatible npm client, without a long-lived `NPM_TOKEN`; provenance is generated automatically by npm.
17
+
18
+ ### Verified
19
+
20
+ - Pass the full Python/Node regression suite, quality and signed-attestation gate, isolated installed-package smoke test, Dev Lab browser-security smoke test, real Rive/GSAP/Framer Motion runtime capture, 6,900-case deep stress run and twelve Swift package tests.
21
+ - Pass the pull-request Quality, Security Analysis, Documentation and Package Hygiene, Dev Lab and Apple workflows before preparing this patch release.
22
+
23
+ ### Boundary
24
+
25
+ - This patch does not add framework capability, Apple signing, TestFlight distribution or production approval. Browser review and remote release actions remain explicit human-governed steps.
26
+
27
+ ## [2.5.0] - 2026-08-17
28
+
29
+ ### Added
30
+
31
+ - Read-only `motionloom capability card --format json` discovery surface. It exports the evidence-validated runtime registry for an Agent, including runtime status, adapter/version, compatibility, verification timestamp, inputs/outputs, evidence references, limitations, fallback, risk and side-effect metadata.
32
+ - `pnpm intelligence:card` shortcut and `agent-card.json` command/capability declarations for machine-readable discovery without a parallel capability policy.
33
+ - `capability-registry.json` is included in the npm package allowlist, so the default card command has its verified registry after a normal package installation.
34
+ - Benchmark research ledger comparing public agent workflow, model-serving and AI/video repositories; the release applies the low-risk capability-card lesson and records deferred generation-profile and hash-bound workflow-template work with explicit gates.
35
+ - Native `apps/apple/` alpha in the GitHub source release: shared Swift packages for contracts, review state, macOS bridge, review UI and local-first CloudKit metadata sync, plus unsigned macOS Studio and iOS/iPadOS Review build targets and Apple CI.
36
+
37
+ ### Verified
38
+
39
+ - Capability-card export validates registry evidence before output and fails closed for missing, altered or out-of-repository evidence. It does not select a runtime or infer review/production approval.
40
+ - The repository release target passes the full regression suite, Skill/doctor and documentation gates, package artifact inspection, and GitHub Quality, Security, Documentation and Apple CI checks.
41
+
42
+ ### Boundary
43
+
44
+ - The Apple deliverable is an alpha source release. It has no Apple Developer signing, CloudKit production container, TestFlight distribution or iOS Simulator UI-smoke claim.
45
+ - Capability discovery is not execution authority. Runtime selection still validates current evidence, and attestation/production approval remain non-derived human decisions.
46
+
7
47
  ## [2.4.0] - 2026-08-15
8
48
 
9
49
  ### Added
@@ -109,6 +149,7 @@ See the [2.0.0 release note](docs/releases/2.0.0.md).
109
149
  The 1.5.0–1.9.0 milestones established runtime evidence, browser review, Intelligence Core, semantic lint, continuity, telemetry and trust-boundary hardening. Their detailed notes are available in [`docs/releases/`](docs/releases/).
110
150
 
111
151
  [2.2.0]: docs/releases/2.2.0.md
152
+ [2.5.0]: docs/releases/2.5.0.md
112
153
  [2.4.0]: docs/releases/2.4.0.md
113
154
  [2.3.0]: docs/releases/2.3.0.md
114
155
  [2.1.0]: docs/releases/2.1.0.md
package/README.md CHANGED
@@ -6,6 +6,7 @@
6
6
  [![License](https://img.shields.io/github/license/lenhonbp/MotionLoom)](LICENSE)
7
7
  [![Node.js 18+](https://img.shields.io/badge/Node.js-18%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
8
8
  [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white)](https://www.python.org/)
9
+ [![Apple](https://github.com/lenhonbp/MotionLoom/actions/workflows/apple.yml/badge.svg)](https://github.com/lenhonbp/MotionLoom/actions/workflows/apple.yml)
9
10
  [![Agent Skills](https://img.shields.io/badge/Agent%20Skill-compatible-5B5BD6)](https://agentskills.io/specification)
10
11
 
11
12
  **Project-aware animation production and runtime verification for coding agents.**
@@ -14,7 +15,7 @@ MotionLoom is an independent open-source Agent Skill for building UI motion, Lot
14
15
 
15
16
  > **MotionLoom is not an auto-approval layer.** A valid signature, a passing heuristic, or a successful render proves only the contract it checks. Visual quality, intent, accessibility and PR authorization remain reviewable human decisions.
16
17
 
17
- > **Release posture:** `motionloom@2.4.0` is the next release target. It adds a truthful `code_authored` runtime-first lane, a Framer Motion end-to-end reference candidate, identity-bound Dev Lab review evidence and task-bundle discovery that binds by declared scene identity rather than an inferred directory name. Verify npm/GitHub publication metadata separately; passing evidence never implies user approval.
18
+ > **Release posture:** MotionLoom 2.5.1 hardens installed-package onboarding, Dev Lab browser review, runtime-output cleanup and consumer-package acceptance. The native macOS/iOS review app remains an unsigned source alpha under `apps/apple/`; the npm package remains the cross-platform Node/Python Skill and documentation surface. Verify npm/GitHub publication metadata separately; passing evidence never implies user approval.
18
19
 
19
20
  ## Why MotionLoom
20
21
 
@@ -76,7 +77,7 @@ npx --no-install motionloom doctor # check the installed package
76
77
  npx --no-install motionloom repair --yes # restore only missing managed pieces
77
78
  ```
78
79
 
79
- MotionLoom supports **Node.js 18+** and **Python 3.11+** on Ubuntu, macOS and Windows. `npx` is the recommended first-run surface; after setup, use the project-local binary through `npx --no-install motionloom ...`. A global install remains optional, not required.
80
+ MotionLoom's onboarding and contract CLI supports **Node.js 18+** and **Python 3.11+** on Ubuntu, macOS and Windows. Browser-runtime capture uses the separately declared optional Playwright/Vite dependencies and follows the capability contract's Node.js 22 requirement. Signed-attestation commands additionally require the Python `cryptography` package declared in the shipped `requirements.txt`; `motionloom doctor` reports missing runtime prerequisites. `npx` is the recommended first-run surface; after setup, use the project-local binary through `npx --no-install motionloom ...`. A global install remains optional, not required.
80
81
 
81
82
  ### When you begin animation work
82
83
 
@@ -154,6 +155,14 @@ Read the [Project Memory schema](schemas/project-memory.schema.json), [2.1.0 rel
154
155
 
155
156
  Capability selection uses `agent-card.json` and the capability registry. A runtime is not promoted from `scaffold_only` to `verified` because a template exists; its adapter evidence and CI contract must pass.
156
157
 
158
+ An Agent can inspect the read-only capability card before choosing a renderer:
159
+
160
+ ```bash
161
+ motionloom capability card --format json
162
+ ```
163
+
164
+ The card exposes declared compatibility, evidence references, limitations and fallback paths. It does **not** select a runtime, refresh evidence, infer production approval or replace the verification step; use `motionloom intelligence capabilities select --registry capability-registry.json --capability runtime.<id>` immediately before execution.
165
+
157
166
  ## Evidence, trust and review
158
167
 
159
168
  MotionLoom keeps distinct layers distinct:
@@ -257,6 +266,14 @@ The public integration surfaces are intentionally small and inspectable:
257
266
 
258
267
  The Skill can trigger or suggest an internal browser-capable Agent to open the Dev Lab after rendering. Dev Lab is post-render review infrastructure, not a competing Skill. The user can request changes, receive a structured fix plan and rerender selectively, or explicitly confirm the PR path.
259
268
 
269
+ ## Native companion apps (alpha)
270
+
271
+ `apps/apple/` contains the native-first Apple companion surface. **MotionLoom Studio for macOS** opens a scoped project, exposes the evidence and timeline inspection surface, and can request only allow-listed local checks. **MotionLoom Review for iPhone and iPad** reads a hash-bound review launch descriptor, scrubs evidence, records annotations, and exports a human review decision.
272
+
273
+ These apps do not replace the Agent, the npm CLI or Dev Lab. They make a project’s artifact state and human review decision visible between Agent sessions. They cannot grant `production_approved`, set `OPEN_PR=1`, push Git changes, publish npm packages, or turn an AI-generated asset into artist-authored material.
274
+
275
+ Read [the Apple workspace guide](apps/apple/README.md), [the contract boundary](docs/architecture/apple/contracts.md), and [the TestFlight preparation guide](docs/apple-distribution.md) before building locally.
276
+
260
277
  ## Repository map
261
278
 
262
279
  | Path | Purpose |
@@ -273,6 +290,7 @@ The Skill can trigger or suggest an internal browser-capable Agent to open the D
273
290
  | `references/` | Progressive-disclosure implementation references |
274
291
  | `docs/` | Framework selection, checklists, audits and release notes |
275
292
  | `dev-lab/` | Self-contained browser review workbench and harness |
293
+ | `apps/apple/` | macOS Studio and iOS/iPadOS Review companion sources, Swift packages, Xcode project and local build guide |
276
294
  | `artifacts/<task-id>/` | Per-task evidence, report and handoff bundle |
277
295
  | `schemas/visual-truth.schema.json`, `scripts/visual-truth.py` | Provenance-bound visual comparison and review explanation contract |
278
296
  | `schemas/remediation-history.schema.json`, `scripts/remediation-learning.py` | Append-only remediation/benchmark ledger and aggregate learning metrics |
@@ -297,6 +315,7 @@ The Skill can trigger or suggest an internal browser-capable Agent to open the D
297
315
  | Check control-to-runtime and rig compatibility | `motionloom runtime-candidate`, `motionloom rig-compatibility`, and [production checklist](docs/CHECKLIST.md) |
298
316
  | Validate visual truth before review/PR | `motionloom visual-truth build|validate` and [production checklist](docs/CHECKLIST.md) |
299
317
  | Check current evidence posture | [Current status](docs/STATUS.md), [external corpus evidence](docs/audits/external-project-corpus-2026-08-13.md) and [historical audit snapshot](AUDIT-REPORT.md) |
318
+ | Build the native review companions | [Apple workspace guide](apps/apple/README.md), [Studio architecture](docs/architecture/apple/studio.md), and [distribution preparation](docs/apple-distribution.md) |
300
319
  | Contribute code or docs | [CONTRIBUTING.md](CONTRIBUTING.md) |
301
320
  | Report a vulnerability or request help | [SECURITY.md](SECURITY.md) and [SUPPORT.md](SUPPORT.md) |
302
321
  | See version history | [CHANGELOG.md](CHANGELOG.md) and [release notes](docs/releases/) |
@@ -305,6 +324,7 @@ The Skill can trigger or suggest an internal browser-capable Agent to open the D
305
324
 
306
325
  ```bash
307
326
  npm install
327
+ python3 -m pip install --requirement requirements.txt
308
328
  python3 scripts/skill-doctor.py --json
309
329
  python3 tests/scripts/run_tests.py
310
330
  python3 scripts/eval-intelligence.py
package/SKILL.md CHANGED
@@ -7,7 +7,7 @@ description: >-
7
7
  validate, review, or deliver animation inside an existing project.
8
8
  license: MIT
9
9
  metadata:
10
- version: "2.4.0"
10
+ version: "2.5.1"
11
11
  target_frameworks: "lottie,dotlottie,rive,gsap,framer-motion,spine,threejs"
12
12
  verified_runtimes: "lottie-json,dotlottie-package,svg-cutout-rig,rive,gsap,framer-motion"
13
13
  ---
package/agent-card.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "card_version": "1.0",
3
3
  "name": "motionloom",
4
- "version": "2.4.0",
4
+ "version": "2.5.1",
5
5
  "description": "Project-aware animation production with durable Project Memory, provider-neutral Artifact Intake, hash-bound control-to-runtime candidates, tiered asset provenance, framework-neutral motion IR, rig compatibility, runtime verification and telemetry, Visual Truth, Remediation Learning, DSSE-compatible signed attestation, internal browser review, trust-boundary hardening and deterministic Agent handoff.",
6
6
  "capabilities": [
7
7
  "project.setup",
@@ -41,6 +41,7 @@
41
41
  "provenance.emit",
42
42
  "provenance.verify",
43
43
  "capability.discover",
44
+ "capability.card",
44
45
  "capability.select",
45
46
  "replay.capture",
46
47
  "replay.verify",
@@ -121,6 +122,7 @@
121
122
  "project-graph",
122
123
  "provenance-attestation",
123
124
  "capability-registry",
125
+ "capability-card",
124
126
  "motion-ir",
125
127
  "replay-bundle",
126
128
  "semantic-lint-report",
@@ -203,6 +205,7 @@
203
205
  "intelligence_graph": "python3 scripts/intelligence.py graph build --task-dir artifacts/<task-id>",
204
206
  "intelligence_provenance": "python3 scripts/intelligence.py provenance build --task-dir artifacts/<task-id>",
205
207
  "intelligence_capabilities": "python3 scripts/intelligence.py capabilities build --output capability-registry.json",
208
+ "intelligence_capability_card": "motionloom capability card --format json",
206
209
  "intelligence_motion_ir": "python3 scripts/intelligence.py motion-ir build --task-dir artifacts/<task-id>",
207
210
  "intelligence_replay": "python3 scripts/intelligence.py replay capture --task-dir artifacts/<task-id>",
208
211
  "semantic_lint": "python3 scripts/intelligence.py semantic-lint build --task-dir artifacts/<task-id>",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
3
  "name": "motionloom",
4
- "version": "2.4.0",
4
+ "version": "2.5.1",
5
5
  "canonical": {
6
6
  "skill": "SKILL.md",
7
7
  "agent_card": "agent-card.json",
@@ -8,8 +8,11 @@
8
8
  import { fileURLToPath } from "node:url";
9
9
  import { dirname, resolve } from "node:path";
10
10
  import { spawnSync } from "node:child_process";
11
+ import { readFileSync } from "node:fs";
11
12
 
12
13
  const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
14
+ const PACKAGE = JSON.parse(readFileSync(resolve(ROOT, "package.json"), "utf8"));
15
+ const VERSION = PACKAGE.version || "unknown";
13
16
  const PYTHON = process.env.MOTIONLOOM_PYTHON || (process.platform === "win32" ? "python" : "python3");
14
17
 
15
18
  const PYTHON_COMMANDS = {
@@ -32,8 +35,6 @@ const PYTHON_COMMANDS = {
32
35
  pr: "scripts/pr.py",
33
36
  "validate-lottie": "scripts/validate-lottie.py",
34
37
  manifest: "scripts/manifest.py",
35
- test: "tests/scripts/run_tests.py",
36
- "deep-audit": "tests/scripts/deep-stress.py",
37
38
  discovery: "scripts/discovery.py",
38
39
  "visual-truth": "scripts/visual-truth.py",
39
40
  "remediation-learning": "scripts/remediation-learning.py",
@@ -54,8 +55,12 @@ const NODE_COMMANDS = {
54
55
  repair: "scripts/setup.mjs",
55
56
  };
56
57
 
58
+ const COMMAND_ALIASES = {
59
+ capability: { script: "scripts/intelligence.py", args: ["capabilities"] },
60
+ };
61
+
57
62
  function printHelp() {
58
- console.log(`MotionLoom 2.4.0 — project-aware animation production and evidence contracts
63
+ console.log(`MotionLoom ${VERSION} — project-aware animation production and evidence contracts
59
64
 
60
65
  Usage:
61
66
  motionloom <command> [args...]
@@ -69,6 +74,7 @@ Use when an animation task needs it:
69
74
  analyze Run project analysis and refresh Project Memory
70
75
  memory Initialize, inspect, refresh, recover or validate memory
71
76
  intelligence Build or validate Intelligence Core artifacts
77
+ capability Export or select evidence-bound runtime capabilities
72
78
  attestation Build/validate canonical signed-attestation artifacts
73
79
  verify-attestation Verify an attestation against a trust policy
74
80
  evidence-verify Verify runtime evidence externally
@@ -103,6 +109,7 @@ Cross-platform examples:
103
109
  --status accepted --summary "Use ease-out for UI entry" --user-confirmed
104
110
  motionloom discovery check --root . --json
105
111
  motionloom discovery install-matrix --root . --json
112
+ motionloom capability card --format json
106
113
  motionloom visual-truth validate --root . --input src/output/<scene>/visual-truth.json
107
114
  motionloom remediation-learning summary --history artifacts/remediation-history.jsonl --json
108
115
  motionloom asset-provenance check --input <asset-provenance.json> --root <scene-dir> --mode runtime --json
@@ -124,7 +131,8 @@ if (!command || command === "help" || command === "--help" || command === "-h")
124
131
  process.exit(0);
125
132
  }
126
133
 
127
- const script = NODE_COMMANDS[command] || PYTHON_COMMANDS[command];
134
+ const alias = COMMAND_ALIASES[command];
135
+ const script = alias?.script || NODE_COMMANDS[command] || PYTHON_COMMANDS[command];
128
136
  if (!script) {
129
137
  console.error(`Unknown MotionLoom command: ${command}`);
130
138
  printHelp();
@@ -132,9 +140,15 @@ if (!script) {
132
140
  }
133
141
 
134
142
  const executable = script.endsWith(".mjs") ? process.execPath : PYTHON;
135
- const delegatedArgs = NODE_COMMANDS[command] && !["setup", "init"].includes(command) ? [command, ...args] : command === "init" ? ["init", ...args] : args;
143
+ const delegatedArgs = alias
144
+ ? [...alias.args, ...args]
145
+ : NODE_COMMANDS[command] && !["setup", "init"].includes(command)
146
+ ? [command, ...args]
147
+ : command === "init"
148
+ ? ["init", ...args]
149
+ : args;
136
150
  const result = spawnSync(executable, [resolve(ROOT, script), ...delegatedArgs], {
137
- cwd: ROOT,
151
+ cwd: process.cwd(),
138
152
  stdio: "inherit",
139
153
  env: process.env,
140
154
  });
@@ -0,0 +1,308 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "registry_id": "registry-motionloom-2.5.1",
4
+ "generated_at": "2026-08-17T23:50:53Z",
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.1",
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-17T23:50:53Z",
34
+ "evidence": [
35
+ {
36
+ "path": "scripts/runtime-adapters.mjs",
37
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
71
+ "evidence": [
72
+ {
73
+ "path": "scripts/runtime-adapters.mjs",
74
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
108
+ "evidence": [
109
+ {
110
+ "path": "scripts/runtime-adapters.mjs",
111
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
145
+ "evidence": [
146
+ {
147
+ "path": "scripts/runtime-adapters.mjs",
148
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
182
+ "evidence": [
183
+ {
184
+ "path": "scripts/runtime-adapters.mjs",
185
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
219
+ "evidence": [
220
+ {
221
+ "path": "scripts/runtime-adapters.mjs",
222
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
256
+ "evidence": [
257
+ {
258
+ "path": "scripts/runtime-adapters.mjs",
259
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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.1",
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-17T23:50:53Z",
293
+ "evidence": [
294
+ {
295
+ "path": "scripts/runtime-adapters.mjs",
296
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
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
+ }