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
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "motionloom",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "MotionLoom: project-aware animation Skill with graph, provenance, Motion IR, runtime telemetry, DSSE-compatible signed attestation, external evidence verification and Dev Lab review.",
|
|
6
|
+
"bin": {
|
|
7
|
+
"motionloom": "bin/motionloom.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"README.md",
|
|
11
|
+
"SKILL.md",
|
|
12
|
+
"LICENSE",
|
|
13
|
+
"agent-card.json",
|
|
14
|
+
"bin",
|
|
15
|
+
"scripts",
|
|
16
|
+
"src",
|
|
17
|
+
"templates",
|
|
18
|
+
"assets",
|
|
19
|
+
"schemas",
|
|
20
|
+
"references",
|
|
21
|
+
"docs",
|
|
22
|
+
"examples",
|
|
23
|
+
"project-context.example.json",
|
|
24
|
+
"tests/evals",
|
|
25
|
+
"tests/scripts/run_tests.py",
|
|
26
|
+
"tests/scripts/test_attestation.py"
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"animation",
|
|
30
|
+
"agent-skill",
|
|
31
|
+
"motion-design",
|
|
32
|
+
"lottie",
|
|
33
|
+
"dotlottie",
|
|
34
|
+
"rive",
|
|
35
|
+
"gsap",
|
|
36
|
+
"framer-motion",
|
|
37
|
+
"runtime-evidence",
|
|
38
|
+
"developer-tools"
|
|
39
|
+
],
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/lenhonbp/MotionLoom.git"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/lenhonbp/MotionLoom#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/lenhonbp/MotionLoom/issues"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18",
|
|
53
|
+
"python": ">=3.11"
|
|
54
|
+
},
|
|
55
|
+
"scripts": {
|
|
56
|
+
"prepack": "find . -type d -name __pycache__ -prune -exec rm -rf {} + && find . -type f \\( -name '*.pyc' -o -name '*.pyo' \\) -delete",
|
|
57
|
+
"test": "python3 tests/scripts/run_tests.py",
|
|
58
|
+
"validate": "python3 scripts/quality-gate.py --all",
|
|
59
|
+
"doctor": "python3 scripts/skill-doctor.py --json",
|
|
60
|
+
"report": "python3 scripts/report.py",
|
|
61
|
+
"report:check": "python3 scripts/report-contract.py",
|
|
62
|
+
"review": "python3 scripts/review-hook.py",
|
|
63
|
+
"manifest": "python3 scripts/manifest.py",
|
|
64
|
+
"intelligence": "python3 scripts/intelligence.py",
|
|
65
|
+
"intelligence:registry": "python3 scripts/intelligence.py capabilities build --output capability-registry.json",
|
|
66
|
+
"intelligence:registry:check": "python3 scripts/intelligence.py capabilities validate --path capability-registry.json",
|
|
67
|
+
"intelligence:p1": "python3 scripts/intelligence.py",
|
|
68
|
+
"quality:p1": "python3 scripts/quality-gate.py --require-intelligence --require-p1 --require-benchmark",
|
|
69
|
+
"eval:intelligence": "python3 scripts/eval-intelligence.py",
|
|
70
|
+
"benchmark:semantic": "python3 scripts/intelligence.py semantic-lint benchmark --task-dir artifacts/professional-review-e2e --iterations 25 --threshold-ms 500",
|
|
71
|
+
"evidence:verify": "python3 scripts/evidence-verifier.py --scene-dir src/output/browser-review-smoke --task-dir artifacts/browser-review-smoke-task --runtime-evidence runtime-adapters/runtime-evidence.json --max-age-days 1 --output artifacts/browser-review-smoke-task/evidence-verifier-report.json",
|
|
72
|
+
"attestation:build": "python3 scripts/attestation.py build",
|
|
73
|
+
"attestation:verify": "python3 scripts/attestation-verifier.py",
|
|
74
|
+
"attestation:policy": "python3 scripts/attestation.py validate-policy",
|
|
75
|
+
"attestation:keygen": "python3 scripts/attestation-keygen.py",
|
|
76
|
+
"quality:telemetry": "python3 scripts/quality-gate.py --scene browser-review-smoke --context artifacts/browser-review-smoke-task/project-context.json --task-dir artifacts/browser-review-smoke-task --require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry",
|
|
77
|
+
"quality:attestation": "python3 scripts/quality-gate.py --scene browser-review-smoke --context artifacts/browser-review-smoke-task/project-context.json --task-dir artifacts/browser-review-smoke-task --require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation",
|
|
78
|
+
"pack:dotlottie": "bash scripts/to-dotlottie.sh",
|
|
79
|
+
"runtime:test": "node scripts/runtime-adapters.mjs"
|
|
80
|
+
},
|
|
81
|
+
"dependencies": {
|
|
82
|
+
"@lottiefiles/dotlottie-web": "^0.79.0",
|
|
83
|
+
"@napi-rs/canvas": "^1.0.5",
|
|
84
|
+
"@rive-app/canvas": "^2.39.2",
|
|
85
|
+
"framer-motion": "^13.1.0",
|
|
86
|
+
"gsap": "^3.15.0",
|
|
87
|
+
"react": "^19.2.8",
|
|
88
|
+
"react-dom": "^19.2.8"
|
|
89
|
+
},
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"playwright": "^1.62.1",
|
|
92
|
+
"vite": "^8.2.1"
|
|
93
|
+
},
|
|
94
|
+
"license": "MIT"
|
|
95
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.1",
|
|
3
|
+
"name": "host-project",
|
|
4
|
+
"project_root": "/absolute/path/to/host-project",
|
|
5
|
+
"stack": {
|
|
6
|
+
"framework": "framer-motion",
|
|
7
|
+
"react": true,
|
|
8
|
+
"vue": false,
|
|
9
|
+
"react_native": false,
|
|
10
|
+
"native_web": false
|
|
11
|
+
},
|
|
12
|
+
"brand": {
|
|
13
|
+
"primary": "#2563EB",
|
|
14
|
+
"accent": "#F59E0B",
|
|
15
|
+
"palette": [],
|
|
16
|
+
"fonts": []
|
|
17
|
+
},
|
|
18
|
+
"motion_language": {
|
|
19
|
+
"easings_used": [],
|
|
20
|
+
"duration_patterns": [],
|
|
21
|
+
"recommendation": "ease-out"
|
|
22
|
+
},
|
|
23
|
+
"existing_animations": [],
|
|
24
|
+
"manifest_overrides": {},
|
|
25
|
+
"source_authority": "project-manifest.json then assets/library/, never invented geometry"
|
|
26
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Browser review contract
|
|
2
|
+
|
|
3
|
+
Browser review is a required post-render handoff, not a separate skill. The Animation Skill prepares a candidate, then triggers or suggests a browser-capable Agent to open the internal Dev Lab URL. The browser Agent must inspect the exact candidate scene, not a demo scene or a different build.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
rendered → review_required → candidate prepared → internal browser opened
|
|
7
|
+
→ user reviews/fixes → review.json approved or changes_requested
|
|
8
|
+
→ validated → ready_for_pr → explicit confirmation
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Prepare a candidate with:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
python3 scripts/review-hook.py prepare \
|
|
15
|
+
--task-dir artifacts/<task-id> \
|
|
16
|
+
--lab-url http://127.0.0.1:3300
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The command writes `browser-review.json` into the task bundle and scene output, records a deterministic `candidate_id`, binds the candidate to the context and animation source SHA-256, and emits JSON containing the exact URL and the next browser Agent action.
|
|
20
|
+
|
|
21
|
+
The browser-capable Agent must open the emitted URL, inspect frames 0/50/100, scrub the timeline, check the quality checklist, record notes, and ask the user for approval. The page exposes `window.__lab.getReview()` so the Agent can capture the review payload without relying on a downloaded file. Persist the captured payload with:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 scripts/report.py review \
|
|
25
|
+
--task-dir artifacts/<task-id> \
|
|
26
|
+
--decision approved \
|
|
27
|
+
--candidate-id <candidate-id> \
|
|
28
|
+
--reviewer user \
|
|
29
|
+
--notes "Reviewed in the internal Dev Lab"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`ready_for_pr` and `confirmed` are rejected unless the review decision is `approved` and the candidate identity still matches the source, context and task. If the user requests a change, record `changes_requested`, add the issue, return to generation/rendering, and prepare a new candidate. Opening a browser is allowed as a review side effect; commit, push and PR remain explicit confirmation side effects.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# dotLottie implementation notes
|
|
2
|
+
|
|
3
|
+
These notes preserve the external format facts used for the `.lottie` packager.
|
|
4
|
+
|
|
5
|
+
## Sources
|
|
6
|
+
|
|
7
|
+
- https://dotlottie.io/spec/2.0/
|
|
8
|
+
- https://docs.lottiefiles.com/en/format/dotlottie/structure
|
|
9
|
+
- https://github.com/LottieFiles/dotlottie-web/blob/main/SKILL.md
|
|
10
|
+
|
|
11
|
+
## Contract used by this repository
|
|
12
|
+
|
|
13
|
+
- A `.lottie` file is a ZIP archive using the `application/zip+dotlottie` format.
|
|
14
|
+
- `manifest.json` is required at the archive root.
|
|
15
|
+
- `a/` is required and contains at least one Lottie JSON animation.
|
|
16
|
+
- The v2 manifest requires `version: "2"` and `animations` with unique `id` values.
|
|
17
|
+
- `initial.animation`, when present, names an animation ID stored under `a/`.
|
|
18
|
+
- Optional directories include `i/` for images, `t/` for themes, `s/` for state machines and `f/` for fonts.
|
|
19
|
+
- Animation IDs should use the dotLottie filename-safe pattern: alphanumeric characters, dots, underscores, spaces and hyphens.
|
|
20
|
+
- Runtime rendering should use the official dotLottie runtime; synchronous frame capture uses `autoplay: false`, load completion, then `setFrame()`.
|
|
21
|
+
- The package/runtime reference recommends `.lottie` over raw JSON for compression, bundled assets, themes and state machines.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Intelligence Core v0.1
|
|
2
|
+
|
|
3
|
+
Use this reference when an Agent needs to understand or extend MotionLoom's task-bound intelligence contracts. The core is deterministic and artifact-first: it indexes relationships, attests pipeline steps, filters runtime capabilities, describes framework-neutral motion intent and verifies replay integrity. It does not make an aesthetic claim or replace human review.
|
|
4
|
+
|
|
5
|
+
## Contract map
|
|
6
|
+
|
|
7
|
+
| Artifact | Command | Acceptance role |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| `project-graph.json` | `python3 scripts/intelligence.py graph build --task-dir <task>` | Links project, intent, scene, context, artifacts and review with task identity and hashes. |
|
|
10
|
+
| `provenance.json` | `python3 scripts/intelligence.py provenance build --task-dir <task>` | Records step actor, builder, materials, products, policy, result and parent chain hash. |
|
|
11
|
+
| `capability-registry.json` | `python3 scripts/intelligence.py capabilities build --output <path>` | Describes verified/scaffold-only adapters, evidence freshness, compatibility, fallback and side effects. |
|
|
12
|
+
| `motion-ir.json` | `python3 scripts/intelligence.py motion-ir build --task-dir <task>` | Binds framework-neutral tracks and accessibility policy to task, scene, context and source. |
|
|
13
|
+
| `replay-bundle.json` | `python3 scripts/intelligence.py replay capture --root <root> --task-dir <task>` | Captures clean-root artifact hashes and environment metadata; verification fails on mutation or omission. |
|
|
14
|
+
| `semantic-lint-report.json` | `python3 scripts/intelligence.py semantic-lint build --task-dir <task>` | Reports intent, timing, easing, accessibility, performance and anti-pattern findings with severity, confidence and evidence. |
|
|
15
|
+
| `semantic-lint-benchmark.json` | `python3 scripts/intelligence.py semantic-lint benchmark --task-dir <task>` | Measures in-process semantic-lint execution, rule coverage and p95 against a deterministic threshold; it is a performance contract, not visual approval. |
|
|
16
|
+
| `runtime-telemetry.json` | `bash scripts/capture-runtime-telemetry.sh <scene> artifacts/<task-id>` | Records deterministic scrub-point observations, RAF timing, runtime state hashes and source/manifest/Motion IR bindings from the real adapter harness. |
|
|
17
|
+
| `evidence-verifier-report.json` | `python3 scripts/evidence-verifier.py --scene-dir <scene-dir> --task-dir <task> --runtime-evidence <path>` | Read-only external verification result for task/scene/path/hash/age integrity; `approval` is always `false`. |
|
|
18
|
+
| `attestation-statement.json` | `python3 scripts/attestation.py statement --scene-dir <scene-dir> --task-dir <task> --context <context>` | Derives canonical task/scene/source/manifest/Motion IR/evidence hash bindings before signing. |
|
|
19
|
+
| `attestation.json` | `python3 scripts/attestation.py build --statement <statement> --private-key <key> --key-id <id>` | DSSE-compatible Ed25519 envelope over the versioned statement; `approval` is always `false`. |
|
|
20
|
+
| `trust-policy.json` | `python3 scripts/attestation.py validate-policy --path <policy>` | Declares trusted keys, validity, rotation and fail-closed revocation behavior. |
|
|
21
|
+
| `attestation-verifier-report.json` | `python3 scripts/attestation-verifier.py --attestation <bundle> --trust-policy <policy>` | Independent verifier result with stable exit codes 0/10/11/12/13/14; verification never grants approval. |
|
|
22
|
+
| `continuity-report.json` | `python3 scripts/intelligence.py continuity build --task-dirs <task>...` | Checks context, intent, Motion IR and transition continuity across an ordered scene set. |
|
|
23
|
+
| `fix-plan.json` | `python3 scripts/intelligence.py fix-plan build --task-dir <task> --reports <report>...` | Converts findings into root cause, patch scope, selective rerun scope, verification and user-review requirements. |
|
|
24
|
+
|
|
25
|
+
## Agent operating rules
|
|
26
|
+
|
|
27
|
+
The Agent must build the graph, Motion IR, provenance, replay bundle, P1 feedback reports and semantic-lint benchmark after render and before the strict quality gate. For a strict observability run it must also capture runtime telemetry and run the external verifier before `--require-telemetry`. For a production trust run it must derive/sign `attestation.json`, copy or resolve a managed `trust-policy.json`, run the independent attestation verifier and use `--require-attestation`. It must run the report completeness contract for changed scenes; that contract selects one deterministic passing task bundle and fails on ambiguous ties. It may use a verified capability only when the registry evidence is fresh, its hash matches the referenced file and the target environment is compatible. `scaffold_only` is a planning option, never a production acceptance result.
|
|
28
|
+
|
|
29
|
+
The graph and provenance are evidence indexes, not approval tokens. A valid graph cannot bypass source binding, runtime assertions, browser review, reviewer consent or the `OPEN_PR=0` default. A confidence or risk value can prioritize investigation but cannot replace a deterministic rule or human decision.
|
|
30
|
+
|
|
31
|
+
All task-bound paths are resolved under their declared root and symlink traversal is rejected. Replay additionally binds `task_dir`, `task_id`, scene and every recorded file to the same task bundle. Browser-review and Dev Lab handoffs must use same-origin artifact/task bases and must agree on task, scene and candidate identity; expiry or mismatch is a review failure, not a warning to ignore.
|
|
32
|
+
|
|
33
|
+
## Strict validation
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
python3 scripts/intelligence.py graph validate --path artifacts/<task-id>/project-graph.json
|
|
37
|
+
python3 scripts/intelligence.py motion-ir validate --path artifacts/<task-id>/motion-ir.json
|
|
38
|
+
python3 scripts/intelligence.py provenance validate --task-dir artifacts/<task-id>
|
|
39
|
+
python3 scripts/intelligence.py replay verify \
|
|
40
|
+
--root . --bundle artifacts/<task-id>/replay-bundle.json
|
|
41
|
+
python3 scripts/intelligence.py semantic-lint validate \
|
|
42
|
+
--path artifacts/<task-id>/semantic-lint-report.json
|
|
43
|
+
python3 scripts/intelligence.py semantic-lint benchmark \
|
|
44
|
+
--task-dir artifacts/<task-id> --iterations 25 --threshold-ms 500
|
|
45
|
+
python3 scripts/evidence-verifier.py \
|
|
46
|
+
--scene-dir src/output/<scene> \
|
|
47
|
+
--task-dir artifacts/<task-id> \
|
|
48
|
+
--runtime-evidence runtime-adapters/runtime-evidence.json \
|
|
49
|
+
--max-age-days 1 \
|
|
50
|
+
--output artifacts/<task-id>/evidence-verifier-report.json
|
|
51
|
+
python3 scripts/attestation.py statement \
|
|
52
|
+
--scene-dir src/output/<scene> \
|
|
53
|
+
--task-dir artifacts/<task-id> \
|
|
54
|
+
--context <project-context.json> \
|
|
55
|
+
--output artifacts/<task-id>/attestation-statement.json
|
|
56
|
+
python3 scripts/attestation.py build \
|
|
57
|
+
--statement artifacts/<task-id>/attestation-statement.json \
|
|
58
|
+
--private-key <managed-ed25519-key> --key-id <key-id> \
|
|
59
|
+
--output artifacts/<task-id>/attestation.json
|
|
60
|
+
python3 scripts/attestation-verifier.py \
|
|
61
|
+
--attestation artifacts/<task-id>/attestation.json \
|
|
62
|
+
--trust-policy artifacts/<task-id>/trust-policy.json \
|
|
63
|
+
--expected-task-id <task-id> --expected-scene <scene> \
|
|
64
|
+
--output artifacts/<task-id>/attestation-verifier-report.json
|
|
65
|
+
python3 scripts/intelligence.py continuity validate \
|
|
66
|
+
--path artifacts/<task-id>/continuity-report.json
|
|
67
|
+
python3 scripts/intelligence.py fix-plan validate \
|
|
68
|
+
--path artifacts/<task-id>/fix-plan.json
|
|
69
|
+
python3 scripts/quality-gate.py \
|
|
70
|
+
--scene <scene> \
|
|
71
|
+
--context <project-context.json> \
|
|
72
|
+
--task-dir artifacts/<task-id> \
|
|
73
|
+
--require-browser-review --require-intelligence --require-p1 --require-benchmark --require-telemetry --require-attestation
|
|
74
|
+
python3 scripts/eval-intelligence.py
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The replay policy excludes generated reports and manifests because `report.py collect` and `report.py render` legitimately rewrite them. Source, spec, runtime evidence, review, graph, provenance and Motion IR remain integrity-bound. If any bound artifact changes, replay must be captured again or the gate must reject it.
|
|
78
|
+
|
|
79
|
+
## Failure semantics
|
|
80
|
+
|
|
81
|
+
| Failure | Meaning | Agent action |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| `missing project-graph.json` or `missing motion-ir.json` | Intelligence artifacts were not built | Run the corresponding build command; do not mark the task validated. |
|
|
84
|
+
| `no capability satisfies the registry selection policy` | Runtime is stale, unsupported, scaffold-only or tampered | Choose another verified adapter or ask the user for an explicit exception. |
|
|
85
|
+
| `project graph edge references an unknown node` | Relationship index is corrupt | Rebuild the graph from the task bundle and inspect changed artifacts. |
|
|
86
|
+
| `replay bundle has mismatch(es)` | A bound artifact changed after capture | Identify the changed path, rerun only the affected pipeline scope, then capture replay again. |
|
|
87
|
+
| `semantic lint status: warn` | A heuristic or human-review finding exists | Preserve the finding, generate `fix-plan.json`, and request review; do not turn a warning into approval. |
|
|
88
|
+
| `semantic lint benchmark status: fail` | Semantic-lint p95 execution is at or above its declared threshold | Reduce lint complexity or raise the threshold only with an explicit contract change and new eval evidence; do not treat the benchmark as a visual-quality score. |
|
|
89
|
+
| `continuity report has drift` | Scene context, intent, asset or transition contract changed | Rerun only the affected scenes and transitions, then verify the updated continuity report. |
|
|
90
|
+
| `fix-plan source report hash mismatch` | The plan no longer describes the reports that produced it | Regenerate the plan from current reports before proposing a patch. |
|
|
91
|
+
| Browser review or approval failure | Candidate is not approved by the right reviewer/task | Return to Dev Lab review; never synthesize `review.json`. |
|
|
92
|
+
| `artifact is missing or outside task bundle` | A graph, provenance or replay record attempts to escape its declared task root or traverse a symlink | Stop the task, inspect the path and rebuild the artifact from a clean task bundle. |
|
|
93
|
+
| `ambiguous passing task bundles share the same state and updated_at` | More than one task bundle could supply evidence for the same changed scene | Resolve the duplicate explicitly and rerun the report contract; never merge evidence by filename order. |
|
|
94
|
+
| `artifact_base must share the Dev Lab origin` or identity binding failure | Dev Lab query parameters would mix an external or foreign task/candidate bundle | Reject the handoff and regenerate the review URL from the canonical task bundle. |
|
|
95
|
+
| `runtime telemetry verification failed` | Scrub-point evidence is stale, tampered, missing, cross-task, path-escaped or bound to different source/manifest/Motion IR bytes | Re-run the real runtime capture from the canonical scene/task bundle, then verify again; never treat the verifier as approval. |
|
|
96
|
+
| `attestation verification failed` | Payload hash, DSSE signature, signer validity/revocation, policy lookup, path binding or expected task/scene binding failed | Regenerate the statement from current artifacts, re-run the external verifier against a managed policy and investigate signer lifecycle; never flip `approval` or bypass user review. |
|
|
97
|
+
|
|
98
|
+
The public eval corpus is `tests/evals/intelligence-cases.json`. It covers positive verified selection plus scaffold-only, stale evidence, tampering, graph corruption, replay tamper and foreign-task candidate failures. P1 extends the acceptance surface with semantic warning preservation, generic-intent detection, multi-scene context drift, selective rerun binding, performance budget/frame-rate warnings, perceptual easing/reduced-motion warnings and benchmark execution time. The 1.9.0 slice adds runtime telemetry happy-path, state tamper, cross-task identity, stale evidence and symlink escape cases. The 2.0.0 slice adds clean attestation, payload tamper, binding mismatch, revoked signer and unknown signer cases without weakening the approval=false and human-review invariants.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Reporting and handoff contract
|
|
2
|
+
|
|
3
|
+
Use this reference when a task needs to be continued by another Agent or reviewed by a human.
|
|
4
|
+
|
|
5
|
+
## Required artifact roles
|
|
6
|
+
|
|
7
|
+
| File | Purpose |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `task.json` | Current lifecycle state, task identity, project binding and commit/PR pointers |
|
|
10
|
+
| `execution-report.json` | Completed, verified, not completed, problems, structure review and next Agent |
|
|
11
|
+
| `decision-log.jsonl` | Append-only decisions with reason, evidence and actor |
|
|
12
|
+
| `artifact-manifest.json` | Paths, types, byte sizes and SHA-256 checksums |
|
|
13
|
+
| `quality-report.json` | Machine-readable quality gate result and rule-level evidence |
|
|
14
|
+
| `issue-register.json` | Problems, severity, status, owner and next action |
|
|
15
|
+
| `review.json` | Human/Agent review decision and categorized feedback |
|
|
16
|
+
| `handoff.json` | What the next Agent should read, do, verify or ask the user |
|
|
17
|
+
| `project-graph.json` | Task-bound relationship index for project, intent, scene, artifacts, evidence and review |
|
|
18
|
+
| `provenance.json` | Step-level attestation with actor, builder, materials, products, policy and hash chain |
|
|
19
|
+
| `motion-ir.json` | Framework-neutral motion intent bound to task, scene, context and source hashes |
|
|
20
|
+
| `replay-bundle.json` | Clean replay environment metadata and artifact hash inventory |
|
|
21
|
+
|
|
22
|
+
## Status semantics
|
|
23
|
+
|
|
24
|
+
Use `blocked` when required input, permission or consent is missing. Use `failed` when an attempted operation produced a technical error. Use `review_required` when the artifact exists but a human or downstream Agent must inspect it. Use `validated` only when the quality gate passes, including strict Intelligence Core validation when the task declares `intelligence_required`. Use `ready_for_pr` only when validation and review are both complete.
|
|
25
|
+
|
|
26
|
+
Never mark an item completed without an evidence path or command result. Never convert a scaffold-only runtime into a verified runtime in prose.
|
|
27
|
+
|
|
28
|
+
## CLI recording contract
|
|
29
|
+
|
|
30
|
+
Use `python3 scripts/report.py add` for facts that belong in `completed`, `verified`, `not_completed`, `problems` or `next_agent`. Use `python3 scripts/report.py structure` for missing files, broken references and untracked artifacts. Run `collect` to create deterministic SHA-256 entries, `check` to enforce semantic completeness, and `render` to create the human-readable `REPORT.md`.
|
|
31
|
+
|
|
32
|
+
The initial `not_completed` entry is removed automatically after the first completed or verified item is recorded. Explicit unfinished work must still be added to `not_completed`; this prevents an empty template from looking like a complete task while preserving a visible record of work that remains.
|
|
33
|
+
|
|
34
|
+
The report is an evidence index, not a chat transcript. Each item should point to a file, command output, test name, runtime metadata or review decision that another Agent can inspect.
|
|
35
|
+
|
|
36
|
+
## Handoff rule
|
|
37
|
+
|
|
38
|
+
The receiving Agent should be able to continue from `handoff.json`, `task.json`, `quality-report.json`, `project-graph.json`, `provenance.json`, `motion-ir.json`, `replay-bundle.json` and the artifact manifest without reconstructing the previous conversation. If that is not possible, the handoff is incomplete. Graph and provenance are indexes and attestations, not permission to skip browser review or user consent.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Runtime capability levels
|
|
2
|
+
|
|
3
|
+
Use explicit capability levels in reports and `agent-card.json`.
|
|
4
|
+
|
|
5
|
+
| Level | Meaning | Acceptance |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `scaffold` | Template/code exists but runtime integration is not proven | Never sufficient for production PR |
|
|
8
|
+
| `static-validated` | JSON/XML/schema and local references are valid | Still not runtime evidence |
|
|
9
|
+
| `runtime-verified` | Target runtime rendered required frames successfully | Can pass production gate if other rules pass |
|
|
10
|
+
| `project-integrated` | Runtime artifact works in the actual host project route/component and target policy | Preferred final level |
|
|
11
|
+
|
|
12
|
+
The current audited levels are `runtime-verified` for Lottie JSON, dotLottie packaging, SVG cutout rig, Rive, GSAP and Framer Motion. The adapter evidence is generated by `node scripts/runtime-adapters.mjs` and contains three deterministic scrub points plus runtime state. Treat Spine and Three.js as `scaffold` until their adapter test matrix is implemented.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Signed attestation and trust-anchor contract
|
|
2
|
+
|
|
3
|
+
MotionLoom's next trust boundary uses a **DSSE-compatible envelope** around a MotionLoom-specific JSON statement. The envelope authenticates the exact serialized predicate; it does not grant review approval. This separation follows the attestation model in SLSA [1] and the DSSE pre-authentication encoding rules [2].
|
|
4
|
+
|
|
5
|
+
## Contract boundary
|
|
6
|
+
|
|
7
|
+
| Layer | Responsibility | Must not claim |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| MotionLoom statement | Bind task, scene, source, manifest, Motion IR, runtime evidence, telemetry and provenance hashes | User approval |
|
|
10
|
+
| DSSE-compatible envelope | Bind payload type, exact serialized body and signer signature | Artifact quality |
|
|
11
|
+
| Trust policy | Select accepted algorithm, key, validity window and revocation state | Runtime correctness |
|
|
12
|
+
| External verifier | Report integrity, binding and signer trust with stable exit codes | Approval or PR authorization |
|
|
13
|
+
| Review lifecycle | Record user decision on the exact candidate | Cryptographic identity without verification |
|
|
14
|
+
|
|
15
|
+
## Canonicalization rules
|
|
16
|
+
|
|
17
|
+
The payload type is `application/vnd.motionloom.attestation+json;version=1`. The signed body is the exact UTF-8 serialized statement bytes. The DSSE pre-authentication encoding is computed over the UTF-8 payload type and those exact body bytes. A verifier must not verify one serialization and then parse a different serialization for application decisions.
|
|
18
|
+
|
|
19
|
+
The statement uses a MotionLoom-specific subject/predicate shape. `subject[*].digest.sha256` identifies the attested artifact. The predicate binds `task_id`, `scene`, context hash, source/manifest/Motion IR hashes, runtime evidence hashes and provenance chain hash. The field `approval` is present only as the constant `false` in the bundle contract so cryptographic evidence cannot be mistaken for review approval.
|
|
20
|
+
|
|
21
|
+
## Trust and key lifecycle
|
|
22
|
+
|
|
23
|
+
Trust is configured out-of-band in `trust-policy.schema.json`. A `key_id` is only a lookup hint; the verifier must still resolve the key from the configured trust policy, require `status: active`, check the validity interval, enforce the algorithm and reject revoked or unknown signers. Rotation may overlap keys, but an expired or revoked signer must not be accepted merely because its signature is mathematically valid.
|
|
24
|
+
|
|
25
|
+
The initial implementation is deliberately local-policy based and deterministic. It supports test trust anchors and explicit revocation fixtures. Production deployments may replace the trust source, but must preserve fail-closed verification and the review-first approval boundary.
|
|
26
|
+
|
|
27
|
+
## References
|
|
28
|
+
|
|
29
|
+
[1]: https://slsa.dev/spec/v1.2/attestation-model "SLSA v1.2 Software attestations"
|
|
30
|
+
|
|
31
|
+
[2]: https://github.com/secure-systems-lab/dsse/blob/master/protocol.md "DSSE Protocol v1.0.2"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/artifact-manifest.schema.json",
|
|
4
|
+
"title": "Animation artifact manifest",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["manifest_version", "task_id", "generated_at", "artifacts"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"manifest_version": {"type": "string"},
|
|
9
|
+
"task_id": {"type": "string"},
|
|
10
|
+
"generated_at": {"type": "string", "format": "date-time"},
|
|
11
|
+
"artifacts": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"items": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["path", "type", "sha256", "bytes"],
|
|
16
|
+
"properties": {"path": {"type": "string"}, "type": {"type": "string"}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "bytes": {"type": "integer", "minimum": 0}},
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"additionalProperties": true
|
|
22
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/browser-review-candidate.schema.json",
|
|
4
|
+
"title": "Animation browser review candidate",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema_version", "candidate_id", "task_id", "scene", "url", "status", "context_sha256", "source_sha256", "review_artifact", "expires_at"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schema_version": {"type": "string"},
|
|
9
|
+
"candidate_id": {"type": "string", "pattern": "^[a-f0-9]{20}$"},
|
|
10
|
+
"task_id": {"type": "string"},
|
|
11
|
+
"scene": {"type": "string", "pattern": "^[A-Za-z0-9._-]+$"},
|
|
12
|
+
"url": {"type": "string", "format": "uri"},
|
|
13
|
+
"status": {"type": "string", "enum": ["prepared", "opened", "reviewed", "approved", "changes_requested", "expired"]},
|
|
14
|
+
"context_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
15
|
+
"source_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
16
|
+
"runtime": {"type": "string"},
|
|
17
|
+
"checkpoints": {"type": "array", "items": {"type": "integer", "enum": [0, 50, 100]}},
|
|
18
|
+
"review_artifact": {"type": "string"},
|
|
19
|
+
"requires_user_approval": {"type": "boolean"},
|
|
20
|
+
"prepared_at": {"type": "string", "format": "date-time"},
|
|
21
|
+
"expires_at": {"type": "string", "format": "date-time"}
|
|
22
|
+
},
|
|
23
|
+
"additionalProperties": true
|
|
24
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/capability-registry.schema.json",
|
|
4
|
+
"title": "MotionLoom capability registry",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "registry_id", "generated_at", "selection_policy", "capabilities"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"schema_version": {"const": "0.1"},
|
|
10
|
+
"registry_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
|
|
11
|
+
"generated_at": {"type": "string", "format": "date-time"},
|
|
12
|
+
"selection_policy": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"required": ["require_verified", "allow_scaffold_only", "max_evidence_age_seconds"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"require_verified": {"type": "boolean"},
|
|
18
|
+
"allow_scaffold_only": {"type": "boolean"},
|
|
19
|
+
"max_evidence_age_seconds": {"type": "integer", "minimum": 0}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"capabilities": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"minItems": 1,
|
|
25
|
+
"items": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"required": ["id", "kind", "status", "adapter_version", "inputs", "outputs", "compatibility", "last_verified_at", "evidence", "limitations", "risk_level", "side_effect_level"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{2,127}$"},
|
|
31
|
+
"kind": {"type": "string", "enum": ["analyzer", "planner", "generator", "renderer", "runtime-adapter", "review", "packager"]},
|
|
32
|
+
"status": {"type": "string", "enum": ["verified", "scaffold_only", "static_validated", "project_integrated", "disabled"]},
|
|
33
|
+
"adapter_version": {"type": "string", "minLength": 1},
|
|
34
|
+
"inputs": {"type": "array", "items": {"type": "string"}},
|
|
35
|
+
"outputs": {"type": "array", "items": {"type": "string"}},
|
|
36
|
+
"compatibility": {"$ref": "#/$defs/compatibility"},
|
|
37
|
+
"last_verified_at": {"type": "string", "format": "date-time"},
|
|
38
|
+
"evidence": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/evidence"}},
|
|
39
|
+
"limitations": {"type": "array", "items": {"type": "string"}},
|
|
40
|
+
"fallback": {"type": "string"},
|
|
41
|
+
"risk_level": {"type": "string", "enum": ["low", "medium", "high"]},
|
|
42
|
+
"side_effect_level": {"type": "string", "enum": ["read", "local_write", "user_review_required", "remote_write"]}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"$defs": {
|
|
48
|
+
"compatibility": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"additionalProperties": false,
|
|
51
|
+
"required": ["browsers", "os"],
|
|
52
|
+
"properties": {"browsers": {"type": "array", "items": {"type": "string"}}, "os": {"type": "array", "items": {"type": "string"}}, "node": {"type": "string"}}
|
|
53
|
+
},
|
|
54
|
+
"evidence": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"required": ["path", "sha256", "kind"],
|
|
58
|
+
"properties": {"path": {"type": "string", "pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"}, "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}, "kind": {"type": "string", "enum": ["runtime", "ci", "browser", "static"]}}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/continuity-report.schema.json",
|
|
4
|
+
"title": "MotionLoom multi-scene continuity report",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["schema_version", "report_id", "project_id", "status", "scenes", "transitions", "summary", "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
|
+
"project_id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
|
|
12
|
+
"status": {"type": "string", "enum": ["pass", "warn", "fail"]},
|
|
13
|
+
"scenes": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/scene"}},
|
|
14
|
+
"transitions": {"type": "array", "items": {"$ref": "#/$defs/transition"}},
|
|
15
|
+
"summary": {"$ref": "#/$defs/summary"},
|
|
16
|
+
"generated_at": {"type": "string", "format": "date-time"}
|
|
17
|
+
},
|
|
18
|
+
"$defs": {
|
|
19
|
+
"scene": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"required": ["scene", "order", "motion_ir_path", "motion_ir_sha256", "context_hash", "intent"],
|
|
23
|
+
"properties": {
|
|
24
|
+
"scene": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{1,63}$"},
|
|
25
|
+
"order": {"type": "integer", "minimum": 0},
|
|
26
|
+
"motion_ir_path": {"type": "string", "minLength": 1},
|
|
27
|
+
"motion_ir_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
28
|
+
"context_hash": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
29
|
+
"intent": {"type": "string", "minLength": 1}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"transition": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"additionalProperties": false,
|
|
35
|
+
"required": ["id", "from_scene", "to_scene", "status", "checks"],
|
|
36
|
+
"properties": {
|
|
37
|
+
"id": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{2,127}$"},
|
|
38
|
+
"from_scene": {"type": "string", "minLength": 1},
|
|
39
|
+
"to_scene": {"type": "string", "minLength": 1},
|
|
40
|
+
"status": {"type": "string", "enum": ["pass", "warn", "fail"]},
|
|
41
|
+
"checks": {"type": "array", "items": {"type": "string", "minLength": 1}},
|
|
42
|
+
"findings": {"type": "array", "items": {"type": "string", "minLength": 1}}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"summary": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"required": ["scene_count", "transition_count", "errors", "warnings", "blocking"],
|
|
49
|
+
"properties": {"scene_count": {"type": "integer", "minimum": 1}, "transition_count": {"type": "integer", "minimum": 0}, "errors": {"type": "integer", "minimum": 0}, "warnings": {"type": "integer", "minimum": 0}, "blocking": {"type": "integer", "minimum": 0}}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/evidence-verifier-report.schema.json",
|
|
4
|
+
"title": "MotionLoom external evidence verifier report",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema_version", "verifier", "verified", "approval", "issues", "bindings"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schema_version": {"type": "string", "const": "1.0"},
|
|
9
|
+
"verifier": {"type": "string", "const": "motionloom-evidence-verifier/1.0"},
|
|
10
|
+
"verified": {"type": "boolean"},
|
|
11
|
+
"approval": {"type": "boolean", "const": false},
|
|
12
|
+
"issues": {"type": "array", "items": {"type": "string"}},
|
|
13
|
+
"bindings": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["scene", "task_id", "source_sha256", "manifest_sha256", "motion_ir_sha256", "telemetry_files"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"scene": {"type": "string", "minLength": 1},
|
|
18
|
+
"task_id": {"type": "string", "minLength": 1},
|
|
19
|
+
"source_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
20
|
+
"manifest_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
21
|
+
"motion_ir_sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"},
|
|
22
|
+
"telemetry_files": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}}
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": true
|
|
25
|
+
},
|
|
26
|
+
"policy": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"properties": {
|
|
29
|
+
"max_age_days": {"type": "number", "minimum": 0}
|
|
30
|
+
},
|
|
31
|
+
"additionalProperties": true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"additionalProperties": true
|
|
35
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/lenhonbp/MotionLoom/blob/main/schemas/execution-report.schema.json",
|
|
4
|
+
"title": "Animation execution report",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["report_version", "task_id", "status", "confidence", "completed", "verified", "not_completed", "problems", "structure_review", "next_agent", "generated_at"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"report_version": {"type": "string"},
|
|
9
|
+
"task_id": {"type": "string"},
|
|
10
|
+
"status": {"type": "string", "enum": ["created", "needs_context", "planning", "sourcing", "generating", "rendering", "review_required", "blocked", "failed", "validated", "ready_for_pr", "confirmed"]},
|
|
11
|
+
"confidence": {"type": "string", "enum": ["high", "medium", "low"]},
|
|
12
|
+
"completed": {"type": "array", "items": {"$ref": "#/$defs/report_item"}},
|
|
13
|
+
"verified": {"type": "array", "items": {"$ref": "#/$defs/report_item"}},
|
|
14
|
+
"not_completed": {"type": "array", "items": {"$ref": "#/$defs/report_item"}},
|
|
15
|
+
"problems": {"type": "array", "items": {"$ref": "#/$defs/problem"}},
|
|
16
|
+
"structure_review": {"type": "object"},
|
|
17
|
+
"next_agent": {"type": "array", "items": {"type": "object"}},
|
|
18
|
+
"generated_at": {"type": "string", "format": "date-time"}
|
|
19
|
+
},
|
|
20
|
+
"$defs": {
|
|
21
|
+
"report_item": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"required": ["id", "summary", "status"],
|
|
24
|
+
"properties": {"id": {"type": "string"}, "summary": {"type": "string"}, "status": {"type": "string"}, "evidence": {"type": "array", "items": {"type": "string"}}, "confidence": {"type": "string"}},
|
|
25
|
+
"additionalProperties": true
|
|
26
|
+
},
|
|
27
|
+
"problem": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"required": ["id", "severity", "summary", "status"],
|
|
30
|
+
"properties": {"id": {"type": "string"}, "severity": {"type": "string", "enum": ["P0", "P1", "P2", "P3"]}, "summary": {"type": "string"}, "status": {"type": "string"}, "next_action": {"type": "string"}},
|
|
31
|
+
"additionalProperties": true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"additionalProperties": true
|
|
35
|
+
}
|