motionloom 2.6.0 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -0
- package/CHANGELOG.md +26 -0
- package/README.md +1 -1
- package/SKILL.md +10 -3
- package/agent-card.json +62 -13
- package/agent-surfaces.json +30 -7
- package/bin/motionloom.mjs +6 -0
- package/docs/STATUS.md +2 -2
- package/docs/releases/2.6.1.md +57 -0
- package/examples/agent-consumer/frame-generation-lock/hero-walk-lock.json +84 -0
- package/package.json +9 -9
- package/references/multi-frame-asset-generation.md +109 -0
- package/schemas/frame-generation-lock.schema.json +166 -0
- package/scripts/frame-generation-lock.py +328 -0
- package/scripts/frame-set-preflight.py +214 -0
- package/tests/scripts/test_asset_consistency.py +77 -4
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 generated multi-frame animation assets, read [`references/multi-frame-asset-generation.md`](references/multi-frame-asset-generation.md) **before generating frame 2**. Apply it automatically without waiting for the user to ask: keep generated source frames isolated, lock canvas/scale/pivot/baseline from the accepted anchor frame, and pack sprite sheets/atlases only after the isolated frames pass. Before generating any later pose, create or load a `schemas/frame-generation-lock.schema.json` contract and run `motionloom frame-generation-lock validate`; compose each provider-facing frame instruction from that same lock with `motionloom frame-generation-lock compose`. After each generated frame, update the bound frame-geometry evidence and run `motionloom frame-set-preflight`. Six-frame-or-longer actions must never use one generated multi-pose sheet as their production source.
|
|
16
|
+
|
|
15
17
|
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
18
|
|
|
17
19
|
## Source of truth
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ All notable MotionLoom changes are documented here. The project follows semantic
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.6.1] - 2026-08-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Add a machine-readable `frame-generation-lock` contract that hash-binds the accepted identity/reference and locks canvas, alpha/color space, apparent size, pivot, footline, safe rectangle, transparent padding, camera/orientation and per-frame output identity before later frames are generated.
|
|
12
|
+
- Add provider-neutral `motionloom frame-generation-lock validate|compose|compose-all` commands and public Agent routing so every pose instruction is deterministically rebuilt from the same lock instead of relying on repeated prose prompts.
|
|
13
|
+
- Expose the strict generated `motionloom frame-set-preflight` command through the public CLI for post-generation alpha-bounds, scale, pivot/footline, guard-band, contamination and source-isolation checks.
|
|
14
|
+
|
|
15
|
+
### Hardened
|
|
16
|
+
|
|
17
|
+
- Default generated multi-frame source policy to one isolated PNG per frame; six-frame-or-longer actions must not use one generated pose sheet/contact sheet as production source material.
|
|
18
|
+
- Fail closed on stale reference hashes, duplicate frame outputs, pose-sheet policy violations, path escape, shared/non-isolated sources, post-generation resize and measured apparent-size drift beyond tolerance.
|
|
19
|
+
- Keep atlas packing as a later, separate gate: a clean atlas cannot repair inconsistent or contaminated source frames.
|
|
20
|
+
|
|
21
|
+
### Verified
|
|
22
|
+
|
|
23
|
+
- Dedicated Frame Generation Lock CI validates the public CLI, provider instruction composition and strict post-generation preflight.
|
|
24
|
+
- Pull request #18 passed MotionLoom Quality, Security Analysis, Documentation and Package Hygiene, plus the dedicated Frame Generation Lock workflow before merge.
|
|
25
|
+
|
|
26
|
+
### Boundary
|
|
27
|
+
|
|
28
|
+
- Frame locks, generated prompts, SHA-256 bindings, preflight passes and atlas checks are deterministic evidence only. They never grant artist authorship, production eligibility, runtime approval, licence authority or user approval.
|
|
29
|
+
|
|
30
|
+
See the [2.6.1 release note](docs/releases/2.6.1.md) for the generation/preflight contract and migration guidance.
|
|
31
|
+
|
|
7
32
|
## [2.6.0] - 2026-08-21
|
|
8
33
|
|
|
9
34
|
### Added
|
|
@@ -177,6 +202,7 @@ See the [2.0.0 release note](docs/releases/2.0.0.md).
|
|
|
177
202
|
|
|
178
203
|
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/).
|
|
179
204
|
|
|
205
|
+
[2.6.1]: docs/releases/2.6.1.md
|
|
180
206
|
[2.6.0]: docs/releases/2.6.0.md
|
|
181
207
|
[2.5.1]: docs/releases/2.5.1.md
|
|
182
208
|
[2.5.0]: docs/releases/2.5.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.6.
|
|
18
|
+
> **Release posture:** MotionLoom 2.6.1 keeps the interactive Dev Lab from 2.6.0 and adds a proactive Frame Generation Lock for generated multi-frame animation assets. Agents now hash-bind one accepted identity/reference, compose one isolated provider instruction per frame from locked canvas/scale/pivot/footline geometry, and run measured frame-set preflight before atlas packing. 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. Generation, runtime and validation evidence never imply artist authorship or user approval. See the [2.6.1 release note](docs/releases/2.6.1.md).
|
|
19
19
|
|
|
20
20
|
## Why MotionLoom
|
|
21
21
|
|
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.6.
|
|
10
|
+
version: "2.6.1"
|
|
11
11
|
target_frameworks: "lottie,dotlottie,rive,gsap,framer-motion,spine,threejs"
|
|
12
12
|
verified_runtimes: "lottie-json,dotlottie-package,svg-cutout-rig,rive,gsap,framer-motion"
|
|
13
13
|
---
|
|
@@ -30,10 +30,10 @@ For Agent or CI composition, consume JSON and preserve the exit code. If the pro
|
|
|
30
30
|
2. **Plan** — classify the animation, select a framework, and generate a context-bound `motion-spec.json` with timing, easing, loop, accessibility, performance and source authority.
|
|
31
31
|
3. **Source** — resolve an authoritative asset from the project or `assets/library/`. Record attribution, license and checksum in the scene manifest's required `source_binding`; the binding's SHA-256 must match the bytes referenced by `manifest.file`. Do not promote an unknown or placeholder asset to production.
|
|
32
32
|
3a. **Classify asset provenance** — create or load `asset-provenance.json` with `motionloom asset-provenance`. Treat Agent-created material as ingestible only when its origin, generator task, license, file hash and derivation chain are explicit. Use `code_authored` for an authored runtime scene such as GSAP or Framer Motion; it may be runtime-tested and marked `review_required`, but never self-promotes to production eligibility or approval. `ai_generated` may be runtime-tested but is never production-eligible; `ai_assisted` requires human sign-off; `artist_authored` and `production_approved` cannot be self-asserted by an Agent or quality gate. Use `check --mode runtime` for candidate ingest and `check --mode production` only for a full production gate.
|
|
33
|
-
3b. **Compile asset consistency** — when a task contains multi-frame character actions, sprite sheets/atlases or layered maps, create the matching identity, action-set, frame-geometry, atlas and layered-map contracts from `schemas/`.
|
|
33
|
+
3b. **Compile asset consistency and lock multi-frame generation** — when a task contains multi-frame character actions, sprite sheets/atlases or layered maps, create the matching identity, action-set, frame-geometry, atlas and layered-map contracts from `schemas/`. For Agent-generated frame sequences, read `references/multi-frame-asset-generation.md` before generating frame 2 and apply it automatically without waiting for the user to request consistency. Lock exact canvas, apparent scale, pivot, footline, safe rectangle, transparent guard band, camera/orientation and identity from the accepted anchor frame. Generate source frames as separate isolated images; actions with six or more frames must never use one generated contact sheet or multi-pose canvas as production source material. Validate every accepted frame incrementally with `python3 scripts/frame-set-preflight.py --input <frame-geometry.json> --root <asset-root> --json`; a shared source image, non-isolated source rect, scale drift beyond `bbox_drift_tolerance_px`, pivot/footline drift, guard-band violation, contamination or hash mismatch blocks continuation. Only after the isolated frames pass may the Agent pack a sprite sheet/atlas and run the normal atlas contract. For general consistency checks run `motionloom asset-consistency validate --kind <identity|action-set|frame-geometry|atlas|layered-map> --input <contract> --root <asset-root> --json`. The compiler measures actual PNG alpha bounds, pivot/footline/bbox drift, frame and atlas contamination, region overlap, parallax/z-order, tile seams and camera-safe bounds. A pass is deterministic contract evidence only; it never upgrades provenance, artist authority, production eligibility or human approval.
|
|
34
34
|
3c. **Ingest generation artifacts** — before using output from an internal skill or external provider, bind it with a `generation-receipt`, `control-track` and `export-manifest`. Run `motionloom artifact-intake intake --root <project-root> --registry artifact-adapter-registry.json --receipt <receipt> --controls <controls> --export-manifest <export> --json`. For a single-character AI frame sequence, first run `motionloom build-ai-pilot`: it rejects painted checkerboards, all-opaque RGBA, insufficient measured padding and canvas-spanning detached residue. Visually inspect the isolated output too: edge-connected alpha removal cannot prove that disconnected opaque artifacts are absent. The core path makes no provider call and stores no secret; adapters are evidence descriptors. Use `--provider chatgpt` for user-provided ChatGPT bytes so the receipt records `openai.chatgpt` and `user-mediated`; never relabel them as `internal-imagegen`. Both adapters are scaffold-only metadata, not proof of runtime readiness, artist authority or approval.
|
|
35
35
|
3d. **Build the runtime candidate and rig proof** — bind the intake bundle to identity/action/frame contracts with `motionloom runtime-candidate validate --root <project-root> --input <runtime-candidate.json> --json`, then validate the declared skeleton, sockets, actions, events, export target and runtime adapter with `motionloom rig-compatibility validate --root <project-root> --registry rig-adapter-registry.json --input <rig-contract.json> --json`. A passing candidate is `runtime_test_ready` and remains review-required; it cannot stand in for a production rig, human review or `production_approved`.
|
|
36
|
-
4. **Generate** — use the matching template or rig implementation. For body animation, preserve named anatomy, pivot and parent-first hierarchy.
|
|
36
|
+
4. **Generate** — use the matching template or rig implementation. For body animation, preserve named anatomy, pivot and parent-first hierarchy. For generated frame sequences, do not batch the whole action blindly: preserve the locked anchor geometry and accept each frame only after the multi-frame preflight passes; regenerate only the failing frame rather than resizing accepted frames to match it.
|
|
37
37
|
5. **Render** — run the platform-neutral Node entrypoint for scene output, or `node scripts/runtime-adapters.mjs` for the verified Rive/GSAP/Framer Motion adapter matrix. Acceptance requires runtime evidence at 0/50/100%, not a static placeholder. Keep the render metadata beside the snapshots.
|
|
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.
|
|
@@ -68,6 +68,7 @@ Only user-confirmed decisions and outcomes may become durable remediation memory
|
|
|
68
68
|
- Read `references/reporting-contract.md` when creating task, execution, issue or handoff artifacts.
|
|
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
|
+
- Read `references/multi-frame-asset-generation.md` before creating the second generated frame of any multi-frame action; this is an automatic source-generation rule, not an optional user preference.
|
|
71
72
|
- Read `docs/CHECKLIST.md` before marking a scene ready for review.
|
|
72
73
|
- Read `docs/DEV-LAB-RUNTIME.md` before declaring live actions, playback controls, Action Library metadata or state/transition review flows.
|
|
73
74
|
- Read `src/rig/README.md` for character body hierarchy and pose rules.
|
|
@@ -91,6 +92,7 @@ Only user-confirmed decisions and outcomes may become durable remediation memory
|
|
|
91
92
|
- Asset provenance is tiered: `code_authored` is runtime-only and may be `review_required`; `ai_generated` is `runtime_ready` but not `production_eligible`; `ai_assisted` becomes eligible only after human sign-off; `ai_assisted_human_reviewed` remains review-bound; `artist_authored` requires a verified human/artist record and full gate; `unknown` is `blocked`.
|
|
92
93
|
- `production_approved` is a human decision only. An Agent, generator metadata, signed attestation or quality gate may preserve or verify a decision but may never mint it; `approval` remains `false` in machine-generated evidence.
|
|
93
94
|
- Asset provenance binds each declared file to a SHA-256, license/source metadata, generator or derivation chain, runtime evidence and, where applicable, human review. Production checks fail closed on unknown origin, self-asserted artist authority, missing evidence or hash drift.
|
|
95
|
+
- Generated multi-frame source assets are isolated-frame-first. Lock canvas/apparent scale/pivot/footline/safe-rect geometry before frame 2, validate every accepted frame incrementally, and pack atlases only after preflight. Six-frame-or-longer generated actions must not use a single multi-pose source sheet. Deterministic source-geometry failures are blockers and must not be weakened into approval-friendly tolerances.
|
|
94
96
|
- Asset consistency is artifact-first and fail-closed: declared frame geometry, hashes, atlas regions and layered-map bounds must agree with measured runtime/source files. Heuristic warnings remain visible and may become blocking under `--strict`; no consistency result is an approval decision.
|
|
95
97
|
- 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.
|
|
96
98
|
- 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.
|
|
@@ -124,6 +126,11 @@ node scripts/to-dotlottie.mjs --scene-dir src/output/<scene> --output src/output
|
|
|
124
126
|
motionloom memory init --project-root <project-path>
|
|
125
127
|
motionloom memory recover --project-root <project-path> --json
|
|
126
128
|
|
|
129
|
+
# Generated multi-frame source preflight: isolated canvases, scale/pivot/footline and guard-band checks.
|
|
130
|
+
python3 scripts/frame-set-preflight.py \
|
|
131
|
+
--input src/output/<scene>/hero-walk-frame-geometry.json \
|
|
132
|
+
--root src/output/<scene> --json
|
|
133
|
+
|
|
127
134
|
# Measure multi-frame, atlas or layered-map consistency from real artifacts.
|
|
128
135
|
motionloom asset-consistency validate --kind frame-geometry \
|
|
129
136
|
--input src/output/<scene>/hero-walk-frame-geometry.json \
|
package/agent-card.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"card_version": "1.0",
|
|
3
3
|
"name": "motionloom",
|
|
4
|
-
"version": "2.6.
|
|
4
|
+
"version": "2.6.1",
|
|
5
5
|
"description": "Project-aware animation production with durable Project Memory, provider-neutral Artifact Intake, hash-bound control-to-runtime candidates, tiered asset provenance, framework-neutral motion IR, rig compatibility, runtime verification and telemetry, Visual Truth, Remediation Learning, DSSE-compatible signed attestation, interactive Dev Lab review, trust-boundary hardening and deterministic Agent handoff.",
|
|
6
6
|
"capabilities": [
|
|
7
7
|
"project.setup",
|
|
@@ -28,6 +28,9 @@
|
|
|
28
28
|
"asset.provenance.validate",
|
|
29
29
|
"asset.provenance.report",
|
|
30
30
|
"asset.provenance.production-gate",
|
|
31
|
+
"asset.frame-generation-lock.validate",
|
|
32
|
+
"asset.frame-generation-lock.compose",
|
|
33
|
+
"asset.frame-set-preflight",
|
|
31
34
|
"asset.consistency.validate",
|
|
32
35
|
"asset.consistency.frame-geometry",
|
|
33
36
|
"asset.consistency.atlas",
|
|
@@ -94,7 +97,8 @@
|
|
|
94
97
|
"control-track",
|
|
95
98
|
"export-manifest",
|
|
96
99
|
"runtime-candidate",
|
|
97
|
-
"rig-compatibility-contract"
|
|
100
|
+
"rig-compatibility-contract",
|
|
101
|
+
"frame-generation-lock"
|
|
98
102
|
],
|
|
99
103
|
"output_artifacts": [
|
|
100
104
|
"agent-discovery-report",
|
|
@@ -134,11 +138,23 @@
|
|
|
134
138
|
"project-memory",
|
|
135
139
|
"continuity-report",
|
|
136
140
|
"fix-plan",
|
|
137
|
-
"pr-patch"
|
|
141
|
+
"pr-patch",
|
|
142
|
+
"frame-generation-instruction",
|
|
143
|
+
"generated-frame-set-preflight-report"
|
|
138
144
|
],
|
|
139
145
|
"runtime_capabilities": {
|
|
140
|
-
"verified": [
|
|
141
|
-
|
|
146
|
+
"verified": [
|
|
147
|
+
"lottie-json",
|
|
148
|
+
"dotlottie-package",
|
|
149
|
+
"svg-cutout-rig",
|
|
150
|
+
"rive",
|
|
151
|
+
"gsap",
|
|
152
|
+
"framer-motion"
|
|
153
|
+
],
|
|
154
|
+
"scaffold_only": [
|
|
155
|
+
"spine",
|
|
156
|
+
"threejs"
|
|
157
|
+
]
|
|
142
158
|
},
|
|
143
159
|
"side_effects": {
|
|
144
160
|
"read_files": "allowed",
|
|
@@ -155,24 +171,46 @@
|
|
|
155
171
|
"url": "https://github.com/LottieFiles/dotlottie-web/blob/main/SKILL.md",
|
|
156
172
|
"role": "official-runtime-reference",
|
|
157
173
|
"trust": "official",
|
|
158
|
-
"use_for": [
|
|
159
|
-
|
|
174
|
+
"use_for": [
|
|
175
|
+
"dotLottie runtime API",
|
|
176
|
+
"worker rendering",
|
|
177
|
+
"state machines",
|
|
178
|
+
"slots"
|
|
179
|
+
],
|
|
180
|
+
"not_for": [
|
|
181
|
+
"project planning",
|
|
182
|
+
"provenance",
|
|
183
|
+
"PR acceptance"
|
|
184
|
+
]
|
|
160
185
|
},
|
|
161
186
|
{
|
|
162
187
|
"id": "text-to-lottie",
|
|
163
188
|
"url": "https://github.com/diffusionstudio/lottie",
|
|
164
189
|
"role": "optional-scaffold",
|
|
165
190
|
"trust": "community-open-source",
|
|
166
|
-
"use_for": [
|
|
167
|
-
|
|
191
|
+
"use_for": [
|
|
192
|
+
"scene setup",
|
|
193
|
+
"live preview patterns",
|
|
194
|
+
"prompt conventions"
|
|
195
|
+
],
|
|
196
|
+
"not_for": [
|
|
197
|
+
"runtime truth",
|
|
198
|
+
"context binding"
|
|
199
|
+
]
|
|
168
200
|
},
|
|
169
201
|
{
|
|
170
202
|
"id": "animation-design",
|
|
171
203
|
"url": "https://github.com/b1rdmania/claude-lottie-skill/blob/main/SKILL.md",
|
|
172
204
|
"role": "optional-asset-discovery",
|
|
173
205
|
"trust": "community-open-source",
|
|
174
|
-
"use_for": [
|
|
175
|
-
|
|
206
|
+
"use_for": [
|
|
207
|
+
"brand-aware Lottie/Rive search",
|
|
208
|
+
"series coherence"
|
|
209
|
+
],
|
|
210
|
+
"not_for": [
|
|
211
|
+
"license authority",
|
|
212
|
+
"runtime verification"
|
|
213
|
+
]
|
|
176
214
|
}
|
|
177
215
|
],
|
|
178
216
|
"entrypoints": {
|
|
@@ -234,10 +272,21 @@
|
|
|
234
272
|
"remediation_summary": "motionloom remediation-learning summary --history artifacts/remediation-history.jsonl --output artifacts/remediation-summary.json --json",
|
|
235
273
|
"browser_review_prepare": "python3 scripts/review-hook.py prepare --task-dir artifacts/<task-id> --lab-url <internal-lab-url>",
|
|
236
274
|
"browser_review_validate": "python3 scripts/review-hook.py validate --task-dir artifacts/<task-id>",
|
|
237
|
-
"pr_prepare": "node scripts/pr.mjs <scene>"
|
|
275
|
+
"pr_prepare": "node scripts/pr.mjs <scene>",
|
|
276
|
+
"frame_generation_lock_validate": "motionloom frame-generation-lock validate --input <frame-generation-lock.json> --root <asset-root> --json",
|
|
277
|
+
"frame_generation_lock_compose": "motionloom frame-generation-lock compose --input <frame-generation-lock.json> --frame-id <frame-id> --root <asset-root> --json",
|
|
278
|
+
"frame_set_preflight": "motionloom frame-set-preflight --input <frame-geometry.json> --root <asset-root> --json"
|
|
238
279
|
},
|
|
239
280
|
"report_contract": {
|
|
240
|
-
"required_sections": [
|
|
281
|
+
"required_sections": [
|
|
282
|
+
"completed",
|
|
283
|
+
"verified",
|
|
284
|
+
"not_completed",
|
|
285
|
+
"problems",
|
|
286
|
+
"structure_review",
|
|
287
|
+
"next_agent",
|
|
288
|
+
"browser_review"
|
|
289
|
+
],
|
|
241
290
|
"artifact_root": "artifacts/<task-id>/"
|
|
242
291
|
}
|
|
243
292
|
}
|
package/agent-surfaces.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.0",
|
|
3
3
|
"name": "motionloom",
|
|
4
|
-
"version": "2.6.
|
|
4
|
+
"version": "2.6.1",
|
|
5
5
|
"canonical": {
|
|
6
6
|
"skill": "SKILL.md",
|
|
7
7
|
"agent_card": "agent-card.json",
|
|
@@ -14,7 +14,12 @@
|
|
|
14
14
|
"path": ".agents/skills/motionloom/SKILL.md",
|
|
15
15
|
"canonical": "SKILL.md",
|
|
16
16
|
"load_mode": "alias",
|
|
17
|
-
"agents": [
|
|
17
|
+
"agents": [
|
|
18
|
+
"codex",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"cursor",
|
|
21
|
+
"opencode"
|
|
22
|
+
]
|
|
18
23
|
},
|
|
19
24
|
{
|
|
20
25
|
"id": "claude-code",
|
|
@@ -22,7 +27,9 @@
|
|
|
22
27
|
"path": ".claude/skills/motionloom.md",
|
|
23
28
|
"canonical": "SKILL.md",
|
|
24
29
|
"load_mode": "alias",
|
|
25
|
-
"agents": [
|
|
30
|
+
"agents": [
|
|
31
|
+
"claude-code"
|
|
32
|
+
]
|
|
26
33
|
},
|
|
27
34
|
{
|
|
28
35
|
"id": "codex",
|
|
@@ -30,7 +37,9 @@
|
|
|
30
37
|
"path": ".codex/skills/motionloom.md",
|
|
31
38
|
"canonical": "SKILL.md",
|
|
32
39
|
"load_mode": "alias",
|
|
33
|
-
"agents": [
|
|
40
|
+
"agents": [
|
|
41
|
+
"codex"
|
|
42
|
+
]
|
|
34
43
|
},
|
|
35
44
|
{
|
|
36
45
|
"id": "repository-agent-guide",
|
|
@@ -38,7 +47,12 @@
|
|
|
38
47
|
"path": "AGENTS.md",
|
|
39
48
|
"canonical": "SKILL.md",
|
|
40
49
|
"load_mode": "router",
|
|
41
|
-
"agents": [
|
|
50
|
+
"agents": [
|
|
51
|
+
"codex",
|
|
52
|
+
"claude-code",
|
|
53
|
+
"cursor",
|
|
54
|
+
"opencode"
|
|
55
|
+
]
|
|
42
56
|
}
|
|
43
57
|
],
|
|
44
58
|
"installations": [
|
|
@@ -72,10 +86,19 @@
|
|
|
72
86
|
}
|
|
73
87
|
],
|
|
74
88
|
"compatibility": {
|
|
75
|
-
"operating_systems": [
|
|
89
|
+
"operating_systems": [
|
|
90
|
+
"ubuntu",
|
|
91
|
+
"macos",
|
|
92
|
+
"windows"
|
|
93
|
+
],
|
|
76
94
|
"node": ">=18",
|
|
77
95
|
"python": ">=3.11",
|
|
78
|
-
"agents": [
|
|
96
|
+
"agents": [
|
|
97
|
+
"codex",
|
|
98
|
+
"claude-code",
|
|
99
|
+
"cursor",
|
|
100
|
+
"opencode"
|
|
101
|
+
]
|
|
79
102
|
},
|
|
80
103
|
"rules": {
|
|
81
104
|
"canonical_instruction_source": "SKILL.md",
|
package/bin/motionloom.mjs
CHANGED
|
@@ -40,6 +40,8 @@ const PYTHON_COMMANDS = {
|
|
|
40
40
|
"remediation-learning": "scripts/remediation-learning.py",
|
|
41
41
|
"asset-provenance": "scripts/asset-provenance.py",
|
|
42
42
|
"asset-consistency": "scripts/asset-consistency.py",
|
|
43
|
+
"frame-generation-lock": "scripts/frame-generation-lock.py",
|
|
44
|
+
"frame-set-preflight": "scripts/frame-set-preflight.py",
|
|
43
45
|
"artifact-intake": "scripts/artifact-intake.py",
|
|
44
46
|
"runtime-candidate": "scripts/runtime-candidate.py",
|
|
45
47
|
"rig-compatibility": "scripts/rig-compatibility.py",
|
|
@@ -92,6 +94,8 @@ Use when an animation task needs it:
|
|
|
92
94
|
remediation-learning Record or summarize user-confirmed remediation and benchmark history
|
|
93
95
|
asset-provenance Validate, classify or report asset origin and production readiness
|
|
94
96
|
asset-consistency Validate frame geometry, atlas contamination and layered-map contracts
|
|
97
|
+
frame-generation-lock Validate or compose locked per-frame generation instructions
|
|
98
|
+
frame-set-preflight Fail closed on shared canvases, scale drift and frame contamination
|
|
95
99
|
artifact-intake Bind generation controls, provenance, adapter metadata and exported bytes
|
|
96
100
|
runtime-candidate Bind intake exports to consistency contracts before runtime testing
|
|
97
101
|
rig-compatibility Validate rig bones, sockets, actions, events and runtime adapter evidence
|
|
@@ -114,6 +118,8 @@ Cross-platform examples:
|
|
|
114
118
|
motionloom remediation-learning summary --history artifacts/remediation-history.jsonl --json
|
|
115
119
|
motionloom asset-provenance check --input <asset-provenance.json> --root <scene-dir> --mode runtime --json
|
|
116
120
|
motionloom asset-consistency validate --kind frame-geometry --input <frame-geometry.json> --root <scene-dir> --json
|
|
121
|
+
motionloom frame-generation-lock compose --input <frame-generation-lock.json> --root <asset-root> --frame-id walk.00 --json
|
|
122
|
+
motionloom frame-set-preflight --input <frame-geometry.json> --root <asset-root> --json
|
|
117
123
|
motionloom artifact-intake intake --root <asset-dir> --registry artifact-adapter-registry.json \\
|
|
118
124
|
--receipt <generation-receipt.json> --controls <control-track.json> --export-manifest <export-manifest.json> --json
|
|
119
125
|
motionloom alpha-isolate <opaque.png> <isolated.png> --report <alpha-report.json>
|
package/docs/STATUS.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release posture
|
|
6
6
|
|
|
7
|
-
MotionLoom's repository source and package manifest carry **2.6.
|
|
7
|
+
MotionLoom's repository source and package manifest carry **2.6.1 release metadata**. The publication state of the npm registry and GitHub Release/tag must be verified against the latest release workflow rather than inferred from this document. The repository has a cross-platform CLI, one-command project onboarding, durable Project Memory, Agent interoperability surfaces, artifact-first handoff, runtime evidence, Visual Truth, Remediation Learning, signed attestation, AI-first asset provenance, a truthful code-authored runtime lane and an interactive browser-based Dev Lab review workbench. Dev Lab supports hash-bound live playback, arbitrary project-defined action libraries and optional state/transition review flows; generated frame sequences additionally use a machine-readable Frame Generation Lock plus fail-closed measured preflight so isolated source geometry is controlled before and after generation. The protected manual release workflow verifies package/changelog/release-note alignment before publication.
|
|
8
8
|
|
|
9
9
|
The repository is **engineering-ready for continued integration work**, not a universal production certification for every animation framework or every host project. CI status must be read from the latest GitHub Actions run, not inferred from historical audit prose.
|
|
10
10
|
|
|
@@ -30,4 +30,4 @@ Use the following order when sources disagree:
|
|
|
30
30
|
|
|
31
31
|
## Known next work
|
|
32
32
|
|
|
33
|
-
The bounded analyzer has been exercised against a labeled external corpus; see the [dated evidence note](audits/external-project-corpus-2026-08-13.md). The 2.5.x publication chain established npm/GitHub release provenance,
|
|
33
|
+
The bounded analyzer has been exercised against a labeled external corpus; see the [dated evidence note](audits/external-project-corpus-2026-08-13.md). The 2.5.x publication chain established npm/GitHub release provenance, 2.6.0 added the richer Dev Lab review surface, and 2.6.1 adds proactive machine-readable frame-generation geometry control without weakening the human approval boundary. The highest-value next evidence work is consumer-project review of real action sets, transitions and generated frame sequences, followed by paired product evaluation across more real projects and repeating the same provenance verification for each new release. Missing external projects are reported as `insufficient_evidence`, never as a pass. None of these items should weaken the user-review gate or convert runtime success or heuristic warnings into approval.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# MotionLoom 2.6.1
|
|
2
|
+
|
|
3
|
+
MotionLoom 2.6.1 closes the generated multi-frame consistency gap discovered during real Codex animation work. The release makes frame consistency proactive: the Agent binds one accepted identity/reference into a machine-readable Frame Generation Lock before producing later poses, then validates the real PNG bytes after every generated frame before any atlas is packed.
|
|
4
|
+
|
|
5
|
+
## What changed
|
|
6
|
+
|
|
7
|
+
### Frame Generation Lock before generation
|
|
8
|
+
|
|
9
|
+
Generated frame sequences now have a provider-neutral contract in `schemas/frame-generation-lock.schema.json`. The lock records and verifies:
|
|
10
|
+
|
|
11
|
+
- accepted identity/reference path and SHA-256;
|
|
12
|
+
- exact canvas dimensions, alpha mode and color space;
|
|
13
|
+
- camera/orientation and apparent character scale;
|
|
14
|
+
- pivot and baseline/footline;
|
|
15
|
+
- safe rectangle, transparent padding and geometry tolerances;
|
|
16
|
+
- ordered frame ids, pose intent and one unique isolated output path per frame.
|
|
17
|
+
|
|
18
|
+
Agents use `motionloom frame-generation-lock validate` before generation and `motionloom frame-generation-lock compose` (or `compose-all`) to build each provider-facing pose instruction from the same lock. This removes dependence on an Agent remembering or rewriting the geometry prose consistently across frame 2, frame 6 or frame 20.
|
|
19
|
+
|
|
20
|
+
### Strict preflight after each generated frame
|
|
21
|
+
|
|
22
|
+
`motionloom frame-set-preflight` is now a public CLI command. It re-measures actual PNG bytes and blocks shared/non-isolated source canvases, stale hashes, contamination, guard-band violations, pivot/footline drift and apparent-size drift beyond the declared tolerance.
|
|
23
|
+
|
|
24
|
+
The default source policy is deliberately strict: generate one isolated source PNG per frame, validate it, and only then continue. For long actions (including six or more frames), a generated contact sheet or multi-pose sheet must not be cropped into production source frames. Atlas/sprite-sheet packing happens only after all isolated source frames pass.
|
|
25
|
+
|
|
26
|
+
## Agent behavior
|
|
27
|
+
|
|
28
|
+
`AGENTS.md` and the canonical Skill route Codex and other compatible Agents through this workflow automatically. The user does not need to remember to ask for equal scale, separate frames, padding, baseline consistency or pose-sheet avoidance.
|
|
29
|
+
|
|
30
|
+
If one frame fails, the Agent regenerates or repairs that frame under the same lock. It must not silently resize previously accepted frames or weaken tolerances merely to make the set pass.
|
|
31
|
+
|
|
32
|
+
## Verification
|
|
33
|
+
|
|
34
|
+
PR #18 passed:
|
|
35
|
+
|
|
36
|
+
- the dedicated Frame Generation Lock workflow;
|
|
37
|
+
- MotionLoom Quality (including engine tests and cross-platform package checks);
|
|
38
|
+
- Security Analysis / CodeQL;
|
|
39
|
+
- Documentation and Package Hygiene.
|
|
40
|
+
|
|
41
|
+
The dedicated regression suite covers stale reference hashes, duplicate outputs, pose-sheet policy, path escape, post-generation resize, public CLI composition and strict preflight.
|
|
42
|
+
|
|
43
|
+
## Trust boundary
|
|
44
|
+
|
|
45
|
+
This release improves source consistency and evidence quality; it does not change authority. A generator prompt, reference hash, frame lock, preflight pass, atlas pass, runtime render or signed evidence record does **not** create artist authorship, licence authority, production eligibility, production approval or user approval. Human review remains a separate bounded decision.
|
|
46
|
+
|
|
47
|
+
## Updating a project
|
|
48
|
+
|
|
49
|
+
After `motionloom@2.6.1` is published, update the project-local development dependency and refresh the managed Agent surface:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install --save-dev motionloom@2.6.1
|
|
53
|
+
npx --no-install motionloom repair --yes
|
|
54
|
+
npx --no-install motionloom status --json
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
For a generated multi-frame task, the Agent should then use the Frame Generation Lock before later frames and `frame-set-preflight` after each accepted frame.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"lock_id": "hero-walk-v1",
|
|
4
|
+
"asset_identity": "character/hero-male",
|
|
5
|
+
"action_id": "walk",
|
|
6
|
+
"reference": {
|
|
7
|
+
"image": "asset-consistency/assets/hero-frame-00.png",
|
|
8
|
+
"sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248",
|
|
9
|
+
"role": "accepted_frame_anchor"
|
|
10
|
+
},
|
|
11
|
+
"canvas": {
|
|
12
|
+
"width": 8,
|
|
13
|
+
"height": 8,
|
|
14
|
+
"color_space": "srgb",
|
|
15
|
+
"alpha_mode": "straight"
|
|
16
|
+
},
|
|
17
|
+
"geometry": {
|
|
18
|
+
"center_x": 4,
|
|
19
|
+
"pivot": { "x": 4, "y": 7, "space": "pixels" },
|
|
20
|
+
"footline_px": 6,
|
|
21
|
+
"safe_rect": { "x": 1, "y": 0, "width": 6, "height": 7 },
|
|
22
|
+
"min_padding_px": 1,
|
|
23
|
+
"target_alpha_bbox": { "width": 4, "height": 5 },
|
|
24
|
+
"tolerances": {
|
|
25
|
+
"pivot_px": 0.01,
|
|
26
|
+
"footline_px": 0.01,
|
|
27
|
+
"bbox_width_px": 0,
|
|
28
|
+
"bbox_height_px": 0
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"appearance": {
|
|
32
|
+
"preserve": [
|
|
33
|
+
"same character identity and silhouette",
|
|
34
|
+
"same camera and left-to-right orientation",
|
|
35
|
+
"same palette, outline weight and apparent scale"
|
|
36
|
+
],
|
|
37
|
+
"forbid": [
|
|
38
|
+
"second character or neighboring pose",
|
|
39
|
+
"background, shadow, text, prop or crop",
|
|
40
|
+
"camera change, mirror, recolor or post-generation resize"
|
|
41
|
+
],
|
|
42
|
+
"pixel_art": {
|
|
43
|
+
"enabled": true,
|
|
44
|
+
"nearest_neighbor_only": true
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"source_policy": {
|
|
48
|
+
"isolated_frames": true,
|
|
49
|
+
"max_frames_per_image": 1,
|
|
50
|
+
"allow_pose_sheet": false,
|
|
51
|
+
"allow_post_resize": false,
|
|
52
|
+
"reuse_reference": true
|
|
53
|
+
},
|
|
54
|
+
"frames": [
|
|
55
|
+
{
|
|
56
|
+
"frame_id": "walk.00",
|
|
57
|
+
"pose": "Contact-right: right foot forward on the shared footline, left leg trailing, natural counter-swing.",
|
|
58
|
+
"output": "frame-generation-lock/generated/hero-walk-00.png"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"frame_id": "walk.01",
|
|
62
|
+
"pose": "Passing: one leg passes beneath the upright body with compact stride and natural counter-swing.",
|
|
63
|
+
"output": "frame-generation-lock/generated/hero-walk-01.png"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"frame_id": "walk.02",
|
|
67
|
+
"pose": "Contact-left: left foot forward on the shared footline, right leg trailing, natural counter-swing.",
|
|
68
|
+
"output": "frame-generation-lock/generated/hero-walk-02.png"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"frame_id": "walk.03",
|
|
72
|
+
"pose": "Passing complement: opposite leg passes beneath the upright body; preserve the same body scale and baseline.",
|
|
73
|
+
"output": "frame-generation-lock/generated/hero-walk-03.png"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"postflight": {
|
|
77
|
+
"frame_geometry": "asset-consistency/hero-walk-frame-geometry.json"
|
|
78
|
+
},
|
|
79
|
+
"trust": {
|
|
80
|
+
"authority": "ai_generated",
|
|
81
|
+
"review_only": true,
|
|
82
|
+
"approval": false
|
|
83
|
+
}
|
|
84
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "motionloom",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "pnpm@11.20.0",
|
|
6
6
|
"description": "MotionLoom: project-aware animation Skill with Agent interoperability, graph, provenance, Motion IR, runtime telemetry, Visual Truth, Remediation Learning, DSSE-compatible signed attestation, external evidence verification and Dev Lab review.",
|
|
@@ -76,11 +76,11 @@
|
|
|
76
76
|
"scripts/rive-package-gate.py",
|
|
77
77
|
"schemas/rive-package-manifest.schema.json",
|
|
78
78
|
"examples/agent-consumer/rive-package-gate",
|
|
79
|
-
"tests/scripts/test_rive_package_gate.py"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
"tests/scripts/test_rive_package_gate.py",
|
|
80
|
+
"scripts/build-ai-pilot.py",
|
|
81
|
+
"scripts/isolate-alpha-background.py",
|
|
82
|
+
"tests/scripts/test_ai_pilot_builder.py",
|
|
83
|
+
"tests/scripts/test_alpha_isolation.py"
|
|
84
84
|
],
|
|
85
85
|
"keywords": [
|
|
86
86
|
"animation",
|
|
@@ -184,9 +184,9 @@
|
|
|
184
184
|
"artifact:intake": "node bin/motionloom.mjs artifact-intake intake --root . --registry artifact-adapter-registry.json --receipt examples/agent-consumer/artifact-intake/hero-motion-receipt.json --controls examples/agent-consumer/artifact-intake/hero-motion-controls.json --export-manifest examples/agent-consumer/artifact-intake/hero-motion-export.json --json",
|
|
185
185
|
"runtime:candidate": "node bin/motionloom.mjs runtime-candidate validate --root . --input examples/agent-consumer/runtime-candidate/hero-walk-candidate.json --json",
|
|
186
186
|
"rig:compatibility": "node bin/motionloom.mjs rig-compatibility validate --root . --registry rig-adapter-registry.json --input examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json --json",
|
|
187
|
-
"rive:gate": "node bin/motionloom.mjs rive-package-gate --help"
|
|
188
|
-
|
|
189
|
-
|
|
187
|
+
"rive:gate": "node bin/motionloom.mjs rive-package-gate --help",
|
|
188
|
+
"pilot:build": "node bin/motionloom.mjs pilot-build --help",
|
|
189
|
+
"alpha:isolate": "node bin/motionloom.mjs alpha-isolate --help"
|
|
190
190
|
},
|
|
191
191
|
"dependencies": {
|
|
192
192
|
"@lottiefiles/dotlottie-web": "^0.79.0",
|