motionloom 2.0.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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/SKILL.md +122 -0
  4. package/agent-card.json +161 -0
  5. package/assets/library/ATTRIBUTION.md +6 -0
  6. package/assets/library/README.md +20 -0
  7. package/assets/library/avatar-base.svg +19 -0
  8. package/assets/library/error-alert.json +1 -0
  9. package/assets/library/rive/ATTRIBUTION.md +12 -0
  10. package/assets/library/rive/state-machine-test.riv +0 -0
  11. package/assets/library/success-check.json +1 -0
  12. package/bin/motionloom.mjs +81 -0
  13. package/docs/BROWSER-REVIEW-E2E.md +78 -0
  14. package/docs/CATEGORIES.md +16 -0
  15. package/docs/CHECKLIST.md +31 -0
  16. package/docs/DEEP-AUDIT-WORKING-NOTES.md +22 -0
  17. package/docs/FRAMEWORK-SELECTION.md +26 -0
  18. package/docs/PROJECT-MANIFEST.md +37 -0
  19. package/docs/ROADMAP-INTELLIGENCE.md +224 -0
  20. package/docs/audits/1.10.0-attestation-research-notes.md +19 -0
  21. package/docs/audits/1.8.0-trust-boundary-hardening.md +56 -0
  22. package/docs/audits/1.9.0-evidence-interoperability-threat-model.md +37 -0
  23. package/docs/audits/2.0.0-attestation-acceptance.md +30 -0
  24. package/docs/releases/1.5.0.md +25 -0
  25. package/docs/releases/1.6.0.md +27 -0
  26. package/docs/releases/1.7.0.md +23 -0
  27. package/docs/releases/1.8.0.md +23 -0
  28. package/docs/releases/1.9.0.md +21 -0
  29. package/docs/releases/2.0.0.md +21 -0
  30. package/docs/releases/npm-publish-from-workstation.md +88 -0
  31. package/docs/research/AGENT-PROTOCOL-FINDINGS.md +43 -0
  32. package/examples/report-demo/REPORT.md +50 -0
  33. package/examples/report-demo/artifact-manifest.json +25 -0
  34. package/examples/report-demo/decision-log.jsonl +0 -0
  35. package/examples/report-demo/execution-report.json +70 -0
  36. package/examples/report-demo/handoff.json +22 -0
  37. package/examples/report-demo/issue-register.json +5 -0
  38. package/examples/report-demo/task.json +13 -0
  39. package/package.json +95 -0
  40. package/project-context.example.json +26 -0
  41. package/references/browser-review-contract.md +32 -0
  42. package/references/dotlottie-source-notes.md +21 -0
  43. package/references/intelligence-core.md +98 -0
  44. package/references/reporting-contract.md +38 -0
  45. package/references/runtime-capability.md +12 -0
  46. package/references/signed-attestation.md +31 -0
  47. package/schemas/artifact-manifest.schema.json +22 -0
  48. package/schemas/browser-review-candidate.schema.json +24 -0
  49. package/schemas/capability-registry.schema.json +61 -0
  50. package/schemas/continuity-report.schema.json +52 -0
  51. package/schemas/evidence-verifier-report.schema.json +35 -0
  52. package/schemas/execution-report.schema.json +35 -0
  53. package/schemas/fix-plan.schema.json +44 -0
  54. package/schemas/handoff.schema.json +19 -0
  55. package/schemas/motion-ir.schema.json +74 -0
  56. package/schemas/project-graph.schema.json +70 -0
  57. package/schemas/provenance.schema.json +76 -0
  58. package/schemas/runtime-evidence.schema.json +48 -0
  59. package/schemas/runtime-telemetry.schema.json +50 -0
  60. package/schemas/scene-manifest.schema.json +45 -0
  61. package/schemas/semantic-benchmark.schema.json +26 -0
  62. package/schemas/semantic-lint-report.schema.json +48 -0
  63. package/schemas/signed-attestation.schema.json +95 -0
  64. package/schemas/task.schema.json +39 -0
  65. package/schemas/trust-policy.schema.json +53 -0
  66. package/scripts/analyze.sh +13 -0
  67. package/scripts/attestation-keygen.py +63 -0
  68. package/scripts/attestation-verifier.py +178 -0
  69. package/scripts/attestation.py +288 -0
  70. package/scripts/capture-runtime-telemetry.sh +37 -0
  71. package/scripts/devlab.sh +77 -0
  72. package/scripts/eval-intelligence.py +377 -0
  73. package/scripts/evidence-verifier.py +222 -0
  74. package/scripts/fetch-library.sh +57 -0
  75. package/scripts/intelligence.py +1543 -0
  76. package/scripts/manifest.py +61 -0
  77. package/scripts/pr.sh +103 -0
  78. package/scripts/quality-gate.py +378 -0
  79. package/scripts/render-node.mjs +53 -0
  80. package/scripts/render.sh +37 -0
  81. package/scripts/report-contract.py +181 -0
  82. package/scripts/report.py +588 -0
  83. package/scripts/review-hook.py +199 -0
  84. package/scripts/runtime-adapters.mjs +187 -0
  85. package/scripts/skill-doctor.py +150 -0
  86. package/scripts/to-dotlottie.mjs +99 -0
  87. package/scripts/to-dotlottie.sh +25 -0
  88. package/scripts/validate-lottie.py +102 -0
  89. package/src/core/analyzer.py +226 -0
  90. package/src/core/snapshot.py +124 -0
  91. package/src/core/spec.py +240 -0
  92. package/src/output/browser-review-smoke/animation.json +57 -0
  93. package/src/output/browser-review-smoke/browser-review.json +21 -0
  94. package/src/output/browser-review-smoke/manifest.json +22 -0
  95. package/src/output/browser-review-smoke/motion-spec.json +28 -0
  96. package/src/output/browser-review-smoke/snapshot/.render-meta.json +10 -0
  97. package/src/output/browser-review-smoke/snapshot/frame-00.png +0 -0
  98. package/src/output/browser-review-smoke/snapshot/frame-100.png +0 -0
  99. package/src/output/browser-review-smoke/snapshot/frame-50.png +0 -0
  100. package/src/rig/README.md +35 -0
  101. package/src/rig/cutout_rig.py +211 -0
  102. package/templates/framer-motion/ui-micro.tsx +50 -0
  103. package/templates/gsap/scroll-scene.js +54 -0
  104. package/templates/lottie/README.md +21 -0
  105. package/templates/lottie/react-component.tsx +82 -0
  106. package/templates/lottie/scaffold/animation.json +57 -0
  107. package/templates/lottie/scaffold/character-rig.svg +19 -0
  108. package/templates/lottie/vanilla.js +68 -0
  109. package/templates/rive/README.md +36 -0
  110. package/tests/evals/intelligence-cases.json +131 -0
  111. package/tests/scripts/run_tests.py +843 -0
  112. package/tests/scripts/test_attestation.py +172 -0
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/fix-plan.schema.json",
4
+ "title": "MotionLoom structured animation fix plan",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "plan_id", "task_id", "status", "source_reports", "issues", "generated_at"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "plan_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "status": {"type": "string", "enum": ["proposed", "accepted", "in_progress", "verified", "blocked"]},
13
+ "source_reports": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/report_ref"}},
14
+ "issues": {"type": "array", "items": {"$ref": "#/$defs/issue"}},
15
+ "generated_at": {"type": "string", "format": "date-time"},
16
+ "next_agent": {"type": "object", "additionalProperties": false, "properties": {"action": {"type": "string"}, "skill": {"type": "string"}, "evidence_needed": {"type": "array", "items": {"type": "string"}}}}
17
+ },
18
+ "$defs": {
19
+ "report_ref": {
20
+ "type": "object",
21
+ "additionalProperties": false,
22
+ "required": ["path", "sha256", "kind"],
23
+ "properties": {"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "kind": {"type": "string", "enum": ["semantic-lint", "continuity", "review", "quality"]}}
24
+ },
25
+ "issue": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["id", "finding_ref", "severity", "confidence", "root_cause", "affected_artifacts", "patch_scope", "rerun_scope", "verification", "requires_user_review"],
29
+ "properties": {
30
+ "id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
31
+ "finding_ref": {"type": "string", "minLength": 1},
32
+ "severity": {"type": "string", "enum": ["info", "warning", "error"]},
33
+ "confidence": {"type": "number", "minimum": 0, "maximum": 1},
34
+ "root_cause": {"type": "string", "minLength": 1},
35
+ "affected_artifacts": {"type": "array", "items": {"type": "string", "minLength": 1}},
36
+ "patch_scope": {"type": "array", "items": {"type": "string", "minLength": 1}},
37
+ "rerun_scope": {"type": "array", "items": {"type": "string", "enum": ["lint", "continuity", "render", "runtime", "browser_review", "quality_gate", "replay"]}},
38
+ "verification": {"type": "array", "items": {"type": "string", "minLength": 1}},
39
+ "requires_user_review": {"type": "boolean"},
40
+ "status": {"type": "string", "enum": ["open", "in_progress", "verified", "wont_fix"]}
41
+ }
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/handoff.schema.json",
4
+ "title": "Animation Agent handoff",
5
+ "type": "object",
6
+ "required": ["handoff_version", "task_id", "from_agent", "state", "summary", "next_actions", "required_artifacts", "blockers"],
7
+ "properties": {
8
+ "handoff_version": {"type": "string"},
9
+ "task_id": {"type": "string"},
10
+ "from_agent": {"type": "string"},
11
+ "to_agent": {"type": "string"},
12
+ "state": {"type": "string"},
13
+ "summary": {"type": "string"},
14
+ "next_actions": {"type": "array", "items": {"type": "object", "required": ["action"], "properties": {"action": {"type": "string"}, "skill": {"type": "string"}, "agent": {"type": "string"}, "kind": {"type": "string"}, "url": {"type": "string", "format": "uri"}, "candidate_id": {"type": "string"}, "requires_user_approval": {"type": "boolean"}, "evidence_needed": {"type": "array", "items": {"type": "string"}}, "output_artifacts": {"type": "array", "items": {"type": "string"}}}}},
15
+ "required_artifacts": {"type": "array", "items": {"type": "string"}},
16
+ "blockers": {"type": "array", "items": {"type": "object"}}
17
+ },
18
+ "additionalProperties": true
19
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/motion-ir.schema.json",
4
+ "title": "MotionLoom framework-neutral motion intermediate representation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "ir_id", "task_id", "scene", "intent", "context_hash", "duration_ms", "tracks", "accessibility", "acceptance"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "ir_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
13
+ "intent": {"type": "string", "minLength": 1},
14
+ "context_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
15
+ "duration_ms": {"type": "integer", "minimum": 1},
16
+ "fps": {"type": "number", "exclusiveMinimum": 0, "maximum": 240},
17
+ "tracks": {
18
+ "type": "array",
19
+ "minItems": 1,
20
+ "items": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["id", "target", "property", "keyframes"],
24
+ "properties": {
25
+ "id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,127}$"},
26
+ "target": {"type": "string", "minLength": 1},
27
+ "property": {"type": "string", "enum": ["opacity", "translate_x", "translate_y", "scale_x", "scale_y", "rotate", "color", "path", "custom"]},
28
+ "keyframes": {
29
+ "type": "array",
30
+ "minItems": 2,
31
+ "items": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["offset", "value"],
35
+ "properties": {"offset": {"type": "number", "minimum": 0, "maximum": 1}, "value": {}, "easing": {"type": "string", "minLength": 1}}
36
+ }
37
+ },
38
+ "spring": {"type": "object", "additionalProperties": false, "properties": {"mass": {"type": "number", "exclusiveMinimum": 0}, "stiffness": {"type": "number", "exclusiveMinimum": 0}, "damping": {"type": "number", "exclusiveMinimum": 0}}}
39
+ }
40
+ }
41
+ },
42
+ "accessibility": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["reduced_motion", "keyboard_safe"],
46
+ "properties": {"reduced_motion": {"type": "string", "enum": ["none", "reduce", "replace", "freeze"]}, "keyboard_safe": {"type": "boolean"}, "fallback_description": {"type": "string"}}
47
+ },
48
+ "performance_budget": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "properties": {"max_tracks": {"type": "integer", "minimum": 1}, "max_layers": {"type": "integer", "minimum": 1}, "allow_layout_animation": {"type": "boolean"}}
52
+ },
53
+ "acceptance": {
54
+ "type": "array",
55
+ "minItems": 1,
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["id", "type", "expected"],
60
+ "properties": {"id": {"type": "string", "minLength": 1}, "type": {"type": "string", "enum": ["deterministic", "runtime", "human_required"]}, "expected": {}, "evidence_refs": {"type": "array", "items": {"type": "string"}}}
61
+ }
62
+ },
63
+ "confidence": {"$ref": "#/$defs/confidence"},
64
+ "source_refs": {"type": "array", "items": {"type": "string"}}
65
+ },
66
+ "$defs": {
67
+ "confidence": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["value", "basis"],
71
+ "properties": {"value": {"type": "number", "minimum": 0, "maximum": 1}, "basis": {"type": "string", "enum": ["deterministic", "runtime", "human", "heuristic"]}, "evidence_refs": {"type": "array", "items": {"type": "string"}}}
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/project-graph.schema.json",
4
+ "title": "MotionLoom canonical project motion graph",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "graph_id", "task_id", "scene", "generated_at", "context_hash", "nodes", "edges", "roots"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "graph_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
13
+ "generated_at": {"type": "string", "format": "date-time"},
14
+ "context_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
15
+ "nodes": {
16
+ "type": "array",
17
+ "minItems": 1,
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["id", "kind", "label"],
22
+ "properties": {
23
+ "id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]{1,191}$"},
24
+ "kind": {"type": "string", "enum": ["project", "intent", "constraint", "asset", "source", "scene", "motion_spec", "runtime", "artifact", "evidence", "review", "decision"]},
25
+ "label": {"type": "string", "minLength": 1},
26
+ "ref": {"type": "string", "minLength": 1},
27
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
28
+ "attributes": {"type": "object"},
29
+ "confidence": {"$ref": "#/$defs/confidence"}
30
+ }
31
+ }
32
+ },
33
+ "edges": {
34
+ "type": "array",
35
+ "items": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["from", "to", "relation"],
39
+ "properties": {
40
+ "from": {"type": "string", "minLength": 1},
41
+ "to": {"type": "string", "minLength": 1},
42
+ "relation": {"type": "string", "enum": ["contains", "derived_from", "uses", "constrained_by", "rendered_by", "verified_by", "reviewed_as", "supersedes", "blocked_by"]},
43
+ "evidence_refs": {"type": "array", "items": {"type": "string"}}
44
+ }
45
+ }
46
+ },
47
+ "roots": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
48
+ "policy": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "properties": {
52
+ "source_of_truth": {"type": "string", "enum": ["task-bundle", "project-context", "manifest"]},
53
+ "allow_unresolved_edges": {"type": "boolean"},
54
+ "required_node_kinds": {"type": "array", "items": {"type": "string"}}
55
+ }
56
+ }
57
+ },
58
+ "$defs": {
59
+ "confidence": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": ["value", "basis"],
63
+ "properties": {
64
+ "value": {"type": "number", "minimum": 0, "maximum": 1},
65
+ "basis": {"type": "string", "enum": ["deterministic", "runtime", "human", "heuristic"]},
66
+ "evidence_refs": {"type": "array", "items": {"type": "string"}}
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/provenance.schema.json",
4
+ "title": "MotionLoom step provenance attestation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "attestation_id", "task_id", "scene", "generated_at", "subjects", "steps", "verification"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "attestation_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
13
+ "generated_at": {"type": "string", "format": "date-time"},
14
+ "subjects": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/artifact"}},
15
+ "steps": {
16
+ "type": "array",
17
+ "minItems": 1,
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["step_id", "step_type", "actor", "builder", "materials", "products", "policy", "started_at", "finished_at", "result"],
22
+ "properties": {
23
+ "step_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{1,127}$"},
24
+ "step_type": {"type": "string", "enum": ["analyze", "context", "spec", "source-bind", "generate", "render", "runtime-test", "browser-review", "quality-gate", "confirm"]},
25
+ "actor": {"$ref": "#/$defs/actor"},
26
+ "builder": {"$ref": "#/$defs/builder"},
27
+ "materials": {"type": "array", "items": {"$ref": "#/$defs/artifact"}},
28
+ "products": {"type": "array", "items": {"$ref": "#/$defs/artifact"}},
29
+ "policy": {"type": "string", "minLength": 1},
30
+ "started_at": {"type": "string", "format": "date-time"},
31
+ "finished_at": {"type": "string", "format": "date-time"},
32
+ "result": {"type": "string", "enum": ["pass", "fail", "blocked", "needs_review"]},
33
+ "parent_step_ids": {"type": "array", "items": {"type": "string"}},
34
+ "details": {"type": "object"}
35
+ }
36
+ }
37
+ },
38
+ "verification": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["hash_algorithm", "chain_hash", "status"],
42
+ "properties": {
43
+ "hash_algorithm": {"const": "sha256"},
44
+ "chain_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
45
+ "status": {"type": "string", "enum": ["verified", "unverified", "invalid"]},
46
+ "signature": {"type": "object", "additionalProperties": false, "properties": {"status": {"type": "string", "enum": ["unsigned", "verified", "invalid"]}, "key_id": {"type": "string"}}}
47
+ }
48
+ }
49
+ },
50
+ "$defs": {
51
+ "artifact": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["id", "path", "type", "sha256"],
55
+ "properties": {
56
+ "id": {"type": "string", "minLength": 1},
57
+ "path": {"type": "string", "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"},
58
+ "type": {"type": "string", "minLength": 1},
59
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
60
+ "bytes": {"type": "integer", "minimum": 0}
61
+ }
62
+ },
63
+ "actor": {
64
+ "type": "object",
65
+ "additionalProperties": false,
66
+ "required": ["type", "id"],
67
+ "properties": {"type": {"type": "string", "enum": ["agent", "user", "ci", "runtime"]}, "id": {"type": "string", "minLength": 1}}
68
+ },
69
+ "builder": {
70
+ "type": "object",
71
+ "additionalProperties": false,
72
+ "required": ["name", "version"],
73
+ "properties": {"name": {"type": "string", "minLength": 1}, "version": {"type": "string", "minLength": 1}, "browser": {"type": "string"}, "os": {"type": "string"}}
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/runtime-evidence.schema.json",
4
+ "title": "Animation runtime adapter evidence",
5
+ "type": "object",
6
+ "required": ["schema_version", "run_id", "generated_at", "mode", "harness", "status", "frameworks"],
7
+ "properties": {
8
+ "schema_version": {"type": "string"},
9
+ "run_id": {"type": "string", "minLength": 1},
10
+ "generated_at": {"type": "string", "format": "date-time"},
11
+ "mode": {"const": "runtime"},
12
+ "harness": {"type": "string", "minLength": 1},
13
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9._-]+$"},
14
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9._-]+$"},
15
+ "source_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
16
+ "manifest_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
17
+ "motion_ir_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
18
+ "status": {"const": "pass"},
19
+ "frameworks": {
20
+ "type": "array",
21
+ "minItems": 1,
22
+ "items": {
23
+ "type": "object",
24
+ "required": ["run_id", "framework", "runtime", "status", "ready", "frames"],
25
+ "properties": {
26
+ "framework": {"type": "string"},
27
+ "runtime": {"type": "string"},
28
+ "status": {"const": "pass"},
29
+ "ready": {"const": true},
30
+ "frames": {"type": "array", "minItems": 3},
31
+ "console_errors": {"type": "array"},
32
+ "telemetry": {
33
+ "type": "object",
34
+ "required": ["file", "sha256", "metrics"],
35
+ "properties": {
36
+ "file": {"type": "string", "minLength": 1},
37
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
38
+ "metrics": {"type": "object"}
39
+ },
40
+ "additionalProperties": true
41
+ }
42
+ },
43
+ "additionalProperties": true
44
+ }
45
+ }
46
+ },
47
+ "additionalProperties": true
48
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/runtime-telemetry.schema.json",
4
+ "title": "MotionLoom runtime frame telemetry",
5
+ "type": "object",
6
+ "required": ["schema_version", "run_id", "generated_at", "mode", "scene", "framework", "runtime", "samples", "metrics", "status"],
7
+ "properties": {
8
+ "schema_version": {"type": "string", "const": "1.0"},
9
+ "run_id": {"type": "string", "minLength": 1},
10
+ "generated_at": {"type": "string", "format": "date-time"},
11
+ "mode": {"type": "string", "const": "runtime-telemetry"},
12
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9._-]+$"},
13
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9._-]+$"},
14
+ "framework": {"type": "string", "minLength": 1},
15
+ "runtime": {"type": "string", "minLength": 1},
16
+ "source_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
17
+ "manifest_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
18
+ "motion_ir_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
19
+ "samples": {
20
+ "type": "array",
21
+ "minItems": 3,
22
+ "items": {
23
+ "type": "object",
24
+ "required": ["sequence", "percent", "captured_at_ms", "raf_intervals_ms", "state_sha256", "state"],
25
+ "properties": {
26
+ "sequence": {"type": "integer", "minimum": 0},
27
+ "percent": {"type": "number", "minimum": 0, "maximum": 100},
28
+ "captured_at_ms": {"type": "number", "minimum": 0},
29
+ "raf_intervals_ms": {"type": "array", "minItems": 1, "items": {"type": "number", "exclusiveMinimum": 0, "maximum": 1000}},
30
+ "state_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
31
+ "state": {"type": "object"}
32
+ },
33
+ "additionalProperties": true
34
+ }
35
+ },
36
+ "metrics": {
37
+ "type": "object",
38
+ "required": ["sample_count", "raf_interval_count", "max_raf_interval_ms", "p95_raf_interval_ms"],
39
+ "properties": {
40
+ "sample_count": {"type": "integer", "minimum": 3},
41
+ "raf_interval_count": {"type": "integer", "minimum": 1},
42
+ "max_raf_interval_ms": {"type": "number", "exclusiveMinimum": 0},
43
+ "p95_raf_interval_ms": {"type": "number", "exclusiveMinimum": 0}
44
+ },
45
+ "additionalProperties": true
46
+ },
47
+ "status": {"type": "string", "enum": ["pass", "fail"]}
48
+ },
49
+ "additionalProperties": true
50
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/scene-manifest.schema.json",
4
+ "title": "Animation scene manifest",
5
+ "type": "object",
6
+ "required": ["name", "description", "framework", "category", "file", "source_binding", "checks"],
7
+ "properties": {
8
+ "name": {"type": "string", "minLength": 1},
9
+ "description": {"type": "string", "minLength": 1},
10
+ "framework": {"type": "string", "minLength": 1},
11
+ "category": {"type": "string", "minLength": 1},
12
+ "file": {"type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*\\.\\.).+$"},
13
+ "runtime_evidence": {"type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*\\.\\.).+$"},
14
+ "source_binding": {
15
+ "type": "object",
16
+ "required": ["kind", "source_path", "authority", "license", "sha256"],
17
+ "properties": {
18
+ "kind": {"type": "string", "enum": ["project", "library", "generated", "fixture", "remote"]},
19
+ "source_path": {"type": "string", "minLength": 1, "pattern": "^(?!/)(?!.*\\.\\.).+$"},
20
+ "source_url": {"type": "string", "format": "uri-reference"},
21
+ "authority": {"type": "string", "minLength": 1},
22
+ "license": {"type": "string", "minLength": 1},
23
+ "attribution": {"type": "string"},
24
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}
25
+ },
26
+ "additionalProperties": false
27
+ },
28
+ "checks": {
29
+ "type": "array",
30
+ "minItems": 1,
31
+ "items": {
32
+ "type": "object",
33
+ "required": ["id", "label", "pass"],
34
+ "properties": {
35
+ "id": {"type": "string", "minLength": 1},
36
+ "label": {"type": "string", "minLength": 1},
37
+ "detail": {"type": "string"},
38
+ "pass": {"const": true}
39
+ },
40
+ "additionalProperties": true
41
+ }
42
+ }
43
+ },
44
+ "additionalProperties": true
45
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/semantic-benchmark.schema.json",
4
+ "title": "MotionLoom semantic lint benchmark report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "benchmark_id", "task_id", "scene", "operation", "iterations", "threshold_ms", "samples_ms", "average_ms", "p95_ms", "status", "rule_count", "rule_ids", "generated_at"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "benchmark_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
13
+ "operation": {"const": "semantic-lint-build"},
14
+ "iterations": {"type": "integer", "minimum": 1},
15
+ "threshold_ms": {"type": "number", "exclusiveMinimum": 0},
16
+ "samples_ms": {"type": "array", "minItems": 1, "items": {"type": "number", "minimum": 0}},
17
+ "average_ms": {"type": "number", "minimum": 0},
18
+ "p95_ms": {"type": "number", "minimum": 0},
19
+ "status": {"enum": ["pass", "fail"]},
20
+ "rule_count": {"type": "integer", "minimum": 1},
21
+ "rule_ids": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
22
+ "lint_status": {"enum": ["pass", "warn", "fail"]},
23
+ "lint_finding_count": {"type": "integer", "minimum": 0},
24
+ "generated_at": {"type": "string", "format": "date-time"}
25
+ }
26
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/semantic-lint-report.schema.json",
4
+ "title": "MotionLoom semantic motion lint report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "report_id", "task_id", "scene", "status", "ruleset", "summary", "findings", "generated_at"],
8
+ "properties": {
9
+ "schema_version": {"const": "0.1"},
10
+ "report_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
11
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
12
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
13
+ "status": {"type": "string", "enum": ["pass", "warn", "fail"]},
14
+ "ruleset": {"type": "object", "additionalProperties": false, "required": ["id", "version"], "properties": {"id": {"type": "string", "minLength": 1}, "version": {"type": "string", "minLength": 1}}},
15
+ "context_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
16
+ "motion_ir": {"type": "object", "additionalProperties": false, "required": ["path", "sha256"], "properties": {"path": {"type": "string", "minLength": 1}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}}},
17
+ "summary": {"$ref": "#/$defs/summary"},
18
+ "findings": {"type": "array", "items": {"$ref": "#/$defs/finding"}},
19
+ "generated_at": {"type": "string", "format": "date-time"}
20
+ },
21
+ "$defs": {
22
+ "summary": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["total", "errors", "warnings", "infos", "blocking"],
26
+ "properties": {"total": {"type": "integer", "minimum": 0}, "errors": {"type": "integer", "minimum": 0}, "warnings": {"type": "integer", "minimum": 0}, "infos": {"type": "integer", "minimum": 0}, "blocking": {"type": "integer", "minimum": 0}}
27
+ },
28
+ "finding": {
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "required": ["id", "rule_id", "category", "severity", "confidence", "basis", "message", "evidence_refs", "affected_paths", "approval_blocking"],
32
+ "properties": {
33
+ "id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
34
+ "rule_id": {"type": "string", "minLength": 1},
35
+ "category": {"type": "string", "enum": ["intent", "timing", "easing", "accessibility", "performance", "continuity", "anti_pattern"]},
36
+ "severity": {"type": "string", "enum": ["info", "warning", "error"]},
37
+ "confidence": {"type": "number", "minimum": 0, "maximum": 1},
38
+ "basis": {"type": "string", "enum": ["deterministic", "runtime", "human", "heuristic"]},
39
+ "message": {"type": "string", "minLength": 1},
40
+ "rationale": {"type": "string"},
41
+ "evidence_refs": {"type": "array", "items": {"type": "string", "minLength": 1}},
42
+ "affected_paths": {"type": "array", "items": {"type": "string", "minLength": 1}},
43
+ "suggested_action": {"type": "string"},
44
+ "approval_blocking": {"type": "boolean"}
45
+ }
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/signed-attestation.schema.json",
4
+ "title": "MotionLoom DSSE-compatible signed animation evidence attestation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema_version", "envelope", "statement", "approval"],
8
+ "properties": {
9
+ "schema_version": {"const": "1.0"},
10
+ "envelope": {
11
+ "type": "object",
12
+ "additionalProperties": false,
13
+ "required": ["payload_type", "payload_sha256", "payload_base64", "signatures"],
14
+ "properties": {
15
+ "payload_type": {"const": "application/vnd.motionloom.attestation+json;version=1"},
16
+ "payload_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
17
+ "payload_base64": {"type": "string", "minLength": 1, "pattern": "^[A-Za-z0-9+/=_-]+$"},
18
+ "signatures": {
19
+ "type": "array",
20
+ "minItems": 1,
21
+ "items": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": ["key_id", "algorithm", "signature_base64"],
25
+ "properties": {
26
+ "key_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/-]{2,127}$"},
27
+ "algorithm": {"type": "string", "enum": ["ed25519"]},
28
+ "signature_base64": {"type": "string", "minLength": 1, "pattern": "^[A-Za-z0-9+/=_-]+$"}
29
+ }
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "statement": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": ["type", "subject", "predicate_type", "predicate"],
38
+ "properties": {
39
+ "type": {"const": "https://motionloom.dev/attestation/v1"},
40
+ "subject": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "items": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": ["name", "digest"],
47
+ "properties": {
48
+ "name": {"type": "string", "minLength": 1},
49
+ "digest": {"type": "object", "additionalProperties": false, "required": ["sha256"], "properties": {"sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}}}
50
+ }
51
+ }
52
+ },
53
+ "predicate_type": {"const": "https://motionloom.dev/predicate/animation-evidence/v1"},
54
+ "predicate": {"$ref": "#/$defs/predicate"}
55
+ }
56
+ },
57
+ "approval": {"type": "boolean", "const": false}
58
+ },
59
+ "$defs": {
60
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
61
+ "predicate": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "required": ["task_id", "scene", "context_hash", "source_sha256", "manifest_sha256", "motion_ir_sha256", "evidence", "provenance_chain_hash", "policy_version", "generated_at", "builder"],
65
+ "properties": {
66
+ "task_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
67
+ "scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
68
+ "context_hash": {"$ref": "#/$defs/sha256"},
69
+ "source_sha256": {"$ref": "#/$defs/sha256"},
70
+ "manifest_sha256": {"$ref": "#/$defs/sha256"},
71
+ "motion_ir_sha256": {"$ref": "#/$defs/sha256"},
72
+ "evidence": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "required": ["runtime_evidence_sha256", "runtime_telemetry_sha256", "verifier_report_sha256"],
76
+ "properties": {
77
+ "runtime_evidence_sha256": {"$ref": "#/$defs/sha256"},
78
+ "runtime_telemetry_sha256": {"$ref": "#/$defs/sha256"},
79
+ "verifier_report_sha256": {"$ref": "#/$defs/sha256"},
80
+ "visual_comparison_sha256": {"$ref": "#/$defs/sha256"}
81
+ }
82
+ },
83
+ "provenance_chain_hash": {"$ref": "#/$defs/sha256"},
84
+ "policy_version": {"type": "string", "minLength": 1},
85
+ "generated_at": {"type": "string", "format": "date-time"},
86
+ "builder": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "required": ["name", "version"],
90
+ "properties": {"name": {"type": "string", "minLength": 1}, "version": {"type": "string", "minLength": 1}}
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }