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 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.2.0]: docs/releases/2.2.0.md
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.5.0 adds an evidence-bound Agent capability card, benchmark-informed runtime discovery, and the native macOS/iOS review alpha in the GitHub source release under `apps/apple/`. The npm package remains the cross-platform Node/Python Skill and documentation surface; it does not distribute or sign the Xcode app. Verify npm/GitHub publication metadata separately; passing evidence never implies user approval.
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, frame checkpoints, checklist, review artifact and handoff report in Dev Lab | Confirm, push or open a PR without explicit user authorization |
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 an explicit input rather than an automatic side effect.
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 artifact |
349
- | `release.yml` | Manual dispatch only | Regression, npm publish with provenance and optional GitHub release |
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 a protected GitHub environment named `npm-release` and either add the `NPM_TOKEN` environment secret or configure npm trusted publishing for this repository. Each manual run must provide `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.
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.2.x` | Release candidate; support begins on publication |
8
- | `2.1.x` | Current published line; supported until 2.2.0 publication |
9
- | `2.0.x` | Best effort while upgrading |
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.2.0 release note](docs/releases/2.2.0.md) for the current threat model and limitations.
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, and keeps npm credentials in environment secrets. Dependency updates are proposed by Dependabot as pull requests rather than applied directly to `main`.
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.5.0"
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, inspect frames 0/50/100, scrub the timeline and ask the user to review. This is not a separate Dev Lab Skill; it is a required post-render handoff.
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.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, internal browser review, trust-boundary hardening and deterministic Agent handoff.",
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
- ,"open_internal_browser": "trigger-or-suggest-after-render; user-review-required"
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
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "1.0",
3
3
  "name": "motionloom",
4
- "version": "2.5.0",
4
+ "version": "2.6.0",
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",
@@ -59,7 +60,7 @@ const COMMAND_ALIASES = {
59
60
  };
60
61
 
61
62
  function printHelp() {
62
- 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
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: ROOT,
151
+ cwd: process.cwd(),
151
152
  stdio: "inherit",
152
153
  env: process.env,
153
154
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "0.1",
3
- "registry_id": "registry-motionloom-2.5.0",
4
- "generated_at": "2026-08-17T05:39:24Z",
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.0",
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-17T05:39:24Z",
33
+ "last_verified_at": "2026-08-17T23:50:53Z",
34
34
  "evidence": [
35
35
  {
36
36
  "path": "scripts/runtime-adapters.mjs",
37
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
70
+ "last_verified_at": "2026-08-17T23:50:53Z",
71
71
  "evidence": [
72
72
  {
73
73
  "path": "scripts/runtime-adapters.mjs",
74
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
107
+ "last_verified_at": "2026-08-17T23:50:53Z",
108
108
  "evidence": [
109
109
  {
110
110
  "path": "scripts/runtime-adapters.mjs",
111
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
144
+ "last_verified_at": "2026-08-17T23:50:53Z",
145
145
  "evidence": [
146
146
  {
147
147
  "path": "scripts/runtime-adapters.mjs",
148
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
181
+ "last_verified_at": "2026-08-17T23:50:53Z",
182
182
  "evidence": [
183
183
  {
184
184
  "path": "scripts/runtime-adapters.mjs",
185
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
218
+ "last_verified_at": "2026-08-17T23:50:53Z",
219
219
  "evidence": [
220
220
  {
221
221
  "path": "scripts/runtime-adapters.mjs",
222
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
255
+ "last_verified_at": "2026-08-17T23:50:53Z",
256
256
  "evidence": [
257
257
  {
258
258
  "path": "scripts/runtime-adapters.mjs",
259
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
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.0",
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-17T05:39:24Z",
292
+ "last_verified_at": "2026-08-17T23:50:53Z",
293
293
  "evidence": [
294
294
  {
295
295
  "path": "scripts/runtime-adapters.mjs",
296
- "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89",
296
+ "sha256": "6f135e75e700a7bb105903db59445fcd3577669b595082a2b542db639f5fe56d",
297
297
  "kind": "ci"
298
298
  }
299
299
  ],