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,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"control_id": "runtime-pilot-framer-controls",
|
|
4
|
+
"asset_id": "runtime/framer-motion-pilot",
|
|
5
|
+
"created_at": "2026-08-15T00:00:00Z",
|
|
6
|
+
"references": [
|
|
7
|
+
{
|
|
8
|
+
"id": "framer-runtime-source",
|
|
9
|
+
"path": "src/output/runtime-pilot-framer/scene.jsx",
|
|
10
|
+
"sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
|
|
11
|
+
"role": "motion"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"tracks": [
|
|
15
|
+
{
|
|
16
|
+
"id": "source-binding",
|
|
17
|
+
"kind": "source",
|
|
18
|
+
"binding": "required",
|
|
19
|
+
"value_hash": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "scrub-progress",
|
|
23
|
+
"kind": "motion",
|
|
24
|
+
"binding": "required",
|
|
25
|
+
"value_hash": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
|
|
26
|
+
"samples": 3
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"output_profile": {
|
|
30
|
+
"kind": "runtime_scene",
|
|
31
|
+
"fps": 60,
|
|
32
|
+
"expected_frame_count": 3,
|
|
33
|
+
"loop": true
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"manifest_id": "runtime-pilot-framer-export",
|
|
4
|
+
"asset_id": "runtime/framer-motion-pilot",
|
|
5
|
+
"created_at": "2026-08-15T00:00:00Z",
|
|
6
|
+
"receipt_ref": "examples/agent-consumer/runtime-pilot/receipt.json",
|
|
7
|
+
"control_track_ref": "examples/agent-consumer/runtime-pilot/controls.json",
|
|
8
|
+
"outputs": [
|
|
9
|
+
{
|
|
10
|
+
"path": "src/output/runtime-pilot-framer/scene.jsx",
|
|
11
|
+
"role": "runtime-source",
|
|
12
|
+
"sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
|
|
13
|
+
"bytes": 1769,
|
|
14
|
+
"target": "runtime_candidate"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"provenance_id": "runtime-pilot-framer-provenance",
|
|
4
|
+
"task_id": "runtime-pilot-001",
|
|
5
|
+
"scene": "runtime-pilot-framer",
|
|
6
|
+
"created_at": "2026-08-15T00:00:00Z",
|
|
7
|
+
"asset": {
|
|
8
|
+
"id": "runtime/framer-motion-pilot",
|
|
9
|
+
"path": "src/output/runtime-pilot-framer/scene.jsx",
|
|
10
|
+
"type": "runtime_scene",
|
|
11
|
+
"framework": "framer-motion",
|
|
12
|
+
"version": "13.1.0"
|
|
13
|
+
},
|
|
14
|
+
"authority": "code_authored",
|
|
15
|
+
"readiness": "review_required",
|
|
16
|
+
"license": {
|
|
17
|
+
"spdx": "MIT",
|
|
18
|
+
"source": "MotionLoom repository source",
|
|
19
|
+
"attribution": "MotionLoom contributors"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
{
|
|
23
|
+
"path": "src/output/runtime-pilot-framer/scene.jsx",
|
|
24
|
+
"role": "runtime-source",
|
|
25
|
+
"sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
|
|
26
|
+
"bytes": 1769
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"provenance_chain": [
|
|
30
|
+
{
|
|
31
|
+
"step": "code-authoring",
|
|
32
|
+
"actor": "MotionLoom runtime-pilot author",
|
|
33
|
+
"source": "src/output/runtime-pilot-framer/scene.jsx",
|
|
34
|
+
"timestamp": "2026-08-15T00:00:00Z",
|
|
35
|
+
"sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"receipt_id": "runtime-pilot-framer-receipt",
|
|
4
|
+
"created_at": "2026-08-15T00:00:00Z",
|
|
5
|
+
"asset": {
|
|
6
|
+
"id": "runtime/framer-motion-pilot",
|
|
7
|
+
"kind": "runtime_scene",
|
|
8
|
+
"intended_use": "runtime_candidate"
|
|
9
|
+
},
|
|
10
|
+
"authority": "code_authored",
|
|
11
|
+
"provider": {
|
|
12
|
+
"adapter_id": "fixture.local-artifact-intake",
|
|
13
|
+
"kind": "fixture",
|
|
14
|
+
"invocation_mode": "none",
|
|
15
|
+
"task_id": "runtime-pilot-001",
|
|
16
|
+
"model": "code-authored-repository-source",
|
|
17
|
+
"generated_at": "2026-08-15T00:00:00Z",
|
|
18
|
+
"cost_class": "included"
|
|
19
|
+
},
|
|
20
|
+
"control_track_ref": "examples/agent-consumer/runtime-pilot/controls.json",
|
|
21
|
+
"provenance_ref": "examples/agent-consumer/runtime-pilot/provenance.json",
|
|
22
|
+
"outputs": [
|
|
23
|
+
{
|
|
24
|
+
"path": "src/output/runtime-pilot-framer/scene.jsx",
|
|
25
|
+
"role": "runtime-source",
|
|
26
|
+
"sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
|
|
27
|
+
"bytes": 1769
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "motionloom",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "pnpm@11.20.0",
|
|
6
6
|
"description": "MotionLoom: project-aware animation Skill with Agent interoperability, graph, provenance, Motion IR, runtime telemetry, Visual Truth, Remediation Learning, DSSE-compatible signed attestation, external evidence verification and Dev Lab review.",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"SKILL.md",
|
|
20
20
|
"LICENSE",
|
|
21
21
|
"agent-card.json",
|
|
22
|
+
"capability-registry.json",
|
|
22
23
|
"bin",
|
|
23
24
|
"scripts",
|
|
24
25
|
"src",
|
|
@@ -40,7 +41,40 @@
|
|
|
40
41
|
".claude",
|
|
41
42
|
".codex",
|
|
42
43
|
"AGENTS.md",
|
|
43
|
-
"agent-surfaces.json"
|
|
44
|
+
"agent-surfaces.json",
|
|
45
|
+
"scripts/asset-consistency.py",
|
|
46
|
+
"schemas/asset-identity.schema.json",
|
|
47
|
+
"schemas/action-set.schema.json",
|
|
48
|
+
"schemas/frame-geometry.schema.json",
|
|
49
|
+
"schemas/atlas-contract.schema.json",
|
|
50
|
+
"schemas/layered-map.schema.json",
|
|
51
|
+
"tests/scripts/test_asset_consistency.py",
|
|
52
|
+
"scripts/artifact-intake.py",
|
|
53
|
+
"schemas/generation-receipt.schema.json",
|
|
54
|
+
"schemas/control-track.schema.json",
|
|
55
|
+
"schemas/export-manifest.schema.json",
|
|
56
|
+
"schemas/artifact-adapter-registry.schema.json",
|
|
57
|
+
"artifact-adapter-registry.json",
|
|
58
|
+
"examples/agent-consumer/artifact-intake",
|
|
59
|
+
"tests/scripts/test_artifact_intake.py",
|
|
60
|
+
"scripts/runtime-candidate.py",
|
|
61
|
+
"schemas/runtime-candidate.schema.json",
|
|
62
|
+
"examples/agent-consumer/runtime-candidate",
|
|
63
|
+
"tests/scripts/test_runtime_candidate.py",
|
|
64
|
+
"scripts/rig-compatibility.py",
|
|
65
|
+
"schemas/rig-compatibility.schema.json",
|
|
66
|
+
"schemas/rig-adapter-registry.schema.json",
|
|
67
|
+
"rig-adapter-registry.json",
|
|
68
|
+
"examples/agent-consumer/rig-compatibility",
|
|
69
|
+
"tests/scripts/test_rig_compatibility.py",
|
|
70
|
+
"scripts/rive-package-gate.py",
|
|
71
|
+
"schemas/rive-package-manifest.schema.json",
|
|
72
|
+
"examples/agent-consumer/rive-package-gate",
|
|
73
|
+
"tests/scripts/test_rive_package_gate.py"
|
|
74
|
+
,"scripts/build-ai-pilot.py"
|
|
75
|
+
,"scripts/isolate-alpha-background.py"
|
|
76
|
+
,"tests/scripts/test_ai_pilot_builder.py"
|
|
77
|
+
,"tests/scripts/test_alpha_isolation.py"
|
|
44
78
|
],
|
|
45
79
|
"keywords": [
|
|
46
80
|
"animation",
|
|
@@ -61,7 +95,17 @@
|
|
|
61
95
|
"dev-lab",
|
|
62
96
|
"visual-truth",
|
|
63
97
|
"remediation-learning",
|
|
64
|
-
"agent-interoperability"
|
|
98
|
+
"agent-interoperability",
|
|
99
|
+
"asset-consistency",
|
|
100
|
+
"sprite-atlas",
|
|
101
|
+
"layered-map",
|
|
102
|
+
"artifact-intake",
|
|
103
|
+
"generation-receipt",
|
|
104
|
+
"runtime-candidate",
|
|
105
|
+
"rig-compatibility",
|
|
106
|
+
"rive-package-gate",
|
|
107
|
+
"provider-neutral",
|
|
108
|
+
"agent-skills"
|
|
65
109
|
],
|
|
66
110
|
"repository": {
|
|
67
111
|
"type": "git",
|
|
@@ -83,6 +127,7 @@
|
|
|
83
127
|
"test": "node bin/motionloom.mjs test",
|
|
84
128
|
"validate": "npm run quality:attestation",
|
|
85
129
|
"doctor": "node bin/motionloom.mjs doctor --json",
|
|
130
|
+
"init": "node bin/motionloom.mjs init",
|
|
86
131
|
"setup": "node bin/motionloom.mjs setup",
|
|
87
132
|
"setup:dry": "node bin/motionloom.mjs setup --dry-run",
|
|
88
133
|
"status": "node bin/motionloom.mjs status",
|
|
@@ -98,6 +143,7 @@
|
|
|
98
143
|
"intelligence": "node bin/motionloom.mjs intelligence",
|
|
99
144
|
"intelligence:registry": "node bin/motionloom.mjs intelligence capabilities build --output capability-registry.json",
|
|
100
145
|
"intelligence:registry:check": "node bin/motionloom.mjs intelligence capabilities validate --path capability-registry.json",
|
|
146
|
+
"intelligence:card": "node bin/motionloom.mjs capability card --format json",
|
|
101
147
|
"intelligence:p1": "node bin/motionloom.mjs intelligence",
|
|
102
148
|
"quality:p1": "node bin/motionloom.mjs quality-gate --require-intelligence --require-p1 --require-benchmark",
|
|
103
149
|
"eval:intelligence": "node bin/motionloom.mjs eval-intelligence",
|
|
@@ -125,7 +171,15 @@
|
|
|
125
171
|
"discovery:show": "node bin/motionloom.mjs discovery show --root . --json",
|
|
126
172
|
"install:matrix": "node bin/motionloom.mjs discovery install-matrix --root . --json",
|
|
127
173
|
"asset-provenance:validate": "node bin/motionloom.mjs asset-provenance validate --input examples/agent-consumer/ai-generated-pilot-provenance.json --json",
|
|
128
|
-
"asset-provenance:check": "node bin/motionloom.mjs asset-provenance check --input examples/agent-consumer/ai-generated-pilot-provenance.json --root examples/agent-consumer --mode runtime --json"
|
|
174
|
+
"asset-provenance:check": "node bin/motionloom.mjs asset-provenance check --input examples/agent-consumer/ai-generated-pilot-provenance.json --root examples/agent-consumer --mode runtime --json",
|
|
175
|
+
"asset:consistency": "node bin/motionloom.mjs asset-consistency validate --kind frame-geometry --input examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json --root examples/agent-consumer/asset-consistency --json",
|
|
176
|
+
"asset:audit": "node bin/motionloom.mjs asset-consistency report --kind frame-geometry --input examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json --root examples/agent-consumer/asset-consistency --json",
|
|
177
|
+
"artifact:intake": "node bin/motionloom.mjs artifact-intake intake --root . --registry artifact-adapter-registry.json --receipt examples/agent-consumer/artifact-intake/hero-motion-receipt.json --controls examples/agent-consumer/artifact-intake/hero-motion-controls.json --export-manifest examples/agent-consumer/artifact-intake/hero-motion-export.json --json",
|
|
178
|
+
"runtime:candidate": "node bin/motionloom.mjs runtime-candidate validate --root . --input examples/agent-consumer/runtime-candidate/hero-walk-candidate.json --json",
|
|
179
|
+
"rig:compatibility": "node bin/motionloom.mjs rig-compatibility validate --root . --registry rig-adapter-registry.json --input examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json --json",
|
|
180
|
+
"rive:gate": "node bin/motionloom.mjs rive-package-gate --help"
|
|
181
|
+
,"pilot:build": "node bin/motionloom.mjs pilot-build --help"
|
|
182
|
+
,"alpha:isolate": "node bin/motionloom.mjs alpha-isolate --help"
|
|
129
183
|
},
|
|
130
184
|
"dependencies": {
|
|
131
185
|
"@lottiefiles/dotlottie-web": "^0.79.0",
|
|
@@ -13,9 +13,15 @@ Prepare a candidate with:
|
|
|
13
13
|
```bash
|
|
14
14
|
python3 scripts/review-hook.py prepare \
|
|
15
15
|
--task-dir artifacts/<task-id> \
|
|
16
|
-
--lab-url
|
|
16
|
+
--lab-url https://animdevlab-hcxnxr9c.manus.space/lab
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
`--lab-url` là **browser review route thực tế**. Dev Lab React dùng
|
|
20
|
+
`https://…/lab`; Dev Lab static cục bộ dùng `http://127.0.0.1:3300/`. Command
|
|
21
|
+
tự gắn `scene`, `task_id`, `candidate_id`, `artifact_base` và `task_base` vào
|
|
22
|
+
URL cùng origin; Dev Lab từ chối URL thiếu field, foreign origin hoặc path sai
|
|
23
|
+
trước khi tải artifact.
|
|
24
|
+
|
|
19
25
|
The command writes `browser-review.json` into the task bundle and scene output, records a deterministic `candidate_id`, binds the candidate to the context and animation source SHA-256, and emits JSON containing the exact URL and the next browser Agent action.
|
|
20
26
|
|
|
21
27
|
The browser-capable Agent must open the emitted URL, inspect frames 0/50/100, scrub the timeline, check the quality checklist, record notes, and ask the user for approval. The page exposes `window.__lab.getReview()` so the Agent can capture the review payload without relying on a downloaded file. Persist the captured payload with:
|
|
@@ -9,6 +9,10 @@ Use this reference when an Agent needs to understand or extend MotionLoom's task
|
|
|
9
9
|
| `project-graph.json` | `python3 scripts/intelligence.py graph build --task-dir <task>` | Links project, intent, scene, context, artifacts and review with task identity and hashes. |
|
|
10
10
|
| `provenance.json` | `python3 scripts/intelligence.py provenance build --task-dir <task>` | Records step actor, builder, materials, products, policy, result and parent chain hash. |
|
|
11
11
|
| `asset-provenance.json` | `motionloom asset-provenance check --input <path> --root <scene-dir> --mode runtime|production` | Classifies asset origin/authority and effective readiness, binds file hashes and license/source metadata, and fails closed before production eligibility. It never grants `production_approved`. |
|
|
12
|
+
| `asset-consistency-report` | `motionloom asset-consistency validate|analyze|report --kind <kind> --input <path> --root <asset-root> --json` | Measures declared identity, action timing, frame geometry, atlas ownership or layered-map bounds against real artifacts. It reports deterministic errors/warnings and never grants provenance authority or approval. |
|
|
13
|
+
| `generation-receipt.json`, `control-track.json`, `export-manifest.json` | `motionloom artifact-intake intake --root <root> --registry <registry> --receipt <path> --controls <path> --export-manifest <path> --json` | Hash-binds an internal-skill/provider generation record, declared controls and emitted output to a provider-neutral adapter descriptor. It neither invokes a provider nor proves artist authority, runtime readiness or approval. |
|
|
14
|
+
| `runtime-candidate.json` | `motionloom runtime-candidate validate --root <root> --input <path> --json` | Requires the intake bundle and referenced identity/action/geometry contracts to agree before allowing a `runtime_test_ready`, review-required candidate. |
|
|
15
|
+
| `rig-compatibility.json` | `motionloom rig-compatibility validate --root <root> --registry <registry> --input <path> --json` | Checks adapter target/evidence, skeleton, sockets, action/event coverage and candidate binding. A pass is compatibility evidence, not a production-rig or approval claim. |
|
|
12
16
|
| `capability-registry.json` | `python3 scripts/intelligence.py capabilities build --output <path>` | Describes verified/scaffold-only adapters, evidence freshness, compatibility, fallback and side effects. |
|
|
13
17
|
| `motion-ir.json` | `python3 scripts/intelligence.py motion-ir build --task-dir <task>` | Binds framework-neutral tracks and accessibility policy to task, scene, context and source. |
|
|
14
18
|
| `replay-bundle.json` | `python3 scripts/intelligence.py replay capture --root <root> --task-dir <task>` | Captures clean-root artifact hashes and environment metadata; verification fails on mutation or omission. |
|
|
@@ -29,6 +33,10 @@ Use this reference when an Agent needs to understand or extend MotionLoom's task
|
|
|
29
33
|
|
|
30
34
|
The Agent must build the graph, Motion IR, step-level provenance, asset provenance, replay bundle, P1 feedback reports and semantic-lint benchmark after render and before the strict quality gate. For a strict observability run it must also capture runtime telemetry and run the external verifier before `--require-telemetry`. For a production trust run it must derive/sign `attestation.json`, copy or resolve a managed `trust-policy.json`, run the independent attestation verifier and use `--require-attestation` plus `--require-asset-provenance`. It must run the report completeness contract for changed scenes; that contract selects one deterministic passing task bundle and fails on ambiguous ties. It may use a verified capability only when the registry evidence is fresh, its hash matches the referenced file and the target environment is compatible. `scaffold_only` is a planning option, never a production acceptance result.
|
|
31
35
|
|
|
36
|
+
When the task includes multi-frame, atlas or layered-map material, the Agent must also build the applicable consistency contract and preserve its JSON result in the task bundle. The Agent should use `--strict` for a production-bound check, but must keep warnings and measurements visible in the report. A consistency pass is evidence that declared artifact boundaries agree; it is not a claim about aesthetics, provenance, artist authorship or user consent.
|
|
37
|
+
|
|
38
|
+
When the task begins with an internal skill such as ImageGen or an external generation provider, the Agent must additionally preserve a receipt/control/export intake bundle. The registry only describes audited adapter evidence; it does not make a network call and it cannot elevate a provider's claim. Build the runtime candidate only after Intake and the referenced consistency contracts pass, then validate rig compatibility for skeleton-based output. Preserve all three result files in the task bundle and Dev Lab handoff; any `scaffold`, `static-validated`, `blocked` or `review_required` result must remain visible through review.
|
|
39
|
+
|
|
32
40
|
The graph and provenance are evidence indexes, not approval tokens. A valid graph cannot bypass source binding, runtime assertions, browser review, reviewer consent or the `OPEN_PR=0` default. A confidence or risk value can prioritize investigation but cannot replace a deterministic rule or human decision.
|
|
33
41
|
|
|
34
42
|
All task-bound paths are resolved under their declared root and symlink traversal is rejected. Replay additionally binds `task_dir`, `task_id`, scene and every recorded file to the same task bundle. Browser-review and Dev Lab handoffs must use same-origin artifact/task bases and must agree on task, scene and candidate identity; expiry or mismatch is a review failure, not a warning to ignore.
|
|
@@ -73,11 +81,21 @@ python3 scripts/quality-gate.py \
|
|
|
73
81
|
--scene <scene> \
|
|
74
82
|
--context <project-context.json> \
|
|
75
83
|
--task-dir artifacts/<task-id> \
|
|
76
|
-
--require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation --require-asset-provenance
|
|
84
|
+
--require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation --require-asset-provenance --require-asset-consistency
|
|
85
|
+
motionloom asset-consistency validate \
|
|
86
|
+
--kind frame-geometry \
|
|
87
|
+
--input src/output/<scene>/hero-walk-frame-geometry.json \
|
|
88
|
+
--root src/output/<scene> --strict --json
|
|
77
89
|
motionloom asset-provenance check \
|
|
78
90
|
--input src/output/<scene>/asset-provenance.json \
|
|
79
91
|
--root src/output/<scene> --mode production \
|
|
80
92
|
--manifest src/output/<scene>/manifest.json --json
|
|
93
|
+
motionloom artifact-intake intake --root . --registry artifact-adapter-registry.json \
|
|
94
|
+
--receipt <generation-receipt.json> --controls <control-track.json> \
|
|
95
|
+
--export-manifest <export-manifest.json> --json
|
|
96
|
+
motionloom runtime-candidate validate --root . --input <runtime-candidate.json> --json
|
|
97
|
+
motionloom rig-compatibility validate --root . --registry rig-adapter-registry.json \
|
|
98
|
+
--input <rig-compatibility.json> --json
|
|
81
99
|
python3 scripts/remediation-learning.py validate --history artifacts/remediation-history.jsonl --json
|
|
82
100
|
python3 scripts/remediation-learning.py summary --history artifacts/remediation-history.jsonl --output artifacts/remediation-summary.json --json
|
|
83
101
|
python3 scripts/eval-intelligence.py
|
|
@@ -104,5 +122,8 @@ The replay policy excludes generated reports and manifests because `report.py co
|
|
|
104
122
|
| `runtime telemetry verification failed` | Scrub-point evidence is stale, tampered, missing, cross-task, path-escaped or bound to different source/manifest/Motion IR bytes | Re-run the real runtime capture from the canonical scene/task bundle, then verify again; never treat the verifier as approval. |
|
|
105
123
|
| `attestation verification failed` | Payload hash, DSSE signature, signer validity/revocation, policy lookup, path binding or expected task/scene binding failed | Regenerate the statement from current artifacts, re-run the external verifier against a managed policy and investigate signer lifecycle; never flip `approval` or bypass user review. |
|
|
106
124
|
| `asset provenance is blocked` or `production_eligible: false` | Origin is unknown/AI-generated without the required review, a file hash/license/runtime/full-gate record is missing, or an Agent self-asserted artist authority/approval | Keep the candidate runtime-only, fix the provenance record or obtain the required human review; never rewrite the authority tier or set `production_approved` automatically. |
|
|
125
|
+
| `asset consistency is blocked` | Declared frame, atlas or map geometry disagrees with the referenced bytes, or a required image/contract is missing | Inspect the measured path/code, regenerate only the affected asset/contract, rerun the deterministic check and return to Dev Lab review; never bypass the finding with provenance or attestation. |
|
|
126
|
+
| `artifact intake is blocked` | Receipt, controls, export, provenance, adapter evidence or output hash is missing, escaped, unknown or disagrees with the declared bundle | Recreate the intake bundle from the actual generator/export output, preserve the correct provenance tier and rerun the check; never set an adapter to verified or grant approval by hand. |
|
|
127
|
+
| `runtime candidate is blocked` or rig compatibility fails | Intake, identity/action/geometry refs, runtime evidence, adapter target, skeleton, socket or event coverage is missing or incompatible | Repair/re-export only the affected asset or adapter binding, regenerate runtime evidence and return to Dev Lab review; do not substitute a placeholder rig or override the result. |
|
|
107
128
|
|
|
108
129
|
The public eval corpus is `tests/evals/intelligence-cases.json`. It covers positive verified selection plus scaffold-only, stale evidence, tampering, graph corruption, replay tamper and foreign-task candidate failures. P1 extends the acceptance surface with semantic warning preservation, generic-intent detection, multi-scene context drift, selective rerun binding, performance budget/frame-rate warnings, perceptual easing/reduced-motion warnings and benchmark execution time. The 1.9.0 slice adds runtime telemetry happy-path, state tamper, cross-task identity, stale evidence and symlink escape cases. The 2.0.0 slice adds clean attestation, payload tamper, binding mismatch, revoked signer and unknown signer cases without weakening the approval=false and human-review invariants.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "0.1",
|
|
3
|
+
"registry_id": "motionloom-rig-adapters",
|
|
4
|
+
"generated_at": "2026-08-15T00:00:00Z",
|
|
5
|
+
"adapters": [
|
|
6
|
+
{
|
|
7
|
+
"adapter_id": "motionloom.sprite-frame-sequence",
|
|
8
|
+
"target": "sprite",
|
|
9
|
+
"framework": "sprite",
|
|
10
|
+
"status": "static_validated",
|
|
11
|
+
"evidence": [{"path": "scripts/runtime-candidate.py", "sha256": "ec292a902de12c14dcc53442e15f6d7b8a8f8d22fd2bcdd7e522c15ca9d20af1"}],
|
|
12
|
+
"limitations": ["Contract-only adapter; requires runtime evidence before runtime verification."]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"adapter_id": "motionloom.rive-runtime",
|
|
16
|
+
"target": "rive",
|
|
17
|
+
"framework": "rive",
|
|
18
|
+
"status": "project_integrated",
|
|
19
|
+
"evidence": [{"path": "scripts/runtime-adapters.mjs", "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89"}],
|
|
20
|
+
"limitations": ["Runtime harness evidence must be captured for the concrete scene and source bytes."]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"adapter_id": "motionloom.gsap-runtime",
|
|
24
|
+
"target": "gsap",
|
|
25
|
+
"framework": "gsap",
|
|
26
|
+
"status": "project_integrated",
|
|
27
|
+
"evidence": [{"path": "scripts/runtime-adapters.mjs", "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89"}],
|
|
28
|
+
"limitations": ["Runtime harness evidence must be captured for the concrete scene and source bytes."]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"adapter_id": "motionloom.framer-motion-runtime",
|
|
32
|
+
"target": "framer-motion",
|
|
33
|
+
"framework": "framer-motion",
|
|
34
|
+
"status": "project_integrated",
|
|
35
|
+
"evidence": [{"path": "scripts/runtime-adapters.mjs", "sha256": "711a64c07b4d82f646d066c7b0d91deaefc5c9c0fb701358706bf31d558b4d89"}],
|
|
36
|
+
"limitations": ["Runtime harness evidence must be captured for the concrete scene and source bytes."]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://motionloom.dev/schemas/action-set.schema.json",
|
|
4
|
+
"title": "MotionLoom Action Set Contract",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "asset_identity", "actions", "invariants"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": { "const": "0.1" },
|
|
10
|
+
"asset_identity": { "type": "string", "minLength": 1 },
|
|
11
|
+
"actions": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"additionalProperties": false,
|
|
17
|
+
"required": ["action_id", "fps", "frames", "loop"],
|
|
18
|
+
"properties": {
|
|
19
|
+
"action_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$" },
|
|
20
|
+
"fps": { "type": "number", "exclusiveMinimum": 0 },
|
|
21
|
+
"frames": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 },
|
|
22
|
+
"loop": { "type": "boolean" },
|
|
23
|
+
"events": { "type": "array", "items": { "type": "string" } },
|
|
24
|
+
"required_sockets": { "type": "array", "items": { "type": "string" } }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"invariants": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"additionalProperties": false,
|
|
31
|
+
"required": ["canvas_width", "canvas_height", "pivot_tolerance_px", "footline_tolerance_px", "bbox_drift_tolerance_px"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"canvas_width": { "type": "integer", "minimum": 1 },
|
|
34
|
+
"canvas_height": { "type": "integer", "minimum": 1 },
|
|
35
|
+
"pivot_tolerance_px": { "type": "number", "minimum": 0 },
|
|
36
|
+
"footline_tolerance_px": { "type": "number", "minimum": 0 },
|
|
37
|
+
"bbox_drift_tolerance_px": { "type": "number", "minimum": 0 },
|
|
38
|
+
"min_alpha_pixels": { "type": "integer", "minimum": 1 }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/artifact-adapter-registry.schema.json",
|
|
4
|
+
"title": "MotionLoom artifact adapter registry",
|
|
5
|
+
"description": "Provider-neutral capability descriptors. Registry membership does not invoke a provider, transfer credentials or grant approval.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema_version", "registry_id", "generated_at", "selection_policy", "adapters"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema_version": {"const": "0.1"},
|
|
11
|
+
"registry_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
|
|
12
|
+
"generated_at": {"type": "string", "format": "date-time"},
|
|
13
|
+
"selection_policy": {"type": "object", "additionalProperties": false, "required": ["require_verified", "allow_scaffold_only"], "properties": {"require_verified": {"type": "boolean"}, "allow_scaffold_only": {"type": "boolean"}}},
|
|
14
|
+
"adapters": {"type": "array", "minItems": 1, "items": {"type": "object", "additionalProperties": false, "required": ["adapter_id", "kind", "status", "adapter_version", "invocation_mode", "cost_class", "inputs", "outputs", "compatibility", "evidence", "limitations", "risk_level", "side_effect_level"], "properties": {"adapter_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{2,127}$"}, "kind": {"type": "string", "enum": ["fixture", "internal_skill", "external_provider", "manual_import"]}, "status": {"type": "string", "enum": ["verified", "scaffold_only", "static_validated", "project_integrated", "disabled"]}, "adapter_version": {"type": "string", "minLength": 1}, "invocation_mode": {"type": "string", "enum": ["none", "manual", "agent-mediated", "api"]}, "cost_class": {"type": "string", "enum": ["included", "metered", "external", "unknown"]}, "inputs": {"type": "array", "items": {"type": "string"}}, "outputs": {"type": "array", "items": {"type": "string"}}, "compatibility": {"type": "object", "additionalProperties": false, "required": ["os"], "properties": {"os": {"type": "array", "items": {"type": "string"}}, "browsers": {"type": "array", "items": {"type": "string"}}}}, "evidence": {"type": "array", "minItems": 1, "items": {"type": "object", "additionalProperties": false, "required": ["path", "sha256", "kind"], "properties": {"path": {"type": "string", "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "kind": {"type": "string", "enum": ["runtime", "ci", "browser", "static"]}}}}, "limitations": {"type": "array", "items": {"type": "string"}}, "risk_level": {"type": "string", "enum": ["low", "medium", "high"]}, "side_effect_level": {"type": "string", "enum": ["read", "local_write", "user_review_required", "remote_write"]}}}}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://motionloom.dev/schemas/asset-identity.schema.json",
|
|
4
|
+
"title": "MotionLoom Asset Identity Contract",
|
|
5
|
+
"description": "Stable identity and derivation locks shared by generated or code-authored runtime variants.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema_version", "asset_id", "asset_kind", "identity", "derivation"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema_version": { "const": "0.1" },
|
|
11
|
+
"asset_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._/-]{2,127}$" },
|
|
12
|
+
"asset_kind": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"enum": ["character", "prop", "effect", "background", "tile", "ui", "rig"]
|
|
15
|
+
},
|
|
16
|
+
"identity": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"required": ["subject_id", "reference_hashes", "camera", "coordinate_system", "scale", "pivot", "palette_lock"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"subject_id": { "type": "string", "minLength": 1 },
|
|
22
|
+
"reference_hashes": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"items": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
25
|
+
"minItems": 1,
|
|
26
|
+
"uniqueItems": true
|
|
27
|
+
},
|
|
28
|
+
"camera": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"additionalProperties": false,
|
|
31
|
+
"required": ["projection", "width", "height", "focal_length"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"projection": { "enum": ["orthographic", "perspective"] },
|
|
34
|
+
"width": { "type": "integer", "minimum": 1 },
|
|
35
|
+
"height": { "type": "integer", "minimum": 1 },
|
|
36
|
+
"focal_length": { "type": "number", "exclusiveMinimum": 0 }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"coordinate_system": { "enum": ["screen_y_down", "world_y_up"] },
|
|
40
|
+
"scale": { "type": "number", "exclusiveMinimum": 0 },
|
|
41
|
+
"pivot": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"additionalProperties": false,
|
|
44
|
+
"required": ["x", "y", "space"],
|
|
45
|
+
"properties": {
|
|
46
|
+
"x": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
47
|
+
"y": { "type": "number", "minimum": 0, "maximum": 1 },
|
|
48
|
+
"space": { "enum": ["normalized_canvas", "world"] }
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"palette_lock": {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"additionalProperties": false,
|
|
54
|
+
"required": ["colors", "delta_e_tolerance"],
|
|
55
|
+
"properties": {
|
|
56
|
+
"colors": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"items": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
|
|
59
|
+
"minItems": 1,
|
|
60
|
+
"uniqueItems": true
|
|
61
|
+
},
|
|
62
|
+
"delta_e_tolerance": { "type": "number", "minimum": 0, "maximum": 100 }
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"style_profile": { "type": "string", "minLength": 1 },
|
|
66
|
+
"lighting_profile": { "type": "string", "minLength": 1 }
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"derivation": {
|
|
70
|
+
"type": "object",
|
|
71
|
+
"additionalProperties": false,
|
|
72
|
+
"required": ["origin", "source_refs"],
|
|
73
|
+
"properties": {
|
|
74
|
+
"origin": { "enum": ["ai_generated", "ai_assisted", "ai_assisted_human_reviewed", "artist_authored", "code_authored", "unknown"] },
|
|
75
|
+
"generator": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"additionalProperties": false,
|
|
78
|
+
"required": ["model", "task_id", "prompt_hash"],
|
|
79
|
+
"properties": {
|
|
80
|
+
"model": { "type": "string", "minLength": 1 },
|
|
81
|
+
"task_id": { "type": "string", "minLength": 1 },
|
|
82
|
+
"prompt_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
83
|
+
"seed": { "type": ["integer", "string"] },
|
|
84
|
+
"tool_version": { "type": "string" }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"source_refs": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"items": { "type": "string", "minLength": 1 },
|
|
90
|
+
"minItems": 1
|
|
91
|
+
},
|
|
92
|
+
"derivation_chain": {
|
|
93
|
+
"type": "array",
|
|
94
|
+
"items": {
|
|
95
|
+
"type": "object",
|
|
96
|
+
"additionalProperties": false,
|
|
97
|
+
"required": ["step", "operation", "input_hashes", "output_hash"],
|
|
98
|
+
"properties": {
|
|
99
|
+
"step": { "type": "integer", "minimum": 0 },
|
|
100
|
+
"operation": { "type": "string", "minLength": 1 },
|
|
101
|
+
"input_hashes": { "type": "array", "items": { "type": "string", "pattern": "^[a-f0-9]{64}$" } },
|
|
102
|
+
"output_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"provenance_ref": { "type": "string", "minLength": 1 },
|
|
109
|
+
"notes": { "type": "string" }
|
|
110
|
+
},
|
|
111
|
+
"allOf": [
|
|
112
|
+
{
|
|
113
|
+
"if": {"properties": {"derivation": {"properties": {"origin": {"enum": ["ai_generated", "ai_assisted", "ai_assisted_human_reviewed"]}}, "required": ["origin"]}}, "required": ["derivation"]},
|
|
114
|
+
"then": {"properties": {"derivation": {"required": ["generator"]}}}
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"authority": {
|
|
28
28
|
"type": "string",
|
|
29
|
-
"enum": ["ai_generated", "ai_assisted", "ai_assisted_human_reviewed", "artist_authored", "unknown"]
|
|
29
|
+
"enum": ["ai_generated", "ai_assisted", "ai_assisted_human_reviewed", "artist_authored", "code_authored", "unknown"]
|
|
30
30
|
},
|
|
31
31
|
"readiness": {
|
|
32
32
|
"type": "string",
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://motionloom.dev/schemas/atlas-contract.schema.json",
|
|
4
|
+
"title": "MotionLoom Atlas Contract",
|
|
5
|
+
"description": "Deterministic atlas geometry and contamination boundary contract.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema_version", "image", "allow_rotation", "padding_px", "extrude_px", "regions"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema_version": { "const": "0.1" },
|
|
11
|
+
"image": { "type": "string", "minLength": 1 },
|
|
12
|
+
"allow_rotation": { "const": false },
|
|
13
|
+
"padding_px": { "type": "integer", "minimum": 0 },
|
|
14
|
+
"extrude_px": { "type": "integer", "minimum": 0 },
|
|
15
|
+
"require_transparent_outside_regions": { "type": "boolean" },
|
|
16
|
+
"regions": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"minItems": 1,
|
|
19
|
+
"items": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"required": ["region_id", "frame_id", "rect", "trim", "pivot"],
|
|
23
|
+
"properties": {
|
|
24
|
+
"region_id": { "type": "string", "minLength": 1 },
|
|
25
|
+
"frame_id": { "type": "string", "minLength": 1 },
|
|
26
|
+
"rect": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"required": ["x", "y", "width", "height"],
|
|
30
|
+
"properties": {
|
|
31
|
+
"x": { "type": "integer", "minimum": 0 },
|
|
32
|
+
"y": { "type": "integer", "minimum": 0 },
|
|
33
|
+
"width": { "type": "integer", "minimum": 1 },
|
|
34
|
+
"height": { "type": "integer", "minimum": 1 }
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"trim": { "type": "boolean" },
|
|
38
|
+
"pivot": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"required": ["x", "y"],
|
|
42
|
+
"properties": { "x": { "type": "number" }, "y": { "type": "number" } }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/control-track.schema.json",
|
|
4
|
+
"title": "MotionLoom generation control track",
|
|
5
|
+
"description": "Hash-bound generation controls. It stores no prompt plaintext, API token or approval assertion.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema_version", "control_id", "asset_id", "references", "tracks", "output_profile", "created_at"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema_version": {"const": "0.1"},
|
|
11
|
+
"control_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
|
|
12
|
+
"asset_id": {"type": "string", "minLength": 1},
|
|
13
|
+
"created_at": {"type": "string", "format": "date-time"},
|
|
14
|
+
"references": {"type": "array", "minItems": 1, "items": {"type": "object", "additionalProperties": false, "required": ["id", "path", "sha256", "role"], "properties": {"id": {"type": "string", "minLength": 1}, "path": {"type": "string", "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "role": {"type": "string", "enum": ["identity", "style", "pose", "camera", "motion", "palette", "lighting", "other"]}}}},
|
|
15
|
+
"tracks": {"type": "array", "minItems": 1, "items": {"type": "object", "additionalProperties": false, "required": ["id", "kind", "binding", "value_hash"], "properties": {"id": {"type": "string", "minLength": 1}, "kind": {"type": "string", "enum": ["identity", "style", "camera", "motion", "pose", "seed", "negative_prompt", "lighting", "source"]}, "binding": {"type": "string", "enum": ["required", "advisory", "not_applicable"]}, "value_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "samples": {"type": "integer", "minimum": 0}}}},
|
|
16
|
+
"output_profile": {"type": "object", "additionalProperties": false, "required": ["kind"], "properties": {"kind": {"type": "string", "enum": ["image", "frame_sequence", "sprite_atlas", "layered_map", "video", "rigged_2d", "rigged_3d", "runtime_scene"]}, "fps": {"type": "number", "exclusiveMinimum": 0}, "expected_frame_count": {"type": "integer", "minimum": 1}, "loop": {"type": "boolean"}}}
|
|
17
|
+
}
|
|
18
|
+
}
|