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.
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/SKILL.md +122 -0
- package/agent-card.json +161 -0
- package/assets/library/ATTRIBUTION.md +6 -0
- package/assets/library/README.md +20 -0
- package/assets/library/avatar-base.svg +19 -0
- package/assets/library/error-alert.json +1 -0
- package/assets/library/rive/ATTRIBUTION.md +12 -0
- package/assets/library/rive/state-machine-test.riv +0 -0
- package/assets/library/success-check.json +1 -0
- package/bin/motionloom.mjs +81 -0
- package/docs/BROWSER-REVIEW-E2E.md +78 -0
- package/docs/CATEGORIES.md +16 -0
- package/docs/CHECKLIST.md +31 -0
- package/docs/DEEP-AUDIT-WORKING-NOTES.md +22 -0
- package/docs/FRAMEWORK-SELECTION.md +26 -0
- package/docs/PROJECT-MANIFEST.md +37 -0
- package/docs/ROADMAP-INTELLIGENCE.md +224 -0
- package/docs/audits/1.10.0-attestation-research-notes.md +19 -0
- package/docs/audits/1.8.0-trust-boundary-hardening.md +56 -0
- package/docs/audits/1.9.0-evidence-interoperability-threat-model.md +37 -0
- package/docs/audits/2.0.0-attestation-acceptance.md +30 -0
- package/docs/releases/1.5.0.md +25 -0
- package/docs/releases/1.6.0.md +27 -0
- package/docs/releases/1.7.0.md +23 -0
- package/docs/releases/1.8.0.md +23 -0
- package/docs/releases/1.9.0.md +21 -0
- package/docs/releases/2.0.0.md +21 -0
- package/docs/releases/npm-publish-from-workstation.md +88 -0
- package/docs/research/AGENT-PROTOCOL-FINDINGS.md +43 -0
- package/examples/report-demo/REPORT.md +50 -0
- package/examples/report-demo/artifact-manifest.json +25 -0
- package/examples/report-demo/decision-log.jsonl +0 -0
- package/examples/report-demo/execution-report.json +70 -0
- package/examples/report-demo/handoff.json +22 -0
- package/examples/report-demo/issue-register.json +5 -0
- package/examples/report-demo/task.json +13 -0
- package/package.json +95 -0
- package/project-context.example.json +26 -0
- package/references/browser-review-contract.md +32 -0
- package/references/dotlottie-source-notes.md +21 -0
- package/references/intelligence-core.md +98 -0
- package/references/reporting-contract.md +38 -0
- package/references/runtime-capability.md +12 -0
- package/references/signed-attestation.md +31 -0
- package/schemas/artifact-manifest.schema.json +22 -0
- package/schemas/browser-review-candidate.schema.json +24 -0
- package/schemas/capability-registry.schema.json +61 -0
- package/schemas/continuity-report.schema.json +52 -0
- package/schemas/evidence-verifier-report.schema.json +35 -0
- package/schemas/execution-report.schema.json +35 -0
- package/schemas/fix-plan.schema.json +44 -0
- package/schemas/handoff.schema.json +19 -0
- package/schemas/motion-ir.schema.json +74 -0
- package/schemas/project-graph.schema.json +70 -0
- package/schemas/provenance.schema.json +76 -0
- package/schemas/runtime-evidence.schema.json +48 -0
- package/schemas/runtime-telemetry.schema.json +50 -0
- package/schemas/scene-manifest.schema.json +45 -0
- package/schemas/semantic-benchmark.schema.json +26 -0
- package/schemas/semantic-lint-report.schema.json +48 -0
- package/schemas/signed-attestation.schema.json +95 -0
- package/schemas/task.schema.json +39 -0
- package/schemas/trust-policy.schema.json +53 -0
- package/scripts/analyze.sh +13 -0
- package/scripts/attestation-keygen.py +63 -0
- package/scripts/attestation-verifier.py +178 -0
- package/scripts/attestation.py +288 -0
- package/scripts/capture-runtime-telemetry.sh +37 -0
- package/scripts/devlab.sh +77 -0
- package/scripts/eval-intelligence.py +377 -0
- package/scripts/evidence-verifier.py +222 -0
- package/scripts/fetch-library.sh +57 -0
- package/scripts/intelligence.py +1543 -0
- package/scripts/manifest.py +61 -0
- package/scripts/pr.sh +103 -0
- package/scripts/quality-gate.py +378 -0
- package/scripts/render-node.mjs +53 -0
- package/scripts/render.sh +37 -0
- package/scripts/report-contract.py +181 -0
- package/scripts/report.py +588 -0
- package/scripts/review-hook.py +199 -0
- package/scripts/runtime-adapters.mjs +187 -0
- package/scripts/skill-doctor.py +150 -0
- package/scripts/to-dotlottie.mjs +99 -0
- package/scripts/to-dotlottie.sh +25 -0
- package/scripts/validate-lottie.py +102 -0
- package/src/core/analyzer.py +226 -0
- package/src/core/snapshot.py +124 -0
- package/src/core/spec.py +240 -0
- package/src/output/browser-review-smoke/animation.json +57 -0
- package/src/output/browser-review-smoke/browser-review.json +21 -0
- package/src/output/browser-review-smoke/manifest.json +22 -0
- package/src/output/browser-review-smoke/motion-spec.json +28 -0
- package/src/output/browser-review-smoke/snapshot/.render-meta.json +10 -0
- package/src/output/browser-review-smoke/snapshot/frame-00.png +0 -0
- package/src/output/browser-review-smoke/snapshot/frame-100.png +0 -0
- package/src/output/browser-review-smoke/snapshot/frame-50.png +0 -0
- package/src/rig/README.md +35 -0
- package/src/rig/cutout_rig.py +211 -0
- package/templates/framer-motion/ui-micro.tsx +50 -0
- package/templates/gsap/scroll-scene.js +54 -0
- package/templates/lottie/README.md +21 -0
- package/templates/lottie/react-component.tsx +82 -0
- package/templates/lottie/scaffold/animation.json +57 -0
- package/templates/lottie/scaffold/character-rig.svg +19 -0
- package/templates/lottie/vanilla.js +68 -0
- package/templates/rive/README.md +36 -0
- package/tests/evals/intelligence-cases.json +131 -0
- package/tests/scripts/run_tests.py +843 -0
- 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
|
+
}
|