motionloom 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/AGENTS.md +3 -1
  2. package/CHANGELOG.md +68 -0
  3. package/CONTRIBUTING.md +3 -1
  4. package/README.md +20 -4
  5. package/SECURITY.md +5 -5
  6. package/SKILL.md +15 -5
  7. package/agent-card.json +77 -14
  8. package/agent-surfaces.json +30 -7
  9. package/artifact-adapter-registry.json +568 -20
  10. package/bin/motionloom.mjs +25 -2
  11. package/capability-registry.json +58 -234
  12. package/dev-lab/public/devlab.js +36 -3
  13. package/dev-lab/public/index.html +6 -2
  14. package/docs/ACTION-SEPARATION.md +104 -0
  15. package/docs/ASSET-GENERATION-PLANNER.md +101 -0
  16. package/docs/BRANCH-PROTECTION.md +44 -0
  17. package/docs/EXTERNAL-CORPUS.md +26 -0
  18. package/docs/STATUS.md +3 -2
  19. package/docs/audits/field-test-after-hardening-2026-08-21.md +25 -0
  20. package/docs/releases/2.6.1.md +57 -0
  21. package/docs/releases/2.7.0.md +98 -0
  22. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.00.json +32 -0
  23. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.01.json +32 -0
  24. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.02.json +32 -0
  25. package/examples/agent-consumer/asset-consistency/action-sequence/envelopes/walk.03.json +32 -0
  26. package/examples/agent-consumer/asset-consistency/action-sequence/hero-walk-action-manifest.json +81 -0
  27. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.00.json +26 -0
  28. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.01.json +26 -0
  29. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.02.json +26 -0
  30. package/examples/agent-consumer/asset-consistency/action-sequence/verifier-evidence/walk.03.json +26 -0
  31. package/examples/agent-consumer/asset-planning/pixellab-hero-256x448-request.json +43 -0
  32. package/examples/agent-consumer/devlab-live-sprite/README.md +30 -0
  33. package/examples/agent-consumer/devlab-live-sprite/devlab-runtime.json +61 -0
  34. package/examples/agent-consumer/devlab-live-sprite/frames/idle-00.png +0 -0
  35. package/examples/agent-consumer/devlab-live-sprite/frames/idle-01.png +0 -0
  36. package/examples/agent-consumer/devlab-live-sprite/frames/idle-02.png +0 -0
  37. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-00.png +0 -0
  38. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-01.png +0 -0
  39. package/examples/agent-consumer/devlab-live-sprite/frames/reverse-02.png +0 -0
  40. package/examples/agent-consumer/frame-generation-lock/hero-walk-lock.json +97 -0
  41. package/package.json +23 -9
  42. package/references/multi-frame-asset-generation.md +144 -0
  43. package/schemas/action-separation-verifier-evidence.schema.json +43 -0
  44. package/schemas/action-sequence-manifest.schema.json +48 -0
  45. package/schemas/artifact-adapter-registry.schema.json +1 -1
  46. package/schemas/asset-adaptation.schema.json +21 -0
  47. package/schemas/asset-generation-plan.schema.json +77 -0
  48. package/schemas/asset-generation-request.schema.json +104 -0
  49. package/schemas/frame-envelope.schema.json +62 -0
  50. package/schemas/frame-generation-lock.schema.json +189 -0
  51. package/scripts/action-separation.py +410 -0
  52. package/scripts/asset-adapt.mjs +92 -0
  53. package/scripts/asset-generation-plan.py +613 -0
  54. package/scripts/browser_review_consistency.py +64 -0
  55. package/scripts/fetch-project-corpus.py +91 -0
  56. package/scripts/frame-generation-lock.py +358 -0
  57. package/scripts/frame-set-preflight.py +264 -0
  58. package/scripts/package-consumer-smoke.mjs +20 -0
  59. package/scripts/quality-gate.py +7 -0
  60. package/scripts/release-verify.py +25 -0
  61. package/scripts/report-contract.py +1 -1
  62. package/scripts/report.py +19 -4
  63. package/scripts/resolve-task-bundle.py +11 -3
  64. package/scripts/review-hook.py +51 -2
  65. package/scripts/skill-doctor.py +42 -0
  66. package/src/output/browser-review-smoke/browser-review.json +6 -6
  67. package/tests/scripts/run_tests.py +45 -2
  68. package/tests/scripts/test_asset_adapt.py +47 -0
  69. package/tests/scripts/test_asset_consistency.py +77 -4
  70. package/tests/scripts/test_asset_generation_plan.py +250 -0
  71. package/tests/scripts/test_attestation.py +24 -8
@@ -11,6 +11,6 @@
11
11
  "registry_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
12
  "generated_at": {"type": "string", "format": "date-time"},
13
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"]}}}}
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"}}}}, "availability": {"type": "object", "additionalProperties": false, "properties": {"status": {"type": "string", "enum": ["known", "available", "unavailable", "unknown"]}, "environment": {"type": "string"}, "checked_at": {"type": "string", "format": "date-time"}, "reason": {"type": "string"}}}, "capabilities": {"type": "object", "additionalProperties": false, "properties": {"official_docs": {"type": "array", "items": {"type": "string", "format": "uri"}}, "canvas": {"type": "object", "additionalProperties": false, "properties": {"shapes": {"type": "array", "items": {"type": "string", "enum": ["square", "portrait", "landscape"]}}, "allowed_sizes": {"type": "array", "items": {"type": "array", "minItems": 2, "maxItems": 2, "items": {"type": "integer", "minimum": 1}}}, "max_width": {"type": "integer", "minimum": 1}, "max_height": {"type": "integer", "minimum": 1}}}, "frame_behavior": {"type": "object", "additionalProperties": false, "properties": {"mode": {"type": "string", "enum": ["single_frame", "batch_animation", "interpolation", "unknown"]}, "single_frame": {"type": "boolean"}, "max_frames_per_request": {"type": "integer", "minimum": 1}, "frame_count_policy": {"type": "string", "enum": ["fixed", "depends_on_canvas_size", "unknown"]}, "limits_by_canvas": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["canvas", "max_frames_per_request"], "properties": {"canvas": {"type": "array", "minItems": 2, "maxItems": 2, "items": {"type": "integer", "minimum": 1}}, "max_frames_per_request": {"type": "integer", "minimum": 1}}}}}}, "adaptation": {"type": "array", "items": {"type": "string", "enum": ["pad_to_target", "provider_native_resize", "tile_stitch", "integer_upscale"]}}}}, "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
15
  }
16
16
  }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/asset-adaptation.schema.json",
4
+ "title": "MotionLoom asset adaptation report",
5
+ "description": "Deterministic canvas adaptation evidence. It does not grant approval or production eligibility.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contract", "schema_version", "operation", "status", "approval", "production_approved", "source", "output", "transform"],
9
+ "properties": {
10
+ "contract": {"const": "motionloom-asset-adaptation"},
11
+ "schema_version": {"const": "0.1"},
12
+ "operation": {"const": "pad"},
13
+ "status": {"const": "built"},
14
+ "approval": {"const": false},
15
+ "production_approved": {"const": false},
16
+ "source": {"type": "object", "additionalProperties": false, "required": ["path", "sha256", "canvas"], "properties": {"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "canvas": {"type": "array", "minItems": 2, "maxItems": 2, "items": {"type": "integer", "minimum": 1}}}},
17
+ "output": {"type": "object", "additionalProperties": false, "required": ["path", "sha256", "canvas"], "properties": {"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "canvas": {"type": "array", "minItems": 2, "maxItems": 2, "items": {"type": "integer", "minimum": 1}}}},
18
+ "transform": {"type": "object", "additionalProperties": false, "required": ["scale", "x", "y", "anchor", "crop", "stretch", "interpolation"], "properties": {"scale": {"type": "integer", "minimum": 1}, "x": {"type": "integer", "minimum": 0}, "y": {"type": "integer", "minimum": 0}, "anchor": {"type": "string", "enum": ["center", "footline"]}, "crop": {"const": false}, "stretch": {"const": false}, "interpolation": {"const": "nearest-neighbour"}}},
19
+ "note": {"type": "string"}
20
+ }
21
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/asset-generation-plan.schema.json",
4
+ "title": "MotionLoom project-aware asset generation plan",
5
+ "description": "Advisory MotionLoom assessment. Recommendations never grant execution authorization or approval.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "contract", "schema_version", "producer", "source", "identity", "status", "decision", "execution_decision",
10
+ "approval", "production_approved", "request", "project", "registry", "providers", "selection",
11
+ "recommendations", "agent_guidance", "next_steps", "warnings"
12
+ ],
13
+ "properties": {
14
+ "contract": {"const": "motionloom-asset-generation-plan"},
15
+ "schema_version": {"const": "0.2"},
16
+ "producer": {"const": "MotionLoom"},
17
+ "source": {"type": "string", "minLength": 1},
18
+ "identity": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["product", "role"],
22
+ "properties": {"product": {"const": "MotionLoom"}, "role": {"type": "string", "minLength": 1}}
23
+ },
24
+ "status": {"const": "plan_only"},
25
+ "decision": {"type": "string", "enum": ["recommendations_available", "compatible_execution_route_available", "execution_route_requires_review_or_adaptation", "no_execution_eligible_route", "no_safe_recommendation_available"]},
26
+ "execution_decision": {"type": "string", "enum": ["compatible_execution_route_available", "execution_route_requires_review_or_adaptation", "no_execution_eligible_route"]},
27
+ "approval": {"const": false},
28
+ "production_approved": {"const": false},
29
+ "request": {"type": "object"},
30
+ "project": {"type": "object"},
31
+ "registry": {"type": "object"},
32
+ "providers": {"type": "array", "items": {"type": "object"}},
33
+ "selection": {
34
+ "type": "object",
35
+ "required": ["policy", "eligible_count", "provisional_count", "blocked_count", "recommendation_count"],
36
+ "properties": {
37
+ "policy": {"type": "object"},
38
+ "eligible_count": {"type": "integer", "minimum": 0},
39
+ "provisional_count": {"type": "integer", "minimum": 0},
40
+ "blocked_count": {"type": "integer", "minimum": 0},
41
+ "recommendation_count": {"type": "integer", "minimum": 0}
42
+ }
43
+ },
44
+ "recommendations": {
45
+ "type": "array",
46
+ "items": {
47
+ "type": "object",
48
+ "required": ["adapter_id", "recommendation_status", "execution_status", "execution_evidence_status", "execution_eligible", "user_preference", "availability", "project_fit", "rationale", "agent_guidance", "approval"],
49
+ "properties": {
50
+ "adapter_id": {"type": "string"},
51
+ "recommendation_status": {"type": "string", "enum": ["recommended", "acceptable", "not_recommended"]},
52
+ "execution_status": {"type": "string", "enum": ["verified", "provisional", "blocked"]},
53
+ "execution_evidence_status": {"type": "string", "enum": ["verified", "provisional"]},
54
+ "execution_eligible": {"type": "boolean"},
55
+ "user_preference": {"type": "object"},
56
+ "availability": {"type": "object"},
57
+ "project_fit": {"type": "string", "enum": ["high", "medium", "low"]},
58
+ "rationale": {"type": "array", "items": {"type": "string"}},
59
+ "agent_guidance": {"type": "object"},
60
+ "approval": {"const": false}
61
+ }
62
+ }
63
+ },
64
+ "agent_guidance": {
65
+ "type": "object",
66
+ "required": ["recommended_by", "summary", "next_step", "validation_route"],
67
+ "properties": {
68
+ "recommended_by": {"const": "MotionLoom"},
69
+ "summary": {"type": "string"},
70
+ "next_step": {"type": "string"},
71
+ "validation_route": {"type": "array", "items": {"type": "string"}}
72
+ }
73
+ },
74
+ "next_steps": {"type": "array", "items": {"type": "string"}},
75
+ "warnings": {"type": "array", "items": {"type": "string"}}
76
+ }
77
+ }
@@ -0,0 +1,104 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/asset-generation-request.schema.json",
4
+ "title": "MotionLoom asset generation request",
5
+ "description": "Provider-neutral request used to plan generation and adaptation. It never invokes a provider or grants approval.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema_version", "request_id", "asset_id", "asset_kind", "target", "generation_policy"],
9
+ "properties": {
10
+ "schema_version": {"const": "0.1"},
11
+ "request_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "asset_id": {"type": "string", "minLength": 1},
13
+ "asset_kind": {"type": "string", "enum": ["image", "frame_sequence", "sprite_atlas", "layered_map", "video", "rigged_2d", "rigged_3d", "runtime_scene"]},
14
+ "target": {
15
+ "type": "object",
16
+ "additionalProperties": false,
17
+ "required": ["canvas", "alpha_mode"],
18
+ "properties": {
19
+ "canvas": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["width", "height"],
23
+ "properties": {
24
+ "width": {"type": "integer", "minimum": 1},
25
+ "height": {"type": "integer", "minimum": 1}
26
+ }
27
+ },
28
+ "frame_count": {"type": "integer", "minimum": 1},
29
+ "fps": {"type": "number", "exclusiveMinimum": 0},
30
+ "alpha_mode": {"type": "string", "enum": ["straight", "premultiplied", "opaque"]},
31
+ "pixel_art": {"type": "boolean"},
32
+ "anchor": {"type": "string", "enum": ["center", "footline", "pivot", "top_left"]}
33
+ }
34
+ },
35
+ "generation_policy": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["frame_isolation", "allow_crop", "allow_stretch", "allow_silent_resize"],
39
+ "properties": {
40
+ "frame_isolation": {"type": "string", "enum": ["required", "preferred", "not_required"]},
41
+ "allow_crop": {"const": false},
42
+ "allow_stretch": {"const": false},
43
+ "allow_silent_resize": {"const": false},
44
+ "allow_provider_batch_as_provisional": {"type": "boolean"},
45
+ "integer_scale_only": {"type": "boolean"}
46
+ }
47
+ },
48
+ "actions": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["action_id", "positive_cues", "negative_cues"],
54
+ "properties": {
55
+ "action_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"},
56
+ "positive_cues": {"type": "array", "items": {"type": "string"}},
57
+ "negative_cues": {"type": "array", "items": {"type": "string"}},
58
+ "frame_count": {"type": "integer", "minimum": 1}
59
+ }
60
+ }
61
+ },
62
+ "project_context": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "runtime": {"type": "string", "minLength": 1},
67
+ "framework": {"type": "string", "minLength": 1},
68
+ "existing_assets": {"type": "array", "items": {"type": "string", "minLength": 1}},
69
+ "rig_requirements": {"type": "array", "items": {"type": "string", "minLength": 1}},
70
+ "provenance_requirements": {"type": "array", "items": {"type": "string", "minLength": 1}},
71
+ "validation_requirements": {"type": "array", "items": {"type": "string", "minLength": 1}}
72
+ }
73
+ },
74
+ "provider_preferences": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "properties": {
78
+ "preferred_adapter_ids": {
79
+ "type": "array",
80
+ "uniqueItems": true,
81
+ "items": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{2,127}$"}
82
+ },
83
+ "excluded_adapter_ids": {
84
+ "type": "array",
85
+ "uniqueItems": true,
86
+ "items": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{2,127}$"}
87
+ }
88
+ }
89
+ },
90
+ "references": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "object",
94
+ "additionalProperties": false,
95
+ "required": ["id", "role"],
96
+ "properties": {
97
+ "id": {"type": "string", "minLength": 1},
98
+ "role": {"type": "string", "enum": ["identity", "style", "pose", "motion", "palette", "other"]},
99
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://motionloom.dev/schemas/frame-envelope.schema.json",
4
+ "title": "MotionLoom Frame Envelope",
5
+ "description": "Hash-bound identity and explicitly classified action-separation evidence for one isolated frame.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema_version", "sequence_id", "action_id", "frame_id", "frame_index", "image", "image_sha256", "identity_lock_sha256", "generator_agent_id", "verifier", "approval"],
9
+ "properties": {
10
+ "schema_version": {"const": "0.2"},
11
+ "sequence_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,95}$"},
12
+ "action_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
13
+ "frame_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
14
+ "frame_index": {"type": "integer", "minimum": 0},
15
+ "image": {"type": "string", "pattern": "^.+\\.png$"},
16
+ "image_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
17
+ "identity_lock_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
18
+ "generator_agent_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
19
+ "verifier": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["verifier_id", "verification_mode", "expected_action", "top_competitor", "margin", "threshold", "status", "method"],
23
+ "properties": {
24
+ "verifier_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
25
+ "verification_mode": {"type": "string", "enum": ["declared", "independently_bound"]},
26
+ "expected_action": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
27
+ "top_competitor": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
28
+ "margin": {"type": "number", "minimum": 0},
29
+ "threshold": {"type": "number", "minimum": 0},
30
+ "status": {"enum": ["pass", "quarantined"]},
31
+ "method": {"type": "string", "minLength": 1},
32
+ "evidence": {
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": ["artifact", "artifact_sha256", "result_sha256", "provenance"],
36
+ "properties": {
37
+ "artifact": {"type": "string", "pattern": "^.+\\.json$"},
38
+ "artifact_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
39
+ "result_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
40
+ "provenance": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["kind", "producer_id", "run_id"],
44
+ "properties": {
45
+ "kind": {"const": "separate_verifier_artifact"},
46
+ "producer_id": {"type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$"},
47
+ "run_id": {"type": "string", "minLength": 1}
48
+ }
49
+ }
50
+ }
51
+ }
52
+ },
53
+ "allOf": [
54
+ {
55
+ "if": {"properties": {"verification_mode": {"const": "independently_bound"}}},
56
+ "then": {"required": ["evidence"]}
57
+ }
58
+ ]
59
+ },
60
+ "approval": {"const": false}
61
+ }
62
+ }
@@ -0,0 +1,189 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://motionloom.dev/schemas/frame-generation-lock.schema.json",
4
+ "title": "MotionLoom Frame Generation Lock",
5
+ "description": "Provider-neutral, machine-readable generation constraints that keep independently generated animation frames on one identity, canvas and geometry lock before deterministic post-generation preflight.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "lock_id",
11
+ "asset_identity",
12
+ "action_id",
13
+ "reference",
14
+ "canvas",
15
+ "geometry",
16
+ "appearance",
17
+ "source_policy",
18
+ "frames",
19
+ "postflight",
20
+ "trust"
21
+ ],
22
+ "properties": {
23
+ "schema_version": { "enum": ["0.1", "0.2"] },
24
+ "lock_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,95}$" },
25
+ "asset_identity": { "type": "string", "minLength": 1 },
26
+ "action_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$" },
27
+ "sequence_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,95}$" },
28
+ "forbidden_action_ids": {
29
+ "type": "array",
30
+ "minItems": 1,
31
+ "uniqueItems": true,
32
+ "items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$" }
33
+ },
34
+ "action_manifest": { "type": "string", "pattern": "^.+\\.json$" },
35
+ "action_contract": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["positive_cues", "negative_cues"],
39
+ "properties": {
40
+ "positive_cues": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
41
+ "negative_cues": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
42
+ }
43
+ },
44
+ "reference": {
45
+ "type": "object",
46
+ "additionalProperties": false,
47
+ "required": ["image", "sha256", "role"],
48
+ "properties": {
49
+ "image": { "type": "string", "minLength": 1 },
50
+ "sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
51
+ "role": { "enum": ["identity_anchor", "accepted_frame_anchor"] }
52
+ }
53
+ },
54
+ "canvas": {
55
+ "type": "object",
56
+ "additionalProperties": false,
57
+ "required": ["width", "height", "color_space", "alpha_mode"],
58
+ "properties": {
59
+ "width": { "type": "integer", "minimum": 1 },
60
+ "height": { "type": "integer", "minimum": 1 },
61
+ "color_space": { "enum": ["srgb", "linear-srgb"] },
62
+ "alpha_mode": { "enum": ["straight", "premultiplied"] }
63
+ }
64
+ },
65
+ "geometry": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": ["center_x", "pivot", "footline_px", "safe_rect", "min_padding_px", "target_alpha_bbox", "tolerances"],
69
+ "properties": {
70
+ "center_x": { "type": "number" },
71
+ "pivot": { "$ref": "#/$defs/point" },
72
+ "footline_px": { "type": "number" },
73
+ "safe_rect": { "$ref": "#/$defs/rect" },
74
+ "min_padding_px": { "type": "integer", "minimum": 0 },
75
+ "target_alpha_bbox": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": ["width", "height"],
79
+ "properties": {
80
+ "width": { "type": "integer", "minimum": 1 },
81
+ "height": { "type": "integer", "minimum": 1 }
82
+ }
83
+ },
84
+ "tolerances": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "required": ["pivot_px", "footline_px", "bbox_width_px", "bbox_height_px"],
88
+ "properties": {
89
+ "pivot_px": { "type": "number", "minimum": 0 },
90
+ "footline_px": { "type": "number", "minimum": 0 },
91
+ "bbox_width_px": { "type": "number", "minimum": 0 },
92
+ "bbox_height_px": { "type": "number", "minimum": 0 }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "appearance": {
98
+ "type": "object",
99
+ "additionalProperties": false,
100
+ "required": ["preserve", "forbid", "pixel_art"],
101
+ "properties": {
102
+ "preserve": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
103
+ "forbid": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
104
+ "pixel_art": {
105
+ "type": "object",
106
+ "additionalProperties": false,
107
+ "required": ["enabled", "nearest_neighbor_only"],
108
+ "properties": {
109
+ "enabled": { "type": "boolean" },
110
+ "nearest_neighbor_only": { "type": "boolean" }
111
+ }
112
+ }
113
+ }
114
+ },
115
+ "source_policy": {
116
+ "type": "object",
117
+ "additionalProperties": false,
118
+ "required": ["isolated_frames", "max_frames_per_image", "allow_pose_sheet", "allow_post_resize", "reuse_reference"],
119
+ "properties": {
120
+ "isolated_frames": { "const": true },
121
+ "max_frames_per_image": { "const": 1 },
122
+ "allow_pose_sheet": { "const": false },
123
+ "allow_post_resize": { "const": false },
124
+ "reuse_reference": { "const": true }
125
+ }
126
+ },
127
+ "frames": {
128
+ "type": "array",
129
+ "minItems": 2,
130
+ "items": {
131
+ "type": "object",
132
+ "additionalProperties": false,
133
+ "required": ["frame_id", "pose", "output"],
134
+ "properties": {
135
+ "frame_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{1,63}$" },
136
+ "pose": { "type": "string", "minLength": 1 },
137
+ "output": { "type": "string", "pattern": ".+\\.png$" }
138
+ }
139
+ }
140
+ },
141
+ "postflight": {
142
+ "type": "object",
143
+ "additionalProperties": false,
144
+ "required": ["frame_geometry"],
145
+ "properties": {
146
+ "frame_geometry": { "type": "string", "minLength": 1 }
147
+ }
148
+ },
149
+ "trust": {
150
+ "type": "object",
151
+ "additionalProperties": false,
152
+ "required": ["authority", "review_only", "approval"],
153
+ "properties": {
154
+ "authority": { "enum": ["ai_generated", "ai_assisted", "code_authored", "unknown"] },
155
+ "review_only": { "const": true },
156
+ "approval": { "const": false }
157
+ }
158
+ }
159
+ },
160
+ "allOf": [
161
+ {
162
+ "if": { "properties": { "schema_version": { "const": "0.2" } } },
163
+ "then": { "required": ["sequence_id", "forbidden_action_ids", "action_contract", "action_manifest"] }
164
+ }
165
+ ],
166
+ "$defs": {
167
+ "rect": {
168
+ "type": "object",
169
+ "additionalProperties": false,
170
+ "required": ["x", "y", "width", "height"],
171
+ "properties": {
172
+ "x": { "type": "integer", "minimum": 0 },
173
+ "y": { "type": "integer", "minimum": 0 },
174
+ "width": { "type": "integer", "minimum": 1 },
175
+ "height": { "type": "integer", "minimum": 1 }
176
+ }
177
+ },
178
+ "point": {
179
+ "type": "object",
180
+ "additionalProperties": false,
181
+ "required": ["x", "y", "space"],
182
+ "properties": {
183
+ "x": { "type": "number" },
184
+ "y": { "type": "number" },
185
+ "space": { "enum": ["pixels", "normalized"] }
186
+ }
187
+ }
188
+ }
189
+ }