motionloom 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.agents/skills/motionloom/SKILL.md +14 -0
  2. package/.claude/skills/motionloom.md +5 -0
  3. package/.codex/skills/motionloom.md +11 -0
  4. package/AGENTS.md +17 -0
  5. package/CHANGELOG.md +68 -0
  6. package/CODE_OF_CONDUCT.md +19 -0
  7. package/CONTRIBUTING.md +65 -0
  8. package/README.md +193 -134
  9. package/ROADMAP.md +36 -0
  10. package/SECURITY.md +28 -0
  11. package/SKILL.md +57 -9
  12. package/SUPPORT.md +23 -0
  13. package/agent-card.json +42 -6
  14. package/agent-surfaces.json +79 -0
  15. package/bin/motionloom.mjs +33 -5
  16. package/docs/AGENT-INTEGRATION.md +47 -0
  17. package/docs/CHECKLIST.md +2 -1
  18. package/docs/STATUS.md +33 -0
  19. package/docs/audits/2.1.0-deep-stress-evaluation.md +97 -0
  20. package/docs/audits/ci-replay-remediation-2026-08-13.md +33 -0
  21. package/docs/audits/data/2.1.0-deep-stress-6900.json +329 -0
  22. package/docs/audits/data/deep-stress-latest.json +329 -0
  23. package/docs/audits/external-project-corpus-2026-08-13.md +26 -0
  24. package/docs/releases/2.1.0.md +23 -0
  25. package/docs/releases/2.2.0.md +35 -0
  26. package/docs/releases/npm-publish-from-workstation.md +6 -6
  27. package/examples/agent-consumer/README.md +18 -0
  28. package/examples/agent-consumer/fixture-manifest.json +82 -0
  29. package/package.json +69 -28
  30. package/references/agent-interoperability.md +29 -0
  31. package/references/intelligence-core.md +5 -1
  32. package/schemas/agent-surfaces.schema.json +78 -0
  33. package/schemas/project-memory.schema.json +180 -0
  34. package/schemas/remediation-history.schema.json +23 -0
  35. package/schemas/scene-manifest.schema.json +1 -0
  36. package/schemas/visual-truth.schema.json +80 -0
  37. package/scripts/analyze.py +56 -0
  38. package/scripts/capture-runtime-telemetry.py +119 -0
  39. package/scripts/devlab.py +126 -0
  40. package/scripts/discovery.py +257 -0
  41. package/scripts/docs-audit.py +112 -0
  42. package/scripts/eval-intelligence.py +23 -0
  43. package/scripts/eval-projects.py +156 -0
  44. package/scripts/intelligence.py +106 -6
  45. package/scripts/pr.py +151 -0
  46. package/scripts/prepack-clean.mjs +37 -0
  47. package/scripts/project-memory.py +483 -0
  48. package/scripts/project_memory_loader.py +31 -0
  49. package/scripts/quality-gate.py +43 -3
  50. package/scripts/release-verify.py +52 -0
  51. package/scripts/remediation-learning.py +326 -0
  52. package/scripts/render.py +65 -0
  53. package/scripts/report.py +60 -2
  54. package/scripts/review-hook.py +13 -2
  55. package/scripts/skill-doctor.py +12 -2
  56. package/scripts/to-dotlottie.mjs +26 -20
  57. package/scripts/visual-truth.py +310 -0
  58. package/src/core/analyzer.py +174 -25
  59. package/src/output/browser-review-smoke/manifest.json +1 -0
  60. package/src/output/browser-review-smoke/visual-truth.json +68 -0
  61. package/tests/evals/intelligence-cases.json +10 -0
  62. package/tests/evals/project-corpus.json +51 -0
  63. package/tests/scripts/run_tests.py +111 -1
  64. package/tests/scripts/test_project_memory.py +129 -0
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: motionloom
3
+ description: Load the canonical MotionLoom Skill from the repository root for project-aware animation production, runtime evidence, Dev Lab review and review-first PR handoff.
4
+ ---
5
+
6
+ # MotionLoom Agent Skills surface
7
+
8
+ This is a **portable discovery alias**, not a second copy of the Skill. Load the canonical [`SKILL.md`](../../../SKILL.md) from the repository root and use [`agent-card.json`](../../../agent-card.json) for machine-readable capabilities. Before using the Skill, run:
9
+
10
+ ```text
11
+ motionloom discovery check --root <motionloom-checkout> --json
12
+ ```
13
+
14
+ Keep the review boundary intact: a candidate may be rendered and reviewed, but approval is never inferred and a PR is never opened without explicit user confirmation.
@@ -0,0 +1,5 @@
1
+ # MotionLoom for Claude Code
2
+
3
+ Use MotionLoom when the task creates, fixes, validates, renders or hands off animation inside an existing project. Load the repository-root [`SKILL.md`](../../SKILL.md) as the canonical instruction source and [`agent-card.json`](../../agent-card.json) for capability discovery. Do not copy or fork the workflow into this file.
4
+
5
+ Start with `motionloom discovery check --root <motionloom-checkout> --json`, then follow the required lifecycle: project context → source binding → runtime evidence → Dev Lab browser review → user-confirmed handoff. `approval` remains `false` until the user explicitly approves.
@@ -0,0 +1,11 @@
1
+ # MotionLoom for Codex
2
+
3
+ Use MotionLoom for project-aware animation work, including Lottie/dotLottie, Rive, GSAP, Framer Motion, body rigs and runtime-backed review. Load the canonical repository-root [`SKILL.md`](../../SKILL.md) and use [`agent-card.json`](../../agent-card.json) rather than duplicating instructions.
4
+
5
+ Verify discovery first:
6
+
7
+ ```text
8
+ motionloom discovery check --root <motionloom-checkout> --json
9
+ ```
10
+
11
+ Always produce task-bound artifacts and runtime evidence, suggest/open the internal Dev Lab after rendering, report unresolved issues, and stop before commit/push/PR unless the user explicitly confirms.
package/AGENTS.md ADDED
@@ -0,0 +1,17 @@
1
+ # MotionLoom Agent Router
2
+
3
+ This repository exposes one canonical Agent Skill: [`SKILL.md`](SKILL.md). Load it when the task concerns animation production, motion design, asset binding, runtime rendering, Dev Lab review or PR handoff. Use [`agent-card.json`](agent-card.json) for machine-readable capabilities and [`agent-surfaces.json`](agent-surfaces.json) for installation/discovery compatibility.
4
+
5
+ ## First action
6
+
7
+ Run the offline discovery check from the checkout root:
8
+
9
+ ```text
10
+ motionloom discovery check --root . --json
11
+ ```
12
+
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
+
15
+ ## Source of truth
16
+
17
+ 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 ADDED
@@ -0,0 +1,68 @@
1
+ # Changelog
2
+
3
+ All notable MotionLoom changes are documented here. The project follows semantic versioning for the npm package and keeps major contract changes in dedicated release notes under [`docs/releases/`](docs/releases/).
4
+
5
+ ## [Unreleased]
6
+
7
+ - No unreleased changes are currently tracked.
8
+
9
+ ## [2.2.0] - 2026-08-13
10
+
11
+ ### Added
12
+
13
+ - Canonical Agent interoperability surfaces for `.agents/skills`, `.claude`, `.codex`, source discovery and cross-platform installation checks.
14
+ - Consumer fixtures for Lottie/dotLottie, Rive, GSAP, Framer Motion, body rigs and multi-scene continuity.
15
+ - Visual Truth Contract with frame hashes, runtime/source provenance, deterministic perceptual signals, region explanations and review-required semantics.
16
+ - Append-only, hash-chained Remediation Learning ledger for user-confirmed outcomes, correction counts, first-pass acceptance, issue-class outliers and benchmark provenance.
17
+
18
+ ### Fixed
19
+
20
+ - Quality CI now rebuilds the context-bound replay bundle after runtime, report and attestation artifacts are generated, preventing stale replay hashes from rejecting an otherwise valid changed-scene gate.
21
+
22
+ ### Verified
23
+
24
+ - Mainline Quality, Documentation and Package Hygiene, and Security workflows pass on the replay-remediation commit.
25
+ - The local release candidate passes the full regression, docs/Skill validation, runtime adapter, discovery, installation matrix, Visual Truth, Remediation Learning, attestation and npm tarball checks.
26
+
27
+ ### Boundary
28
+
29
+ - This is a release candidate prepared from the green mainline. Remote tag creation, GitHub Release creation and npm publication remain explicit maintainer actions; evidence and heuristics never grant user approval.
30
+
31
+ ## [2.1.0] - 2026-08-13
32
+
33
+ ### Added
34
+
35
+ - Durable, relocatable Project Memory with schema validation, atomic writes, canonical integrity and stable lifecycle exit codes.
36
+ - Cross-platform npm CLI routing for Ubuntu, macOS and Windows without Bash-only user commands or system `zip`/`unzip` dependencies.
37
+ - Memory loader integration for project analysis, reports, review hooks, handoff and downstream Agent continuity.
38
+ - Ubuntu/macOS/Windows CI matrix for Project Memory recovery, CLI routing and npm tarball inspection.
39
+ - Public repository governance documents, contribution workflow, security policy, support guide, roadmap, issue forms and pull-request template.
40
+
41
+ ### Fixed
42
+
43
+ - Rebinding a relocated checkout no longer invalidates integrity merely because `project.root_path` changed.
44
+ - Recovery atomically refreshes runtime path, repository and package metadata while preserving the durable project identity contract.
45
+
46
+ ### Verified
47
+
48
+ - Full regression, Intelligence Core evaluation, Skill Doctor, strict quality gate, npm package dry-run and Dev Lab production build pass.
49
+ - Relocation coverage includes Git remote identity, Unicode paths, spaces in paths, stale context and user-confirmed outcome invariants.
50
+
51
+ See the [2.1.0 release note](docs/releases/2.1.0.md) for scope, trust boundaries and remaining work.
52
+
53
+ ## [2.0.0] - 2026-08-12
54
+
55
+ ### Added
56
+
57
+ - DSSE-compatible Ed25519 signed attestation and fail-closed trust policy verification.
58
+ - External verifier, attestation report contract and Dev Lab attestation rail.
59
+
60
+ See the [2.0.0 release note](docs/releases/2.0.0.md).
61
+
62
+ ## Earlier releases
63
+
64
+ 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/).
65
+
66
+ [2.2.0]: docs/releases/2.2.0.md
67
+ [2.1.0]: docs/releases/2.1.0.md
68
+ [2.0.0]: docs/releases/2.0.0.md
@@ -0,0 +1,19 @@
1
+ # Code of Conduct
2
+
3
+ ## Our commitment
4
+
5
+ We want MotionLoom to be a respectful, technically rigorous and welcoming project for people working on animation, developer tooling and Agent interoperability. Contributors are expected to participate constructively, assume good faith while examining evidence, and make room for different levels of experience.
6
+
7
+ ## Expected behavior
8
+
9
+ Use clear and respectful language. Focus criticism on code, contracts, evidence and decisions rather than people. Explain disagreement with reproducible reasoning. Protect private project data, credentials and source assets. Give credit to upstream runtimes, asset authors and contributors.
10
+
11
+ ## Unacceptable behavior
12
+
13
+ Harassment, discrimination, personal attacks, threats, doxxing, sexualized conduct, deliberate exposure of private data, spam, bad-faith manipulation of review evidence or attempts to bypass user authorization are not acceptable.
14
+
15
+ ## Enforcement
16
+
17
+ Report a conduct concern privately through the repository's maintainer contact or a GitHub private vulnerability report when the concern involves safety or security. Do not include sensitive details in a public issue. Maintainers may remove content, request corrections, restrict participation or close contributions when necessary to protect the community.
18
+
19
+ This code of conduct is adapted for MotionLoom from the [Contributor Covenant](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).
@@ -0,0 +1,65 @@
1
+ # Contributing to MotionLoom
2
+
3
+ Thank you for helping make animation workflows more reliable for coding agents. Contributions are welcome in code, schemas, tests, runtime adapters, documentation, fixtures and reproducible bug reports. Please read the [Code of Conduct](CODE_OF_CONDUCT.md) and [Security Policy](SECURITY.md) before contributing.
4
+
5
+ ## Before opening an issue or pull request
6
+
7
+ Search existing issues and documentation first. For a bug, include the operating system, Node/Python versions, exact command, minimal fixture or artifact bundle, expected behavior and observed output. Never attach private project context, credentials, private source assets or trust-policy private keys.
8
+
9
+ For a feature, explain which Agent failure mode it addresses, which contract or schema changes, what evidence would demonstrate correctness, and how the change preserves explicit user approval. A template without a runtime or validation path is not sufficient for a production capability.
10
+
11
+ ## Local setup
12
+
13
+ ```bash
14
+ git clone https://github.com/lenhonbp/MotionLoom.git
15
+ cd MotionLoom
16
+ npm install
17
+ python3 -m pip install --requirement requirements.txt
18
+ python3 scripts/skill-doctor.py --json
19
+ ```
20
+
21
+ Node.js 18+ and Python 3.11+ are required. On Windows, use `python` if `python3` is not available or set `MOTIONLOOM_PYTHON` for the npm wrapper. Runtime adapter tests may require the Playwright browser installation described by the CI workflow.
22
+
23
+ ## Validation commands
24
+
25
+ Run the smallest relevant checks while iterating, then run the complete suite before opening a pull request:
26
+
27
+ ```bash
28
+ python3 -m py_compile scripts/*.py tests/scripts/*.py
29
+ python3 tests/scripts/test_project_memory.py
30
+ python3 tests/scripts/run_tests.py
31
+ python3 scripts/eval-intelligence.py
32
+ python3 scripts/skill-doctor.py --json
33
+ npm run runtime:test
34
+ npm publish --dry-run --access public
35
+ ```
36
+
37
+ For changes to a scene or evidence contract, also run the appropriate report contract, browser-review validation, quality gate and `npm run audit:deep`. Keep generated local runtime state and temporary project memory out of the commit.
38
+
39
+ ## GitHub Actions and release environments
40
+
41
+ Every pull request should pass the quality and documentation workflows. Security analysis may be skipped for an untrusted fork when GitHub cannot grant security-event permissions; the maintainer must review the resulting status before merge. Dev Lab changes produce a retained build artifact for inspection.
42
+
43
+ The `release.yml` workflow is deliberately `workflow_dispatch`-only. Maintainers must configure the protected `npm-release` environment and its required reviewers before using it. The workflow accepts either an `NPM_TOKEN` environment secret or npm trusted publishing through GitHub OIDC (`id-token: write`). Never put an npm token in repository variables, source files or pull-request logs. Creating a GitHub release is an explicit dispatch input.
44
+
45
+ ## Pull request expectations
46
+
47
+ Use a focused branch and a conventional commit-style title such as `feat(memory): ...`, `fix(runtime): ...` or `docs: ...`. A pull request should explain the user-visible change, list changed contracts, identify platform coverage, link tests and state limitations or remaining warnings. Schema changes must include fixtures and backward/forward compatibility notes where relevant.
48
+
49
+ Do not claim a runtime is verified unless real adapter evidence exists. Do not convert a heuristic, benchmark, valid signature or successful build into an approval statement. Do not change `approval` to `true` in fixtures or bypass the user-review gate to make a test pass.
50
+
51
+ ## Review and merge policy
52
+
53
+ CI must pass before merge. Changes that affect `SKILL.md`, `agent-card.json`, schemas, quality gates, evidence verification, attestations, runtime adapters or Git side effects require explicit contract review. Maintainers may request a focused adversarial fixture when a change can affect stale evidence, cross-task contamination, path safety or approval invariants.
54
+
55
+ The repository's PR template is a checklist, not a substitute for evidence. Maintainers merge only after the behavior, documentation and trust boundary are clear.
56
+
57
+ ## Release process
58
+
59
+ 1. Update `CHANGELOG.md` and a dedicated `docs/releases/<version>.md` note.
60
+ 2. Update `package.json`, `SKILL.md`, `agent-card.json` and relevant schema/reference versions.
61
+ 3. Run the full validation suite and `npm publish --dry-run --access public`.
62
+ 4. Create a local commit and obtain explicit maintainer confirmation before pushing.
63
+ 5. Publish from the authenticated maintainer workstation, then verify the npm version and GitHub release state.
64
+
65
+ See [ROADMAP.md](ROADMAP.md) for future work and [SUPPORT.md](SUPPORT.md) for help with setup or usage.
package/README.md CHANGED
@@ -1,179 +1,238 @@
1
1
  # MotionLoom
2
2
 
3
- A coding-agent skill for professional animation development: motion, character body rigs and assets. It does not guess — it **understands the host project, plans from a signed motion spec, generates from vetted source assets, renders everything in the Dev Lab for live testing, and only then confirms into a pull request**.
3
+ [![CI](https://github.com/lenhonbp/MotionLoom/actions/workflows/quality.yml/badge.svg)](https://github.com/lenhonbp/MotionLoom/actions/workflows/quality.yml)
4
+ [![npm version](https://img.shields.io/npm/v/motionloom?logo=npm&logoColor=white)](https://www.npmjs.com/package/motionloom)
5
+ [![npm downloads](https://img.shields.io/npm/dm/motionloom?logo=npm&logoColor=white)](https://www.npmjs.com/package/motionloom)
6
+ [![License](https://img.shields.io/github/license/lenhonbp/MotionLoom)](LICENSE)
7
+ [![Node.js 18+](https://img.shields.io/badge/Node.js-18%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
8
+ [![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python&logoColor=white)](https://www.python.org/)
9
+ [![Agent Skills](https://img.shields.io/badge/Agent%20Skill-compatible-5B5BD6)](https://agentskills.io/specification)
10
+
11
+ **Project-aware animation production and runtime verification for coding agents.**
12
+
13
+ MotionLoom is an independent open-source Agent Skill for building UI motion, Lottie and dotLottie scenes, Rive/GSAP/Framer Motion experiences, character body rigs and traceable animation assets inside an existing project. It does not treat animation as an isolated prompt: it binds the work to the host project's context, records decisions and provenance, renders through a real runtime, hands the exact candidate to an internal Dev Lab, and stops before Git side effects until the user approves.
14
+
15
+ > **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
+ > **Release posture:** the repository source and `package.json` are at **2.1.0**. The public npm registry currently serves **2.0.0** and no GitHub tag/Release for 2.1.0 exists yet; a maintainer must perform the protected manual release before the registry and GitHub release state change.
18
+
19
+ ## Why MotionLoom
20
+
21
+ Most animation helpers optimize for generating one asset quickly. That breaks down when an Agent has to work in a real product: it can lose the project's motion language, select an untraceable asset, render a placeholder instead of the target runtime, mix evidence from another task, or open a PR before the user has inspected the result.
22
+
23
+ MotionLoom turns that fragile sequence into a bounded production system. Its durable Project Memory survives long gaps between animation tasks and project relocation; its Intelligence Core keeps context, provenance, capability selection and Motion IR connected; its runtime adapters produce evidence instead of prose claims; and its Dev Lab is a mandatory review handoff rather than a separate Agent or a static demo catalog.
24
+
25
+ ## What it provides
26
+
27
+ | Capability | What the Agent gets | What MotionLoom refuses to do |
28
+ |---|---|---|
29
+ | **Project binding** | Project context, package/design-token discovery and durable `.motionloom/project-memory.json` | Reuse memory across projects or silently continue through missing context |
30
+ | **Motion planning** | Framework-aware Motion Spec, timing/easing/accessibility budgets and framework selection | Present a template as a project-integrated result |
31
+ | **Asset provenance** | Required `source_binding`, authority, license and SHA-256 traceability | Promote unknown, unlicensed or placeholder production assets |
32
+ | **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 |
33
+ | **Agent intelligence** | Project graph, provenance, Motion IR, replay, semantic lint, continuity and fix plan | Convert confidence, benchmark output or warnings into approval |
34
+ | **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 |
35
+
36
+ ## The production contract
37
+
38
+ ```mermaid
39
+ flowchart LR
40
+ A[Host project] --> B[Analyze + Project Memory]
41
+ B --> C[Context-bound Motion Spec]
42
+ C --> D[Source binding + asset provenance]
43
+ D --> E[Generate / rig / adapt]
44
+ E --> F[Real runtime render]
45
+ F --> G[Intelligence Core + evidence]
46
+ G --> H[Dev Lab browser review]
47
+ H --> I{User approved?}
48
+ I -- changes requested --> D
49
+ I -- no --> J[Report blocked / needs fix]
50
+ I -- yes --> K[Quality gate + attestation]
51
+ K --> L[PR preflight; side effects still explicit]
52
+ ```
53
+
54
+ 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.
4
55
 
5
- ## Install from npm
56
+ ## Quick start
6
57
 
7
- MotionLoom is distributed as the `motionloom` npm package. The package ships the installable Skill contract, framework adapters, Intelligence Core schemas, evidence verifiers and a small CLI wrapper around the canonical Python scripts.
58
+ ### Install the public CLI
8
59
 
9
60
  ```bash
10
61
  npm install --global motionloom
11
- motionloom doctor
62
+ motionloom doctor --json
12
63
  motionloom --help
13
64
  ```
14
65
 
15
- The CLI requires **Node.js 18+** and **Python 3.11+**. Installation does not grant approval, commit changes or open a pull request; browser review and explicit repository-side-effect confirmation remain mandatory.
66
+ MotionLoom supports **Node.js 18+** and **Python 3.11+** on Ubuntu, macOS and Windows. The npm wrapper is the cross-platform surface: it discovers the platform Python executable and delegates to the same canonical contracts used by a repository checkout.
16
67
 
17
- ## Quick start
68
+ ### Start from a real project
69
+
70
+ Run the first commands from the project that owns the animation. Do not copy the example context into production; generate a fresh context from the host project.
18
71
 
19
72
  ```bash
20
- # 1. Understand the project
21
- bash scripts/analyze.sh /path/to/your/project
22
-
23
- # 1b. Start a transparent task ledger for Agent/human handoff
24
- python3 scripts/report.py init --task-id onboarding-wave \
25
- --scene my-scene --intent "Character wave in onboarding" \
26
- --project-name your-project
27
-
28
- # 2. Plan & sign a spec (example: a loading animation)
29
- python3 src/core/spec.py generate loading --context /path/to/your/project/project-context.json \
30
- --output motion-spec.json --loop
31
-
32
- # 3. Generate a body rig, then pose it
33
- python3 src/rig/cutout_rig.py build \
34
- --input assets/library/avatar-base.svg --output rigged.svg
35
- python3 src/rig/cutout_rig.py pose rigged.svg --pose walk \
36
- --duration 1.2 --fps 30 --out walk.json
37
-
38
- # 3b. Bind the scene source to an authoritative provenance record
39
- python3 scripts/manifest.py bind-source --scene my-scene \
40
- --source animation.json --kind project \
41
- --authority "host project manifest" --license MIT
42
-
43
- # 4. Render runtime verification snapshots (0/50/100%; placeholders fail)
44
- bash scripts/render.sh my-scene
45
-
46
- # 4b. Package the Lottie source as a dotLottie v2 archive when required
47
- bash scripts/to-dotlottie.sh my-scene
48
-
49
- # 4c. Verify Rive, GSAP and Framer Motion through the real browser harness
50
- node scripts/runtime-adapters.mjs
51
-
52
- # 4d. Capture runtime telemetry and verify evidence bindings externally
53
- bash scripts/capture-runtime-telemetry.sh my-scene artifacts/onboarding-wave
54
-
55
- # 4e. Derive and verify a signed task-bound statement against a managed trust policy
56
- python3 scripts/attestation.py statement --scene-dir src/output/my-scene \
57
- --task-dir artifacts/onboarding-wave --context /path/to/your/project/project-context.json \
58
- --output artifacts/onboarding-wave/attestation-statement.json
59
- python3 scripts/attestation.py build --statement artifacts/onboarding-wave/attestation-statement.json \
60
- --private-key <managed-ed25519-key> --key-id <key-id> \
61
- --output artifacts/onboarding-wave/attestation.json
62
- python3 scripts/attestation-verifier.py --attestation artifacts/onboarding-wave/attestation.json \
63
- --trust-policy artifacts/onboarding-wave/trust-policy.json \
64
- --expected-task-id onboarding-wave --expected-scene my-scene
65
-
66
- # 5. Boot the Dev Lab to test & fix interactively
67
- bash scripts/devlab.sh my-scene
68
-
69
- # 6. Run the acceptance gate, then confirm and ship
70
- python3 scripts/quality-gate.py --scene my-scene \
71
- --context /path/to/your/project/project-context.json \
72
- --task-dir artifacts/onboarding-wave --require-telemetry --require-attestation
73
-
74
- # 6. Collect evidence and render the user-facing report
75
- python3 scripts/report.py collect --task-dir artifacts/onboarding-wave
76
- python3 scripts/report.py render --task-dir artifacts/onboarding-wave
77
-
78
- # 7. Confirm and ship only after review
79
- bash scripts/pr.sh my-scene
80
- ```
73
+ cd /path/to/your/project
81
74
 
82
- The kit is intended to run from a Git clone. Copy `project-context.example.json` only as a schema reference; always generate the real context with `scripts/analyze.sh` against the host project. Do not commit a context containing a temporary path or another project's brand tokens.
75
+ # Understand the project and bootstrap/recover durable memory.
76
+ motionloom analyze . --init-memory
77
+ motionloom memory inspect --project-root . --json
83
78
 
84
- For a reproducible review fixture, keep `project-context.json`, `quality-report.json`, `review.json`, `execution-report.json`, `handoff.json` and `artifact-manifest.json` under the repository's `artifacts/<task-id>/` directory. `scripts/pr.sh` rejects task bundles outside the repository, requires the task scene to match the requested scene, runs the semantic report check, and stages the evidence bundle together with the scene. This prevents a gate from consuming evidence that is omitted from the resulting commit.
79
+ # Bound traversal when the host project is large; truncation is reported, never hidden.
80
+ motionloom analyze . --max-files 2500 --max-bytes 25000000 --max-seconds 10
85
81
 
86
- Runtime adapter evidence can be bound to a scene and its exact source/manifest bytes:
82
+ # Plan and generate the scene using the selected framework.
83
+ python3 /path/to/MotionLoom/src/core/spec.py generate loading \
84
+ --context project-context.json --output motion-spec.json --loop
87
85
 
88
- ```bash
89
- RUNTIME_SCENE=my-scene \
90
- RUNTIME_SOURCE_PATH=src/output/my-scene/animation.json \
91
- RUNTIME_MANIFEST_PATH=src/output/my-scene/manifest.json \
92
- node scripts/runtime-adapters.mjs
86
+ # Render real runtime evidence and prepare the Dev Lab review handoff.
87
+ motionloom render loading
88
+ motionloom devlab loading
89
+
90
+ # Validate the exact task bundle before any Git side effect.
91
+ motionloom quality-gate --scene loading \
92
+ --context project-context.json \
93
+ --task-dir artifacts/loading-task \
94
+ --require-browser-review --require-intelligence --require-p1 \
95
+ --require-benchmark --require-telemetry --require-attestation
96
+
97
+ # Local-only by default. A user must review and explicitly authorize side effects.
98
+ motionloom pr loading --task-dir artifacts/loading-task
93
99
  ```
94
100
 
95
- When these variables are supplied, `runtime-evidence.json` records `scene`, `source_sha256` and `manifest_sha256`; the quality gate rejects evidence copied from another scene or generated against an older manifest.
101
+ For a source checkout, use `git clone https://github.com/lenhonbp/MotionLoom.git`, run `npm install`, and replace the global command with `node bin/motionloom.mjs` or the corresponding Python/Node script shown in the [development guide](CONTRIBUTING.md).
96
102
 
97
- ### Intelligence Core v0.1 + P1 feedback intelligence + trust-boundary hardening + evidence interoperability + signed attestation
103
+ ## Durable Project Memory
98
104
 
99
- After render and before strict acceptance, build the task-bound Intelligence Core artifacts. They give an Agent a single relationship graph, step-level provenance, framework-neutral Motion IR, capability selection policy and deterministic replay inventory instead of requiring it to infer relationships from prose and unrelated files:
105
+ Project Memory is the continuity layer for Agents that return to animation after many unrelated tasks or a new context window. It stores project identity, motion principles, asset and runtime policy, accepted/rejected decisions, user-confirmed outcomes and freshness/invalidation state in `.motionloom/project-memory.json`.
100
106
 
101
107
  ```bash
102
- python3 scripts/intelligence.py motion-ir build --task-dir artifacts/onboarding-wave
103
- python3 scripts/intelligence.py graph build --task-dir artifacts/onboarding-wave
104
- python3 scripts/intelligence.py provenance build --task-dir artifacts/onboarding-wave
105
- python3 scripts/intelligence.py replay capture --root . --task-dir artifacts/onboarding-wave
106
- python3 scripts/intelligence.py semantic-lint build --task-dir artifacts/onboarding-wave
107
- python3 scripts/intelligence.py semantic-lint benchmark --task-dir artifacts/onboarding-wave \
108
- --iterations 25 --threshold-ms 500
109
- bash scripts/capture-runtime-telemetry.sh my-scene artifacts/onboarding-wave
110
- python3 scripts/intelligence.py continuity build --task-dirs artifacts/onboarding-wave
111
- python3 scripts/intelligence.py fix-plan build --task-dir artifacts/onboarding-wave \
112
- --reports semantic-lint-report.json continuity-report.json
113
- python3 scripts/quality-gate.py --scene my-scene \
114
- --context /path/to/your/project/project-context.json \
115
- --task-dir artifacts/onboarding-wave \
116
- --require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation
117
- python3 scripts/eval-intelligence.py
108
+ motionloom memory init --project-root <project>
109
+ motionloom memory inspect --project-root <project> --json
110
+ motionloom memory refresh --project-root <project> --json
111
+ motionloom memory recover --project-root <project> --json
112
+ motionloom memory validate --project-root <project> --json
118
113
  ```
119
114
 
120
- Semantic lint reports intent, timing, easing, accessibility and performance findings with severity, confidence and evidence. The benchmark records rule coverage and p95 execution time against a 500 ms default threshold; it does not claim to measure human visual quality. Continuity analysis checks context and transition drift across an ordered scene set. `fix-plan.json` converts findings into root cause, affected artifacts, selective rerun scope and verification commands; it does not auto-approve a scene. The 1.8.0 hardening layer rejects symlinked or cross-task Intelligence artifacts, binds replay to task identity, chooses one deterministic passing report bundle per scene, and makes the Dev Lab reject cross-origin or mismatched task/candidate evidence. The 1.9.0 evidence layer captures scrub-point, RAF timing, runtime-state and source/manifest/Motion IR hash bindings, then lets a read-only external verifier reject stale, tampered, cross-task or path-escaped evidence. The 2.0.0 attestation layer signs canonical task-bound hashes with a DSSE-compatible Ed25519 envelope and checks signer lifecycle through fail-closed trust policy. A verifier pass still means integrity only: runtime assertions, Dev Lab review and user consent remain mandatory; `approval` is always `false`. See [Intelligence Core](references/intelligence-core.md), [signed attestation reference](references/signed-attestation.md), the [1.9.0 threat model](docs/audits/1.9.0-evidence-interoperability-threat-model.md) and the [2.0.0 release note](docs/releases/2.0.0.md).
115
+ The memory integrity hash excludes only the mutable checkout path; Git remote or package identity remains the project binding. Direct edits to durable content fail closed. A stale, invalid, missing or cross-project memory produces a machine-readable recovery state and cannot silently influence generation or approval. Durable decisions and outcomes require `--user-confirmed`.
121
116
 
122
- ## Pipeline
117
+ Read the [Project Memory schema](schemas/project-memory.schema.json), [2.1.0 release note](docs/releases/2.1.0.md) and [Skill instructions](SKILL.md) for the full lifecycle.
123
118
 
124
- | Step | Module | What it does |
125
- |------|--------|--------------|
126
- | 01 · Understand | `src/core/analyzer.py` | Reads package.json, design tokens and existing motion language; emits `project-context.json` inside the target project |
127
- | 02 · Plan | `src/core/spec.py` | Generates & validates the motion spec against the framework matrix, easing canon and performance budget |
128
- | 03 · Source | `assets/library/` | Vetted, traceable source assets with an attribution table — the authoritative geometry |
129
- | 04 · Generate | `src/rig/cutout_rig.py`, `templates/` | Canonical templates per framework; 20-bone cutout body rigs with parent-first order |
130
- | 05 · Dev Lab | `dev-lab/` | Self-contained static workbench: preview rendered evidence, scrub, quality checklist, fix notes, review export |
131
- | 06 · Confirm → PR | `scripts/pr.sh` | Commits scene + spec + snapshots, opens the PR with an evidence body |
119
+ ## Verified runtime matrix
132
120
 
133
- ## Repository layout
121
+ | Runtime or format | Capability level | Evidence path |
122
+ |---|---:|---|
123
+ | Lottie JSON | Contract verified | Runtime snapshot renderer and manifest validation in repository fixtures |
124
+ | dotLottie v2 | Contract verified | Node/`fflate` packaging, manifest entry and checksum validation |
125
+ | SVG cutout body rig | Contract verified | Parent-first hierarchy, named anatomy and pose evidence in repository fixtures |
126
+ | Rive Canvas | Fixture verified | Browser adapter, state-machine/input binding and representative snapshots |
127
+ | GSAP | Fixture verified | Browser adapter, deterministic timeline scrub and representative snapshots |
128
+ | Framer Motion | Fixture verified | Browser adapter, reduced-motion checks and representative snapshots |
129
+ | Spine | Scaffold only | Requires a framework-specific runtime adapter and evidence |
130
+ | Three.js | Scaffold only | Requires a framework-specific runtime adapter and evidence |
134
131
 
135
- | Path | Purpose |
136
- |------|---------|
137
- | `SKILL.md` | The agent-skill definition (installable into any coding agent) |
138
- | `src/core/` | Analyzer, spec validator, snapshot renderer |
139
- | `src/rig/` | Cutout character body rig engine |
140
- | `templates/` | Canonical Lottie / Rive / GSAP / Framer Motion templates |
141
- | `assets/library/` | Vetted source assets + attribution, including the MIT Rive adapter fixture |
142
- | `scripts/` | Pipeline CLI plus Intelligence Core (`analyze`, `render`, `devlab`, `pr`, `quality-gate`, `validate-lottie`, `to-dotlottie`, `runtime-adapters`, `capture-runtime-telemetry`, `evidence-verifier`, `attestation`, `attestation-verifier`, `attestation-keygen`, `skill-doctor`, `report`, `report-contract`, `intelligence`, `eval-intelligence`) |
143
- | `dev-lab/` | Self-contained static Dev Lab + Playwright snapshot harness |
144
- | `agent-card.json` | Capability discovery, runtime levels and side-effect policy for other Agents |
145
- | `schemas/` | Task, report, artifact-manifest, scene-manifest, handoff, Intelligence Core, signed-attestation and trust-policy JSON Schemas |
146
- | `references/` | Progressive-disclosure contracts for reporting, runtime capability, dotLottie packaging and Intelligence Core |
147
- | `artifacts/<task-id>/` | Per-task ledger, evidence, review, issue register and handoff bundle |
148
- | `tests/` | Deterministic engine tests |
149
- | `.github/workflows/quality.yml` | CI that re-runs the quality gate on every PR |
132
+ 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.
133
+
134
+ ## Evidence, trust and review
135
+
136
+ MotionLoom keeps distinct layers distinct:
150
137
 
151
- ## The quality gate
138
+ | Layer | It proves | It does not prove |
139
+ |---|---|---|
140
+ | Runtime evidence | The selected runtime produced the declared snapshots and observed state | That the motion is aesthetically correct or user-approved |
141
+ | Visual Truth Contract | Baseline/candidate frame identity, dimensions, provenance and review-required regions are bound to the scene | That a changed frame is acceptable or user-approved |
142
+ | Remediation Learning | User-confirmed correction outcomes and deterministic benchmark history with first-pass metrics | That aggregate history can approve a new animation or replace review |
143
+ | Provenance | Which source/material/product bytes were used and how they hash | That the source is appropriate beyond the declared authority/license contract |
144
+ | Semantic lint and benchmark | Bounded rule findings, risk signals and performance measurements | Human visual quality or intent acceptance |
145
+ | Signed attestation | A trusted signer signed the same task-bound hashes under the policy | Reviewer consent, accessibility approval or PR authorization |
146
+ | Dev Lab review | The user saw the exact candidate and recorded a decision | A future candidate is automatically approved |
152
147
 
153
- A scene is only "ready" when, together, the Dev Lab checklist passes, runtime snapshot frames exist at 0/50/100%, the context-bound JSON spec matches the implementation, brand tokens come from the target project's `project-context.json`, the required `source_binding` traces `manifest.file` to an authoritative source with a matching checksum, the P1 reports have been validated and the semantic-lint benchmark is below threshold. For strict observability runs, runtime telemetry and the external verifier report must also pass their identity, freshness and hash checks; for production trust runs, the signed attestation must verify against an active trust-policy key and bind the same task/scene/material hashes. A warning or valid signature may require human review and a selective fix; neither is silently converted into approval. CI reproduces these checks on every PR — see [CHECKLIST.md](docs/CHECKLIST.md).
148
+ `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.
154
149
 
155
- ## Transparent task reporting
150
+ ## How an Agent uses the Skill
156
151
 
157
- The Skill does not end with a prose claim that an animation is complete. Each task can be represented by `artifacts/<task-id>/`, which records the lifecycle state, decisions, changed artifacts, checksums, quality result, review decision, open problems and the next Agent handoff. Generate the report with `python3 scripts/report.py render --task-dir artifacts/<task-id>`.
152
+ The public integration surfaces are intentionally small and inspectable:
158
153
 
159
- The report must distinguish **completed**, **verified**, **not completed**, **blocked/failed**, **structure problems** and **recommended next Agent/Skill**. A scaffold-only runtime must be reported as `scaffold`; it cannot be described as `runtime-verified` until its adapter test has produced evidence.
154
+ 1. `SKILL.md` gives the Agent the imperative workflow, progressive-disclosure references and non-negotiable contracts.
155
+ 2. `agent-card.json` advertises inputs, outputs, verified capabilities, recommended integrations and side-effect policy.
156
+ 3. `motionloom` exposes a cross-platform command surface for analysis, memory, rendering, Dev Lab, evidence, quality and PR preflight.
157
+ 4. `artifacts/<task-id>/` provides a durable, machine-readable handoff instead of requiring another Agent to infer state from chat.
160
158
 
161
- Run `python3 scripts/skill-doctor.py --json` when changing the Skill package. It checks the frontmatter, required directories, schemas, Agent Card and references. CI also requires a task report/handoff bundle for changed scenes, so a future Agent cannot silently modify a scene without leaving a reviewable trail.
159
+ 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.
162
160
 
163
- ## Agent interoperability and public skills
161
+ ## Repository map
162
+
163
+ | Path | Purpose |
164
+ |---|---|
165
+ | `SKILL.md` | Installable Agent Skill contract |
166
+ | `agent-card.json` | Capability discovery and side-effect policy |
167
+ | `agent-surfaces.json`, `.agents/`, `.claude/`, `.codex/` | Cross-Agent discovery aliases and portability contract |
168
+ | `bin/motionloom.mjs` | Cross-platform npm CLI entrypoint |
169
+ | `src/core/` | Analyzer, Motion Spec and runtime snapshot engine |
170
+ | `src/rig/` | Character body rig and pose engine |
171
+ | `templates/` | Lottie, Rive, GSAP and Framer Motion templates |
172
+ | `scripts/` | Analysis, rendering, evidence, memory, intelligence, reports and PR preflight |
173
+ | `schemas/` | Versioned machine-readable contracts |
174
+ | `references/` | Progressive-disclosure implementation references |
175
+ | `docs/` | Framework selection, checklists, audits and release notes |
176
+ | `dev-lab/` | Self-contained browser review workbench and harness |
177
+ | `artifacts/<task-id>/` | Per-task evidence, report and handoff bundle |
178
+ | `schemas/visual-truth.schema.json`, `scripts/visual-truth.py` | Provenance-bound visual comparison and review explanation contract |
179
+ | `schemas/remediation-history.schema.json`, `scripts/remediation-learning.py` | Append-only remediation/benchmark ledger and aggregate learning metrics |
180
+ | `tests/` | Regression, adversarial and deep-stress evaluation harnesses |
181
+
182
+ ## Documentation map
183
+
184
+ | Need | Start here |
185
+ |---|---|
186
+ | Install or understand the full lifecycle | [SKILL.md](SKILL.md) |
187
+ | Choose a runtime | [Framework selection](docs/FRAMEWORK-SELECTION.md) and [runtime capability reference](references/runtime-capability.md) |
188
+ | Run a review-ready scene | [Production checklist](docs/CHECKLIST.md) and [browser review contract](references/browser-review-contract.md) |
189
+ | Understand Agent intelligence | [Intelligence Core](references/intelligence-core.md) and [roadmap](ROADMAP.md) |
190
+ | Run labeled project evaluation | [Project corpus manifest](tests/evals/project-corpus.json) and `python3 scripts/eval-projects.py --allow-insufficient` |
191
+ | Understand trust boundaries | [Signed attestation](references/signed-attestation.md) and [2.0.0 release note](docs/releases/2.0.0.md) |
192
+ | Validate visual truth before review/PR | `motionloom visual-truth build|validate` and [production checklist](docs/CHECKLIST.md) |
193
+ | 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) |
194
+ | Contribute code or docs | [CONTRIBUTING.md](CONTRIBUTING.md) |
195
+ | Report a vulnerability or request help | [SECURITY.md](SECURITY.md) and [SUPPORT.md](SUPPORT.md) |
196
+ | See version history | [CHANGELOG.md](CHANGELOG.md) and [release notes](docs/releases/) |
197
+
198
+ ## Development and release checks
164
199
 
165
- `agent-card.json` is the discovery surface. It declares inputs, outputs, verified versus scaffold-only runtimes and Git side effects. Use official or public skills as focused references and adapters rather than copying their prompts into this repository: [LottieFiles dotLottie Web](https://github.com/LottieFiles/dotlottie-web/blob/main/SKILL.md) for runtime APIs, [Diffusion Studio text-to-lottie](https://github.com/diffusionstudio/lottie) for optional scene scaffolding, [Claude Lottie Skill](https://github.com/b1rdmania/claude-lottie-skill/blob/main/SKILL.md) for optional brand-aware asset discovery, and the [Agent Skills specification](https://agentskills.io/specification) plus [GitHub Agent Skills documentation](https://docs.github.com/en/copilot/concepts/agents/about-agent-skills) for packaging and portability.
200
+ ```bash
201
+ npm install
202
+ python3 scripts/skill-doctor.py --json
203
+ python3 tests/scripts/run_tests.py
204
+ python3 scripts/eval-intelligence.py
205
+ python3 scripts/eval-projects.py --allow-insufficient
206
+ npm run release:verify
207
+ npm run runtime:test
208
+ npm run audit:deep
209
+ npm publish --dry-run --access public
210
+ ```
166
211
 
167
- The project-specific value remains in context binding, Motion Spec, asset provenance, runtime evidence, quality policy, review memory and handoff artifacts. The runtime adapter harness delegates rendering to the official packages; it does not reimplement Lottie/Rive runtimes, MCP transport or GitHub authentication inside this Skill.
212
+ The GitHub Actions workflow is designed to run the Project Memory and CLI contract on Ubuntu, macOS and Windows, then run the full evidence-aware quality suite on Ubuntu. Read the latest GitHub Actions run rather than treating this README or a historical audit as proof that the current checkout is green. A package dry-run is part of release preparation. See [CONTRIBUTING.md](CONTRIBUTING.md) for the clean-checkout procedure and [CHANGELOG.md](CHANGELOG.md) for release discipline.
168
213
 
169
- ### Important trust boundary
214
+ ## Automated CI/CD
170
215
 
171
- `ALLOW_PLACEHOLDER=1 bash scripts/render.sh <scene>` is diagnostic only. It creates visibly marked placeholder frames and the quality gate rejects them. A PR cannot be confirmed until the official runtime or the Dev Lab browser renderer has produced `snapshot/.render-meta.json` with `mode: runtime`.
216
+ 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.
172
217
 
173
- ## Standards basis
218
+ | Workflow | Trigger | Responsibility |
219
+ |---|---|---|
220
+ | `quality.yml` | Pull request, `main`, manual | Cross-platform memory/CLI matrix and full evidence-aware quality suite |
221
+ | `docs.yml` | Documentation/package changes, `main`, manual | Internal links, metadata, workflow safety, Skill Doctor and npm tarball inspection |
222
+ | `security.yml` | Pull request, `main`, weekly schedule, manual | Dependency review and CodeQL for JavaScript/Python |
223
+ | `devlab.yml` | `dev-lab/**` changes, `main`, manual | Build and retain the browser review workbench artifact |
224
+ | `release.yml` | Manual dispatch only | Regression, npm publish with provenance and optional GitHub release |
174
225
 
175
- The audit and templates are grounded in first-party references: [LottieFiles runtimes](https://docs.lottiefiles.com/en/runtimes), the [dotLottie v2 specification](https://dotlottie.io/spec/2.0/), [Rive Web runtime](https://rive.app/docs/runtimes/web/web-js), [Rive state machines](https://rive.app/docs/runtimes/state-machines), and [GSAP accessibility guidance](https://gsap.com/resources/a11y/). End-to-end adapter evidence currently covers **Lottie JSON, dotLottie packaging, SVG cutout rigs, Rive, GSAP and Framer Motion**. Spine and Three.js remain scaffold-only until framework-specific runtime adapters are implemented.
226
+ 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.
176
227
 
177
228
  ## License
178
229
 
179
- MIT
230
+ MotionLoom is released under the [MIT License](LICENSE). Third-party runtime packages and source assets retain their own licenses and attribution requirements.
231
+
232
+ ## References
233
+
234
+ [1]: https://agentskills.io/specification "Agent Skills specification"
235
+ [2]: https://docs.lottiefiles.com/en/runtimes "LottieFiles runtimes"
236
+ [3]: https://dotlottie.io/spec/2.0/ "dotLottie v2 specification"
237
+ [4]: https://rive.app/docs/runtimes/web/web-js "Rive Web runtime"
238
+ [5]: https://gsap.com/resources/a11y/ "GSAP accessibility guidance"