motionloom 2.2.0 → 2.4.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 (114) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/README.md +123 -17
  3. package/ROADMAP.md +8 -3
  4. package/SKILL.md +34 -3
  5. package/agent-card.json +48 -5
  6. package/agent-surfaces.json +8 -1
  7. package/artifact-adapter-registry.json +53 -0
  8. package/bin/motionloom.mjs +41 -4
  9. package/docs/AGENT-INTEGRATION.md +15 -2
  10. package/docs/CHECKLIST.md +21 -0
  11. package/docs/STATUS.md +2 -2
  12. package/docs/audits/data/deep-stress-latest.json +65 -65
  13. package/docs/releases/2.3.0.md +33 -0
  14. package/docs/releases/2.4.0.md +31 -0
  15. package/docs/releases/npm-publish-from-workstation.md +19 -8
  16. package/docs/research/agent-skill-ecosystem-notes.md +47 -0
  17. package/docs/research/ai-animation-tools-2026-notes.md +81 -0
  18. package/docs/research/ai-animation-tools-2026-report.md +168 -0
  19. package/docs/research/ai-pilot-ingest-notes.md +29 -0
  20. package/examples/agent-consumer/ai-generated-pilot/hero-male.json +10 -0
  21. package/examples/agent-consumer/ai-generated-pilot-provenance.json +55 -0
  22. package/examples/agent-consumer/ai-pilot-scout/CHATGPT-HANDOFF.md +70 -0
  23. package/examples/agent-consumer/ai-pilot-scout/CODEX-HANDOFF.md +80 -0
  24. package/examples/agent-consumer/ai-pilot-scout/README.md +39 -0
  25. package/examples/agent-consumer/ai-pilot-scout/chatgpt-geometry-correction-prompt.md +55 -0
  26. package/examples/agent-consumer/ai-pilot-scout/chatgpt-pose-generation-prompt.md +78 -0
  27. package/examples/agent-consumer/ai-pilot-scout/partial-handoff.json +73 -0
  28. package/examples/agent-consumer/artifact-intake/hero-motion-controls.json +15 -0
  29. package/examples/agent-consumer/artifact-intake/hero-motion-export.json +14 -0
  30. package/examples/agent-consumer/artifact-intake/hero-motion-provenance.json +20 -0
  31. package/examples/agent-consumer/artifact-intake/hero-motion-receipt.json +16 -0
  32. package/examples/agent-consumer/asset-consistency/assets/forest-back.png +0 -0
  33. package/examples/agent-consumer/asset-consistency/assets/forest-front.png +0 -0
  34. package/examples/agent-consumer/asset-consistency/assets/forest-mid.png +0 -0
  35. package/examples/agent-consumer/asset-consistency/assets/hero-atlas.png +0 -0
  36. package/examples/agent-consumer/asset-consistency/assets/hero-frame-00.png +0 -0
  37. package/examples/agent-consumer/asset-consistency/assets/hero-frame-01.png +0 -0
  38. package/examples/agent-consumer/asset-consistency/assets/hero-frame-02.png +0 -0
  39. package/examples/agent-consumer/asset-consistency/assets/hero-frame-03.png +0 -0
  40. package/examples/agent-consumer/asset-consistency/forest-layered-map.json +53 -0
  41. package/examples/agent-consumer/asset-consistency/hero-atlas-contract.json +24 -0
  42. package/examples/agent-consumer/asset-consistency/hero-identity.json +51 -0
  43. package/examples/agent-consumer/asset-consistency/hero-walk-action-set.json +27 -0
  44. package/examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json +63 -0
  45. package/examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json +13 -0
  46. package/examples/agent-consumer/rive-package-gate/README.md +20 -0
  47. package/examples/agent-consumer/runtime-candidate/hero-walk-candidate.json +18 -0
  48. package/examples/agent-consumer/runtime-pilot/action-set.json +19 -0
  49. package/examples/agent-consumer/runtime-pilot/asset-identity.json +44 -0
  50. package/examples/agent-consumer/runtime-pilot/candidate.json +21 -0
  51. package/examples/agent-consumer/runtime-pilot/controls.json +35 -0
  52. package/examples/agent-consumer/runtime-pilot/export.json +17 -0
  53. package/examples/agent-consumer/runtime-pilot/provenance.json +38 -0
  54. package/examples/agent-consumer/runtime-pilot/receipt.json +30 -0
  55. package/package.json +65 -4
  56. package/references/agent-interoperability.md +11 -0
  57. package/references/browser-review-contract.md +7 -1
  58. package/references/intelligence-core.md +29 -2
  59. package/rig-adapter-registry.json +39 -0
  60. package/schemas/action-set.schema.json +42 -0
  61. package/schemas/agent-surfaces.schema.json +1 -1
  62. package/schemas/artifact-adapter-registry.schema.json +16 -0
  63. package/schemas/asset-identity.schema.json +117 -0
  64. package/schemas/asset-provenance.schema.json +183 -0
  65. package/schemas/atlas-contract.schema.json +48 -0
  66. package/schemas/control-track.schema.json +18 -0
  67. package/schemas/export-manifest.schema.json +19 -0
  68. package/schemas/frame-geometry.schema.json +79 -0
  69. package/schemas/generation-receipt.schema.json +20 -0
  70. package/schemas/layered-map.schema.json +75 -0
  71. package/schemas/rig-adapter-registry.schema.json +14 -0
  72. package/schemas/rig-compatibility.schema.json +53 -0
  73. package/schemas/rive-package-manifest.schema.json +43 -0
  74. package/schemas/runtime-candidate.schema.json +48 -0
  75. package/schemas/scene-manifest.schema.json +19 -0
  76. package/scripts/artifact-intake.py +408 -0
  77. package/scripts/asset-consistency.py +517 -0
  78. package/scripts/asset-provenance.py +395 -0
  79. package/scripts/build-ai-pilot.py +504 -0
  80. package/scripts/docs-audit.py +14 -2
  81. package/scripts/isolate-alpha-background.py +147 -0
  82. package/scripts/pr.py +2 -0
  83. package/scripts/quality-gate.py +127 -3
  84. package/scripts/report.py +135 -0
  85. package/scripts/resolve-task-bundle.py +84 -0
  86. package/scripts/review-hook.py +26 -4
  87. package/scripts/rig-compatibility.py +251 -0
  88. package/scripts/rive-package-gate.py +245 -0
  89. package/scripts/runtime-candidate.py +301 -0
  90. package/scripts/setup.mjs +500 -0
  91. package/scripts/skill-doctor.py +2 -1
  92. package/src/output/browser-review-smoke/asset-provenance.json +77 -0
  93. package/src/output/browser-review-smoke/manifest.json +1 -0
  94. package/src/output/browser-review-smoke/visual-truth.json +3 -3
  95. package/src/output/runtime-pilot-framer/asset-provenance.json +38 -0
  96. package/src/output/runtime-pilot-framer/browser-review.json +20 -0
  97. package/src/output/runtime-pilot-framer/framer-motion/runtime-telemetry.json +103 -0
  98. package/src/output/runtime-pilot-framer/manifest.json +31 -0
  99. package/src/output/runtime-pilot-framer/motion-spec.json +25 -0
  100. package/src/output/runtime-pilot-framer/runtime-evidence.json +96 -0
  101. package/src/output/runtime-pilot-framer/runtime-telemetry.json +100 -0
  102. package/src/output/runtime-pilot-framer/scene.jsx +52 -0
  103. package/src/output/runtime-pilot-framer/snapshot/.render-meta.json +9 -0
  104. package/src/output/runtime-pilot-framer/snapshot/frame-00.png +0 -0
  105. package/src/output/runtime-pilot-framer/snapshot/frame-100.png +0 -0
  106. package/src/output/runtime-pilot-framer/snapshot/frame-50.png +0 -0
  107. package/tests/scripts/run_tests.py +131 -0
  108. package/tests/scripts/test_ai_pilot_builder.py +128 -0
  109. package/tests/scripts/test_alpha_isolation.py +60 -0
  110. package/tests/scripts/test_artifact_intake.py +146 -0
  111. package/tests/scripts/test_asset_consistency.py +199 -0
  112. package/tests/scripts/test_rig_compatibility.py +105 -0
  113. package/tests/scripts/test_rive_package_gate.py +101 -0
  114. package/tests/scripts/test_runtime_candidate.py +95 -0
@@ -0,0 +1,39 @@
1
+ # AI Scout Pilot Ingest
2
+
3
+ This example is a **real-byte, local workspace flow** for an AI-generated four-frame scout robot pilot. The repository does not version the generated PNG bytes. Run the portable builder against four user-held, alpha-isolated PNG frames; it copies the source bytes into `.motionloom/pilots/ai-pilot-scout/`, measures the alpha geometry, and produces the JSON contracts there.
4
+
5
+ The pilot uses `authority: ai_generated` and stays **review-required**. Its receipt is explicitly a post-hoc, hash-bound ingest record because a provider-native ImageGen receipt was not exported. The result may demonstrate that all bundle links and measured geometry validate. It must never be interpreted as artist-authored authority, provider provenance completeness, runtime verification, production eligibility, or human approval.
6
+
7
+ If a provider returns a fully opaque dark canvas despite a transparency request, run `scripts/isolate-alpha-background.py` first only when the background is visibly high-contrast and edge-connected. It rejects residual opaque pixels at the canvas edge by default, because those normally indicate contamination instead of a safely isolated sprite. The tool emits an alpha-isolation report, but that report is evidence of a deterministic post-process, not proof of source alpha or approval. Review the result visually before building the bundle.
8
+
9
+ ```bash
10
+ python3 scripts/build-ai-pilot.py \
11
+ --idle /absolute/path/scout-idle-transparent.png \
12
+ --contact-right /absolute/path/scout-contact-right-transparent.png \
13
+ --passing /absolute/path/scout-passing-transparent.png \
14
+ --contact-left /absolute/path/scout-contact-left-transparent.png \
15
+ --overwrite
16
+
17
+ python3 scripts/artifact-intake.py report \
18
+ --root . \
19
+ --registry artifact-adapter-registry.json \
20
+ --controls .motionloom/pilots/ai-pilot-scout/controls.json \
21
+ --receipt .motionloom/pilots/ai-pilot-scout/receipt.json \
22
+ --export-manifest .motionloom/pilots/ai-pilot-scout/export.json \
23
+ --output .motionloom/pilots/ai-pilot-scout/artifact-intake-report.json
24
+
25
+ python3 scripts/runtime-candidate.py report \
26
+ --root . \
27
+ --input .motionloom/pilots/ai-pilot-scout/candidate.json \
28
+ --output .motionloom/pilots/ai-pilot-scout/runtime-candidate-report.json
29
+ ```
30
+
31
+ Use `--frame-url ID=URL` when the four frames are hosted for Dev Lab. The builder carries those URLs only in `devlab-pilot-evidence.json`; it does not treat URL reachability as evidence of quality, runtime behavior, review, or approval.
32
+
33
+ > The builder rejects ordinary RGB files and a fully opaque image. A visible checkerboard painted into an RGB PNG is **not** transparency. This restriction makes frame geometry and contamination checks meaningful.
34
+
35
+ When any source fails preflight, the builder exits non-zero and writes only `partial-handoff.json` beside the copied source bytes. That handoff binds the original SHA-256, any measurable alpha/canvas/padding metrics, provider identity and exact refusal reasons. It deliberately does **not** emit `controls.json`, a receipt, candidate, runtime render or Dev Lab review link. Replace the source independently; do not resample, add transparent margins or edit metadata to make rejected bytes pass.
36
+
37
+ ## Current pilot handoff
38
+
39
+ The checked-in [`partial-handoff.json`](partial-handoff.json) records the current real-byte pilot boundary: one v3 master was alpha-isolated, visually checked and retained outside this repository; the independent walk phases could not be generated before the image quota was exhausted. No intake bundle, runtime candidate, render evidence or Dev Lab candidate has been emitted from a repeated idle image. Resume only with three independently generated and reviewed action frames, then run the exact commands above.
@@ -0,0 +1,55 @@
1
+ # ChatGPT corrective prompt — Scout v3 walk frames
2
+
3
+ Upload **only** `motionloom-ai-pilot-scout-v3-idle-alpha.png` as the reference image. Generate each requested pose in a separate turn and download the original PNG, not a screenshot.
4
+
5
+ > Treat the reference as a locked production-pilot sprite sheet source. Preserve the robot exactly; change only the limb pose required by the requested walk phase.
6
+
7
+ ## Non-negotiable output contract
8
+
9
+ Copy this block into **every** generation request, then append one pose block below.
10
+
11
+ ```text
12
+ Use the attached Scout v3 idle sprite as the exact visual and geometry reference.
13
+
14
+ Create ONE complete 2D pixel-art character sprite on a 1920 × 1920 pixel canvas. The canvas background must be truly transparent (RGBA alpha 0), with no black, checkerboard, coloured, shadow, floor, glow, particles, text, border, duplicate character, crop, or prop.
15
+
16
+ Do not redesign, restyle, zoom, crop, rotate, mirror, recolor, or change the camera. Keep the cream/orange/black/cyan robot identity, head, antenna, face, shoulder pads, torso, hands, feet, palette, pixel density, outlines, and apparent scale from the reference. Draw the entire robot at the same approximate scale as the reference, vertically standing on the same baseline.
17
+
18
+ Geometry requirements: leave at least 120 px transparent padding on all four canvas edges. Keep the opaque character approximately 800 px wide by 1450 px tall, centered near x=940, with the feet baseline near y=1626. The character must not occupy more than 55% of canvas width. Use crisp hard pixel edges only; do not add anti-aliased blur.
19
+
20
+ This is an AI-generated source asset for a review-only MotionLoom pilot. It must not imply artist authorship, production approval, runtime approval, or a licence.
21
+ ```
22
+
23
+ ## Pose 1 — contact right
24
+
25
+ Append this after the contract:
26
+
27
+ ```text
28
+ Pose: walk cycle contact-right. The robot’s RIGHT foot is planted forward at the baseline; the LEFT leg trails slightly behind. Counter-swing the arms naturally. Keep both feet fully visible and preserve the locked body scale and centered composition.
29
+
30
+ Return only the single transparent-background PNG. Save it as: motionloom-ai-pilot-scout-v3-chatgpt-contact-right.png
31
+ ```
32
+
33
+ ## Pose 2 — passing
34
+
35
+ Append this after the contract:
36
+
37
+ ```text
38
+ Pose: walk cycle passing phase. One leg passes beneath the body with a compact, balanced gait; the body remains upright and the foot baseline stays near y=1626. Counter-swing the arms naturally. Keep both feet fully visible and preserve the locked body scale and centered composition.
39
+
40
+ Return only the single transparent-background PNG. Save it as: motionloom-ai-pilot-scout-v3-chatgpt-passing.png
41
+ ```
42
+
43
+ ## Pose 3 — contact left
44
+
45
+ Append this after the contract:
46
+
47
+ ```text
48
+ Pose: walk cycle contact-left. The robot’s LEFT foot is planted forward at the baseline; the RIGHT leg trails slightly behind. This must be the complementary phase to contact-right, not a mirror/redesign. Counter-swing the arms naturally. Keep both feet fully visible and preserve the locked body scale and centered composition.
49
+
50
+ Return only the single transparent-background PNG. Save it as: motionloom-ai-pilot-scout-v3-chatgpt-contact-left.png
51
+ ```
52
+
53
+ ## Before sending files back
54
+
55
+ Do not flatten the PNG or put it on a black background. Send the three original downloaded files to MotionLoom in the order above and retain the ChatGPT conversation/task context if available. MotionLoom will measure alpha, padding, identity geometry and file hashes independently; satisfying the prompt does not approve the candidate.
@@ -0,0 +1,78 @@
1
+ # ChatGPT handoff — Scout v3 walk poses
2
+
3
+ ## Mục tiêu
4
+
5
+ Tạo **ba file PNG riêng biệt** cho walk cycle của Scout v3: `contact-right`, `passing`, và `contact-left`. Đây là **source asset** cho MotionLoom, không phải ảnh minh họa. Vì vậy, mỗi output phải có duy nhất một robot, kích thước canvas cố định, padding đo được, và không có chi tiết nền hay hiệu ứng có thể làm sai phép đo alpha/geometry.
6
+
7
+ > **Trust boundary:** Mọi output từ ChatGPT là `ai_generated`. Prompt không cấp `artist_authored`, `production_eligible`, `production_approved`, hoặc runtime approval. MotionLoom sẽ đo lại bytes PNG, alpha, padding, contamination và hash trước khi ingest.
8
+
9
+ ## Chuẩn bị trong ChatGPT
10
+
11
+ Tải **một ảnh tham chiếu duy nhất**: `motionloom-ai-pilot-scout-v3-idle-alpha.png`. Hãy gửi **từng prompt một**, tải file PNG nguyên gốc của từng kết quả, và không dùng screenshot hay ảnh đã nén lại.
12
+
13
+ | Pose | Tên file khi tải về | Mục đích |
14
+ |---|---|---|
15
+ | Contact right | `motionloom-ai-pilot-scout-v3-chatgpt-contact-right.png` | Chân phải chạm đất ở phía trước. |
16
+ | Passing | `motionloom-ai-pilot-scout-v3-chatgpt-passing.png` | Hai chân đi qua nhau dưới thân. |
17
+ | Contact left | `motionloom-ai-pilot-scout-v3-chatgpt-contact-left.png` | Chân trái chạm đất ở phía trước. |
18
+
19
+ ## Prompt chung — dán kèm từng pose
20
+
21
+ ```text
22
+ Use the uploaded image only as the identity reference for one game-ready pixel-art sprite frame.
23
+
24
+ Create exactly ONE 1920 × 1920 PNG image of the same small cream-and-orange scout robot. Preserve the reference’s 3/4 front-facing camera angle, silhouette, palette, pixel density, head antenna, torso emblem, limbs, and apparent scale. The robot must be centered horizontally and fully visible.
25
+
26
+ POSE INSTRUCTION: [REPLACE THIS LINE WITH ONE POSE BLOCK BELOW]
27
+
28
+ SOURCE-ASSET CONTRACT:
29
+ - Use a genuinely transparent background if supported. Otherwise use one perfectly flat solid #00FF00 green background only.
30
+ - Keep at least 180 px completely empty padding on all four canvas edges.
31
+ - Keep the robot’s feet on an invisible common baseline; do not crop any body part.
32
+ - Produce only the robot. Do not add a floor, cast shadow, reflection, glow, scenery, props, text, watermark, label, checkerboard, frame border, gradient, texture, noise, line, disconnected pixel cluster, or any second object.
33
+ - Use crisp pixel-art edges; do not add an anti-aliased halo or motion blur.
34
+ - Return the image only, not a collage, animation sheet, UI mockup, explanation, or multiple alternatives.
35
+
36
+ This is a deterministic animation source asset, not a concept-art request.
37
+ ```
38
+
39
+ ## Ba pose block
40
+
41
+ ### 1. `contact-right`
42
+
43
+ ```text
44
+ Walk-cycle contact-right: the right foot is forward and flat on the baseline, while the left foot trails behind. Both feet are fully visible. The body leans only slightly forward in a natural walk rhythm; do not change the robot design.
45
+ ```
46
+
47
+ ### 2. `passing`
48
+
49
+ ```text
50
+ Walk-cycle passing pose: the legs pass beneath the body; one knee is slightly forward and one foot passes the planted leg. Both feet remain fully visible and the torso stays centered over the same baseline. Do not change the robot design.
51
+ ```
52
+
53
+ ### 3. `contact-left`
54
+
55
+ ```text
56
+ Walk-cycle contact-left: the left foot is forward and flat on the baseline, while the right foot trails behind. Both feet are fully visible. The body leans only slightly forward in a natural walk rhythm; do not change the robot design.
57
+ ```
58
+
59
+ ## Cách bàn giao
60
+
61
+ Sau khi tải về, đặt ba PNG ở một thư mục và cung cấp cho MotionLoom. Kèm theo một note tối thiểu như sau; nếu ChatGPT UI không hiển thị model/version, ghi `not_exposed_by_ui` thay vì suy đoán.
62
+
63
+ ```json
64
+ {
65
+ "provider": "chatgpt",
66
+ "authority": "ai_generated",
67
+ "master_reference": "motionloom-ai-pilot-scout-v3-idle-alpha.png",
68
+ "model": "not_exposed_by_ui",
69
+ "task_id": "motionloom-scout-v3-chatgpt-walk-YYYYMMDD",
70
+ "outputs": [
71
+ "motionloom-ai-pilot-scout-v3-chatgpt-contact-right.png",
72
+ "motionloom-ai-pilot-scout-v3-chatgpt-passing.png",
73
+ "motionloom-ai-pilot-scout-v3-chatgpt-contact-left.png"
74
+ ]
75
+ }
76
+ ```
77
+
78
+ MotionLoom sẽ dùng bytes thật để tính SHA-256, kiểm tra alpha/padding/contamination, đo geometry, xây provenance và chỉ sau đó chạy Artifact Intake. Một frame không đạt sẽ chặn toàn bộ cycle; không thay frame lỗi bằng idle lặp hoặc cấp approval thủ công.
@@ -0,0 +1,73 @@
1
+ {
2
+ "contract": "motionloom-ai-pilot-partial-handoff",
3
+ "version": 1,
4
+ "asset_id": "character.scout-robot.ai-pilot",
5
+ "state": "partial",
6
+ "authority": "ai_generated",
7
+ "production_approved": false,
8
+ "completed": {
9
+ "master_frame": "v3 idle source alpha-isolated and visually checked",
10
+ "source_quality": "clean padding confirmed; minor pixel-edge irregularities remain review-visible",
11
+ "guard_coverage": [
12
+ "RGB/opaque source rejection",
13
+ "edge-connected alpha isolation report",
14
+ "residual-edge rejection",
15
+ "clean-padding geometry rejection"
16
+ ]
17
+ },
18
+ "blocked": {
19
+ "reason": "Independent ChatGPT action frames were received but rejected pre-ingest because their 1254x1254 source canvas, tight padding, and subject proportions do not satisfy the reviewed 1920x1920 master geometry contract.",
20
+ "missing_frames": [
21
+ "contact-right",
22
+ "passing",
23
+ "contact-left"
24
+ ],
25
+ "not_emitted": [
26
+ "controls.json",
27
+ "generation receipt",
28
+ "export manifest",
29
+ "asset consistency contract",
30
+ "Artifact Intake report",
31
+ "runtime candidate",
32
+ "runtime render evidence",
33
+ "Dev Lab review candidate"
34
+ ]
35
+ },
36
+ "rejected_source_attempts": [
37
+ {
38
+ "provider": "openai-chatgpt",
39
+ "authority": "ai_generated",
40
+ "state": "rejected_pre_ingest",
41
+ "reason": "No resampling, transparent padding, or metadata edit may be used to bypass the measured source-geometry gate.",
42
+ "frames": [
43
+ {
44
+ "role": "contact-right",
45
+ "sha256": "d26deada40d35349411f08890ff0dfe6610997170b9fd100ea3bd65536f6623c",
46
+ "canvas": [1254, 1254],
47
+ "alpha_bbox": [97, 71, 1113, 1141],
48
+ "padding": {"left": 97, "top": 71, "right": 44, "bottom": 42}
49
+ },
50
+ {
51
+ "role": "passing",
52
+ "sha256": "164f6dad075babe30595e9f4e617940b35450f68cc709a0f4cf648d79756edb7",
53
+ "canvas": [1254, 1254],
54
+ "alpha_bbox": [41, 39, 1177, 1191],
55
+ "padding": {"left": 41, "top": 39, "right": 36, "bottom": 24}
56
+ },
57
+ {
58
+ "role": "contact-left",
59
+ "sha256": "b278e2e4a8e0cdb2ac82b0650b0ca70d1284729937d4a7c0a545a180c1331b0a",
60
+ "canvas": [1254, 1254],
61
+ "alpha_bbox": [31, 61, 1179, 1153],
62
+ "padding": {"left": 31, "top": 61, "right": 44, "bottom": 40}
63
+ }
64
+ ]
65
+ }
66
+ ],
67
+ "resume_requirements": [
68
+ "Create three independent action frames from the reviewed master; do not repeat idle as action frames.",
69
+ "Run alpha isolation with hash reports and visual checks for all four frames.",
70
+ "Run build-ai-pilot, Artifact Intake, asset-consistency and runtime-candidate without bypassing a failed gate.",
71
+ "Render the candidate and hand it to Dev Lab with review_required still true."
72
+ ]
73
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "control_id": "hero-motion-pilot-controls",
4
+ "asset_id": "character/hero-male",
5
+ "created_at": "2026-08-15T00:00:00Z",
6
+ "references": [
7
+ {"id": "hero-frame-zero", "path": "examples/agent-consumer/asset-consistency/assets/hero-frame-00.png", "sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248", "role": "identity"}
8
+ ],
9
+ "tracks": [
10
+ {"id": "hero-identity-lock", "kind": "identity", "binding": "required", "value_hash": "c24b2cb26f222d5b5febf77d8c79fca50e0dcf0d0b6961f52e58d8ee60e0d351"},
11
+ {"id": "hero-style-lock", "kind": "style", "binding": "required", "value_hash": "5a8430e6968ec460c5ed504d216e82ccdb923369b2ba5c284ed6328fae2a36cc"},
12
+ {"id": "hero-walk-poses", "kind": "pose", "binding": "required", "value_hash": "2eb4b7dcbf9ae8e41ae4178205616152fa40c2d5cc55617e6e0d32d832e0d9c9", "samples": 4}
13
+ ],
14
+ "output_profile": {"kind": "frame_sequence", "fps": 12, "expected_frame_count": 4, "loop": true}
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "manifest_id": "hero-motion-pilot-export",
4
+ "asset_id": "character/hero-male",
5
+ "created_at": "2026-08-15T00:00:00Z",
6
+ "receipt_ref": "examples/agent-consumer/artifact-intake/hero-motion-receipt.json",
7
+ "control_track_ref": "examples/agent-consumer/artifact-intake/hero-motion-controls.json",
8
+ "outputs": [
9
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-00.png", "role": "frame-00", "sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248", "bytes": 97, "target": "preview"},
10
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-01.png", "role": "frame-01", "sha256": "1eaf21df83ed49e490ceb7db1e1a14c58e5227bcb4f1fd79a70e8ad3ee7d38ad", "bytes": 97, "target": "runtime_candidate"},
11
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-02.png", "role": "frame-02", "sha256": "de88659cb7a57ae9c10b6e3e84e04e54bdc07e9971d5c42160a315d41b38fbc3", "bytes": 97, "target": "runtime_candidate"},
12
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-03.png", "role": "frame-03", "sha256": "161d906dc850cd3d3ee970b97406fc36bcdf1c34222ac94171a05672bf64d957", "bytes": 97, "target": "runtime_candidate"}
13
+ ]
14
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "provenance_id": "hero-motion-pilot-provenance",
4
+ "task_id": "artifact-intake-example",
5
+ "scene": "hero-walk-fixture",
6
+ "created_at": "2026-08-15T00:00:00Z",
7
+ "asset": {"id": "character/hero-male", "path": "examples/agent-consumer/asset-consistency/assets/hero-frame-00.png", "type": "runtime-pilot", "framework": "body-rig"},
8
+ "authority": "ai_generated",
9
+ "readiness": "runtime_ready",
10
+ "generator": {"model": "fixture-model", "task_id": "artifact-intake-example", "source": "fixture.local-artifact-intake", "generated_at": "2026-08-15T00:00:00Z"},
11
+ "license": {"spdx": "UNLICENSED", "source": "MotionLoom fixture", "attribution": "not required"},
12
+ "files": [
13
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-00.png", "role": "frame-00", "sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248"},
14
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-01.png", "role": "frame-01", "sha256": "1eaf21df83ed49e490ceb7db1e1a14c58e5227bcb4f1fd79a70e8ad3ee7d38ad"},
15
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-02.png", "role": "frame-02", "sha256": "de88659cb7a57ae9c10b6e3e84e04e54bdc07e9971d5c42160a315d41b38fbc3"},
16
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-03.png", "role": "frame-03", "sha256": "161d906dc850cd3d3ee970b97406fc36bcdf1c34222ac94171a05672bf64d957"}
17
+ ],
18
+ "provenance_chain": [{"step": "generate", "actor": "fixture:local-artifact-intake", "source": "MotionLoom regression fixture", "timestamp": "2026-08-15T00:00:00Z"}],
19
+ "runtime_evidence": {"status": "not_run", "runtime": "fixture-only", "tested_at": "2026-08-15T00:00:00Z"}
20
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "receipt_id": "hero-motion-pilot-receipt",
4
+ "created_at": "2026-08-15T00:00:00Z",
5
+ "asset": {"id": "character/hero-male", "kind": "frame_sequence", "intended_use": "runtime_candidate"},
6
+ "authority": "ai_generated",
7
+ "provider": {"adapter_id": "fixture.local-artifact-intake", "kind": "fixture", "invocation_mode": "none", "task_id": "artifact-intake-example", "model": "fixture-model", "generated_at": "2026-08-15T00:00:00Z", "cost_class": "included", "prompt_hash": "65e32d0806160325a1cb3936963bbab4e2bdf1f65ee6d544fd484b5cb844cd9f"},
8
+ "control_track_ref": "examples/agent-consumer/artifact-intake/hero-motion-controls.json",
9
+ "provenance_ref": "examples/agent-consumer/artifact-intake/hero-motion-provenance.json",
10
+ "outputs": [
11
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-00.png", "role": "frame-00", "sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248", "bytes": 97},
12
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-01.png", "role": "frame-01", "sha256": "1eaf21df83ed49e490ceb7db1e1a14c58e5227bcb4f1fd79a70e8ad3ee7d38ad", "bytes": 97},
13
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-02.png", "role": "frame-02", "sha256": "de88659cb7a57ae9c10b6e3e84e04e54bdc07e9971d5c42160a315d41b38fbc3", "bytes": 97},
14
+ {"path": "examples/agent-consumer/asset-consistency/assets/hero-frame-03.png", "role": "frame-03", "sha256": "161d906dc850cd3d3ee970b97406fc36bcdf1c34222ac94171a05672bf64d957", "bytes": 97}
15
+ ]
16
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "map_id": "forest-demo",
4
+ "coordinate_system": "world_y_up",
5
+ "world_bounds": {"x": 0, "y": 0, "width": 128, "height": 72},
6
+ "camera": {
7
+ "viewport_width": 32,
8
+ "viewport_height": 18,
9
+ "safe_bounds": {"x": 16, "y": 8, "width": 96, "height": 56},
10
+ "seam_tolerance": 0.08
11
+ },
12
+ "layers": [
13
+ {
14
+ "layer_id": "forest.back",
15
+ "role": "far",
16
+ "image": "assets/forest-back.png",
17
+ "z_index": 0,
18
+ "parallax": {"x": 0.2, "y": 0.2, "reference": "camera"},
19
+ "anchor": "top_left",
20
+ "tileable": {"x": true, "y": false},
21
+ "world_bounds": {"x": 0, "y": 0, "width": 128, "height": 72},
22
+ "camera_safe_bounds": {"x": 16, "y": 8, "width": 96, "height": 56},
23
+ "blend": "normal",
24
+ "opacity": 1
25
+ },
26
+ {
27
+ "layer_id": "forest.mid",
28
+ "role": "mid",
29
+ "image": "assets/forest-mid.png",
30
+ "z_index": 1,
31
+ "parallax": {"x": 0.5, "y": 0.5, "reference": "camera"},
32
+ "anchor": "center",
33
+ "tileable": {"x": false, "y": false},
34
+ "world_bounds": {"x": 0, "y": 0, "width": 128, "height": 72},
35
+ "camera_safe_bounds": {"x": 16, "y": 8, "width": 96, "height": 56},
36
+ "blend": "normal",
37
+ "opacity": 0.85
38
+ },
39
+ {
40
+ "layer_id": "forest.front",
41
+ "role": "foreground",
42
+ "image": "assets/forest-front.png",
43
+ "z_index": 2,
44
+ "parallax": {"x": 0.8, "y": 0.8, "reference": "camera"},
45
+ "anchor": "bottom_left",
46
+ "tileable": {"x": false, "y": false},
47
+ "world_bounds": {"x": 0, "y": 0, "width": 128, "height": 72},
48
+ "camera_safe_bounds": {"x": 16, "y": 8, "width": 96, "height": 56},
49
+ "blend": "normal",
50
+ "opacity": 1
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "image": "assets/hero-atlas.png",
4
+ "allow_rotation": false,
5
+ "padding_px": 1,
6
+ "extrude_px": 1,
7
+ "require_transparent_outside_regions": true,
8
+ "regions": [
9
+ {
10
+ "region_id": "hero.walk.00",
11
+ "frame_id": "walk.00",
12
+ "rect": {"x": 1, "y": 0, "width": 6, "height": 8},
13
+ "trim": false,
14
+ "pivot": {"x": 4, "y": 7}
15
+ },
16
+ {
17
+ "region_id": "hero.walk.01",
18
+ "frame_id": "walk.01",
19
+ "rect": {"x": 9, "y": 0, "width": 6, "height": 8},
20
+ "trim": false,
21
+ "pivot": {"x": 4, "y": 7}
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "asset_id": "character/hero-male",
4
+ "asset_kind": "character",
5
+ "identity": {
6
+ "subject_id": "hero-male",
7
+ "reference_hashes": [
8
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9
+ ],
10
+ "camera": {
11
+ "projection": "orthographic",
12
+ "width": 256,
13
+ "height": 256,
14
+ "focal_length": 50
15
+ },
16
+ "coordinate_system": "screen_y_down",
17
+ "scale": 1,
18
+ "pivot": {
19
+ "x": 0.5,
20
+ "y": 0.875,
21
+ "space": "normalized_canvas"
22
+ },
23
+ "palette_lock": {
24
+ "colors": ["#2864D7", "#96B4D2", "#281E50"],
25
+ "delta_e_tolerance": 4
26
+ },
27
+ "style_profile": "clean-orthographic-pilot",
28
+ "lighting_profile": "flat-key-light"
29
+ },
30
+ "derivation": {
31
+ "origin": "ai_generated",
32
+ "generator": {
33
+ "model": "fixture-generator",
34
+ "task_id": "asset-consistency-fixture",
35
+ "prompt_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
36
+ "seed": 20260815,
37
+ "tool_version": "fixture-1"
38
+ },
39
+ "source_refs": ["fixture://motionloom/asset-consistency/hero-male"],
40
+ "derivation_chain": [
41
+ {
42
+ "step": 0,
43
+ "operation": "deterministic-fixture-generation",
44
+ "input_hashes": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
45
+ "output_hash": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
46
+ }
47
+ ]
48
+ },
49
+ "provenance_ref": "../ai-generated-pilot-provenance.json",
50
+ "notes": "Synthetic contract fixture only; runtime-ready examples never imply production art or approval."
51
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "asset_identity": "character/hero-male",
4
+ "actions": [
5
+ {
6
+ "action_id": "walk",
7
+ "fps": 12,
8
+ "frames": [
9
+ "assets/hero-frame-00.png",
10
+ "assets/hero-frame-01.png",
11
+ "assets/hero-frame-02.png",
12
+ "assets/hero-frame-03.png"
13
+ ],
14
+ "loop": true,
15
+ "events": ["footstep.left", "footstep.right"],
16
+ "required_sockets": ["hand.r", "foot.l", "foot.r"]
17
+ }
18
+ ],
19
+ "invariants": {
20
+ "canvas_width": 8,
21
+ "canvas_height": 8,
22
+ "pivot_tolerance_px": 0.01,
23
+ "footline_tolerance_px": 0.01,
24
+ "bbox_drift_tolerance_px": 0,
25
+ "min_alpha_pixels": 1
26
+ }
27
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "asset_identity": "character/hero-male",
4
+ "canvas": {
5
+ "width": 8,
6
+ "height": 8,
7
+ "color_space": "srgb",
8
+ "alpha_mode": "straight"
9
+ },
10
+ "invariants": {
11
+ "pivot_tolerance_px": 0.01,
12
+ "footline_tolerance_px": 0.01,
13
+ "bbox_drift_tolerance_px": 0,
14
+ "min_alpha_pixels": 1,
15
+ "allow_external_opaque_pixels": false
16
+ },
17
+ "frames": [
18
+ {
19
+ "frame_id": "walk.00",
20
+ "image": "assets/hero-frame-00.png",
21
+ "rect": {"x": 0, "y": 0, "width": 8, "height": 8},
22
+ "alpha_bbox": {"x": 2, "y": 1, "width": 4, "height": 5},
23
+ "pivot": {"x": 4, "y": 7, "space": "pixels"},
24
+ "footline_px": 6,
25
+ "safe_rect": {"x": 1, "y": 0, "width": 6, "height": 7},
26
+ "bleed_margin_px": 1,
27
+ "sha256": "75ce90653a01a23bcfab1aef83647d6364d3edbf6e4a44b84c635338c12b9248"
28
+ },
29
+ {
30
+ "frame_id": "walk.01",
31
+ "image": "assets/hero-frame-01.png",
32
+ "rect": {"x": 0, "y": 0, "width": 8, "height": 8},
33
+ "alpha_bbox": {"x": 2, "y": 1, "width": 4, "height": 5},
34
+ "pivot": {"x": 4, "y": 7, "space": "pixels"},
35
+ "footline_px": 6,
36
+ "safe_rect": {"x": 1, "y": 0, "width": 6, "height": 7},
37
+ "bleed_margin_px": 1,
38
+ "sha256": "1eaf21df83ed49e490ceb7db1e1a14c58e5227bcb4f1fd79a70e8ad3ee7d38ad"
39
+ },
40
+ {
41
+ "frame_id": "walk.02",
42
+ "image": "assets/hero-frame-02.png",
43
+ "rect": {"x": 0, "y": 0, "width": 8, "height": 8},
44
+ "alpha_bbox": {"x": 2, "y": 1, "width": 4, "height": 5},
45
+ "pivot": {"x": 4, "y": 7, "space": "pixels"},
46
+ "footline_px": 6,
47
+ "safe_rect": {"x": 1, "y": 0, "width": 6, "height": 7},
48
+ "bleed_margin_px": 1,
49
+ "sha256": "de88659cb7a57ae9c10b6e3e84e04e54bdc07e9971d5c42160a315d41b38fbc3"
50
+ },
51
+ {
52
+ "frame_id": "walk.03",
53
+ "image": "assets/hero-frame-03.png",
54
+ "rect": {"x": 0, "y": 0, "width": 8, "height": 8},
55
+ "alpha_bbox": {"x": 2, "y": 1, "width": 4, "height": 5},
56
+ "pivot": {"x": 4, "y": 7, "space": "pixels"},
57
+ "footline_px": 6,
58
+ "safe_rect": {"x": 1, "y": 0, "width": 6, "height": 7},
59
+ "bleed_margin_px": 1,
60
+ "sha256": "161d906dc850cd3d3ee970b97406fc36bcdf1c34222ac94171a05672bf64d957"
61
+ }
62
+ ]
63
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "rig_id": "hero-walk-fixture-rig",
4
+ "asset_id": "character/hero-male",
5
+ "authority": "ai_generated",
6
+ "source": {"kind": "fixture_contract", "path": "examples/agent-consumer/artifact-intake/hero-motion-controls.json", "sha256": "12248cf9644e1ed65dd75d4a513345b7a37fe1f5029386de38f8cc09a15bdf5b"},
7
+ "candidate": {"path": "examples/agent-consumer/runtime-candidate/hero-walk-candidate.json", "sha256": "c9abbfc77a6a4cc61e1554dae465110cd4eaf6652c74d85279c8c1ab970eb044"},
8
+ "bones": [{"id": "root"}, {"id": "torso", "parent": "root"}, {"id": "hand.r", "parent": "torso"}, {"id": "foot.l", "parent": "root"}, {"id": "foot.r", "parent": "root"}],
9
+ "sockets": [{"id": "hand.r", "bone": "hand.r"}, {"id": "foot.l", "bone": "foot.l"}, {"id": "foot.r", "bone": "foot.r"}],
10
+ "actions": [{"id": "walk", "events": ["footstep.left", "footstep.right"]}],
11
+ "requirements": {"sockets": ["hand.r", "foot.l", "foot.r"], "actions": ["walk"], "events": ["footstep.left", "footstep.right"]},
12
+ "runtime": {"adapter_id": "motionloom.sprite-frame-sequence", "target": "sprite", "review_required": true}
13
+ }
@@ -0,0 +1,20 @@
1
+ # Rive package gate — real package handoff
2
+
3
+ This directory intentionally contains **no fake production `.riv` package**. Put a concrete package here only after it exists, then create a manifest that binds its bytes, provenance and runtime proof.
4
+
5
+ ```text
6
+ hero.riv
7
+ hero-provenance.json
8
+ hero-runtime-evidence.json
9
+ hero-rive-package.json
10
+ ```
11
+
12
+ The manifest must use `runtime.adapter_id: "motionloom.rive-runtime"`, list declared state-machine/input/event controls, and preserve `review_required: true`. In strict mode, runtime evidence must bind `source_sha256` to the exact `hero.riv` bytes and report a passing ready Rive framework capture.
13
+
14
+ ```bash
15
+ npx --yes motionloom rive-gate validate \
16
+ --input examples/agent-consumer/rive-package-gate/hero-rive-package.json \
17
+ --root . --strict --json
18
+ ```
19
+
20
+ > A passing gate means only that the package is ready for runtime testing and human review. It never creates artist authority, production eligibility, production approval, a Git push, or a pull request.
@@ -0,0 +1,18 @@
1
+ {
2
+ "schema_version": "0.1",
3
+ "candidate_id": "hero-walk-fixture-candidate",
4
+ "asset_id": "character/hero-male",
5
+ "created_at": "2026-08-15T00:00:00Z",
6
+ "artifact_intake": {
7
+ "registry": "artifact-adapter-registry.json",
8
+ "receipt": "examples/agent-consumer/artifact-intake/hero-motion-receipt.json",
9
+ "controls": "examples/agent-consumer/artifact-intake/hero-motion-controls.json",
10
+ "export_manifest": "examples/agent-consumer/artifact-intake/hero-motion-export.json"
11
+ },
12
+ "consistency": {
13
+ "asset_identity": "examples/agent-consumer/asset-consistency/hero-identity.json",
14
+ "action_set": "examples/agent-consumer/asset-consistency/hero-walk-action-set.json",
15
+ "frame_geometry": "examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json"
16
+ },
17
+ "runtime": {"target": "sprite", "review_required": true}
18
+ }