motionloom 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -1
- package/README.md +97 -11
- package/ROADMAP.md +8 -5
- package/SKILL.md +24 -5
- package/agent-card.json +34 -5
- package/agent-surfaces.json +1 -1
- package/artifact-adapter-registry.json +53 -0
- package/bin/motionloom.mjs +43 -6
- package/capability-registry.json +308 -0
- package/docs/CHECKLIST.md +16 -0
- package/docs/STATUS.md +2 -2
- package/docs/apple-distribution.md +24 -0
- package/docs/architecture/apple/cloudkit.md +18 -0
- package/docs/architecture/apple/contracts.md +9 -0
- package/docs/architecture/apple/implementation-status-2026-08-16.md +55 -0
- package/docs/architecture/apple/studio.md +35 -0
- package/docs/audits/data/deep-stress-latest.json +65 -65
- package/docs/releases/2.4.0.md +31 -0
- package/docs/releases/2.5.0.md +31 -0
- package/docs/releases/npm-publish-from-workstation.md +19 -8
- package/docs/research/agent-skill-ecosystem-notes.md +47 -0
- package/docs/research/ai-animation-tools-2026-notes.md +81 -0
- package/docs/research/ai-animation-tools-2026-report.md +168 -0
- package/docs/research/ai-pilot-ingest-notes.md +29 -0
- package/docs/research/ai-repository-benchmark-2026-08-16.md +75 -0
- package/examples/agent-consumer/ai-pilot-scout/CHATGPT-HANDOFF.md +70 -0
- package/examples/agent-consumer/ai-pilot-scout/CODEX-HANDOFF.md +80 -0
- package/examples/agent-consumer/ai-pilot-scout/README.md +39 -0
- package/examples/agent-consumer/ai-pilot-scout/chatgpt-geometry-correction-prompt.md +55 -0
- package/examples/agent-consumer/ai-pilot-scout/chatgpt-pose-generation-prompt.md +78 -0
- package/examples/agent-consumer/ai-pilot-scout/partial-handoff.json +73 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-controls.json +15 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-export.json +14 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-provenance.json +20 -0
- package/examples/agent-consumer/artifact-intake/hero-motion-receipt.json +16 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-back.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-front.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/forest-mid.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-atlas.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-00.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-01.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-02.png +0 -0
- package/examples/agent-consumer/asset-consistency/assets/hero-frame-03.png +0 -0
- package/examples/agent-consumer/asset-consistency/forest-layered-map.json +53 -0
- package/examples/agent-consumer/asset-consistency/hero-atlas-contract.json +24 -0
- package/examples/agent-consumer/asset-consistency/hero-identity.json +51 -0
- package/examples/agent-consumer/asset-consistency/hero-walk-action-set.json +27 -0
- package/examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json +63 -0
- package/examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json +13 -0
- package/examples/agent-consumer/rive-package-gate/README.md +20 -0
- package/examples/agent-consumer/runtime-candidate/hero-walk-candidate.json +18 -0
- package/examples/agent-consumer/runtime-pilot/action-set.json +19 -0
- package/examples/agent-consumer/runtime-pilot/asset-identity.json +44 -0
- package/examples/agent-consumer/runtime-pilot/candidate.json +21 -0
- package/examples/agent-consumer/runtime-pilot/controls.json +35 -0
- package/examples/agent-consumer/runtime-pilot/export.json +17 -0
- package/examples/agent-consumer/runtime-pilot/provenance.json +38 -0
- package/examples/agent-consumer/runtime-pilot/receipt.json +30 -0
- package/package.json +58 -4
- package/references/browser-review-contract.md +7 -1
- package/references/intelligence-core.md +22 -1
- package/rig-adapter-registry.json +39 -0
- package/schemas/action-set.schema.json +42 -0
- package/schemas/artifact-adapter-registry.schema.json +16 -0
- package/schemas/asset-identity.schema.json +117 -0
- package/schemas/asset-provenance.schema.json +1 -1
- package/schemas/atlas-contract.schema.json +48 -0
- package/schemas/control-track.schema.json +18 -0
- package/schemas/export-manifest.schema.json +19 -0
- package/schemas/frame-geometry.schema.json +79 -0
- package/schemas/generation-receipt.schema.json +20 -0
- package/schemas/layered-map.schema.json +75 -0
- package/schemas/rig-adapter-registry.schema.json +14 -0
- package/schemas/rig-compatibility.schema.json +53 -0
- package/schemas/rive-package-manifest.schema.json +43 -0
- package/schemas/runtime-candidate.schema.json +48 -0
- package/schemas/scene-manifest.schema.json +18 -0
- package/scripts/artifact-intake.py +408 -0
- package/scripts/asset-consistency.py +517 -0
- package/scripts/asset-provenance.py +8 -3
- package/scripts/attestation.py +8 -0
- package/scripts/build-ai-pilot.py +504 -0
- package/scripts/evidence-verifier.py +18 -9
- package/scripts/intelligence.py +85 -18
- package/scripts/isolate-alpha-background.py +147 -0
- package/scripts/quality-gate.py +88 -2
- package/scripts/report.py +85 -0
- package/scripts/resolve-task-bundle.py +84 -0
- package/scripts/review-hook.py +26 -4
- package/scripts/rig-compatibility.py +251 -0
- package/scripts/rive-package-gate.py +245 -0
- package/scripts/runtime-candidate.py +301 -0
- package/scripts/setup.mjs +54 -26
- package/src/output/runtime-pilot-framer/asset-provenance.json +38 -0
- package/src/output/runtime-pilot-framer/browser-review.json +20 -0
- package/src/output/runtime-pilot-framer/framer-motion/runtime-telemetry.json +103 -0
- package/src/output/runtime-pilot-framer/manifest.json +31 -0
- package/src/output/runtime-pilot-framer/motion-spec.json +25 -0
- package/src/output/runtime-pilot-framer/runtime-evidence.json +96 -0
- package/src/output/runtime-pilot-framer/runtime-telemetry.json +100 -0
- package/src/output/runtime-pilot-framer/scene.jsx +52 -0
- package/src/output/runtime-pilot-framer/snapshot/.render-meta.json +9 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-00.png +0 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-100.png +0 -0
- package/src/output/runtime-pilot-framer/snapshot/frame-50.png +0 -0
- package/tests/scripts/run_tests.py +151 -0
- package/tests/scripts/test_ai_pilot_builder.py +128 -0
- package/tests/scripts/test_alpha_isolation.py +60 -0
- package/tests/scripts/test_artifact_intake.py +146 -0
- package/tests/scripts/test_asset_consistency.py +199 -0
- package/tests/scripts/test_rig_compatibility.py +105 -0
- package/tests/scripts/test_rive_package_gate.py +101 -0
- package/tests/scripts/test_runtime_candidate.py +95 -0
|
@@ -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
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"asset_identity": "runtime/framer-motion-pilot",
|
|
4
|
+
"actions": [
|
|
5
|
+
{
|
|
6
|
+
"action_id": "scrubbable-trajectory",
|
|
7
|
+
"frames": ["src/output/runtime-pilot-framer/scene.jsx"],
|
|
8
|
+
"fps": 60,
|
|
9
|
+
"loop": true,
|
|
10
|
+
"events": ["checkpoint-00", "checkpoint-50", "checkpoint-100"],
|
|
11
|
+
"required_sockets": []
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"invariants": {
|
|
15
|
+
"checkpoint_percentages": [0, 50, 100],
|
|
16
|
+
"progress_domain": [0, 1],
|
|
17
|
+
"runtime_target": "framer-motion"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"asset_id": "runtime/framer-motion-pilot",
|
|
4
|
+
"asset_kind": "ui",
|
|
5
|
+
"identity": {
|
|
6
|
+
"subject_id": "framer-motion-runtime-pilot",
|
|
7
|
+
"reference_hashes": [
|
|
8
|
+
"f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b"
|
|
9
|
+
],
|
|
10
|
+
"camera": {
|
|
11
|
+
"projection": "orthographic",
|
|
12
|
+
"width": 512,
|
|
13
|
+
"height": 512,
|
|
14
|
+
"focal_length": 50
|
|
15
|
+
},
|
|
16
|
+
"coordinate_system": "screen_y_down",
|
|
17
|
+
"scale": 1,
|
|
18
|
+
"pivot": {
|
|
19
|
+
"x": 0.5,
|
|
20
|
+
"y": 0.5,
|
|
21
|
+
"space": "normalized_canvas"
|
|
22
|
+
},
|
|
23
|
+
"palette_lock": {
|
|
24
|
+
"colors": ["#2563eb", "#f59e0b", "#0f172a"],
|
|
25
|
+
"delta_e_tolerance": 0
|
|
26
|
+
},
|
|
27
|
+
"style_profile": "code-authored-runtime-pilot",
|
|
28
|
+
"lighting_profile": "not-applicable"
|
|
29
|
+
},
|
|
30
|
+
"derivation": {
|
|
31
|
+
"origin": "code_authored",
|
|
32
|
+
"source_refs": ["src/output/runtime-pilot-framer/scene.jsx"],
|
|
33
|
+
"derivation_chain": [
|
|
34
|
+
{
|
|
35
|
+
"step": 0,
|
|
36
|
+
"operation": "repository-code-authoring",
|
|
37
|
+
"input_hashes": [],
|
|
38
|
+
"output_hash": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"provenance_ref": "provenance.json",
|
|
43
|
+
"notes": "Code-authored Framer Motion pilot. Runtime evidence can establish runtime verification only; human review remains required."
|
|
44
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"candidate_id": "runtime-pilot-framer-001",
|
|
4
|
+
"asset_id": "runtime/framer-motion-pilot",
|
|
5
|
+
"created_at": "2026-08-15T00:00:00Z",
|
|
6
|
+
"artifact_intake": {
|
|
7
|
+
"registry": "artifact-adapter-registry.json",
|
|
8
|
+
"receipt": "examples/agent-consumer/runtime-pilot/receipt.json",
|
|
9
|
+
"controls": "examples/agent-consumer/runtime-pilot/controls.json",
|
|
10
|
+
"export_manifest": "examples/agent-consumer/runtime-pilot/export.json"
|
|
11
|
+
},
|
|
12
|
+
"consistency": {
|
|
13
|
+
"asset_identity": "examples/agent-consumer/runtime-pilot/asset-identity.json",
|
|
14
|
+
"action_set": "examples/agent-consumer/runtime-pilot/action-set.json"
|
|
15
|
+
},
|
|
16
|
+
"runtime": {
|
|
17
|
+
"target": "framer-motion",
|
|
18
|
+
"runtime_evidence_ref": "src/output/runtime-pilot-framer/runtime-evidence.json",
|
|
19
|
+
"review_required": true
|
|
20
|
+
}
|
|
21
|
+
}
|