motionloom 2.2.0 → 2.4.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 (114) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/README.md +123 -17
  3. package/ROADMAP.md +8 -3
  4. package/SKILL.md +34 -3
  5. package/agent-card.json +48 -5
  6. package/agent-surfaces.json +8 -1
  7. package/artifact-adapter-registry.json +53 -0
  8. package/bin/motionloom.mjs +41 -4
  9. package/docs/AGENT-INTEGRATION.md +15 -2
  10. package/docs/CHECKLIST.md +21 -0
  11. package/docs/STATUS.md +2 -2
  12. package/docs/audits/data/deep-stress-latest.json +65 -65
  13. package/docs/releases/2.3.0.md +33 -0
  14. package/docs/releases/2.4.0.md +31 -0
  15. package/docs/releases/npm-publish-from-workstation.md +19 -8
  16. package/docs/research/agent-skill-ecosystem-notes.md +47 -0
  17. package/docs/research/ai-animation-tools-2026-notes.md +81 -0
  18. package/docs/research/ai-animation-tools-2026-report.md +168 -0
  19. package/docs/research/ai-pilot-ingest-notes.md +29 -0
  20. package/examples/agent-consumer/ai-generated-pilot/hero-male.json +10 -0
  21. package/examples/agent-consumer/ai-generated-pilot-provenance.json +55 -0
  22. package/examples/agent-consumer/ai-pilot-scout/CHATGPT-HANDOFF.md +70 -0
  23. package/examples/agent-consumer/ai-pilot-scout/CODEX-HANDOFF.md +80 -0
  24. package/examples/agent-consumer/ai-pilot-scout/README.md +39 -0
  25. package/examples/agent-consumer/ai-pilot-scout/chatgpt-geometry-correction-prompt.md +55 -0
  26. package/examples/agent-consumer/ai-pilot-scout/chatgpt-pose-generation-prompt.md +78 -0
  27. package/examples/agent-consumer/ai-pilot-scout/partial-handoff.json +73 -0
  28. package/examples/agent-consumer/artifact-intake/hero-motion-controls.json +15 -0
  29. package/examples/agent-consumer/artifact-intake/hero-motion-export.json +14 -0
  30. package/examples/agent-consumer/artifact-intake/hero-motion-provenance.json +20 -0
  31. package/examples/agent-consumer/artifact-intake/hero-motion-receipt.json +16 -0
  32. package/examples/agent-consumer/asset-consistency/assets/forest-back.png +0 -0
  33. package/examples/agent-consumer/asset-consistency/assets/forest-front.png +0 -0
  34. package/examples/agent-consumer/asset-consistency/assets/forest-mid.png +0 -0
  35. package/examples/agent-consumer/asset-consistency/assets/hero-atlas.png +0 -0
  36. package/examples/agent-consumer/asset-consistency/assets/hero-frame-00.png +0 -0
  37. package/examples/agent-consumer/asset-consistency/assets/hero-frame-01.png +0 -0
  38. package/examples/agent-consumer/asset-consistency/assets/hero-frame-02.png +0 -0
  39. package/examples/agent-consumer/asset-consistency/assets/hero-frame-03.png +0 -0
  40. package/examples/agent-consumer/asset-consistency/forest-layered-map.json +53 -0
  41. package/examples/agent-consumer/asset-consistency/hero-atlas-contract.json +24 -0
  42. package/examples/agent-consumer/asset-consistency/hero-identity.json +51 -0
  43. package/examples/agent-consumer/asset-consistency/hero-walk-action-set.json +27 -0
  44. package/examples/agent-consumer/asset-consistency/hero-walk-frame-geometry.json +63 -0
  45. package/examples/agent-consumer/rig-compatibility/hero-walk-fixture-rig.json +13 -0
  46. package/examples/agent-consumer/rive-package-gate/README.md +20 -0
  47. package/examples/agent-consumer/runtime-candidate/hero-walk-candidate.json +18 -0
  48. package/examples/agent-consumer/runtime-pilot/action-set.json +19 -0
  49. package/examples/agent-consumer/runtime-pilot/asset-identity.json +44 -0
  50. package/examples/agent-consumer/runtime-pilot/candidate.json +21 -0
  51. package/examples/agent-consumer/runtime-pilot/controls.json +35 -0
  52. package/examples/agent-consumer/runtime-pilot/export.json +17 -0
  53. package/examples/agent-consumer/runtime-pilot/provenance.json +38 -0
  54. package/examples/agent-consumer/runtime-pilot/receipt.json +30 -0
  55. package/package.json +65 -4
  56. package/references/agent-interoperability.md +11 -0
  57. package/references/browser-review-contract.md +7 -1
  58. package/references/intelligence-core.md +29 -2
  59. package/rig-adapter-registry.json +39 -0
  60. package/schemas/action-set.schema.json +42 -0
  61. package/schemas/agent-surfaces.schema.json +1 -1
  62. package/schemas/artifact-adapter-registry.schema.json +16 -0
  63. package/schemas/asset-identity.schema.json +117 -0
  64. package/schemas/asset-provenance.schema.json +183 -0
  65. package/schemas/atlas-contract.schema.json +48 -0
  66. package/schemas/control-track.schema.json +18 -0
  67. package/schemas/export-manifest.schema.json +19 -0
  68. package/schemas/frame-geometry.schema.json +79 -0
  69. package/schemas/generation-receipt.schema.json +20 -0
  70. package/schemas/layered-map.schema.json +75 -0
  71. package/schemas/rig-adapter-registry.schema.json +14 -0
  72. package/schemas/rig-compatibility.schema.json +53 -0
  73. package/schemas/rive-package-manifest.schema.json +43 -0
  74. package/schemas/runtime-candidate.schema.json +48 -0
  75. package/schemas/scene-manifest.schema.json +19 -0
  76. package/scripts/artifact-intake.py +408 -0
  77. package/scripts/asset-consistency.py +517 -0
  78. package/scripts/asset-provenance.py +395 -0
  79. package/scripts/build-ai-pilot.py +504 -0
  80. package/scripts/docs-audit.py +14 -2
  81. package/scripts/isolate-alpha-background.py +147 -0
  82. package/scripts/pr.py +2 -0
  83. package/scripts/quality-gate.py +127 -3
  84. package/scripts/report.py +135 -0
  85. package/scripts/resolve-task-bundle.py +84 -0
  86. package/scripts/review-hook.py +26 -4
  87. package/scripts/rig-compatibility.py +251 -0
  88. package/scripts/rive-package-gate.py +245 -0
  89. package/scripts/runtime-candidate.py +301 -0
  90. package/scripts/setup.mjs +500 -0
  91. package/scripts/skill-doctor.py +2 -1
  92. package/src/output/browser-review-smoke/asset-provenance.json +77 -0
  93. package/src/output/browser-review-smoke/manifest.json +1 -0
  94. package/src/output/browser-review-smoke/visual-truth.json +3 -3
  95. package/src/output/runtime-pilot-framer/asset-provenance.json +38 -0
  96. package/src/output/runtime-pilot-framer/browser-review.json +20 -0
  97. package/src/output/runtime-pilot-framer/framer-motion/runtime-telemetry.json +103 -0
  98. package/src/output/runtime-pilot-framer/manifest.json +31 -0
  99. package/src/output/runtime-pilot-framer/motion-spec.json +25 -0
  100. package/src/output/runtime-pilot-framer/runtime-evidence.json +96 -0
  101. package/src/output/runtime-pilot-framer/runtime-telemetry.json +100 -0
  102. package/src/output/runtime-pilot-framer/scene.jsx +52 -0
  103. package/src/output/runtime-pilot-framer/snapshot/.render-meta.json +9 -0
  104. package/src/output/runtime-pilot-framer/snapshot/frame-00.png +0 -0
  105. package/src/output/runtime-pilot-framer/snapshot/frame-100.png +0 -0
  106. package/src/output/runtime-pilot-framer/snapshot/frame-50.png +0 -0
  107. package/tests/scripts/run_tests.py +131 -0
  108. package/tests/scripts/test_ai_pilot_builder.py +128 -0
  109. package/tests/scripts/test_alpha_isolation.py +60 -0
  110. package/tests/scripts/test_artifact_intake.py +146 -0
  111. package/tests/scripts/test_asset_consistency.py +199 -0
  112. package/tests/scripts/test_rig_compatibility.py +105 -0
  113. package/tests/scripts/test_rive_package_gate.py +101 -0
  114. package/tests/scripts/test_runtime_candidate.py +95 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "candidate_id": "8cccc4ac5a7e493ffe40",
4
+ "task_id": "runtime-pilot-001",
5
+ "scene": "runtime-pilot-framer",
6
+ "url": "https://animdevlab-hcxnxr9c.manus.space/lab/?scene=runtime-pilot-framer&task_id=runtime-pilot-001&candidate_id=8cccc4ac5a7e493ffe40&artifact_base=https%3A%2F%2Fanimdevlab-hcxnxr9c.manus.space%2Fscenes%2Fruntime-pilot-framer&task_base=https%3A%2F%2Fanimdevlab-hcxnxr9c.manus.space%2Ftasks%2Fruntime-pilot-001",
7
+ "status": "prepared",
8
+ "context_sha256": "9e9bb3bf2e490d23e9f5d52dfc4779b69adf0cc63b32df66adfde7050845fc74",
9
+ "source_sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
10
+ "runtime": "framer-motion",
11
+ "checkpoints": [
12
+ 0,
13
+ 50,
14
+ 100
15
+ ],
16
+ "review_artifact": "review.json",
17
+ "requires_user_approval": true,
18
+ "prepared_at": "2026-08-15T15:44:47Z",
19
+ "expires_at": "2026-08-16T15:44:47Z"
20
+ }
@@ -0,0 +1,103 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "run_id": "1786808870894-145958",
4
+ "generated_at": "2026-08-15T15:47:52.478Z",
5
+ "mode": "runtime-telemetry",
6
+ "task_id": "runtime-pilot-001",
7
+ "scene": "runtime-pilot-framer",
8
+ "framework": "framer-motion",
9
+ "runtime": "framer-motion@13.1.0",
10
+ "source_sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
11
+ "manifest_sha256": "2b53bf3b6fc8dfe16a271ecd52ec51c2acb5b612c0b77d9fd4e485696989011d",
12
+ "motion_ir_sha256": "1d339ca2ec9c510e54e53c37ef32c2ddf1485dbaec97c5e9aa178a8f6c9c3287",
13
+ "samples": [
14
+ {
15
+ "sequence": 0,
16
+ "percent": 0,
17
+ "captured_at_ms": 767.8999999761581,
18
+ "raf_intervals_ms": [
19
+ 16.699999999999932,
20
+ 16.600000000000023,
21
+ 16.799999999999955
22
+ ],
23
+ "state_sha256": "0769bb6867251ff8d951b01e7d817ab4644d1f7d4a38b0e91ad54ec5b0f81f6b",
24
+ "state": {
25
+ "progress": 0,
26
+ "transform": "matrix(0.82, 0, 0, 0.82, 0, 0)",
27
+ "opacity": "0.28",
28
+ "contract": {
29
+ "framework": "framer-motion",
30
+ "checkpoints": [
31
+ 0,
32
+ 50,
33
+ 100
34
+ ],
35
+ "durationSeconds": 1.2,
36
+ "loop": true,
37
+ "sourceAuthority": "code_authored"
38
+ }
39
+ }
40
+ },
41
+ {
42
+ "sequence": 1,
43
+ "percent": 50,
44
+ "captured_at_ms": 851.1000000238419,
45
+ "raf_intervals_ms": [
46
+ 16.700000000000045,
47
+ 16.699999999999932,
48
+ 16.600000000000023
49
+ ],
50
+ "state_sha256": "015ad2af517be79a3cf102b48b5f61282acd1843c7b5efe20472c2752d79c890",
51
+ "state": {
52
+ "progress": 0.5,
53
+ "transform": "matrix(1.02851, -0.256437, 0.256437, 1.02851, 176, -48)",
54
+ "opacity": "1",
55
+ "contract": {
56
+ "framework": "framer-motion",
57
+ "checkpoints": [
58
+ 0,
59
+ 50,
60
+ 100
61
+ ],
62
+ "durationSeconds": 1.2,
63
+ "loop": true,
64
+ "sourceAuthority": "code_authored"
65
+ }
66
+ }
67
+ },
68
+ {
69
+ "sequence": 2,
70
+ "percent": 100,
71
+ "captured_at_ms": 934.6000000238419,
72
+ "raf_intervals_ms": [
73
+ 16.700000000000045,
74
+ 16.600000000000023,
75
+ 16.699999999999932
76
+ ],
77
+ "state_sha256": "275a832573d3c660f6d820256f95412e253f0a29c02e8f535dfdec2c47e56de2",
78
+ "state": {
79
+ "progress": 1,
80
+ "transform": "matrix(0.882948, 0.469472, -0.469472, 0.882948, 240, -36)",
81
+ "opacity": "1",
82
+ "contract": {
83
+ "framework": "framer-motion",
84
+ "checkpoints": [
85
+ 0,
86
+ 50,
87
+ 100
88
+ ],
89
+ "durationSeconds": 1.2,
90
+ "loop": true,
91
+ "sourceAuthority": "code_authored"
92
+ }
93
+ }
94
+ }
95
+ ],
96
+ "metrics": {
97
+ "sample_count": 3,
98
+ "raf_interval_count": 9,
99
+ "max_raf_interval_ms": 16.799999999999955,
100
+ "p95_raf_interval_ms": 16.799999999999955
101
+ },
102
+ "status": "pass"
103
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "scene": "runtime-pilot-framer",
3
+ "task_id": "runtime-pilot-001",
4
+ "name": "Framer Motion Runtime Pilot",
5
+ "description": "Code-authored Framer Motion scene rendered at deterministic 0/50/100 checkpoints before human review.",
6
+ "framework": "framer-motion",
7
+ "category": "runtime-pilot",
8
+ "file": "scene.jsx",
9
+ "runtime_evidence": "runtime-evidence.json",
10
+ "asset_provenance": "asset-provenance.json",
11
+ "source_binding": {
12
+ "kind": "project",
13
+ "source_path": "scene.jsx",
14
+ "authority": "code_authored",
15
+ "license": "MIT",
16
+ "attribution": "MotionLoom contributors",
17
+ "sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b"
18
+ },
19
+ "checks": [
20
+ {
21
+ "id": "source-bound",
22
+ "label": "Runtime source is hash-bound before adapter execution",
23
+ "pass": true
24
+ },
25
+ {
26
+ "id": "review-first",
27
+ "label": "Runtime evidence does not approve a production release or pull request",
28
+ "pass": true
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "version": "1.0",
3
+ "scene": "runtime-pilot-framer",
4
+ "task_id": "runtime-pilot-001",
5
+ "category": "runtime-pilot",
6
+ "framework": "framer-motion",
7
+ "duration_s": 1.2,
8
+ "fps": 60,
9
+ "total_frames": 72,
10
+ "loop": true,
11
+ "easing": "piecewise scrubbed transform",
12
+ "camera": null,
13
+ "theme": {
14
+ "primary": "#2563EB",
15
+ "accent": "#F59E0B"
16
+ },
17
+ "performance": {
18
+ "max_file_kb": 300,
19
+ "max_layers": 8
20
+ },
21
+ "source_binding": "hash-bound code-authored scene.jsx; no generated visual asset is asserted",
22
+ "accessibility": {
23
+ "reduced_motion": "manual review uses discrete checkpoints"
24
+ }
25
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "schema_version": "1.1",
3
+ "run_id": "1786808870894-145958",
4
+ "generated_at": "2026-08-15T15:47:52.510Z",
5
+ "mode": "runtime",
6
+ "harness": "tests/runtime-harness",
7
+ "status": "pass",
8
+ "frameworks": [
9
+ {
10
+ "run_id": "1786808870894-145958",
11
+ "framework": "framer-motion",
12
+ "url": "http://127.0.0.1:4179/tests/runtime-harness/index.html?framework=framer-motion",
13
+ "status": "pass",
14
+ "ready": true,
15
+ "runtime": "framer-motion@13.1.0",
16
+ "frames": [
17
+ {
18
+ "percent": 0,
19
+ "file": "artifacts/runtime-adapters/framer-motion/frame-00.png",
20
+ "state": {
21
+ "progress": 0,
22
+ "transform": "matrix(0.82, 0, 0, 0.82, 0, 0)",
23
+ "opacity": "0.28",
24
+ "contract": {
25
+ "framework": "framer-motion",
26
+ "checkpoints": [
27
+ 0,
28
+ 50,
29
+ 100
30
+ ],
31
+ "durationSeconds": 1.2,
32
+ "loop": true,
33
+ "sourceAuthority": "code_authored"
34
+ }
35
+ }
36
+ },
37
+ {
38
+ "percent": 50,
39
+ "file": "artifacts/runtime-adapters/framer-motion/frame-50.png",
40
+ "state": {
41
+ "progress": 0.5,
42
+ "transform": "matrix(1.02851, -0.256437, 0.256437, 1.02851, 176, -48)",
43
+ "opacity": "1",
44
+ "contract": {
45
+ "framework": "framer-motion",
46
+ "checkpoints": [
47
+ 0,
48
+ 50,
49
+ 100
50
+ ],
51
+ "durationSeconds": 1.2,
52
+ "loop": true,
53
+ "sourceAuthority": "code_authored"
54
+ }
55
+ }
56
+ },
57
+ {
58
+ "percent": 100,
59
+ "file": "artifacts/runtime-adapters/framer-motion/frame-100.png",
60
+ "state": {
61
+ "progress": 1,
62
+ "transform": "matrix(0.882948, 0.469472, -0.469472, 0.882948, 240, -36)",
63
+ "opacity": "1",
64
+ "contract": {
65
+ "framework": "framer-motion",
66
+ "checkpoints": [
67
+ 0,
68
+ 50,
69
+ 100
70
+ ],
71
+ "durationSeconds": 1.2,
72
+ "loop": true,
73
+ "sourceAuthority": "code_authored"
74
+ }
75
+ }
76
+ }
77
+ ],
78
+ "console_errors": [],
79
+ "telemetry": {
80
+ "file": "framer-motion/runtime-telemetry.json",
81
+ "sha256": "1c11a49eac8fb6c87977ccb84cccc59162fa015c73424a07690785bac094e773",
82
+ "metrics": {
83
+ "sample_count": 3,
84
+ "raf_interval_count": 9,
85
+ "max_raf_interval_ms": 16.799999999999955,
86
+ "p95_raf_interval_ms": 16.799999999999955
87
+ }
88
+ }
89
+ }
90
+ ],
91
+ "scene": "runtime-pilot-framer",
92
+ "task_id": "runtime-pilot-001",
93
+ "source_sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
94
+ "manifest_sha256": "2b53bf3b6fc8dfe16a271ecd52ec51c2acb5b612c0b77d9fd4e485696989011d",
95
+ "motion_ir_sha256": "1d339ca2ec9c510e54e53c37ef32c2ddf1485dbaec97c5e9aa178a8f6c9c3287"
96
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "schema_version": "1.0",
3
+ "run_id": "1786808553918-145614",
4
+ "generated_at": "2026-08-15T15:42:35.907Z",
5
+ "mode": "runtime-telemetry",
6
+ "task_id": "runtime-pilot-001",
7
+ "scene": "runtime-pilot-framer",
8
+ "framework": "framer-motion",
9
+ "runtime": "framer-motion@13.1.0",
10
+ "samples": [
11
+ {
12
+ "sequence": 0,
13
+ "percent": 0,
14
+ "captured_at_ms": 760.7000000476837,
15
+ "raf_intervals_ms": [
16
+ 16.700000000000045,
17
+ 16.600000000000023,
18
+ 16.699999999999932
19
+ ],
20
+ "state_sha256": "0769bb6867251ff8d951b01e7d817ab4644d1f7d4a38b0e91ad54ec5b0f81f6b",
21
+ "state": {
22
+ "progress": 0,
23
+ "transform": "matrix(0.82, 0, 0, 0.82, 0, 0)",
24
+ "opacity": "0.28",
25
+ "contract": {
26
+ "framework": "framer-motion",
27
+ "checkpoints": [
28
+ 0,
29
+ 50,
30
+ 100
31
+ ],
32
+ "durationSeconds": 1.2,
33
+ "loop": true,
34
+ "sourceAuthority": "code_authored"
35
+ }
36
+ }
37
+ },
38
+ {
39
+ "sequence": 1,
40
+ "percent": 50,
41
+ "captured_at_ms": 844.1000000238419,
42
+ "raf_intervals_ms": [
43
+ 16.600000000000023,
44
+ 16.799999999999955,
45
+ 16.600000000000023
46
+ ],
47
+ "state_sha256": "015ad2af517be79a3cf102b48b5f61282acd1843c7b5efe20472c2752d79c890",
48
+ "state": {
49
+ "progress": 0.5,
50
+ "transform": "matrix(1.02851, -0.256437, 0.256437, 1.02851, 176, -48)",
51
+ "opacity": "1",
52
+ "contract": {
53
+ "framework": "framer-motion",
54
+ "checkpoints": [
55
+ 0,
56
+ 50,
57
+ 100
58
+ ],
59
+ "durationSeconds": 1.2,
60
+ "loop": true,
61
+ "sourceAuthority": "code_authored"
62
+ }
63
+ }
64
+ },
65
+ {
66
+ "sequence": 2,
67
+ "percent": 100,
68
+ "captured_at_ms": 927.7000000476837,
69
+ "raf_intervals_ms": [
70
+ 16.700000000000045,
71
+ 16.699999999999932,
72
+ 16.700000000000045
73
+ ],
74
+ "state_sha256": "275a832573d3c660f6d820256f95412e253f0a29c02e8f535dfdec2c47e56de2",
75
+ "state": {
76
+ "progress": 1,
77
+ "transform": "matrix(0.882948, 0.469472, -0.469472, 0.882948, 240, -36)",
78
+ "opacity": "1",
79
+ "contract": {
80
+ "framework": "framer-motion",
81
+ "checkpoints": [
82
+ 0,
83
+ 50,
84
+ 100
85
+ ],
86
+ "durationSeconds": 1.2,
87
+ "loop": true,
88
+ "sourceAuthority": "code_authored"
89
+ }
90
+ }
91
+ }
92
+ ],
93
+ "metrics": {
94
+ "sample_count": 3,
95
+ "raf_interval_count": 9,
96
+ "max_raf_interval_ms": 16.799999999999955,
97
+ "p95_raf_interval_ms": 16.799999999999955
98
+ },
99
+ "status": "pass"
100
+ }
@@ -0,0 +1,52 @@
1
+ import React, { useEffect, useRef } from "react";
2
+ import { motion, motionValue, useTransform } from "framer-motion";
3
+
4
+ /**
5
+ * MotionLoom runtime-first pilot source.
6
+ * Design: code-authored, deterministic scrub only; review remains human-gated.
7
+ */
8
+ export const RUNTIME_PILOT_CONTRACT = Object.freeze({
9
+ framework: "framer-motion",
10
+ checkpoints: [0, 50, 100],
11
+ durationSeconds: 1.2,
12
+ loop: true,
13
+ sourceAuthority: "code_authored",
14
+ });
15
+
16
+ export function FramerRuntimePilot({ expose }) {
17
+ const progress = useRef(motionValue(0)).current;
18
+ const x = useTransform(progress, [0, 0.5, 1], [0, 176, 240]);
19
+ const y = useTransform(progress, [0, 0.5, 1], [0, -48, -36]);
20
+ const rotate = useTransform(progress, [0, 0.5, 1], [0, -14, 28]);
21
+ const opacity = useTransform(progress, [0, 0.15, 1], [0.28, 1, 1]);
22
+ const scale = useTransform(progress, [0, 0.5, 1], [0.82, 1.06, 1]);
23
+
24
+ useEffect(() => {
25
+ const box = document.querySelector(".runtime-pilot-box");
26
+ const adapter = {
27
+ framework: RUNTIME_PILOT_CONTRACT.framework,
28
+ runtime: "framer-motion@13.1.0",
29
+ status: "ready",
30
+ ready: true,
31
+ setProgress(value) {
32
+ progress.set(Math.max(0, Math.min(1, Number(value))));
33
+ },
34
+ getState() {
35
+ return {
36
+ progress: progress.get(),
37
+ transform: box ? getComputedStyle(box).transform : "",
38
+ opacity: box ? getComputedStyle(box).opacity : "",
39
+ contract: RUNTIME_PILOT_CONTRACT,
40
+ };
41
+ },
42
+ };
43
+ expose(adapter);
44
+ adapter.setProgress(0);
45
+ }, [expose, progress]);
46
+
47
+ return (
48
+ <div className="stage" aria-label="MotionLoom Framer Motion runtime pilot">
49
+ <motion.div className="motion-box runtime-pilot-box" style={{ x, y, rotate, opacity, scale }} />
50
+ </div>
51
+ );
52
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "mode": "runtime",
3
+ "scene": "runtime-pilot-framer",
4
+ "framework": "framer-motion",
5
+ "run_id": "1786808553918-145614",
6
+ "source_sha256": "f4c0e56de842cae6b234566b556e4f07154f8109dde382a474218a9de8b45a8b",
7
+ "runtime_evidence": "../runtime-evidence.json",
8
+ "checkpoints": [0, 50, 100]
9
+ }
@@ -256,6 +256,10 @@ def test_runtime_evidence_binding():
256
256
  root = Path(td)
257
257
  scene = root / "src/output/browser-review-smoke"
258
258
  shutil.copytree(ROOT / "src/output/browser-review-smoke", scene)
259
+ candidate_path = scene / "browser-review.json"
260
+ candidate = json.loads(candidate_path.read_text())
261
+ candidate["expires_at"] = "2099-01-01T00:00:00Z"
262
+ candidate_path.write_text(json.dumps(candidate, indent=2) + "\n")
259
263
  context = root / "project-context.json"
260
264
  shutil.copy(ROOT / "artifacts/browser-review-smoke-task/project-context.json", context)
261
265
 
@@ -355,6 +359,42 @@ def test_deep_audit_contracts():
355
359
  ], capture_output=True, text=True)
356
360
  check("review hook rejects expired candidate", expired.returncode != 0 and "expired" in expired.stdout)
357
361
 
362
+
363
+ def test_task_bundle_resolver_contract():
364
+ with tempfile.TemporaryDirectory() as td:
365
+ root = Path(td)
366
+ opaque_task = root / "artifacts" / "opaque-task-id"
367
+ shutil.copytree(ROOT / "artifacts/runtime-pilot-001", opaque_task)
368
+ resolver = ROOT / "scripts/resolve-task-bundle.py"
369
+ resolved = subprocess.run([
370
+ sys.executable, str(resolver), "--root", str(root), "--scene", "runtime-pilot-framer",
371
+ ], capture_output=True, text=True)
372
+ check(
373
+ "task bundle resolver binds scene to opaque task directory",
374
+ resolved.returncode == 0 and resolved.stdout.strip() == "artifacts/opaque-task-id",
375
+ resolved.stdout.strip() or resolved.stderr.strip(),
376
+ )
377
+
378
+ duplicate = root / "artifacts" / "second-task-id"
379
+ shutil.copytree(opaque_task, duplicate)
380
+ ambiguous = subprocess.run([
381
+ sys.executable, str(resolver), "--root", str(root), "--scene", "runtime-pilot-framer",
382
+ ], capture_output=True, text=True)
383
+ check(
384
+ "task bundle resolver rejects ambiguous scene bindings",
385
+ ambiguous.returncode != 0 and "ambiguous task bundles" in ambiguous.stderr,
386
+ ambiguous.stdout.strip() or ambiguous.stderr.strip(),
387
+ )
388
+
389
+ unsafe = subprocess.run([
390
+ sys.executable, str(resolver), "--root", str(root), "--scene", "../runtime-pilot-framer",
391
+ ], capture_output=True, text=True)
392
+ check(
393
+ "task bundle resolver rejects unsafe scene identifiers",
394
+ unsafe.returncode != 0 and "unsafe scene" in unsafe.stderr,
395
+ unsafe.stdout.strip() or unsafe.stderr.strip(),
396
+ )
397
+
358
398
  unsafe_runtime = subprocess.run(
359
399
  ["node", str(ROOT / "scripts/runtime-adapters.mjs")],
360
400
  env={**os.environ, "RUNTIME_FRAMEWORKS": "../../escape"},
@@ -902,6 +942,16 @@ def test_quality_workflow_rebuilds_replay_after_generated_artifacts():
902
942
  "cross-platform installation matrix contract passes",
903
943
  matrix_tests.returncode == 0 and "installation matrix tests: PASS" in matrix_tests.stdout,
904
944
  )
945
+ setup_tests = subprocess.run(
946
+ [sys.executable, str(ROOT / "tests/scripts/test_setup.py")],
947
+ capture_output=True,
948
+ text=True,
949
+ )
950
+ check(
951
+ "one-command onboarding is idempotent and project-bound",
952
+ setup_tests.returncode == 0 and "setup onboarding tests: PASS" in setup_tests.stdout,
953
+ setup_tests.stdout.strip() or setup_tests.stderr.strip(),
954
+ )
905
955
  visual_tests = subprocess.run(
906
956
  [sys.executable, str(ROOT / "tests/scripts/test_visual_truth.py")],
907
957
  capture_output=True,
@@ -921,6 +971,86 @@ def test_quality_workflow_rebuilds_replay_after_generated_artifacts():
921
971
  remediation_tests.returncode == 0 and "remediation learning tests: PASS" in remediation_tests.stdout,
922
972
  remediation_tests.stdout.strip() or remediation_tests.stderr.strip(),
923
973
  )
974
+ asset_provenance_tests = subprocess.run(
975
+ [sys.executable, str(ROOT / "tests/scripts/test_asset_provenance.py")],
976
+ capture_output=True,
977
+ text=True,
978
+ )
979
+ check(
980
+ "Asset provenance preserves runtime-ready and human-governed production boundaries",
981
+ asset_provenance_tests.returncode == 0 and "asset provenance contract tests: PASS" in asset_provenance_tests.stdout,
982
+ asset_provenance_tests.stdout.strip() or asset_provenance_tests.stderr.strip(),
983
+ )
984
+ asset_consistency_tests = subprocess.run(
985
+ [sys.executable, str(ROOT / "tests/scripts/test_asset_consistency.py")],
986
+ capture_output=True,
987
+ text=True,
988
+ )
989
+ check(
990
+ "Asset consistency preserves deterministic geometry, atlas and layered-map boundaries",
991
+ asset_consistency_tests.returncode == 0 and "asset consistency contract tests: PASS" in asset_consistency_tests.stdout,
992
+ asset_consistency_tests.stdout.strip() or asset_consistency_tests.stderr.strip(),
993
+ )
994
+ artifact_intake_tests = subprocess.run(
995
+ [sys.executable, str(ROOT / "tests/scripts/test_artifact_intake.py")],
996
+ capture_output=True,
997
+ text=True,
998
+ )
999
+ check(
1000
+ "Artifact intake preserves provider-neutral controls, hash binding and approval boundaries",
1001
+ artifact_intake_tests.returncode == 0 and "artifact intake contract tests: PASS" in artifact_intake_tests.stdout,
1002
+ artifact_intake_tests.stdout.strip() or artifact_intake_tests.stderr.strip(),
1003
+ )
1004
+ runtime_candidate_tests = subprocess.run(
1005
+ [sys.executable, str(ROOT / "tests/scripts/test_runtime_candidate.py")],
1006
+ capture_output=True,
1007
+ text=True,
1008
+ )
1009
+ check(
1010
+ "Runtime candidate bridge binds intake exports, consistency and human review boundaries",
1011
+ runtime_candidate_tests.returncode == 0 and "runtime candidate contract tests: PASS" in runtime_candidate_tests.stdout,
1012
+ runtime_candidate_tests.stdout.strip() or runtime_candidate_tests.stderr.strip(),
1013
+ )
1014
+ rig_compatibility_tests = subprocess.run(
1015
+ [sys.executable, str(ROOT / "tests/scripts/test_rig_compatibility.py")],
1016
+ capture_output=True,
1017
+ text=True,
1018
+ )
1019
+ check(
1020
+ "Rig compatibility preserves skeleton, socket, event, runtime evidence and review boundaries",
1021
+ rig_compatibility_tests.returncode == 0 and "rig compatibility contract tests: PASS" in rig_compatibility_tests.stdout,
1022
+ rig_compatibility_tests.stdout.strip() or rig_compatibility_tests.stderr.strip(),
1023
+ )
1024
+ rive_package_gate_tests = subprocess.run(
1025
+ [sys.executable, str(ROOT / "tests/scripts/test_rive_package_gate.py")],
1026
+ capture_output=True,
1027
+ text=True,
1028
+ )
1029
+ check(
1030
+ "Rive package gate requires authentic package bytes, runtime proof and human review",
1031
+ rive_package_gate_tests.returncode == 0 and "rive package gate contract tests: PASS" in rive_package_gate_tests.stdout,
1032
+ rive_package_gate_tests.stdout.strip() or rive_package_gate_tests.stderr.strip(),
1033
+ )
1034
+ ai_pilot_builder_tests = subprocess.run(
1035
+ [sys.executable, str(ROOT / "tests/scripts/test_ai_pilot_builder.py")],
1036
+ capture_output=True,
1037
+ text=True,
1038
+ )
1039
+ check(
1040
+ "AI pilot builder requires real alpha, hash-binds artifacts and preserves review-first status",
1041
+ ai_pilot_builder_tests.returncode == 0 and "AI pilot builder tests: PASS" in ai_pilot_builder_tests.stdout,
1042
+ ai_pilot_builder_tests.stdout.strip() or ai_pilot_builder_tests.stderr.strip(),
1043
+ )
1044
+ alpha_isolation_tests = subprocess.run(
1045
+ [sys.executable, str(ROOT / "tests/scripts/test_alpha_isolation.py")],
1046
+ capture_output=True,
1047
+ text=True,
1048
+ )
1049
+ check(
1050
+ "Alpha isolation only removes reviewed edge-connected background and rejects residual contamination",
1051
+ alpha_isolation_tests.returncode == 0 and "alpha isolation tests: PASS" in alpha_isolation_tests.stdout,
1052
+ alpha_isolation_tests.stdout.strip() or alpha_isolation_tests.stderr.strip(),
1053
+ )
924
1054
 
925
1055
 
926
1056
  if __name__ == "__main__":
@@ -937,6 +1067,7 @@ if __name__ == "__main__":
937
1067
  test_placeholder_is_not_runtime_evidence()
938
1068
  test_runtime_evidence_binding()
939
1069
  test_deep_audit_contracts()
1070
+ test_task_bundle_resolver_contract()
940
1071
  test_runtime_telemetry_verifier_contract()
941
1072
  test_approved_browser_review_e2e_contract()
942
1073
  test_intelligence_core_contracts()