motionloom 2.5.0 → 2.6.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.md +2 -0
- package/CHANGELOG.md +52 -1
- package/README.md +20 -8
- package/SECURITY.md +6 -7
- package/SKILL.md +5 -3
- package/agent-card.json +4 -4
- package/agent-surfaces.json +1 -1
- package/bin/motionloom.mjs +5 -4
- package/capability-registry.json +26 -26
- package/dev-lab/public/action-library.js +899 -0
- package/dev-lab/public/devlab.js +722 -0
- package/dev-lab/public/index.html +163 -0
- package/dev-lab/public/runtime-bridge.js +109 -0
- package/docs/CHECKLIST.md +15 -2
- package/docs/DEV-LAB-RUNTIME.md +160 -0
- package/docs/DEV-LAB-STATE-TRANSITIONS.md +121 -0
- package/docs/STATUS.md +3 -3
- package/docs/releases/2.5.1.md +21 -0
- package/docs/releases/2.6.0.md +38 -0
- package/docs/releases/npm-publish-from-workstation.md +6 -6
- package/package.json +12 -4
- package/requirements.txt +1 -0
- package/rig-adapter-registry.json +3 -3
- package/schemas/browser-review-candidate.schema.json +37 -0
- package/schemas/devlab-runtime.schema.json +140 -0
- package/schemas/devlab-state-machine.schema.json +103 -0
- package/scripts/capture-runtime-telemetry.py +16 -8
- package/scripts/devlab.py +3 -10
- package/scripts/docs-audit.py +13 -1
- package/scripts/package-consumer-smoke.mjs +76 -0
- package/scripts/review-hook.py +255 -19
- package/scripts/runtime-adapters.mjs +28 -3
- package/scripts/skill-doctor.py +27 -1
- package/tests/runtime-harness/index.html +24 -0
- package/tests/runtime-harness/main.jsx +111 -0
- package/tests/scripts/run_tests.py +41 -0
package/AGENTS.md
CHANGED
|
@@ -12,6 +12,8 @@ motionloom discovery check --root . --json
|
|
|
12
12
|
|
|
13
13
|
Then follow the lifecycle in `SKILL.md`. The repository may coordinate Lottie, dotLottie, Rive, GSAP and Framer Motion, but it does not replace those runtimes. Render evidence, provenance, semantic checks and browser review are separate states. **Do not infer user approval from a passing heuristic, signature, screenshot or quality gate.**
|
|
14
14
|
|
|
15
|
+
For Dev Lab work, also read [`docs/CHECKLIST.md`](docs/CHECKLIST.md) and [`docs/DEV-LAB-RUNTIME.md`](docs/DEV-LAB-RUNTIME.md). A runnable animation candidate should expose the live runtime descriptor/controls defined there; 0/50/100 PNGs remain evidence/fallback and must not be presented as an interactive runtime when live playback is available.
|
|
16
|
+
|
|
15
17
|
## Source of truth
|
|
16
18
|
|
|
17
19
|
Do not duplicate or edit Agent-specific copies of the workflow. If this router conflicts with `SKILL.md`, the canonical root Skill and machine-readable schemas win. Use `references/agent-interoperability.md` for discovery details and `docs/AGENT-INTEGRATION.md` for installation examples.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,55 @@ All notable MotionLoom changes are documented here. The project follows semantic
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.6.0] - 2026-08-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Upgrade Dev Lab from checkpoint-oriented review to an interactive live-runtime workbench with Play, Pause, Restart, scrub, frame-step, speed and loop controls plus fullscreen, zoom/fit, background, grid, bounds, baseline and pivot inspection tools.
|
|
12
|
+
- Discover arbitrary project-defined actions from `devlab-runtime.json` instead of hard-coding `idle`, `walk`, `run` or `attack`; add groups/categories, tags, search, collapsible sections and review-state filters for large action libraries.
|
|
13
|
+
- Add the hash-bound `devlab-state-machine.json` contract, legal transition controls, transition history and bounded multi-step review sequences for flows such as `Idle -> Run -> Attack -> Hurt -> Idle`.
|
|
14
|
+
- Add strict iframe `runtime-trigger` support through `triggerTransition(request)` and portable `select-animation` transitions for sprite/clip runtimes.
|
|
15
|
+
|
|
16
|
+
### Hardened
|
|
17
|
+
|
|
18
|
+
- Bind declared live-runtime and state-machine bytes into the browser-review candidate so runtime drift invalidates stale review links.
|
|
19
|
+
- Fail closed on unsafe/missing runtime paths, duplicate animation ids, mismatched candidate/runtime action sets and unsupported runtime triggers; a failed live runtime remains inspectable only through explicit captured-evidence fallback and cannot be approved.
|
|
20
|
+
- Keep Action Library search/group/filter presentation independent from review coverage so hidden required actions do not disappear from the approval gate.
|
|
21
|
+
- Count runtime-trigger transitions only after the target state is observable; never silently replace a failed runtime state transition with a clip switch.
|
|
22
|
+
- Ship `runtime-bridge.js` with the npm package so installed-package iframe/state-machine review uses the same bridge as the repository harness.
|
|
23
|
+
|
|
24
|
+
### Verified
|
|
25
|
+
|
|
26
|
+
- Dev Lab CI covers deterministic snapshots, live sprite and iframe runtimes, a four-action interactive dogfood candidate, a twelve-action Action Library fixture, sprite state transitions, real iframe runtime-trigger transitions and browser-security smoke tests.
|
|
27
|
+
- Pull requests #13, #14 and #15 passed Dev Lab Build, MotionLoom Quality, Security Analysis and Documentation and Package Hygiene before this release candidate was prepared.
|
|
28
|
+
|
|
29
|
+
### Boundary
|
|
30
|
+
|
|
31
|
+
- Runtime playback, action/transition/sequence coverage, successful triggers, hashes, snapshots and automated checks are evidence only. `approved` remains an explicit user decision bound to the exact candidate.
|
|
32
|
+
- MotionLoom does not promote AI-generated material to artist-authored or production-approved status, and this release does not change the unsigned source-alpha status of the Apple companion apps.
|
|
33
|
+
|
|
34
|
+
See the [2.6.0 release note](docs/releases/2.6.0.md) for the Dev Lab runtime contract, verification scope and trust boundaries.
|
|
35
|
+
|
|
36
|
+
## [2.5.1] - 2026-08-18
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- Preserve the caller's working directory through the npm CLI router, so default onboarding targets the consumer project instead of the installed package directory.
|
|
41
|
+
- 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.
|
|
42
|
+
- 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.
|
|
43
|
+
- Restrict runtime evidence cleanup to a dedicated child of an explicit policy root and preserve caller data outside that boundary.
|
|
44
|
+
- Read the CLI version from `package.json` so displayed status stays aligned with release metadata.
|
|
45
|
+
- 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.
|
|
46
|
+
|
|
47
|
+
### Verified
|
|
48
|
+
|
|
49
|
+
- 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.
|
|
50
|
+
- Pass the pull-request Quality, Security Analysis, Documentation and Package Hygiene, Dev Lab and Apple workflows before preparing this patch release.
|
|
51
|
+
|
|
52
|
+
### Boundary
|
|
53
|
+
|
|
54
|
+
- 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.
|
|
55
|
+
|
|
7
56
|
## [2.5.0] - 2026-08-17
|
|
8
57
|
|
|
9
58
|
### Added
|
|
@@ -128,9 +177,11 @@ See the [2.0.0 release note](docs/releases/2.0.0.md).
|
|
|
128
177
|
|
|
129
178
|
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/).
|
|
130
179
|
|
|
131
|
-
[2.
|
|
180
|
+
[2.6.0]: docs/releases/2.6.0.md
|
|
181
|
+
[2.5.1]: docs/releases/2.5.1.md
|
|
132
182
|
[2.5.0]: docs/releases/2.5.0.md
|
|
133
183
|
[2.4.0]: docs/releases/2.4.0.md
|
|
134
184
|
[2.3.0]: docs/releases/2.3.0.md
|
|
185
|
+
[2.2.0]: docs/releases/2.2.0.md
|
|
135
186
|
[2.1.0]: docs/releases/2.1.0.md
|
|
136
187
|
[2.0.0]: docs/releases/2.0.0.md
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ MotionLoom is an independent open-source Agent Skill for building UI motion, Lot
|
|
|
15
15
|
|
|
16
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.
|
|
17
17
|
|
|
18
|
-
> **Release posture:** MotionLoom 2.
|
|
18
|
+
> **Release posture:** MotionLoom 2.6.0 upgrades Dev Lab into an interactive runtime review workbench with live playback controls, arbitrary project-defined Action Libraries and optional state/transition testing, while preserving deterministic snapshots and explicit human approval. 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 runtime evidence never implies user approval.
|
|
19
19
|
|
|
20
20
|
## Why MotionLoom
|
|
21
21
|
|
|
@@ -33,7 +33,7 @@ MotionLoom turns that fragile sequence into a bounded production system. Its dur
|
|
|
33
33
|
| **Asset consistency** | Measured multi-frame geometry, pivot/footline stability, atlas boundaries and layered-map contracts | Treat a heuristic warning or deterministic pass as artist approval or production authorization |
|
|
34
34
|
| **Runtime truth** | Lottie/dotLottie, SVG cutout rig, Rive, GSAP and Framer Motion evidence from real runtime paths | Call scaffold, static validation or a heuristic score visual approval |
|
|
35
35
|
| **Agent intelligence** | Project graph, provenance, Motion IR, replay, semantic lint, continuity and fix plan | Convert confidence, benchmark output or warnings into approval |
|
|
36
|
-
| **Human review** | Exact candidate URL,
|
|
36
|
+
| **Human review** | Exact candidate URL, live playback, Action Library, state/transition testing, deterministic checkpoints, checklist and review artifact in Dev Lab | Confirm, push or open a PR without explicit user authorization |
|
|
37
37
|
|
|
38
38
|
## The production contract
|
|
39
39
|
|
|
@@ -55,6 +55,16 @@ flowchart LR
|
|
|
55
55
|
|
|
56
56
|
Every handoff is machine-readable. The typical bundle under `artifacts/<task-id>/` includes the task ledger, context hash, motion spec, manifest, runtime snapshots, telemetry, project graph, provenance, lint and continuity reports, fix plan, browser-review candidate, review decision, execution report and next-Agent handoff.
|
|
57
57
|
|
|
58
|
+
## Interactive Dev Lab
|
|
59
|
+
|
|
60
|
+
Dev Lab is designed to let the user inspect the same candidate behavior that MotionLoom is claiming as runtime evidence, rather than treating three screenshots as an animation review surface. A live candidate can expose Play, Pause, Restart, scrub, frame-step, speed and loop controls together with fullscreen, zoom/fit, background, grid, bounds, baseline and pivot inspection tools. Deterministic snapshots remain available as captured evidence and compatibility fallback.
|
|
61
|
+
|
|
62
|
+
Actions are data-driven. `devlab-runtime.json` may declare any project-specific action vocabulary and optional groups/tags, so a character can expose `Idle`, `Walk`, `Run`, `Attack`, `Jump`, skills, reactions, emotes or domain-specific clips without a MotionLoom UI change. Dev Lab turns large sets into a searchable/filterable Action Library while keeping review coverage independent from presentation filters.
|
|
63
|
+
|
|
64
|
+
When interaction between actions matters, an optional hash-bound `devlab-state-machine.json` can declare states, legal transitions and review sequences such as `Idle -> Run -> Attack -> Hurt -> Idle`. Sprite/clip candidates can use portable `select-animation` transitions; iframe runtimes can implement strict `runtime-trigger` transitions through the runtime bridge. A runtime trigger counts as inspected only after the target state is observable, and unsupported triggers are never silently replaced by clip switches.
|
|
65
|
+
|
|
66
|
+
Review policy may require selected actions, transitions or sequences to be inspected before approval becomes available. **Completing playback or transition coverage does not approve the candidate.** Request Changes remains available and `approved` is still an explicit user decision. See the [Dev Lab live runtime contract](docs/DEV-LAB-RUNTIME.md) and [2.6.0 release note](docs/releases/2.6.0.md).
|
|
67
|
+
|
|
58
68
|
## Quick start
|
|
59
69
|
|
|
60
70
|
### Start once. Continue your normal work.
|
|
@@ -77,7 +87,7 @@ npx --no-install motionloom doctor # check the installed package
|
|
|
77
87
|
npx --no-install motionloom repair --yes # restore only missing managed pieces
|
|
78
88
|
```
|
|
79
89
|
|
|
80
|
-
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.
|
|
90
|
+
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.
|
|
81
91
|
|
|
82
92
|
### When you begin animation work
|
|
83
93
|
|
|
@@ -175,7 +185,7 @@ MotionLoom keeps distinct layers distinct:
|
|
|
175
185
|
| Provenance | Which source/material/product bytes were used and how they hash | That the source is appropriate beyond the declared authority/license contract |
|
|
176
186
|
| Semantic lint and benchmark | Bounded rule findings, risk signals and performance measurements | Human visual quality or intent acceptance |
|
|
177
187
|
| Signed attestation | A trusted signer signed the same task-bound hashes under the policy | Reviewer consent, accessibility approval or PR authorization |
|
|
178
|
-
| Dev Lab review | The user saw the exact candidate and recorded a decision | A future candidate is automatically approved |
|
|
188
|
+
| Dev Lab review | The user saw and interacted with the exact candidate and recorded a decision | A future candidate is automatically approved |
|
|
179
189
|
|
|
180
190
|
`approval` remains `false` in attestation and verifier artifacts. The default PR mode is local-only (`OPEN_PR=0`); commit, push and pull-request operations remain explicit side effects.
|
|
181
191
|
|
|
@@ -307,6 +317,7 @@ Read [the Apple workspace guide](apps/apple/README.md), [the contract boundary](
|
|
|
307
317
|
| Install or understand the full lifecycle | [SKILL.md](SKILL.md) |
|
|
308
318
|
| Choose a runtime | [Framework selection](docs/FRAMEWORK-SELECTION.md) and [runtime capability reference](references/runtime-capability.md) |
|
|
309
319
|
| Run a review-ready scene | [Production checklist](docs/CHECKLIST.md) and [browser review contract](references/browser-review-contract.md) |
|
|
320
|
+
| Configure live actions, playback or state transitions in Dev Lab | [Dev Lab live runtime contract](docs/DEV-LAB-RUNTIME.md) and [2.6.0 release note](docs/releases/2.6.0.md) |
|
|
310
321
|
| Understand Agent intelligence | [Intelligence Core](references/intelligence-core.md) and [roadmap](ROADMAP.md) |
|
|
311
322
|
| Run labeled project evaluation | [Project corpus manifest](tests/evals/project-corpus.json) and `python3 scripts/eval-projects.py --allow-insufficient` |
|
|
312
323
|
| Understand trust boundaries | [Signed attestation](references/signed-attestation.md) and [2.0.0 release note](docs/releases/2.0.0.md) |
|
|
@@ -324,6 +335,7 @@ Read [the Apple workspace guide](apps/apple/README.md), [the contract boundary](
|
|
|
324
335
|
|
|
325
336
|
```bash
|
|
326
337
|
npm install
|
|
338
|
+
python3 -m pip install --requirement requirements.txt
|
|
327
339
|
python3 scripts/skill-doctor.py --json
|
|
328
340
|
python3 tests/scripts/run_tests.py
|
|
329
341
|
python3 scripts/eval-intelligence.py
|
|
@@ -338,17 +350,17 @@ The GitHub Actions workflow is designed to run the Project Memory and CLI contra
|
|
|
338
350
|
|
|
339
351
|
## Automated CI/CD
|
|
340
352
|
|
|
341
|
-
MotionLoom separates verification from publication. Pull requests and pushes to `main` trigger the quality, documentation, security and relevant Dev Lab workflows when their path filters match. A weekly Dependabot job proposes dependency updates for the root package, Dev Lab and GitHub Actions. The npm release workflow is manual only, protected by the `npm-release` environment, and requires the maintainer to choose the distribution tag; GitHub release creation is
|
|
353
|
+
MotionLoom separates verification from publication. Pull requests and pushes to `main` trigger the quality, documentation, security and relevant Dev Lab workflows when their path filters match. A weekly Dependabot job proposes dependency updates for the root package, Dev Lab and GitHub Actions. The npm release workflow is manual only, protected by the `npm-release` environment, and requires the maintainer to choose the distribution tag; GitHub release creation is a dispatch input rather than a consequence of ordinary CI.
|
|
342
354
|
|
|
343
355
|
| Workflow | Trigger | Responsibility |
|
|
344
356
|
|---|---|---|
|
|
345
357
|
| `quality.yml` | Pull request, `main`, manual | Cross-platform memory/CLI matrix and full evidence-aware quality suite |
|
|
346
358
|
| `docs.yml` | Documentation/package changes, `main`, manual | Internal links, metadata, workflow safety, Skill Doctor and npm tarball inspection |
|
|
347
359
|
| `security.yml` | Pull request, `main`, weekly schedule, manual | Dependency review and CodeQL for JavaScript/Python |
|
|
348
|
-
| `devlab.yml` | `dev-lab/**` changes, `main`, manual | Build and retain the browser review workbench
|
|
349
|
-
| `release.yml` | Manual dispatch only | Regression, npm
|
|
360
|
+
| `devlab.yml` | `dev-lab/**` changes, `main`, manual | Build and retain the interactive browser review workbench artifacts and smoke evidence |
|
|
361
|
+
| `release.yml` | Manual dispatch only | Regression, installed-package smoke, release traceability, npm Trusted Publishing with provenance and optional GitHub Release |
|
|
350
362
|
|
|
351
|
-
To enable npm publication, configure
|
|
363
|
+
To enable npm publication, configure the protected GitHub environment named `npm-release` and configure npm Trusted Publishing for this repository/workflow/environment. No long-lived `NPM_TOKEN` is required or expected by the current release workflow. Each manual run provides `release_version`; the workflow verifies package/changelog/release-note alignment before publishing. The workflow never runs on a pull request and never changes MotionLoom's user-review or approval contract.
|
|
352
364
|
|
|
353
365
|
## License
|
|
354
366
|
|
package/SECURITY.md
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Security fixes |
|
|
6
6
|
|---|---|
|
|
7
|
-
| `2.
|
|
8
|
-
| `2.
|
|
9
|
-
| `2.
|
|
10
|
-
| `<2.0.0` | Not supported |
|
|
7
|
+
| `2.6.x` | Current supported line |
|
|
8
|
+
| `2.5.x` | Previous line; security fixes are best effort while consumers upgrade |
|
|
9
|
+
| `2.4.x` and earlier | Upgrade recommended; no routine support commitment |
|
|
11
10
|
|
|
12
11
|
## Reporting a vulnerability
|
|
13
12
|
|
|
@@ -19,10 +18,10 @@ If private reporting is unavailable, open a minimal issue titled **Security cont
|
|
|
19
18
|
|
|
20
19
|
MotionLoom can read and write files in the host project, invoke runtimes and prepare Git operations. The npm CLI does not silently push, open a PR or turn evidence into approval. Treat project context, artifact bundles, trust policies, private keys and browser sessions as sensitive. Keep managed signing keys outside the repository and never use CI fixture keys as production trust anchors.
|
|
21
20
|
|
|
22
|
-
Path guards, task identity, source/manifest hashes, evidence freshness, signer policy and approval invariants are security-relevant contracts. Report any bypass that allows cross-project memory, cross-task evidence, stale runtime output or unreviewed Git side effects.
|
|
21
|
+
Path guards, task identity, source/manifest hashes, runtime bundle hashes, state-machine bindings, evidence freshness, signer policy and approval invariants are security-relevant contracts. Report any bypass that allows cross-project memory, cross-task evidence, stale runtime output, undeclared runtime/state-machine bytes or unreviewed Git side effects.
|
|
23
22
|
|
|
24
|
-
See the [signed attestation reference](references/signed-attestation.md), [browser review contract](references/browser-review-contract.md) and [2.
|
|
23
|
+
See the [signed attestation reference](references/signed-attestation.md), [browser review contract](references/browser-review-contract.md), [Dev Lab runtime contract](docs/DEV-LAB-RUNTIME.md) and [2.6.0 release note](docs/releases/2.6.0.md) for the current trust boundaries and limitations.
|
|
25
24
|
|
|
26
25
|
## CI/CD controls
|
|
27
26
|
|
|
28
|
-
GitHub Actions workflows default to read-only repository permissions. The publication workflow is manual-only, uses the protected `npm-release` environment, requests OIDC only for the release job
|
|
27
|
+
GitHub Actions workflows default to read-only repository permissions. The publication workflow is manual-only, uses the protected `npm-release` environment, requests OIDC only for the release job and publishes through npm Trusted Publishing without a long-lived `NPM_TOKEN`. npm provenance is generated by the trusted publication path. Dependency updates are proposed by Dependabot as pull requests rather than applied directly to `main`.
|
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.
|
|
10
|
+
version: "2.6.0"
|
|
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
|
---
|
|
@@ -38,10 +38,10 @@ For Agent or CI composition, consume JSON and preserve the exit code. If the pro
|
|
|
38
38
|
6. **Bind Intelligence Core** — build a framework-neutral `motion-ir.json`, `project-graph.json`, `provenance.json`, `replay-bundle.json`, `semantic-lint-report.json` and `semantic-lint-benchmark.json` with `python3 scripts/intelligence.py`. Select only a capability registry entry whose status is `verified`, whose evidence is fresh and whose compatibility matches the target environment. A confidence score or benchmark result can prioritize investigation; neither can replace deterministic or human acceptance.
|
|
39
39
|
6a. **Harden the trust boundary** — keep artifact and task bundles inside the repository/task root, reject symlinked evidence, bind replay to its exact `task_dir`, `task_id` and scene, select one deterministic report bundle per scene, and require browser candidate/review identity and expiry checks before readiness. The Dev Lab must reject cross-origin or identity-mismatched artifact bases. In strict runtime-observability runs, capture `runtime-telemetry.json` and a read-only `evidence-verifier-report.json`; verifier output must preserve `approval: false`. These checks expose risk and prevent evidence mixing, but do not turn heuristics or evidence integrity into approval.
|
|
40
40
|
6b. **Attest** — derive a canonical statement from the exact scene/task hashes, sign it with an Ed25519 key through `scripts/attestation.py`, and verify it with the independent `scripts/attestation-verifier.py` against a fail-closed `trust-policy.json`. DSSE/SLSA-compatible attestation proves signer and binding integrity only; `approval` must remain `false` and never replaces user review.
|
|
41
|
-
7. **Visual truth and browser review handoff** — after runtime rendering, build `visual-truth.json` from real baseline/candidate PNGs with `motionloom visual-truth build`. The contract records frame hashes, dimensions, runtime/source/manifest provenance and region-level review explanations; a changed frame means `review_required`, never automatic failure or approval. Then run `python3 scripts/review-hook.py prepare --task-dir artifacts/<task-id> --lab-url <internal-lab-url>`. The hook prepares the exact candidate and emits a JSON action for a browser-capable Agent. Trigger or suggest that Agent to open the emitted URL,
|
|
41
|
+
7. **Visual truth and browser review handoff** — after runtime rendering, build `visual-truth.json` from real baseline/candidate PNGs with `motionloom visual-truth build`. The contract records frame hashes, dimensions, runtime/source/manifest provenance and region-level review explanations; a changed frame means `review_required`, never automatic failure or approval. Then run `python3 scripts/review-hook.py prepare --task-dir artifacts/<task-id> --lab-url <internal-lab-url>`. The hook prepares the exact candidate and emits a JSON action for a browser-capable Agent. Trigger or suggest that Agent to open the emitted URL. For live candidates, expose the declared Action Library and real playback controls (Play/Pause/Restart/scrub/frame-step/speed/loop); when `devlab-state-machine.json` is hash-bound, expose its legal transitions and required review sequences. Deterministic 0/50/100 snapshots remain evidence/fallback, not a substitute for live interaction. This is not a separate Dev Lab Skill; it is a required post-render handoff.
|
|
42
42
|
|
|
43
43
|
> **Runtime-first reference:** `examples/agent-consumer/runtime-pilot/` and `src/output/runtime-pilot-framer/` demonstrate a code-authored Framer Motion lane with hash-bound Intake controls, deterministic 0/50/100 Playwright frames, strict runtime candidate validation, verifier and `approval: false` attestation before a prepared Dev Lab review. It is evidence of the pipeline, not a release approval or a substitute for an imported art package.
|
|
44
|
-
8. **Review capture** — the browser Agent calls `window.__lab.getReview()` after the user approves or requests changes, then persists it with `python3 scripts/report.py review --task-dir artifacts/<task-id> --candidate-id <id> --decision approved|changes_requested --reviewer user`. A change request returns to generation; no approval means no PR.
|
|
44
|
+
8. **Review capture** — the browser Agent calls `window.__lab.getReview()` after the user approves or requests changes, then persists it with `python3 scripts/report.py review --task-dir artifacts/<task-id> --candidate-id <id> --decision approved|changes_requested --reviewer user`. A change request returns to generation; no approval means no PR. Playback, action coverage, transition coverage and sequence completion remain evidence only and must never mint the user's decision.
|
|
45
45
|
9. **Validate** — run `motionloom asset-provenance check --input src/output/<scene>/asset-provenance.json --root src/output/<scene> --mode runtime|production --manifest src/output/<scene>/manifest.json`, `motionloom visual-truth validate --root . --input src/output/<scene>/visual-truth.json --scene <scene> --task-id <task-id>`, `motionloom review-hook validate --task-dir artifacts/<task-id>`, `motionloom intelligence semantic-lint benchmark --task-dir artifacts/<task-id> --iterations 25 --threshold-ms 500`, `motionloom runtime-telemetry <scene> artifacts/<task-id>`, the independent attestation verifier, `motionloom report-contract --root . --scenes-file <changed-scenes> --require-attestation`, `motionloom quality-gate --scene <scene> --context <context-path> --task-dir artifacts/<task-id> --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation --require-visual-truth --require-asset-provenance`, and `motionloom doctor --json` when validating the Skill package itself.
|
|
46
46
|
10. **Report** — create or update an artifact bundle with `python3 scripts/report.py`. Record facts with `report.py add`, structural defects with `report.py structure`, collect checksums with `report.py collect`, and run `report.py check` before rendering the final report. The final report must state completed, verified, not completed, blocked/failed, structure problems, browser candidate/review evidence and the recommended next Agent/Skill.
|
|
47
47
|
11. **Learn** — after a user-confirmed fix or a deterministic benchmark, record it with `motionloom remediation-learning record-outcome|record-benchmark`. Run `summary` to expose correction count, first-pass acceptance, success rate, issue-class outliers and benchmark pass rate. Only `--user-confirmed` outcomes contribute to remediation acceptance metrics.
|
|
@@ -69,6 +69,7 @@ Only user-confirmed decisions and outcomes may become durable remediation memory
|
|
|
69
69
|
- Read `references/runtime-capability.md` before claiming a framework is production-verified.
|
|
70
70
|
- Read `docs/FRAMEWORK-SELECTION.md` and `docs/CATEGORIES.md` when selecting a runtime.
|
|
71
71
|
- Read `docs/CHECKLIST.md` before marking a scene ready for review.
|
|
72
|
+
- Read `docs/DEV-LAB-RUNTIME.md` before declaring live actions, playback controls, Action Library metadata or state/transition review flows.
|
|
72
73
|
- Read `src/rig/README.md` for character body hierarchy and pose rules.
|
|
73
74
|
- Read `references/dotlottie-source-notes.md` when packaging or validating `.lottie` archives.
|
|
74
75
|
- Read `docs/ROADMAP-INTELLIGENCE.md` before extending graph, provenance, capability or replay behavior.
|
|
@@ -94,6 +95,7 @@ Only user-confirmed decisions and outcomes may become durable remediation memory
|
|
|
94
95
|
- Artifact Intake is provider-neutral and hash-bound: receipt, control track, export manifest, provenance reference and adapter registry evidence must agree with the actual output bytes. Provider metadata, a prompt, a skill name, a model identifier or an adapter status cannot mint artist authority, production eligibility, runtime proof or approval.
|
|
95
96
|
- A runtime candidate may become `runtime_test_ready` only when its intake and referenced consistency contracts pass. Rig compatibility must bind a supported adapter, skeleton/socket/action/event requirements and runtime evidence; `static-validated` and `scaffold` remain non-production states.
|
|
96
97
|
- Browser-review candidates are single-use, time-bounded and bound to the exact task, scene and candidate identity; Dev Lab artifact/task bases must be same-origin and identity-consistent before staging a review decision.
|
|
98
|
+
- Live Dev Lab review is data-driven and hash-bound: declared runtime and state-machine files must stay inside the scene, Action Library filtering must not weaken review coverage, and unsupported `runtime-trigger` transitions must fail visibly rather than silently switching clips.
|
|
97
99
|
- Report completeness must select one deterministic passing task bundle per scene and fail on ambiguous ties; a valid artifact is never sufficient to bypass explicit user approval.
|
|
98
100
|
- Runtime telemetry must bind task, scene, source, manifest, Motion IR and deterministic scrub points; tampered, stale, missing or cross-task telemetry is a verification failure.
|
|
99
101
|
- Visual Truth must bind baseline/candidate PNG hashes, dimensions, source, manifest, runtime evidence and Motion IR where available; it explains changed regions for review but never emits approval.
|
package/agent-card.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"card_version": "1.0",
|
|
3
3
|
"name": "motionloom",
|
|
4
|
-
"version": "2.
|
|
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,
|
|
4
|
+
"version": "2.6.0",
|
|
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, interactive Dev Lab review, trust-boundary hardening and deterministic Agent handoff.",
|
|
6
6
|
"capabilities": [
|
|
7
7
|
"project.setup",
|
|
8
8
|
"project.status",
|
|
@@ -146,8 +146,8 @@
|
|
|
146
146
|
"network": "optional-and-declared",
|
|
147
147
|
"git_commit": "explicit-confirmation",
|
|
148
148
|
"git_push": "explicit-confirmation",
|
|
149
|
-
"open_pull_request": "explicit-confirmation"
|
|
150
|
-
|
|
149
|
+
"open_pull_request": "explicit-confirmation",
|
|
150
|
+
"open_internal_browser": "trigger-or-suggest-after-render; user-review-required"
|
|
151
151
|
},
|
|
152
152
|
"recommended_integrations": [
|
|
153
153
|
{
|
package/agent-surfaces.json
CHANGED
package/bin/motionloom.mjs
CHANGED
|
@@ -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",
|
|
@@ -59,7 +60,7 @@ const COMMAND_ALIASES = {
|
|
|
59
60
|
};
|
|
60
61
|
|
|
61
62
|
function printHelp() {
|
|
62
|
-
console.log(`MotionLoom
|
|
63
|
+
console.log(`MotionLoom ${VERSION} — project-aware animation production and evidence contracts
|
|
63
64
|
|
|
64
65
|
Usage:
|
|
65
66
|
motionloom <command> [args...]
|
|
@@ -147,7 +148,7 @@ const delegatedArgs = alias
|
|
|
147
148
|
? ["init", ...args]
|
|
148
149
|
: args;
|
|
149
150
|
const result = spawnSync(executable, [resolve(ROOT, script), ...delegatedArgs], {
|
|
150
|
-
cwd:
|
|
151
|
+
cwd: process.cwd(),
|
|
151
152
|
stdio: "inherit",
|
|
152
153
|
env: process.env,
|
|
153
154
|
});
|
package/capability-registry.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "0.1",
|
|
3
|
-
"registry_id": "registry-motionloom-2.5.
|
|
4
|
-
"generated_at": "2026-08-
|
|
3
|
+
"registry_id": "registry-motionloom-2.5.1",
|
|
4
|
+
"generated_at": "2026-08-17T23:50:53Z",
|
|
5
5
|
"selection_policy": {
|
|
6
6
|
"require_verified": true,
|
|
7
7
|
"allow_scaffold_only": false,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"id": "runtime.lottie-json",
|
|
13
13
|
"kind": "renderer",
|
|
14
14
|
"status": "verified",
|
|
15
|
-
"adapter_version": "2.5.
|
|
15
|
+
"adapter_version": "2.5.1",
|
|
16
16
|
"inputs": [
|
|
17
17
|
"project-context",
|
|
18
18
|
"motion-spec",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
],
|
|
31
31
|
"node": ">=22"
|
|
32
32
|
},
|
|
33
|
-
"last_verified_at": "2026-08-
|
|
33
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
34
34
|
"evidence": [
|
|
35
35
|
{
|
|
36
36
|
"path": "scripts/runtime-adapters.mjs",
|
|
37
|
-
"sha256": "
|
|
37
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
38
38
|
"kind": "ci"
|
|
39
39
|
}
|
|
40
40
|
],
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"id": "runtime.dotlottie-package",
|
|
50
50
|
"kind": "packager",
|
|
51
51
|
"status": "verified",
|
|
52
|
-
"adapter_version": "2.5.
|
|
52
|
+
"adapter_version": "2.5.1",
|
|
53
53
|
"inputs": [
|
|
54
54
|
"project-context",
|
|
55
55
|
"motion-spec",
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
],
|
|
68
68
|
"node": ">=22"
|
|
69
69
|
},
|
|
70
|
-
"last_verified_at": "2026-08-
|
|
70
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
71
71
|
"evidence": [
|
|
72
72
|
{
|
|
73
73
|
"path": "scripts/runtime-adapters.mjs",
|
|
74
|
-
"sha256": "
|
|
74
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
75
75
|
"kind": "ci"
|
|
76
76
|
}
|
|
77
77
|
],
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"id": "runtime.svg-cutout-rig",
|
|
87
87
|
"kind": "renderer",
|
|
88
88
|
"status": "verified",
|
|
89
|
-
"adapter_version": "2.5.
|
|
89
|
+
"adapter_version": "2.5.1",
|
|
90
90
|
"inputs": [
|
|
91
91
|
"project-context",
|
|
92
92
|
"motion-spec",
|
|
@@ -104,11 +104,11 @@
|
|
|
104
104
|
],
|
|
105
105
|
"node": ">=22"
|
|
106
106
|
},
|
|
107
|
-
"last_verified_at": "2026-08-
|
|
107
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
108
108
|
"evidence": [
|
|
109
109
|
{
|
|
110
110
|
"path": "scripts/runtime-adapters.mjs",
|
|
111
|
-
"sha256": "
|
|
111
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
112
112
|
"kind": "ci"
|
|
113
113
|
}
|
|
114
114
|
],
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"id": "runtime.rive",
|
|
124
124
|
"kind": "runtime-adapter",
|
|
125
125
|
"status": "verified",
|
|
126
|
-
"adapter_version": "2.5.
|
|
126
|
+
"adapter_version": "2.5.1",
|
|
127
127
|
"inputs": [
|
|
128
128
|
"project-context",
|
|
129
129
|
"motion-spec",
|
|
@@ -141,11 +141,11 @@
|
|
|
141
141
|
],
|
|
142
142
|
"node": ">=22"
|
|
143
143
|
},
|
|
144
|
-
"last_verified_at": "2026-08-
|
|
144
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
145
145
|
"evidence": [
|
|
146
146
|
{
|
|
147
147
|
"path": "scripts/runtime-adapters.mjs",
|
|
148
|
-
"sha256": "
|
|
148
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
149
149
|
"kind": "ci"
|
|
150
150
|
}
|
|
151
151
|
],
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"id": "runtime.gsap",
|
|
161
161
|
"kind": "runtime-adapter",
|
|
162
162
|
"status": "verified",
|
|
163
|
-
"adapter_version": "2.5.
|
|
163
|
+
"adapter_version": "2.5.1",
|
|
164
164
|
"inputs": [
|
|
165
165
|
"project-context",
|
|
166
166
|
"motion-spec",
|
|
@@ -178,11 +178,11 @@
|
|
|
178
178
|
],
|
|
179
179
|
"node": ">=22"
|
|
180
180
|
},
|
|
181
|
-
"last_verified_at": "2026-08-
|
|
181
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
182
182
|
"evidence": [
|
|
183
183
|
{
|
|
184
184
|
"path": "scripts/runtime-adapters.mjs",
|
|
185
|
-
"sha256": "
|
|
185
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
186
186
|
"kind": "ci"
|
|
187
187
|
}
|
|
188
188
|
],
|
|
@@ -197,7 +197,7 @@
|
|
|
197
197
|
"id": "runtime.framer-motion",
|
|
198
198
|
"kind": "runtime-adapter",
|
|
199
199
|
"status": "verified",
|
|
200
|
-
"adapter_version": "2.5.
|
|
200
|
+
"adapter_version": "2.5.1",
|
|
201
201
|
"inputs": [
|
|
202
202
|
"project-context",
|
|
203
203
|
"motion-spec",
|
|
@@ -215,11 +215,11 @@
|
|
|
215
215
|
],
|
|
216
216
|
"node": ">=22"
|
|
217
217
|
},
|
|
218
|
-
"last_verified_at": "2026-08-
|
|
218
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
219
219
|
"evidence": [
|
|
220
220
|
{
|
|
221
221
|
"path": "scripts/runtime-adapters.mjs",
|
|
222
|
-
"sha256": "
|
|
222
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
223
223
|
"kind": "ci"
|
|
224
224
|
}
|
|
225
225
|
],
|
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
"id": "runtime.spine",
|
|
235
235
|
"kind": "renderer",
|
|
236
236
|
"status": "scaffold_only",
|
|
237
|
-
"adapter_version": "2.5.
|
|
237
|
+
"adapter_version": "2.5.1",
|
|
238
238
|
"inputs": [
|
|
239
239
|
"project-context",
|
|
240
240
|
"motion-spec",
|
|
@@ -252,11 +252,11 @@
|
|
|
252
252
|
],
|
|
253
253
|
"node": ">=22"
|
|
254
254
|
},
|
|
255
|
-
"last_verified_at": "2026-08-
|
|
255
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
256
256
|
"evidence": [
|
|
257
257
|
{
|
|
258
258
|
"path": "scripts/runtime-adapters.mjs",
|
|
259
|
-
"sha256": "
|
|
259
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
260
260
|
"kind": "ci"
|
|
261
261
|
}
|
|
262
262
|
],
|
|
@@ -271,7 +271,7 @@
|
|
|
271
271
|
"id": "runtime.threejs",
|
|
272
272
|
"kind": "renderer",
|
|
273
273
|
"status": "scaffold_only",
|
|
274
|
-
"adapter_version": "2.5.
|
|
274
|
+
"adapter_version": "2.5.1",
|
|
275
275
|
"inputs": [
|
|
276
276
|
"project-context",
|
|
277
277
|
"motion-spec",
|
|
@@ -289,11 +289,11 @@
|
|
|
289
289
|
],
|
|
290
290
|
"node": ">=22"
|
|
291
291
|
},
|
|
292
|
-
"last_verified_at": "2026-08-
|
|
292
|
+
"last_verified_at": "2026-08-17T23:50:53Z",
|
|
293
293
|
"evidence": [
|
|
294
294
|
{
|
|
295
295
|
"path": "scripts/runtime-adapters.mjs",
|
|
296
|
-
"sha256": "
|
|
296
|
+
"sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
|
|
297
297
|
"kind": "ci"
|
|
298
298
|
}
|
|
299
299
|
],
|