motionloom 2.6.0 → 2.7.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 (71) hide show
  1. package/AGENTS.md +3 -1
  2. package/CHANGELOG.md +68 -0
  3. package/CONTRIBUTING.md +3 -1
  4. package/README.md +20 -4
  5. package/SECURITY.md +5 -5
  6. package/SKILL.md +15 -5
  7. package/agent-card.json +77 -14
  8. package/agent-surfaces.json +30 -7
  9. package/artifact-adapter-registry.json +568 -20
  10. package/bin/motionloom.mjs +25 -2
  11. package/capability-registry.json +58 -234
  12. package/dev-lab/public/devlab.js +36 -3
  13. package/dev-lab/public/index.html +6 -2
  14. package/docs/ACTION-SEPARATION.md +104 -0
  15. package/docs/ASSET-GENERATION-PLANNER.md +101 -0
  16. package/docs/BRANCH-PROTECTION.md +44 -0
  17. package/docs/EXTERNAL-CORPUS.md +26 -0
  18. package/docs/STATUS.md +3 -2
  19. package/docs/audits/field-test-after-hardening-2026-08-21.md +25 -0
  20. package/docs/releases/2.6.1.md +57 -0
  21. package/docs/releases/2.7.0.md +98 -0
  22. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.00.json +32 -0
  23. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.01.json +32 -0
  24. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.02.json +32 -0
  25. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.03.json +32 -0
  26. package/examples/agent-consumer/asset-consistency/action-sequence/hero-walk-action-manifest.json +81 -0
  27. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.00.json +26 -0
  28. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.01.json +26 -0
  29. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.02.json +26 -0
  30. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.03.json +26 -0
  31. package/examples/agent-consumer/asset-planning/pixellab-hero-256x448-request.json +43 -0
  32. package/examples/agent-consumer/devlab-live-sprite/README.md +30 -0
  33. package/examples/agent-consumer/devlab-live-sprite/devlab-runtime.json +61 -0
  34. package/examples/agent-consumer/devlab-live-sprite/frames/idle-00.png +0 -0
  35. package/examples/agent-consumer/devlab-live-sprite/frames/idle-01.png +0 -0
  36. package/examples/agent-consumer/devlab-live-sprite/frames/idle-02.png +0 -0
  37. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-00.png +0 -0
  38. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-01.png +0 -0
  39. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-02.png +0 -0
  40. package/examples/agent-consumer/frame-generation-lock/hero-walk-lock.json +97 -0
  41. package/package.json +23 -9
  42. package/references/multi-frame-asset-generation.md +144 -0
  43. package/schemas/action-separation-verifier-evidence.schema.json +43 -0
  44. package/schemas/action-sequence-manifest.schema.json +48 -0
  45. package/schemas/artifact-adapter-registry.schema.json +1 -1
  46. package/schemas/asset-adaptation.schema.json +21 -0
  47. package/schemas/asset-generation-plan.schema.json +77 -0
  48. package/schemas/asset-generation-request.schema.json +104 -0
  49. package/schemas/frame-envelope.schema.json +62 -0
  50. package/schemas/frame-generation-lock.schema.json +189 -0
  51. package/scripts/action-separation.py +410 -0
  52. package/scripts/asset-adapt.mjs +92 -0
  53. package/scripts/asset-generation-plan.py +613 -0
  54. package/scripts/browser_review_consistency.py +64 -0
  55. package/scripts/fetch-project-corpus.py +91 -0
  56. package/scripts/frame-generation-lock.py +358 -0
  57. package/scripts/frame-set-preflight.py +264 -0
  58. package/scripts/package-consumer-smoke.mjs +20 -0
  59. package/scripts/quality-gate.py +7 -0
  60. package/scripts/release-verify.py +25 -0
  61. package/scripts/report-contract.py +1 -1
  62. package/scripts/report.py +19 -4
  63. package/scripts/resolve-task-bundle.py +11 -3
  64. package/scripts/review-hook.py +51 -2
  65. package/scripts/skill-doctor.py +42 -0
  66. package/src/output/browser-review-smoke/browser-review.json +6 -6
  67. package/tests/scripts/run_tests.py +45 -2
  68. package/tests/scripts/test_asset_adapt.py +47 -0
  69. package/tests/scripts/test_asset_consistency.py +77 -4
  70. package/tests/scripts/test_asset_generation_plan.py +250 -0
  71. package/tests/scripts/test_attestation.py +24 -8
@@ -0,0 +1,101 @@
1
+ # Provider-aware asset generation planner
2
+
3
+ MotionLoom does not choose animation tools in isolation. It first understands the project and task, evaluates available or requested routes against those requirements, then produces an explainable recommendation and validation workflow. A provider is only an execution route; **MotionLoom remains the project-aware decision and guidance layer**.
4
+
5
+ MotionLoom also does not treat an image provider's native canvas as the game's runtime canvas. A request such as a `256x448` character frame can be valid for the game while being impossible as a native input to a provider whose animation tools accept only square canvases. The planner makes this mismatch explicit before any provider call.
6
+
7
+ ## Command
8
+
9
+ ```bash
10
+ motionloom asset-generation-plan plan \
11
+ --request examples/agent-consumer/asset-planning/pixellab-hero-256x448-request.json \
12
+ --project-root . --json
13
+ ```
14
+
15
+ The command is **plan-only**. It does not invoke a provider, read or transfer a Bearer token, modify image bytes, create a generation job or grant approval. It reads the request, the local `artifact-adapter-registry.json`, and the repository contracts that are present in `--project-root`.
16
+
17
+ When the plan selects deterministic padding, execute it explicitly with `asset-adapt`; the operation is transparent, hash-bound and still requires downstream geometry/action review:
18
+
19
+ ```bash
20
+ motionloom asset-adapt pad \
21
+ --input provider-source.png \
22
+ --output runtime-frame.png \
23
+ --width 256 --height 448 \
24
+ --anchor footline \
25
+ --report asset-adaptation.json --json
26
+ ```
27
+
28
+ `asset-adapt` uses integer nearest-neighbour scaling only when requested, refuses source pixels that do not fit the target, and never crops or non-uniformly stretches. It does not decide whether the source frame belongs to the requested action.
29
+
30
+ ## Why PixelLab needs an adaptation plan
31
+
32
+ PixelLab's official API documentation exposes image and animation endpoints and documents Bearer-token authentication.[1] The official skeleton animation guide accepts square canvases including `256x256`, `128x128`, `64x64`, `32x32` and `16x16`.[2] The official Animation to animation guide documents square sizes `128x128`, `64x64`, `32x32` and `16x16`, with maximum frame count dependent on canvas size.[3] The official Create animated object/character route creates a new object or character from text and action, supports `32x32`, `64x64`, `128x128` and `256x256`, and emits 16 frames for 32/64px tiers or 4 frames for larger documented tiers.[4] The separate Animate with text route animates an existing reference image and is not the same provider capability as create-from-text.[5]
33
+
34
+ Therefore, a game target of `256x448` is not a PixelLab-native animation canvas for these documented routes. MotionLoom may still recommend a PixelLab route when it is a good project fit, but represents it as `recommendation_status: recommended` with `execution_status: provisional` under the default policy. The recommendation is explicit transparent padding into the `256x448` target, followed by frame-geometry and action-separation validation. It never silently stretches, crops or treats a provider batch as equivalent to required isolated-frame generation.
35
+
36
+ PixelLab also documents a Resize tool, but the official page currently states that the feature is available in the Aseprite extension.[6] MotionLoom consequently does not claim provider-native API resize as verified. Deterministic nearest-neighbour scaling or a manual/provider-specific resize route must be declared and evidenced separately.
37
+
38
+ ## Request contract
39
+
40
+ `schemas/asset-generation-request.schema.json` records the information that a generic prompt usually omits:
41
+
42
+ | Field | Purpose |
43
+ |---|---|
44
+ | `target.canvas` | The real runtime width and height, not the provider's preferred size. |
45
+ | `target.frame_count` and `fps` | The temporal contract the generated sequence must satisfy. |
46
+ | `target.alpha_mode` and `pixel_art` | Transparency and pixel-grid constraints for downstream geometry checks. |
47
+ | `generation_policy.frame_isolation` | Whether one source image per frame is required. |
48
+ | `allow_crop`, `allow_stretch`, `allow_silent_resize` | Hard safety boundaries; the current contract requires all three to be false. |
49
+ | `actions` | Positive and negative cues that feed the existing action-scoped manifest/verifier pipeline. |
50
+ | `provider_preferences` | Optional preferred or excluded adapter IDs; preference is visible but cannot override hard constraints. |
51
+ | `references` | Identity/style/pose roles without placing secrets or prompt plaintext in the request. |
52
+
53
+ ## Decision model
54
+
55
+ The planner compares the request with adapter capability metadata, current availability metadata, user preference and the active registry selection policy. It separates **recommendation status** from **execution status** and keeps normal planning useful even when no route is execution-eligible.
56
+
57
+ | Situation | Planner behavior |
58
+ |---|---|
59
+ | Verified adapter satisfies hard constraints | Set `execution_status: verified`, `execution_eligible: true` and usually `recommendation_status: recommended` or `acceptable`; retain human-review boundaries. |
60
+ | Provisional/scaffold adapter fits project requirements | It may receive `recommendation_status: recommended` in normal planning while `execution_status: provisional` remains visible. It is not authorized under verified-only strict execution. |
61
+ | User explicitly prefers a route | Preserve `user_preference: preferred`, add an explainable ranking signal and provide route guidance; never override hard incompatibility or approval boundaries. |
62
+ | User explicitly excludes a route | Preserve `user_preference: excluded` and do not recommend it, while evaluating other routes normally. |
63
+ | Provider canvas is incompatible but safe adaptation is declared | Recommend a concrete source canvas only when both source dimensions fit the target after the declared integer transform. |
64
+ | Provider emits a batch while per-frame isolation is required | Mark execution provisional or blocked according to policy; require independent envelopes after export and never promote it automatically. |
65
+ | Capability/availability is unknown or no safe route exists | Mark the route blocked or not recommended as appropriate, surface the reason, and suggest a manual/alternate option without fabricating availability. Strict mode returns non-zero when no execution-eligible route exists. |
66
+
67
+ The current registry includes a manual single-frame import fallback. In normal planning it remains a visible MotionLoom recommendation because it is project-compatible and explains its user-managed availability; under the default `require_verified: true` policy it remains provisional rather than execution-eligible. This is deliberate: MotionLoom gives the Agent useful choices without silently relaxing policy or forcing it to invent a workaround.
68
+
69
+ ## Recommended 256x448 route
70
+
71
+ For a pixel-art action with eight frames and required isolation, the safe provisional route is:
72
+
73
+ 1. Treat PixelLab as one MotionLoom recommendation, not a default provider. If selected or explicitly preferred, use a square animation route only as a source-generation candidate, with a declared source canvas such as `256x256` and a separate action-specific request.
74
+ 2. Keep the provider result provisional because the documented animation routes are batch-oriented and the adapter is not runtime-verified.
75
+ 3. Place each accepted source frame on a transparent `256x448` target canvas using the declared footline/pivot anchor. Do not stretch or crop.
76
+ 4. Bind source and target geometry in the export manifest and generate one independent frame envelope per output image.
77
+ 5. Run `frame-set-preflight` and `action-separation validate` before atlas packing or Dev Lab review. The adaptation report is evidence of geometry transformation, not a substitute for either contract.
78
+ 6. If any frame is ambiguous, quarantine that frame and regenerate or independently verify it. Do not move it to another action automatically.
79
+
80
+ If strict one-frame-per-provider-call isolation is non-negotiable, the planner's recommendation is to use a provider or manual workflow that declares single-frame output and target-canvas compatibility. PixelLab remains a useful provisional source option, not proof that the hard contract has been met.
81
+
82
+ ## MotionLoom Agent guidance
83
+
84
+ Every recommendation includes `agent_guidance` with `recommended_by: MotionLoom`, a summary, a route-specific sequence of steps and the MotionLoom validation route. The plan also exposes availability as `available`, `known`, `unavailable` or `unknown`; an unavailable/unknown tool may remain a recommendation, but the Agent must resolve connectivity before execution and MotionLoom must not claim it can invoke the tool.
85
+
86
+ Normal output uses the `MotionLoom Project Assessment`, `MotionLoom Recommendations` and `MotionLoom Agent Guidance` headings. JSON output includes `producer: MotionLoom`, `source`, project assessment, recommendation status, execution status, preference, availability, rationale and validation route.
87
+
88
+ ## Adapter registry policy
89
+
90
+ The registry is not a provider launcher. It is a capability and evidence ledger. A `scaffold_only` entry may describe official limits and useful routes, but it cannot satisfy a strict selection policy that requires verified adapters. An adapter can become `verified` only after real export bytes, provider receipt metadata where available, target-runtime evidence, deterministic contract results and a human review path are present.
91
+
92
+ Credentials remain outside all request, receipt, control and manifest files. For an eventual PixelLab integration, the API token should be supplied through the project's secret/connector layer, while the receipt records only non-secret task identity and output hashes.
93
+
94
+ ## References
95
+
96
+ [1]: https://api.pixellab.ai/v2/docs "PixelLab API — official API documentation"
97
+ [2]: https://www.pixellab.ai/docs/tools/animate-with-skeleton "PixelLab — Animate with skeleton"
98
+ [3]: https://www.pixellab.ai/docs/tools/animation-to-animation "PixelLab — Animation to animation"
99
+ [4]: https://www.pixellab.ai/docs/tools/text2animation "PixelLab — Create animated object/character"
100
+ [5]: https://www.pixellab.ai/docs/tools/animation "PixelLab — Animate with text (existing reference)"
101
+ [6]: https://www.pixellab.ai/docs/tools/resize "PixelLab — Resize"
@@ -0,0 +1,44 @@
1
+ # MotionLoom main branch protection recommendation
2
+
3
+ ## Current observed state
4
+
5
+ As of the repository audit, `main` is not protected and the repository exposes no active rulesets. This document records the exact recommended configuration; it does not mutate GitHub settings automatically.
6
+
7
+ ## Recommended configuration
8
+
9
+ Open **Settings → Rules → Rulesets → New branch ruleset** in `lenhonbp/MotionLoom` and create a ruleset named `protect-main-motionloom` with enforcement set to **Active** and target branch `main`.
10
+
11
+ | Setting | Recommended value |
12
+ |---|---|
13
+ | Target branches | Include `main`; do not target feature branches by default. |
14
+ | Restrict deletions | Enabled. |
15
+ | Require linear history | Enabled if the repository policy accepts squash/rebase-only integration; otherwise leave disabled and require the repository's chosen merge strategy consistently. |
16
+ | Require a pull request before merging | Enabled. Require at least 1 approving review; enable dismissal of stale approvals after new commits and require review from Code Owners when a CODEOWNERS file is adopted. |
17
+ | Block force pushes | Enabled. |
18
+ | Required status checks | Require the exact successful checks listed below, with no test-only bypass. |
19
+ | Conversation resolution | Enabled before merge. |
20
+ | Bypass actors | Keep to repository administrators/maintainers only, document emergency use, and do not use bypass as the normal merge path. |
21
+
22
+ The required status checks should include the following exposed check names:
23
+
24
+ | Required check | Why it is required |
25
+ |---|---|
26
+ | `MotionLoom Quality / quality` | Full regression, intelligence, runtime, attestation and quality gate. |
27
+ | `Security Analysis / CodeQL (javascript)` | JavaScript security analysis. |
28
+ | `Security Analysis / CodeQL (python)` | Python security analysis. |
29
+ | `Security Analysis / Dependency review` | Dependency change review. |
30
+ | `Documentation and Package Hygiene / Docs, metadata and npm package` | Docs, metadata and package-surface checks. |
31
+ | `Dev Lab Build / Run browser review harness` | Browser review harness integrity. |
32
+ | `Frame Generation Lock / Lock, compose and preflight` | Frame-lock and action-aware preflight contract. |
33
+ | `Published Consumer Frame Dogfood / Published package → 12 frames → Dev Lab` | Installed/published consumer integration proof. |
34
+ | `MotionLoom Apple / Swift packages and iOS Simulator compatibility` | Apple package and simulator compatibility. |
35
+
36
+ The exact check labels can change when workflow job names change. After creating the ruleset, open a test pull request and select the checks as GitHub exposes them for the current default branch; do not guess a check name that is not present in the branch's status context.
37
+
38
+ ## Maintenance policy
39
+
40
+ Do not require a check that is intentionally skipped for a given path unless GitHub's ruleset semantics and workflow path filters are verified to keep the branch mergeable. If a required hosted environment is unavailable, fix or replace the check rather than bypassing the protection. The repository owner should review administrator bypass access periodically and record any emergency merge in the PR.
41
+
42
+ ## Manual verification
43
+
44
+ After saving the ruleset, confirm that a direct push to `main` is rejected, a pull request without all required checks cannot merge, stale approvals are dismissed after a new commit, force-push/delete operations are blocked, and an administrator bypass is an explicit exceptional path rather than an implicit permission.
@@ -0,0 +1,26 @@
1
+ # External analyzer corpus
2
+
3
+ MotionLoom keeps external project evaluation **opt-in**. The default CI path never clones, installs, builds, tests or executes code from third-party repositories. A checkout is considered evidence only when the caller explicitly fetches it into a workspace and the evaluator records its source and commit.
4
+
5
+ ## Reproduce the corpus evaluation
6
+
7
+ From the repository root, run:
8
+
9
+ ```bash
10
+ rm -rf /tmp/motionloom-external-corpus
11
+ python3 scripts/fetch-project-corpus.py \
12
+ --workspace /tmp/motionloom-external-corpus \
13
+ --all \
14
+ --depth 1
15
+ python3 scripts/eval-projects.py \
16
+ --workspace /tmp/motionloom-external-corpus \
17
+ --output /tmp/motionloom-external-corpus/evaluation.json
18
+ ```
19
+
20
+ The fetch helper reads the allowlisted repository URLs and relative paths from `tests/evals/project-corpus.json`, records the resolved commit in `.motionloom-corpus-fetch.json`, and performs no package installation or external code execution. The evaluator runs MotionLoom's bounded analyzer only; it writes a separate report containing the available project count, expected signals, scan budgets and status.
21
+
22
+ The current manifest covers Motion One, GSAP and Rive React as external projects, in addition to the first-party repository. On 21 Aug 2026, a depth-one checkout of all three external projects produced `available_external_projects=3` and `status=pass`. This is analyzer compatibility evidence, not a guarantee of runtime correctness, design quality or product value in arbitrary host applications.
23
+
24
+ ## Evidence policy
25
+
26
+ External evidence must remain labeled with its source URL, resolved commit and fetch timestamp. Missing or unavailable checkouts must produce `insufficient_evidence`; `--allow-insufficient` may make a local report non-blocking, but it must not turn missing evidence into a pass. No external checkout should be added to the npm package or committed into this repository.
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.0 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 now supports hash-bound live playback, arbitrary project-defined action libraries, and optional state/transition review flows in addition to deterministic snapshot evidence. The protected manual release workflow verifies package/changelog/release-note alignment before publication.
7
+ MotionLoom's repository source and package manifest carry **2.6.1 release metadata**. The npm registry now resolves `motionloom@2.6.1`, and the `v2.6.1` Git tag is bound to the release-preparation main commit; future publication state must still be verified against the registry/tag rather than inferred from this document alone. 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
 
@@ -15,6 +15,7 @@ The repository is **engineering-ready for continued integration work**, not a un
15
15
  | Lottie JSON and SVG cutout rig | End-to-end contract evidence | Context binding, source binding, runtime snapshots, Dev Lab review, quality gate and PR preflight have deterministic fixtures | Visual quality for every brand, asset or device |
16
16
  | Rive, GSAP and Framer Motion | Adapter and fixture evidence | Framework-specific runtime adapters and smoke checks can render representative scenes through browser/runtime paths | Equivalent coverage to the Lottie path across arbitrary projects |
17
17
  | Project Memory | Contract and relocation evidence | Stable project identity, atomic persistence, integrity guard, freshness states and path rebinding after relocation | Automatic correctness of an Agent's inferred decision |
18
+ | Generated multi-frame assets | Published-package consumer contract evidence | An isolated consumer installs `motionloom@2.6.1`, composes a 12-frame lock, validates 12 unique isolated PNG sources, blocks a deliberately shared neighboring source, and plays the accepted 12-frame set through live Dev Lab controls | Image-model art quality, identity fidelity on arbitrary generated assets, artist authorship, licence authority, production/runtime approval or user approval |
18
19
  | Semantic intelligence | Deterministic evaluation evidence | Project graph, provenance, Motion IR, continuity, fix-plan and adversarial/deep-stress contracts; bounded analyzer reports scan budgets and truncation | Human-level design judgment, external-project product-value evidence or guaranteed first-pass acceptance |
19
20
  | Dev Lab | Interactive review infrastructure evidence | Identity-bound candidate loading, live runtime playback controls, arbitrary Action Library discovery, state/transition and review-sequence testing, deterministic snapshots, user checklist and review export | A full visual authoring editor, automatic approval or PR authorization |
20
21
 
@@ -30,4 +31,4 @@ Use the following order when sources disagree:
30
31
 
31
32
  ## Known next work
32
33
 
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, and 2.6.0 adds a substantially richer Dev Lab review surface without weakening the human approval boundary. The highest-value next evidence work is consumer-project review of real action sets and transitions, 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.
34
+ The bounded analyzer has been exercised against a labeled external corpus; see the [dated evidence note](audits/external-project-corpus-2026-08-13.md) and the reproducible [external corpus workflow](EXTERNAL-CORPUS.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 added proactive machine-readable frame-generation geometry control without weakening the human approval boundary. A published-package isolated consumer dogfood now covers a deterministic 12-frame generation/preflight/runtime/review path, including rejection of shared-source contamination; this deliberately remains synthetic contract evidence rather than a claim about image-generator visual quality. The next evidence work is user review inside a real consumer project with genuinely generated action frames and project-specific transitions, 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,25 @@
1
+ # Field test after hardening
2
+
3
+ ## Browser pass 1
4
+
5
+ Candidate `9130000e6b6bc610c8d8` loaded from `http://127.0.0.1:4190` as `LIVE RUNTIME` / `LIVE SPRITE RUNTIME`. It was bound to task `browser-review-smoke-task`, used the sprite bundle hash `d8c2cb98a5cc089637b289580d773108199865b3707a196f54ecd943c71659a7`, and exposed the two required actions `idle` and `reverse`.
6
+
7
+ Selecting `reverse` reset the runtime to `reverse-00.png`, changed the inspector to `animation=reverse`, and moved review coverage from `1/2` to `2/2`. The inspector showed `playing=false`, `frame=0`, `totalFrames=3`, `fps=6`, `loop=false`, `mode=live-runtime`, and `runtime=sprite-sequence`.
8
+
9
+ ## Browser pass 2
10
+
11
+ The live controls behaved correctly in browser: `restart` returned to frame 1, `stepFrames(1)` moved to frame 2 at 50%, setting speed `2x` and loop `true` updated the runtime, and play/pause ended at frame 3 with `playing=false`. The image source followed the declared sprite files, no console errors were observed, all four checklist checkboxes remained unchecked, and Approve remained disabled. This confirms the human review gate was not bypassed by live runtime success.
12
+
13
+ ## Browser pass 3
14
+
15
+ With live coverage already at `2/2`, Approve was initially disabled because all four review checklist items were unchecked. Clicking all four checkboxes changed `Approve` to enabled and all four boxes to `true`, confirming the gate requires explicit checklist confirmation in addition to runtime coverage. A subsequent Reset action triggered a page navigation/reload, so the browser context was reloaded rather than returning a synchronous DOM payload; this is recorded as an observed reset behavior and will be checked again after the page settles.
16
+
17
+ ## Browser pass 4
18
+
19
+ After the reset reload settled, the candidate remained bound to the same task and hash. Runtime returned to `idle`, frame 1/3, progress 0, `playing=false`, speed 1, loop true; coverage returned to `1/2`, all four checklist items were unchecked, Approve was disabled, and no console errors were observed. Reset therefore clears review progress rather than preserving an accidental approval-ready state.
20
+
21
+ ## Fresh field test after CI fix
22
+
23
+ A fresh detached worktree from commit `e146164` was prepared through `review-hook prepare --root ...`; the previously observed external-root failure no longer occurred after passing `MOTIONLOOM_PROJECT_ROOT` and `cwd` to the internal Dev Lab/report subprocesses. The resulting candidate was `9130000e6b6bc610c8d8`, bound to `browser-review-smoke-task`, with live sprite bundle hash `d8c2cb98a5cc089637b289580d773108199865b3707a196f54ecd943c71659a7`.
24
+
25
+ The fresh browser load showed `LIVE RUNTIME` / `LIVE SPRITE RUNTIME`, two required actions, and coverage `1/2`. Selecting `reverse` reset to `reverse-00.png`, changed the inspector to `animation=reverse`, and moved coverage to `2/2`; the candidate/task identity remained consistent.
@@ -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,98 @@
1
+ # MotionLoom 2.7.0
2
+
3
+ MotionLoom 2.7.0 makes provider/tool choice explicitly project-aware. Instead of treating a provider as the product or choosing one by a fixed rule, MotionLoom first reads the animation task and project constraints, then produces a ranked **MotionLoom Recommendation** plus **MotionLoom Agent Guidance**. A user's preferred tool remains visible and influences ranking, but it never overrides hard canvas, isolation, provenance or trust constraints.
4
+
5
+ This release also hardens generated multi-frame review evidence so a generator cannot manufacture an "independent" verifier claim from caller-supplied values.
6
+
7
+ ## What changed
8
+
9
+ ### MotionLoom project-aware asset planning
10
+
11
+ Use `motionloom asset-generation-plan plan` before an Agent calls an image/animation provider. The planner evaluates the declared target canvas, frame count/isolation, alpha/pixel-art policy, available project contracts, adapter capabilities and optional user preferences.
12
+
13
+ The plan separates four ideas that were previously easy to conflate:
14
+
15
+ - **recommendation status** — whether MotionLoom considers the route useful for this project/task;
16
+ - **execution status** — `verified`, `provisional` or `blocked`;
17
+ - **availability** — whether the tool is actually available in the current environment, known but user-managed, unavailable, or unknown;
18
+ - **execution eligibility** — the final guarded decision used by strict mode.
19
+
20
+ Normal planning may recommend a provisional/manual route when it is the best project fit. `--strict` still fails closed unless a route satisfies the active execution policy. Recommendation never upgrades provider evidence.
21
+
22
+ ### User preference without blind obedience
23
+
24
+ `asset-generation-request.json` can declare preferred or excluded adapter IDs. A preferred route gets additional ranking weight when it fits the project, but MotionLoom still reports incompatible geometry, missing isolation, unknown availability or evidence gaps. If a requested tool cannot satisfy a hard requirement, MotionLoom explains the mismatch and surfaces safer alternatives instead of silently switching tools or weakening the contract.
25
+
26
+ No provider is hard-coded as MotionLoom's default. PixelLab entries in the registry are examples of provider-specific capability metadata and remain `scaffold_only` until real provider/runtime evidence exists.
27
+
28
+ ### MotionLoom Agent Guidance
29
+
30
+ Human and JSON planner output now identify MotionLoom as the producer and include project assessment, rationale and the recommended Agent route. Guidance sends provider output back through MotionLoom validation instead of ending at generation:
31
+
32
+ 1. resolve provider/tool availability if needed;
33
+ 2. generate/import at the declared source geometry;
34
+ 3. apply only declared MotionLoom adaptation when needed;
35
+ 4. bind one accepted frame to the action/identity contracts;
36
+ 5. run MotionLoom frame geometry/asset consistency;
37
+ 6. run MotionLoom action separation;
38
+ 7. review the runtime candidate in MotionLoom Dev Lab;
39
+ 8. keep `approval` and `production_approved` false until human review.
40
+
41
+ The installed `agent-card.json` exposes the planner, action-separation and adaptation capabilities so compatible Agents can discover this workflow directly from the package.
42
+
43
+ ### Safe canvas adaptation
44
+
45
+ `motionloom asset-adapt pad` provides deterministic transparent padding and integer nearest-neighbour upscaling. It refuses source overflow/cropping and does not stretch content. The adaptation report remains evidence only and preserves `approval: false` and `production_approved: false`.
46
+
47
+ ### Action-scoped verification provenance
48
+
49
+ Frame/action evidence is now schema `0.2`. Generator-side envelopes are explicitly `declared`, quarantined evidence. An `independently_bound` envelope must point to a separate verifier artifact whose bytes and canonical result are hash-bound to the sequence, action, frame, image, identity lock, generator and verifier identities.
50
+
51
+ MotionLoom verifies those bindings, but does not overclaim what hashes prove: integrity/provenance claims are not proof that a named producer truly performed an independent semantic review. Human approval remains separate.
52
+
53
+ ## Verification
54
+
55
+ PR #21 and PR #22 were integrated only after hosted checks passed. Coverage included:
56
+
57
+ - MotionLoom Quality;
58
+ - Security Analysis / CodeQL and dependency review;
59
+ - Documentation and Package Hygiene;
60
+ - Dev Lab Build;
61
+ - Frame Generation Lock;
62
+ - MotionLoom Apple compatibility;
63
+ - installed-package consumer smoke;
64
+ - planner and asset-adaptation adversarial regressions;
65
+ - action-separation provenance regressions;
66
+ - runtime and quality-attestation validation;
67
+ - Intelligence evaluation;
68
+ - deep audit: 6,900/6,900 passed with 0 false positives and 0 false negatives.
69
+
70
+ The release workflow re-runs documentation/package metadata validation, Skill Doctor, the full regression suite, installed-package smoke and release traceability before npm publication.
71
+
72
+ ## Trust boundary
73
+
74
+ MotionLoom 2.7.0 recommends tools; it does not silently authorize them. Provider metadata, a high ranking, user preference, a successful adaptation, verifier hashes, CI success or a passing quality gate cannot mint artist authority, licence authority, production eligibility or user approval.
75
+
76
+ The planner does not store provider credentials or invoke authenticated provider APIs. Real provider integration should bind availability and execution evidence separately and promote an adapter to `verified` only when fresh independent evidence supports that status.
77
+
78
+ ## Updating a project
79
+
80
+ After `motionloom@2.7.0` is published:
81
+
82
+ ```bash
83
+ npm install --save-dev motionloom@2.7.0
84
+ npx --no-install motionloom repair --yes
85
+ npx --no-install motionloom status --json
86
+ ```
87
+
88
+ Then ask the Agent to work normally on the animation task. When generated/provider-backed assets are relevant, MotionLoom should understand the project first and produce its recommendation/guidance without requiring the user to preselect a provider.
89
+
90
+ To inspect the planner directly:
91
+
92
+ ```bash
93
+ npx --no-install motionloom asset-generation-plan plan \
94
+ --request examples/agent-consumer/asset-planning/pixellab-hero-256x448-request.json \
95
+ --project-root .
96
+ ```
97
+
98
+ The important behavior to evaluate during dogfood is not whether MotionLoom always selects one specific tool. Evaluate whether it correctly understands the project constraints, explains the available choices, respects an explicit user preference when safe, and routes the Agent back through MotionLoom verification and human review.
@@ -0,0 +1,32 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "generator_agent_id": "motionloom-generator-v1",
4
+ "sequence_id": "hero-walk-v1",
5
+ "action_id": "walk",
6
+ "frame_id": "walk.00",
7
+ "frame_index": 0,
8
+ "image": "assets/hero-frame-00.png",
9
+ "image_sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248",
10
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
11
+ "verifier": {
12
+ "verifier_id": "motionloom-separation-verifier-v1",
13
+ "expected_action": "walk",
14
+ "top_competitor": "run",
15
+ "margin": 0.42,
16
+ "threshold": 0.2,
17
+ "status": "pass",
18
+ "method": "independent-action-rubric-v1",
19
+ "verification_mode": "independently_bound",
20
+ "evidence": {
21
+ "artifact": "action-sequence/verifier-evidence/walk.00.json",
22
+ "artifact_sha256": "cd9adf1eafb82e1a36056934495a012b0caa87eb26e26213fff28cc25d90e8a0",
23
+ "result_sha256": "c1e08d34fc0fab0c32a6eb1ad2c8e5e4c2c659f91a0d2f8295759c6c8e5fd804",
24
+ "provenance": {
25
+ "kind": "separate_verifier_artifact",
26
+ "producer_id": "motionloom-independent-verifier-v1",
27
+ "run_id": "fixture-run-2026-08-22"
28
+ }
29
+ }
30
+ },
31
+ "approval": false
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "generator_agent_id": "motionloom-generator-v1",
4
+ "sequence_id": "hero-walk-v1",
5
+ "action_id": "walk",
6
+ "frame_id": "walk.01",
7
+ "frame_index": 1,
8
+ "image": "assets/hero-frame-01.png",
9
+ "image_sha256": "1eaf21df83ed49e490ceb7db1e1a14c58e5227bcb4f1fd79a70e8ad3ee7d38ad",
10
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
11
+ "verifier": {
12
+ "verifier_id": "motionloom-separation-verifier-v1",
13
+ "expected_action": "walk",
14
+ "top_competitor": "jump",
15
+ "margin": 0.39,
16
+ "threshold": 0.2,
17
+ "status": "pass",
18
+ "method": "independent-action-rubric-v1",
19
+ "verification_mode": "independently_bound",
20
+ "evidence": {
21
+ "artifact": "action-sequence/verifier-evidence/walk.01.json",
22
+ "artifact_sha256": "9e9ec13a79d2384cb9320ed04204e31262a640104685307ede836dd9f3a0244e",
23
+ "result_sha256": "0ad134eda50c1d6a161d0395d03f43a51a15767665bc06b203564dd327ce0904",
24
+ "provenance": {
25
+ "kind": "separate_verifier_artifact",
26
+ "producer_id": "motionloom-independent-verifier-v1",
27
+ "run_id": "fixture-run-2026-08-22"
28
+ }
29
+ }
30
+ },
31
+ "approval": false
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "generator_agent_id": "motionloom-generator-v1",
4
+ "sequence_id": "hero-walk-v1",
5
+ "action_id": "walk",
6
+ "frame_id": "walk.02",
7
+ "frame_index": 2,
8
+ "image": "assets/hero-frame-02.png",
9
+ "image_sha256": "de88659cb7a57ae9c10b6e3e84e04e54bdc07e9971d5c42160a315d41b38fbc3",
10
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
11
+ "verifier": {
12
+ "verifier_id": "motionloom-separation-verifier-v1",
13
+ "expected_action": "walk",
14
+ "top_competitor": "attack",
15
+ "margin": 0.36,
16
+ "threshold": 0.2,
17
+ "status": "pass",
18
+ "method": "independent-action-rubric-v1",
19
+ "verification_mode": "independently_bound",
20
+ "evidence": {
21
+ "artifact": "action-sequence/verifier-evidence/walk.02.json",
22
+ "artifact_sha256": "28b0c41b059d91299456877259b48304a93045334f55864b3a90a29ac72535e6",
23
+ "result_sha256": "529c083ac2959e80524234910750c015377d0d7be59b27ca5b14edf6585cd1cc",
24
+ "provenance": {
25
+ "kind": "separate_verifier_artifact",
26
+ "producer_id": "motionloom-independent-verifier-v1",
27
+ "run_id": "fixture-run-2026-08-22"
28
+ }
29
+ }
30
+ },
31
+ "approval": false
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "generator_agent_id": "motionloom-generator-v1",
4
+ "sequence_id": "hero-walk-v1",
5
+ "action_id": "walk",
6
+ "frame_id": "walk.03",
7
+ "frame_index": 3,
8
+ "image": "assets/hero-frame-03.png",
9
+ "image_sha256": "161d906dc850cd3d3ee970b97406fc36bcdf1c34222ac94171a05672bf64d957",
10
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
11
+ "verifier": {
12
+ "verifier_id": "motionloom-separation-verifier-v1",
13
+ "expected_action": "walk",
14
+ "top_competitor": "run",
15
+ "margin": 0.32999999999999996,
16
+ "threshold": 0.2,
17
+ "status": "pass",
18
+ "method": "independent-action-rubric-v1",
19
+ "verification_mode": "independently_bound",
20
+ "evidence": {
21
+ "artifact": "action-sequence/verifier-evidence/walk.03.json",
22
+ "artifact_sha256": "e1ddede6701ab41f5a5ac2d35d32d85b148e82a1cf53285877195d115166b681",
23
+ "result_sha256": "259be183f714d57cec7721127c0dfe61b552e8fbcbb189b782b662ed57ac138b",
24
+ "provenance": {
25
+ "kind": "separate_verifier_artifact",
26
+ "producer_id": "motionloom-independent-verifier-v1",
27
+ "run_id": "fixture-run-2026-08-22"
28
+ }
29
+ }
30
+ },
31
+ "approval": false
32
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "schema_version": "0.2",
3
+ "sequence_id": "hero-walk-v1",
4
+ "asset_identity": "character/hero-male",
5
+ "action_id": "walk",
6
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
7
+ "generator_agent_id": "motionloom-generator-v1",
8
+ "forbidden_action_ids": [
9
+ "run",
10
+ "jump",
11
+ "attack"
12
+ ],
13
+ "actions": [
14
+ {
15
+ "action_id": "walk",
16
+ "positive_cues": [
17
+ "alternating contact and passing phases",
18
+ "upright body and natural counter-swing"
19
+ ],
20
+ "negative_cues": [
21
+ "no airborne phase",
22
+ "no attack or hurt silhouette"
23
+ ]
24
+ },
25
+ {
26
+ "action_id": "run",
27
+ "positive_cues": [
28
+ "longer stride and stronger forward lean"
29
+ ],
30
+ "negative_cues": [
31
+ "not an upright alternating walk"
32
+ ]
33
+ },
34
+ {
35
+ "action_id": "jump",
36
+ "positive_cues": [
37
+ "airborne body and compressed takeoff/landing"
38
+ ],
39
+ "negative_cues": [
40
+ "feet do not remain on shared footline"
41
+ ]
42
+ },
43
+ {
44
+ "action_id": "attack",
45
+ "positive_cues": [
46
+ "directed weapon or strike motion"
47
+ ],
48
+ "negative_cues": [
49
+ "no locomotion cycle"
50
+ ]
51
+ }
52
+ ],
53
+ "frames": [
54
+ {
55
+ "frame_index": 0,
56
+ "frame_id": "walk.00",
57
+ "image": "assets/hero-frame-00.png",
58
+ "envelope": "action-sequence/envelopes/walk.00.json"
59
+ },
60
+ {
61
+ "frame_index": 1,
62
+ "frame_id": "walk.01",
63
+ "image": "assets/hero-frame-01.png",
64
+ "envelope": "action-sequence/envelopes/walk.01.json"
65
+ },
66
+ {
67
+ "frame_index": 2,
68
+ "frame_id": "walk.02",
69
+ "image": "assets/hero-frame-02.png",
70
+ "envelope": "action-sequence/envelopes/walk.02.json"
71
+ },
72
+ {
73
+ "frame_index": 3,
74
+ "frame_id": "walk.03",
75
+ "image": "assets/hero-frame-03.png",
76
+ "envelope": "action-sequence/envelopes/walk.03.json"
77
+ }
78
+ ],
79
+ "status": "review_required",
80
+ "approval": false
81
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "contract": "action-separation-verifier-evidence",
4
+ "sequence_id": "hero-walk-v1",
5
+ "action_id": "walk",
6
+ "frame_id": "walk.00",
7
+ "frame_index": 0,
8
+ "image_sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248",
9
+ "identity_lock_sha256": "59d6b09622b19839b8c9342fb043965ea3f515c8979d769284d413f60a5f7e2d",
10
+ "generator_agent_id": "motionloom-generator-v1",
11
+ "verifier_id": "motionloom-separation-verifier-v1",
12
+ "result": {
13
+ "expected_action": "walk",
14
+ "top_competitor": "run",
15
+ "margin": 0.42,
16
+ "threshold": 0.2,
17
+ "status": "pass",
18
+ "method": "independent-action-rubric-v1"
19
+ },
20
+ "result_sha256": "c1e08d34fc0fab0c32a6eb1ad2c8e5e4c2c659f91a0d2f8295759c6c8e5fd804",
21
+ "provenance": {
22
+ "kind": "separate_verifier_artifact",
23
+ "producer_id": "motionloom-independent-verifier-v1",
24
+ "run_id": "fixture-run-2026-08-22"
25
+ }
26
+ }