automated-qa 0.11.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 (187) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE +9 -0
  3. package/README.md +100 -0
  4. package/SKILL.md +65 -0
  5. package/agent/prebuilt/darwin-universal/qa-agent +0 -0
  6. package/agent/prebuilt/linux-arm64/qa-agent +0 -0
  7. package/agent/prebuilt/linux-x64/qa-agent +0 -0
  8. package/agent/release-manifest.json +31 -0
  9. package/bin/autonomous-cache.mjs +2 -0
  10. package/bin/bench-generate.mjs +232 -0
  11. package/bin/bench-graph-query.mjs +2 -0
  12. package/bin/bench-score.mjs +10 -0
  13. package/bin/classify.mjs +15 -0
  14. package/bin/coherence-playwright.mjs +1 -0
  15. package/bin/coherence-runner.mjs +6 -0
  16. package/bin/crud-runner.mjs +12 -0
  17. package/bin/experiment-executor.mjs +10 -0
  18. package/bin/experiment-runner.mjs +3 -0
  19. package/bin/inventory.mjs +17 -0
  20. package/bin/probe.js +879 -0
  21. package/bin/qa.mjs +16 -0
  22. package/bin/rules.mjs +5 -0
  23. package/bin/run-benchmarks.mjs +2 -0
  24. package/bin/runtime-packs.mjs +3 -0
  25. package/bin/semantic-explorer.mjs +3 -0
  26. package/bin/shadow-collector.mjs +3 -0
  27. package/bin/shadow-replay.mjs +6 -0
  28. package/bin/soak-marathon.mjs +15 -0
  29. package/bin/sweep.mjs +43 -0
  30. package/bin/validate-priors.mjs +3 -0
  31. package/bin/verify-artifacts.mjs +3 -0
  32. package/bin/verify-manifest.mjs +2 -0
  33. package/install-skill.sh +45 -0
  34. package/lib/qa/agent-availability.mjs +1 -0
  35. package/lib/qa/agent-result.mjs +1 -0
  36. package/lib/qa/analysis.mjs +5 -0
  37. package/lib/qa/atlas-coverage.mjs +11 -0
  38. package/lib/qa/atlas-v1.mjs +1 -0
  39. package/lib/qa/atlas.mjs +2 -0
  40. package/lib/qa/auth/coordinator.mjs +1 -0
  41. package/lib/qa/auth/launcher.mjs +3 -0
  42. package/lib/qa/auth/lease.mjs +1 -0
  43. package/lib/qa/auth/oracle.mjs +1 -0
  44. package/lib/qa/auth/personas.mjs +3 -0
  45. package/lib/qa/autonomous-cache.mjs +3 -0
  46. package/lib/qa/block-ledger.mjs +1 -0
  47. package/lib/qa/capture-report.mjs +63 -0
  48. package/lib/qa/ci.mjs +11 -0
  49. package/lib/qa/cli.mjs +538 -0
  50. package/lib/qa/coherence/analyze.mjs +1 -0
  51. package/lib/qa/coherence/cache-key.mjs +6 -0
  52. package/lib/qa/coherence/causes.mjs +1 -0
  53. package/lib/qa/coherence/concurrency.mjs +1 -0
  54. package/lib/qa/coherence/contracts.mjs +1 -0
  55. package/lib/qa/coherence/entity-aliases.mjs +1 -0
  56. package/lib/qa/coherence/enums.mjs +1 -0
  57. package/lib/qa/coherence/family-report.mjs +1 -0
  58. package/lib/qa/coherence/flow-pool.mjs +1 -0
  59. package/lib/qa/coherence/graph.mjs +1 -0
  60. package/lib/qa/coherence/identity.mjs +1 -0
  61. package/lib/qa/coherence/ir.mjs +4 -0
  62. package/lib/qa/coherence/navigation.mjs +1 -0
  63. package/lib/qa/coherence/observe.mjs +2 -0
  64. package/lib/qa/coherence/offline.mjs +1 -0
  65. package/lib/qa/coherence/plan-join.mjs +1 -0
  66. package/lib/qa/coherence/provenance.mjs +2 -0
  67. package/lib/qa/coherence/report.mjs +1 -0
  68. package/lib/qa/coherence/representations.mjs +1 -0
  69. package/lib/qa/coherence/risk.mjs +2 -0
  70. package/lib/qa/coherence/structural-js.mjs +11 -0
  71. package/lib/qa/coherence/symbols.mjs +6 -0
  72. package/lib/qa/coherence/tanstack.mjs +4 -0
  73. package/lib/qa/coherence/views.mjs +1 -0
  74. package/lib/qa/coherence-planner.mjs +1 -0
  75. package/lib/qa/command-catalog.mjs +2 -0
  76. package/lib/qa/commands/dev.mjs +1 -0
  77. package/lib/qa/commands/fix.mjs +1 -0
  78. package/lib/qa/commands/impl/analysis.mjs +1 -0
  79. package/lib/qa/commands/impl/atlas.mjs +1 -0
  80. package/lib/qa/commands/impl/coherence.mjs +1 -0
  81. package/lib/qa/commands/impl/crud.mjs +2 -0
  82. package/lib/qa/commands/impl/doctor.mjs +1 -0
  83. package/lib/qa/commands/impl/experiments.mjs +1 -0
  84. package/lib/qa/commands/impl/fp.mjs +1 -0
  85. package/lib/qa/commands/impl/graph.mjs +1 -0
  86. package/lib/qa/commands/impl/invariants.mjs +1 -0
  87. package/lib/qa/commands/impl/lanes.mjs +7 -0
  88. package/lib/qa/commands/impl/ledger.mjs +11 -0
  89. package/lib/qa/commands/impl/loop.mjs +1 -0
  90. package/lib/qa/commands/impl/marathon.mjs +1 -0
  91. package/lib/qa/commands/impl/next.mjs +38 -0
  92. package/lib/qa/commands/impl/report.mjs +4 -0
  93. package/lib/qa/commands/impl/research.mjs +4 -0
  94. package/lib/qa/commands/impl/selftest.mjs +1 -0
  95. package/lib/qa/commands/impl/serve.mjs +1 -0
  96. package/lib/qa/commands/impl/shadow.mjs +1 -0
  97. package/lib/qa/commands/impl/stability.mjs +1 -0
  98. package/lib/qa/commands/impl/triage.mjs +1 -0
  99. package/lib/qa/commands/impl/validate.mjs +4 -0
  100. package/lib/qa/commands/impl/version.mjs +1 -0
  101. package/lib/qa/commands/impl/watch.mjs +1 -0
  102. package/lib/qa/commands/init.mjs +6 -0
  103. package/lib/qa/commands/measure.mjs +1 -0
  104. package/lib/qa/commands/run.mjs +1 -0
  105. package/lib/qa/commands/show.mjs +1 -0
  106. package/lib/qa/commands/verify.mjs +6 -0
  107. package/lib/qa/deepening.mjs +1 -0
  108. package/lib/qa/denominators.mjs +1 -0
  109. package/lib/qa/depth.mjs +4 -0
  110. package/lib/qa/doctor.mjs +2 -0
  111. package/lib/qa/experiments-default.mjs +1 -0
  112. package/lib/qa/fix-lanes.mjs +3 -0
  113. package/lib/qa/forced-states.mjs +1 -0
  114. package/lib/qa/fp.mjs +2 -0
  115. package/lib/qa/fs.mjs +6 -0
  116. package/lib/qa/graph-schema.mjs +2 -0
  117. package/lib/qa/graph.mjs +3 -0
  118. package/lib/qa/harness-plan.mjs +3 -0
  119. package/lib/qa/init.mjs +5 -0
  120. package/lib/qa/integrity.mjs +1 -0
  121. package/lib/qa/invariants.mjs +84 -0
  122. package/lib/qa/jcs.mjs +1 -0
  123. package/lib/qa/lanes.mjs +1 -0
  124. package/lib/qa/loop.mjs +7 -0
  125. package/lib/qa/marathon-coherence.mjs +1 -0
  126. package/lib/qa/marathon-phases.mjs +1 -0
  127. package/lib/qa/marathon-wait.mjs +3 -0
  128. package/lib/qa/marathon.mjs +5 -0
  129. package/lib/qa/mode-coverage.mjs +1 -0
  130. package/lib/qa/mutation-policy.mjs +1 -0
  131. package/lib/qa/pattern-ledger.mjs +3 -0
  132. package/lib/qa/pending.mjs +1 -0
  133. package/lib/qa/proc.mjs +4 -0
  134. package/lib/qa/recommend.mjs +1 -0
  135. package/lib/qa/release-manifest.mjs +1 -0
  136. package/lib/qa/report-html.mjs +178 -0
  137. package/lib/qa/reports.mjs +2 -0
  138. package/lib/qa/request-evidence.mjs +1 -0
  139. package/lib/qa/research.mjs +20 -0
  140. package/lib/qa/routing.mjs +1 -0
  141. package/lib/qa/runs.mjs +1 -0
  142. package/lib/qa/schema.mjs +1 -0
  143. package/lib/qa/serve.mjs +4 -0
  144. package/lib/qa/server.mjs +1 -0
  145. package/lib/qa/source-snapshot.mjs +3 -0
  146. package/lib/qa/stability.mjs +3 -0
  147. package/lib/qa/state-evidence.mjs +1 -0
  148. package/lib/qa/sweep-incremental.mjs +1 -0
  149. package/lib/qa/triage.mjs +2 -0
  150. package/lib/qa/verdict.mjs +1 -0
  151. package/lib/qa/watch.mjs +2 -0
  152. package/package.json +62 -0
  153. package/references/ATLAS-COVERAGE.md +231 -0
  154. package/references/atlas-v1.md +318 -0
  155. package/references/atlas.md +338 -0
  156. package/references/verify.crud.example.json +1 -0
  157. package/references/verify.impact.example.json +1 -0
  158. package/references/verify.shadow.example.json +1 -0
  159. package/schemas/agent-result.schema.json +135 -0
  160. package/schemas/analysis.schema.json +15 -0
  161. package/schemas/classify.schema.json +61 -0
  162. package/schemas/coherence-ir.schema.json +1585 -0
  163. package/schemas/coherence-observed.schema.json +1171 -0
  164. package/schemas/coherence-plan.schema.json +77 -0
  165. package/schemas/coherence-risk.schema.json +46 -0
  166. package/schemas/crud-observed.schema.json +118 -0
  167. package/schemas/experiment-execution.schema.json +82 -0
  168. package/schemas/graph-edge.schema.json +22 -0
  169. package/schemas/graph-node.schema.json +81 -0
  170. package/schemas/graph.schema.json +2493 -0
  171. package/schemas/identity-oracle.schema.json +19 -0
  172. package/schemas/inventory.schema.json +2167 -0
  173. package/schemas/lanes-plan.schema.json +52 -0
  174. package/schemas/next.schema.json +54 -0
  175. package/schemas/personas.schema.json +52 -0
  176. package/schemas/research.schema.json +192 -0
  177. package/schemas/run.schema.json +160 -0
  178. package/schemas/shadow-replay.schema.json +68 -0
  179. package/schemas/stability.schema.json +92 -0
  180. package/schemas/sweep.schema.json +239 -0
  181. package/schemas/v1/agent-result.schema.json +106 -0
  182. package/schemas/v1/run.schema.json +96 -0
  183. package/schemas/verify-crud.schema.json +37 -0
  184. package/schemas/verify-read-only.schema.json +37 -0
  185. package/templates/github-workflow.yml +80 -0
  186. package/templates/pre-commit.sample +22 -0
  187. package/verify.sh +385 -0
@@ -0,0 +1,1171 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/coherence-observed.schema.json",
4
+ "title": "coherence-observed.json",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "status",
9
+ "runId",
10
+ "base",
11
+ "lane",
12
+ "provenance",
13
+ "counts",
14
+ "cases",
15
+ "findings"
16
+ ],
17
+ "oneOf": [
18
+ { "required": ["schemaVersion"], "properties": { "schemaVersion": { "const": 1 } } },
19
+ { "required": ["schemaVersion", "cases", "findings"], "properties": { "schemaVersion": { "enum": [2, 3] }, "cases": { "type": "array", "items": { "$ref": "#/$defs/currentCaseV3" } }, "findings": { "type": "array", "items": { "$ref": "#/$defs/currentFinding" } }, "plan": { "$ref": "#/$defs/currentPlan" } } },
20
+ { "required": ["schemaVersion", "cases", "findings"], "properties": { "schemaVersion": { "const": 4 }, "cases": { "type": "array", "items": { "$ref": "#/$defs/currentCase" } }, "findings": { "type": "array", "items": { "$ref": "#/$defs/currentFinding" } }, "plan": { "$ref": "#/$defs/currentPlan" } } }
21
+ ],
22
+ "additionalProperties": false,
23
+ "properties": {
24
+ "schemaVersion": {
25
+ "enum": [1, 2, 3, 4]
26
+ },
27
+ "status": {
28
+ "type": "string",
29
+ "enum": [
30
+ "measured",
31
+ "partial",
32
+ "unmeasured",
33
+ "invalid"
34
+ ]
35
+ },
36
+ "runId": {
37
+ "type": "string",
38
+ "minLength": 1
39
+ },
40
+ "base": {
41
+ "type": "string",
42
+ "minLength": 1
43
+ },
44
+ "lane": {
45
+ "type": "string",
46
+ "minLength": 1
47
+ },
48
+ "reason": {
49
+ "type": "string"
50
+ },
51
+ "provenance": {
52
+ "type": "array"
53
+ },
54
+ "cases": {
55
+ "type": "array",
56
+ "items": {
57
+ "$ref": "#/$defs/case"
58
+ }
59
+ },
60
+ "findings": {
61
+ "type": "array"
62
+ },
63
+ "counts": {
64
+ "$ref": "#/$defs/counts"
65
+ },
66
+ "plan": {
67
+ "$ref": "#/$defs/plan"
68
+ },
69
+ "parallelism": {
70
+ "$ref": "#/$defs/parallelism"
71
+ },
72
+ "resume": {
73
+ "$ref": "#/$defs/resume"
74
+ },
75
+ "envelope": {
76
+ "$ref": "#/$defs/envelope"
77
+ }
78
+ },
79
+ "$defs": {
80
+ "currentObserver": { "type": "object", "required": ["persona", "expect", "identity"], "additionalProperties": false, "properties": { "persona": { "type": "string", "minLength": 1 }, "expect": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] }, "identity": { "$ref": "#/$defs/principalIdentity" } } },
81
+ "currentCellMaterial": { "type": "object", "required": ["namespace", "version", "mutation", "target", "surface", "principal", "context", "invariant", "expectation"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/observation-cell" }, "version": { "const": 1 }, "mutation": { "$ref": "#/$defs/mutationIdentity" }, "target": { "$ref": "#/$defs/targetIdentity" }, "surface": { "$ref": "#/$defs/surfaceIdentity" }, "principal": { "$ref": "#/$defs/principalIdentity" }, "context": { "$ref": "#/$defs/contextIdentity" }, "invariant": { "$ref": "#/$defs/invariantIdentity" }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] } } },
82
+ "currentCell": { "type": "object", "required": ["cellId", "material"], "additionalProperties": false, "properties": { "cellId": { "$ref": "#/$defs/coherenceId" }, "material": { "$ref": "#/$defs/currentCellMaterial" } } },
83
+ "currentWarmObservation": { "type": "object", "required": ["persona", "principalId", "context", "contextId", "transition", "invariant", "invariantId", "expectation", "status", "agreed", "reason", "comparisonReason", "refetched", "typed", "authoritative", "observed"], "additionalProperties": false, "properties": { "persona": { "type": "string" }, "principalId": { "$ref": "#/$defs/coherenceId" }, "context": { "enum": ["warm-cache", "fresh-context"] }, "contextId": { "$ref": "#/$defs/coherenceId" }, "transition": { "type": ["string", "null"] }, "invariant": { "enum": ["field-parity", "visibility-policy"] }, "invariantId": { "$ref": "#/$defs/coherenceId" }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] }, "status": { "enum": ["measured", "unmeasured"] }, "agreed": { "type": ["boolean", "null"] }, "reason": { "type": ["string", "null"] }, "comparisonReason": { "type": ["string", "null"] }, "refetched": { "type": "boolean" }, "typed": { "type": "boolean" }, "authoritative": { "$ref": "#/$defs/stateDigest" }, "observed": { "$ref": "#/$defs/stateDigest" } } },
84
+ "currentFreshObservation": { "type": "object", "required": ["persona", "principalId", "context", "contextId", "invariants", "invariantIds", "expectation", "status", "agreed", "reason", "authoritative", "observed"], "additionalProperties": false, "properties": { "persona": { "type": "string" }, "principalId": { "$ref": "#/$defs/coherenceId" }, "context": { "const": "fresh-context" }, "contextId": { "$ref": "#/$defs/coherenceId" }, "invariants": { "type": "array", "items": { "enum": ["field-parity", "durability"] } }, "invariantIds": { "type": "array", "items": { "$ref": "#/$defs/coherenceId" } }, "expectation": { "const": "visible" }, "status": { "enum": ["measured", "unmeasured"] }, "agreed": { "type": ["boolean", "null"] }, "reason": { "type": ["string", "null"] }, "authoritative": { "$ref": "#/$defs/stateDigest" }, "observed": { "$ref": "#/$defs/stateDigest" } } },
85
+ "currentObservationCase": { "type": "object", "required": ["targetId", "surfaceId", "route", "observations", "fresh", "status", "comparison"], "additionalProperties": false, "properties": { "targetId": { "$ref": "#/$defs/coherenceId" }, "surfaceId": { "$ref": "#/$defs/coherenceId" }, "route": { "type": ["string", "null"] }, "observations": { "type": "array", "items": { "$ref": "#/$defs/currentWarmObservation" } }, "fresh": { "$ref": "#/$defs/currentFreshObservation" }, "status": { "enum": ["measured", "unmeasured"] }, "reason": { "type": "string" }, "comparison": { "anyOf": [{ "type": "null" }, { "type": "object", "required": ["agreed", "authoritative", "fresh"], "additionalProperties": false, "properties": { "agreed": { "type": "boolean" }, "authoritative": { "$ref": "#/$defs/stateDigest" }, "fresh": { "$ref": "#/$defs/stateDigest" } } }] } } },
86
+ "currentFinding": { "type": "object", "required": ["kind", "severity", "targetId", "surfaceId"], "additionalProperties": false, "properties": { "kind": { "type": "string" }, "severity": { "enum": ["P0", "P1", "P2", "P3"] }, "rootCauseId": { "type": "string", "pattern": "^crc:[a-f0-9]{64}$" }, "targetId": { "$ref": "#/$defs/coherenceId" }, "surfaceId": { "$ref": "#/$defs/coherenceId" }, "route": { "type": ["string", "null"] }, "persona": { "type": "string" } } },
87
+ "causalEvidence": { "type": "object", "required": ["status", "reason", "accepted", "fixture", "effect", "convergence", "observers"], "additionalProperties": false, "properties": { "status": { "enum": ["measured", "unmeasured", "invalid"] }, "reason": { "type": ["string", "null"] }, "accepted": { "type": "boolean" }, "fixture": { "anyOf": [{ "type": "null" }, { "type": "object", "required": ["namespace", "entity", "entityId"], "additionalProperties": false, "properties": { "namespace": { "type": "string", "minLength": 1 }, "entity": { "type": "string", "minLength": 1 }, "entityId": { "$ref": "#/$defs/sha256Digest" } } }] }, "effect": { "anyOf": [{ "type": "null" }, { "type": "object", "required": ["kind", "field", "verified", "beforeHash", "expectedHash", "afterHash", "settledHash", "beforeVersionHash", "afterVersionHash", "versionAdvanced"], "additionalProperties": false, "properties": { "kind": { "enum": ["field-change", "version-advance"] }, "field": { "type": "string", "minLength": 1 }, "verified": { "const": true }, "beforeHash": { "$ref": "#/$defs/sha256Digest" }, "expectedHash": { "$ref": "#/$defs/sha256Digest" }, "afterHash": { "$ref": "#/$defs/sha256Digest" }, "settledHash": { "$ref": "#/$defs/sha256Digest" }, "beforeVersionHash": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/sha256Digest" }] }, "afterVersionHash": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/sha256Digest" }] }, "versionAdvanced": { "type": ["boolean", "null"] } } }] }, "convergence": { "anyOf": [{ "type": "null" }, { "type": "object", "required": ["deadlineMs", "elapsedMs", "converged"], "additionalProperties": false, "properties": { "deadlineMs": { "type": "integer", "minimum": 1, "maximum": 120000 }, "elapsedMs": { "type": "number", "minimum": 0 }, "converged": { "const": true } } }] }, "observers": { "type": "array", "items": { "type": "object", "required": ["targetId", "surfaceId", "route", "persona", "context", "status", "agreed", "projection"], "additionalProperties": false, "properties": { "targetId": { "type": ["string", "null"] }, "surfaceId": { "type": ["string", "null"] }, "route": { "type": ["string", "null"] }, "persona": { "type": "string", "minLength": 1 }, "context": { "enum": ["warm-cache", "fresh-context"] }, "status": { "enum": ["measured", "unmeasured"] }, "agreed": { "type": ["boolean", "null"] }, "projection": { "$ref": "#/$defs/stateDigest" } } } } } },
88
+ "currentCaseV3": { "type": "object", "required": ["id", "flow", "flowExecutionId", "flowExecutionMaterial", "cells", "status", "counts", "findings"], "additionalProperties": false, "properties": { "id": { "type": "string" }, "flow": { "type": "string" }, "observers": { "type": "array", "items": { "$ref": "#/$defs/currentObserver" } }, "rootCauseId": { "type": "string", "pattern": "^crc:[a-f0-9]{64}$" }, "flowExecutionId": { "$ref": "#/$defs/coherenceId" }, "flowExecutionMaterial": { "$ref": "#/$defs/flowExecutionMaterial" }, "cells": { "type": "array", "items": { "$ref": "#/$defs/currentCell" } }, "status": { "enum": ["measured", "invalid"] }, "reason": { "type": "string" }, "counts": { "$ref": "#/$defs/caseCounts" }, "findings": { "type": "array", "items": { "$ref": "#/$defs/currentFinding" } }, "cases": { "type": "array", "items": { "$ref": "#/$defs/currentObservationCase" } }, "mutationAccepted": { "type": "boolean" }, "timing": { "$ref": "#/$defs/caseTiming" } } },
89
+ "currentCase": { "type": "object", "required": ["id", "flow", "flowExecutionId", "flowExecutionMaterial", "cells", "status", "counts", "findings"], "additionalProperties": false, "properties": { "id": { "type": "string" }, "flow": { "type": "string" }, "observers": { "type": "array", "items": { "$ref": "#/$defs/currentObserver" } }, "rootCauseId": { "type": "string", "pattern": "^crc:[a-f0-9]{64}$" }, "flowExecutionId": { "$ref": "#/$defs/coherenceId" }, "flowExecutionMaterial": { "$ref": "#/$defs/flowExecutionMaterial" }, "cells": { "type": "array", "items": { "$ref": "#/$defs/currentCell" } }, "status": { "enum": ["measured", "invalid"] }, "reason": { "type": "string" }, "counts": { "$ref": "#/$defs/caseCounts" }, "findings": { "type": "array", "items": { "$ref": "#/$defs/currentFinding" } }, "cases": { "type": "array", "items": { "$ref": "#/$defs/currentObservationCase" } }, "causal": { "$ref": "#/$defs/causalEvidence" }, "mutationAccepted": { "type": "boolean" }, "timing": { "$ref": "#/$defs/caseTiming" } } },
90
+ "currentPlanObligation": { "type": "object", "required": ["id", "mutationId", "targetId", "surfaceId", "principalId", "contextId", "invariantId", "expectation", "status"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "mutationId": { "$ref": "#/$defs/coherenceId" }, "targetId": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" }, "surfaceId": { "$ref": "#/$defs/coherenceId" }, "principalId": { "$ref": "#/$defs/coherenceId" }, "contextId": { "$ref": "#/$defs/coherenceId" }, "invariantId": { "$ref": "#/$defs/coherenceId" }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] }, "status": { "enum": ["unmeasured", "reached", "agreed", "disagreed"] }, "reason": { "type": "string" } } },
91
+ "currentPlanTarget": { "type": "object", "required": ["surfaceId", "route", "status", "counts", "obligations"], "additionalProperties": false, "properties": { "targetId": { "$ref": "#/$defs/coherenceId" }, "surfaceId": { "$ref": "#/$defs/coherenceId" }, "route": { "type": "string" }, "status": { "enum": ["unmeasured", "partial", "agreed", "disagreed"] }, "reason": { "type": "string" }, "counts": { "$ref": "#/$defs/planTargetCounts" }, "obligations": { "type": "array", "items": { "$ref": "#/$defs/currentPlanObligation" } } } },
92
+ "currentPlanJourney": { "type": "object", "required": ["journeyId", "flow", "status", "targets"], "additionalProperties": false, "properties": { "journeyId": { "type": "string" }, "flow": { "type": ["string", "null"] }, "flowId": { "$ref": "#/$defs/coherenceId" }, "status": { "enum": ["matched", "unmeasured"] }, "reason": { "type": "string" }, "targets": { "type": "array", "items": { "$ref": "#/$defs/currentPlanTarget" } } } },
93
+ "currentPlan": { "type": "object", "oneOf": [{ "required": ["status", "reason"], "additionalProperties": false, "properties": { "status": { "const": "unmeasured" }, "reason": { "type": "string" } } }, { "required": ["status", "source", "journeys", "obligations", "coverage", "needed"], "additionalProperties": false, "properties": { "status": { "const": "measured" }, "source": { "type": "string" }, "runId": { "type": ["string", "null"] }, "journeys": { "type": "array", "items": { "$ref": "#/$defs/currentPlanJourney" } }, "obligations": { "type": "array", "items": { "$ref": "#/$defs/currentPlanObligation" } }, "coverage": { "$ref": "#/$defs/planCoverage" }, "needed": { "type": "array", "items": { "$ref": "#/$defs/planNeeded" } }, "order": { "type": "array", "items": { "type": "string" } } } }] },
94
+ "funnel": {
95
+ "type": "object",
96
+ "required": [
97
+ "planned",
98
+ "completed",
99
+ "unmeasured"
100
+ ],
101
+ "additionalProperties": false,
102
+ "properties": {
103
+ "planned": {
104
+ "type": "integer",
105
+ "minimum": 0
106
+ },
107
+ "completed": {
108
+ "type": "integer",
109
+ "minimum": 0
110
+ },
111
+ "unmeasured": {
112
+ "type": "integer",
113
+ "minimum": 0
114
+ }
115
+ }
116
+ },
117
+ "targets": {
118
+ "type": "object",
119
+ "required": [
120
+ "planned",
121
+ "reached",
122
+ "compared",
123
+ "agreed",
124
+ "unmeasured"
125
+ ],
126
+ "additionalProperties": false,
127
+ "properties": {
128
+ "planned": {
129
+ "type": "integer",
130
+ "minimum": 0
131
+ },
132
+ "reached": {
133
+ "type": "integer",
134
+ "minimum": 0
135
+ },
136
+ "compared": {
137
+ "type": "integer",
138
+ "minimum": 0
139
+ },
140
+ "agreed": {
141
+ "type": "integer",
142
+ "minimum": 0
143
+ },
144
+ "unmeasured": {
145
+ "type": "integer",
146
+ "minimum": 0
147
+ }
148
+ }
149
+ },
150
+ "obligations": {
151
+ "type": "object",
152
+ "required": [
153
+ "discovered",
154
+ "resolved",
155
+ "unresolved",
156
+ "planned",
157
+ "reached",
158
+ "compared",
159
+ "agreed"
160
+ ],
161
+ "additionalProperties": false,
162
+ "properties": {
163
+ "discovered": {
164
+ "type": "integer",
165
+ "minimum": 0
166
+ },
167
+ "resolved": {
168
+ "type": "integer",
169
+ "minimum": 0
170
+ },
171
+ "unresolved": {
172
+ "type": "integer",
173
+ "minimum": 0
174
+ },
175
+ "planned": {
176
+ "type": "integer",
177
+ "minimum": 0
178
+ },
179
+ "reached": {
180
+ "type": "integer",
181
+ "minimum": 0
182
+ },
183
+ "compared": {
184
+ "type": "integer",
185
+ "minimum": 0
186
+ },
187
+ "agreed": {
188
+ "type": "integer",
189
+ "minimum": 0
190
+ }
191
+ }
192
+ },
193
+ "mutations": {
194
+ "type": "object",
195
+ "required": [
196
+ "declared",
197
+ "executed"
198
+ ],
199
+ "additionalProperties": false,
200
+ "properties": {
201
+ "declared": {
202
+ "type": "integer",
203
+ "minimum": 0
204
+ },
205
+ "executed": {
206
+ "type": "integer",
207
+ "minimum": 0
208
+ }
209
+ }
210
+ },
211
+ "counts": {
212
+ "type": "object",
213
+ "required": [
214
+ "cases",
215
+ "targets",
216
+ "personas",
217
+ "contexts",
218
+ "cleanups",
219
+ "obligations",
220
+ "mutations"
221
+ ],
222
+ "additionalProperties": false,
223
+ "properties": {
224
+ "cases": {
225
+ "$ref": "#/$defs/funnel"
226
+ },
227
+ "targets": {
228
+ "$ref": "#/$defs/targets"
229
+ },
230
+ "personas": {
231
+ "$ref": "#/$defs/funnel"
232
+ },
233
+ "contexts": {
234
+ "$ref": "#/$defs/funnel"
235
+ },
236
+ "cleanups": {
237
+ "$ref": "#/$defs/funnel"
238
+ },
239
+ "obligations": {
240
+ "$ref": "#/$defs/obligations"
241
+ },
242
+ "mutations": {
243
+ "$ref": "#/$defs/mutations"
244
+ }
245
+ }
246
+ },
247
+ "planTargetStatus": {
248
+ "type": "object",
249
+ "required": [
250
+ "surfaceId",
251
+ "route",
252
+ "status"
253
+ ],
254
+ "additionalProperties": false,
255
+ "properties": {
256
+ "surfaceId": {
257
+ "type": "string"
258
+ },
259
+ "route": {
260
+ "type": "string"
261
+ },
262
+ "status": {
263
+ "type": "string",
264
+ "enum": [
265
+ "agreed",
266
+ "disagreed",
267
+ "unmeasured"
268
+ ]
269
+ },
270
+ "reason": {
271
+ "type": "string"
272
+ }
273
+ }
274
+ },
275
+ "planJourney": {
276
+ "type": "object",
277
+ "required": [
278
+ "journeyId",
279
+ "flow",
280
+ "status",
281
+ "targets"
282
+ ],
283
+ "additionalProperties": false,
284
+ "properties": {
285
+ "journeyId": {
286
+ "type": "string"
287
+ },
288
+ "flow": {
289
+ "type": [
290
+ "string",
291
+ "null"
292
+ ]
293
+ },
294
+ "flowId": { "$ref": "#/$defs/coherenceId" },
295
+ "status": {
296
+ "type": "string",
297
+ "enum": [
298
+ "matched",
299
+ "unmeasured"
300
+ ]
301
+ },
302
+ "reason": {
303
+ "type": "string"
304
+ },
305
+ "targets": {
306
+ "type": "array",
307
+ "items": {
308
+ "$ref": "#/$defs/planTarget"
309
+ }
310
+ }
311
+ }
312
+ },
313
+ "planCoverage": {
314
+ "type": "object",
315
+ "required": [
316
+ "discovered",
317
+ "resolved",
318
+ "unresolved",
319
+ "planned",
320
+ "reached",
321
+ "compared",
322
+ "agreed",
323
+ "disagreed"
324
+ ],
325
+ "additionalProperties": false,
326
+ "properties": {
327
+ "discovered": {
328
+ "type": "integer",
329
+ "minimum": 0
330
+ },
331
+ "resolved": {
332
+ "type": "integer",
333
+ "minimum": 0
334
+ },
335
+ "unresolved": {
336
+ "type": "integer",
337
+ "minimum": 0
338
+ },
339
+ "planned": {
340
+ "type": "integer",
341
+ "minimum": 0
342
+ },
343
+ "reached": {
344
+ "type": "integer",
345
+ "minimum": 0
346
+ },
347
+ "compared": {
348
+ "type": "integer",
349
+ "minimum": 0
350
+ },
351
+ "agreed": {
352
+ "type": "integer",
353
+ "minimum": 0
354
+ },
355
+ "disagreed": {
356
+ "type": "integer",
357
+ "minimum": 0
358
+ }
359
+ }
360
+ },
361
+ "plan": {
362
+ "type": "object",
363
+ "oneOf": [
364
+ {
365
+ "required": [
366
+ "status",
367
+ "reason"
368
+ ],
369
+ "additionalProperties": false,
370
+ "properties": {
371
+ "status": {
372
+ "const": "unmeasured"
373
+ },
374
+ "reason": {
375
+ "type": "string"
376
+ }
377
+ }
378
+ },
379
+ {
380
+ "required": [
381
+ "status",
382
+ "source",
383
+ "journeys",
384
+ "obligations",
385
+ "coverage",
386
+ "needed"
387
+ ],
388
+ "additionalProperties": false,
389
+ "properties": {
390
+ "status": {
391
+ "const": "measured"
392
+ },
393
+ "source": {
394
+ "type": "string"
395
+ },
396
+ "runId": {
397
+ "type": [
398
+ "string",
399
+ "null"
400
+ ]
401
+ },
402
+ "journeys": {
403
+ "type": "array",
404
+ "items": {
405
+ "$ref": "#/$defs/planJourney"
406
+ }
407
+ },
408
+ "coverage": {
409
+ "$ref": "#/$defs/planCoverage"
410
+ },
411
+ "obligations": {
412
+ "type": "array",
413
+ "items": {
414
+ "$ref": "#/$defs/planObligation"
415
+ }
416
+ },
417
+ "needed": {
418
+ "type": "array",
419
+ "items": {
420
+ "$ref": "#/$defs/planNeeded"
421
+ }
422
+ },
423
+ "order": {
424
+ "type": "array",
425
+ "items": {
426
+ "type": "string"
427
+ }
428
+ }
429
+ }
430
+ }
431
+ ]
432
+ },
433
+ "parallelism": {
434
+ "type": "object",
435
+ "required": [
436
+ "requested",
437
+ "used",
438
+ "reason"
439
+ ],
440
+ "additionalProperties": false,
441
+ "properties": {
442
+ "requested": {
443
+ "type": "integer",
444
+ "minimum": 1
445
+ },
446
+ "used": {
447
+ "type": "integer",
448
+ "minimum": 1
449
+ },
450
+ "reason": {
451
+ "type": [
452
+ "string",
453
+ "null"
454
+ ]
455
+ }
456
+ }
457
+ },
458
+ "resume": {
459
+ "type": "object",
460
+ "required": [
461
+ "journal",
462
+ "replayed",
463
+ "invalid"
464
+ ],
465
+ "additionalProperties": false,
466
+ "properties": {
467
+ "journal": {
468
+ "type": "string"
469
+ },
470
+ "replayed": {
471
+ "type": "array",
472
+ "items": {
473
+ "type": "string"
474
+ }
475
+ },
476
+ "invalid": {
477
+ "anyOf": [
478
+ { "type": "null" },
479
+ { "$ref": "#/$defs/journalInvalid" }
480
+ ]
481
+ }
482
+ }
483
+ },
484
+ "digest": {
485
+ "type": "string",
486
+ "pattern": "^[a-f0-9]{64}$"
487
+ },
488
+ "digestPair": {
489
+ "type": "object",
490
+ "required": ["material", "digest"],
491
+ "additionalProperties": false,
492
+ "properties": {
493
+ "material": {},
494
+ "digest": { "$ref": "#/$defs/digest" }
495
+ }
496
+ },
497
+ "sha256Digest": {
498
+ "type": "string",
499
+ "pattern": "^sha256:[a-f0-9]{64}$"
500
+ },
501
+ "sourceIdentity": {
502
+ "type": "object",
503
+ "required": ["repoRealPath", "gitSha", "dirtyDigest", "clean"],
504
+ "additionalProperties": false,
505
+ "properties": {
506
+ "repoRealPath": { "type": "string", "minLength": 1 },
507
+ "gitSha": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
508
+ "dirtyDigest": { "$ref": "#/$defs/sha256Digest" },
509
+ "clean": { "type": "boolean" }
510
+ }
511
+ },
512
+ "servedIdentity": {
513
+ "type": "object",
514
+ "required": ["repoRealPath", "gitSha", "dirtyDigest", "clean", "buildId"],
515
+ "additionalProperties": false,
516
+ "properties": {
517
+ "repoRealPath": { "type": "string", "minLength": 1 },
518
+ "gitSha": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
519
+ "dirtyDigest": { "$ref": "#/$defs/sha256Digest" },
520
+ "clean": { "type": "boolean" },
521
+ "buildId": { "type": "string", "minLength": 1 }
522
+ }
523
+ },
524
+ "representation": {
525
+ "type": "object",
526
+ "required": ["selector", "field", "type"],
527
+ "additionalProperties": false,
528
+ "properties": {
529
+ "selector": { "type": "string", "minLength": 1 },
530
+ "field": { "type": "string", "minLength": 1 },
531
+ "type": { "enum": ["string", "number", "boolean", "count", "enum", "money", "date", "datetime", "duration", "unit"] },
532
+ "source": { "enum": ["text", "value", "attribute", "aria"] },
533
+ "attribute": { "type": "string" },
534
+ "locale": { "type": "string" },
535
+ "timezone": { "type": "string" },
536
+ "currency": { "type": "string", "pattern": "^[A-Z]{3}$" },
537
+ "scale": { "type": "integer", "minimum": 0, "maximum": 6 },
538
+ "inputUnit": { "type": "string" },
539
+ "canonicalUnit": { "type": "string" },
540
+ "factor": { "type": "number" },
541
+ "optional_on_summary": { "type": "boolean" }
542
+ }
543
+ },
544
+ "coherenceId": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
545
+ "identitySourceRef": { "type": "object", "required": ["file", "line"], "additionalProperties": false, "properties": { "file": { "type": ["string", "null"] }, "line": { "type": "integer", "minimum": 0 } } },
546
+ "mutationIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "sourceRef", "endpoint"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/mutation" }, "version": { "const": 1 }, "sourceRef": { "$ref": "#/$defs/identitySourceRef" }, "endpoint": { "type": ["string", "null"] } } } } },
547
+ "surfaceIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "route", "component", "sourceRef"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/surface" }, "version": { "const": 1 }, "route": { "type": "string" }, "component": { "type": ["string", "null"] }, "sourceRef": { "$ref": "#/$defs/identitySourceRef" } } } } },
548
+ "targetIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "flow", "route", "transition", "role", "representation"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/target" }, "version": { "const": 1 }, "flow": { "$ref": "#/$defs/flowIdentity" }, "route": { "type": "string" }, "transition": { "type": ["string", "null"] }, "role": { "type": ["string", "null"] }, "representation": { "type": "object", "required": ["field", "type"], "additionalProperties": false, "properties": { "field": { "type": "string" }, "type": { "type": "string" }, "source": { "type": "string" }, "attribute": { "type": "string" }, "locale": { "type": "string" }, "timezone": { "type": "string" }, "currency": { "type": "string" }, "scale": { "type": "integer" }, "inputUnit": { "type": "string" }, "canonicalUnit": { "type": "string" }, "factor": { "type": "number" }, "optional_on_summary": { "type": "boolean" } } } } } } },
549
+ "principalIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "name"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/principal" }, "version": { "const": 1 }, "name": { "type": "string" } } } } },
550
+ "entityIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "name"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/entity" }, "version": { "const": 1 }, "name": { "type": "string" } } } } },
551
+ "flowIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "route", "declaredEndpoint"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/flow" }, "version": { "const": 1 }, "route": { "type": "string" }, "declaredEndpoint": { "type": "string" } } } } },
552
+ "contextIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "kind", "transition"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/context" }, "version": { "const": 1 }, "kind": { "enum": ["warm-cache", "fresh-context"] }, "transition": { "type": ["string", "null"] } } } } },
553
+ "invariantIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/coherenceId" }, "material": { "type": "object", "required": ["namespace", "version", "name"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/invariant" }, "version": { "const": 1 }, "name": { "enum": ["field-parity", "visibility-policy", "durability"] } } } } },
554
+ "observer": {
555
+ "type": "object",
556
+ "required": ["persona", "expect"],
557
+ "additionalProperties": false,
558
+ "properties": {
559
+ "persona": { "type": "string", "minLength": 1 },
560
+ "expect": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] },
561
+ "identity": { "$ref": "#/$defs/principalIdentity" }
562
+ }
563
+ },
564
+ "semanticTarget": {
565
+ "type": "object",
566
+ "required": ["id", "route", "transition", "representation"],
567
+ "additionalProperties": false,
568
+ "properties": {
569
+ "id": { "type": "string", "minLength": 1 },
570
+ "route": { "type": "string", "minLength": 1 },
571
+ "role": { "type": "string" },
572
+ "transition": { "enum": ["same-surface", "client-navigation", "reload", "fresh-context", "history-back", "history-forward", "direct-url", "offline-replay"] },
573
+ "representation": { "$ref": "#/$defs/representation" }
574
+ ,"identity": { "$ref": "#/$defs/targetIdentity" }
575
+ ,"surfaceMatch": { "type": "object", "required": ["surface", "evidence"], "additionalProperties": false, "properties": { "surface": { "$ref": "#/$defs/surfaceIdentity" }, "evidence": { "type": "object", "required": ["source", "kind"], "additionalProperties": false, "properties": { "source": { "type": "string", "minLength": 1 }, "kind": { "const": "declared" } } } } }
576
+ }
577
+ },
578
+ "causalContract": { "type": "object", "required": ["entity", "effect", "convergence"], "additionalProperties": false, "properties": { "entity": { "type": "string", "minLength": 1 }, "effect": { "type": "object", "required": ["kind", "field"], "additionalProperties": false, "properties": { "kind": { "enum": ["field-change", "version-advance"] }, "field": { "type": "string", "minLength": 1 } } }, "convergence": { "type": "object", "required": ["deadlineMs"], "additionalProperties": false, "properties": { "deadlineMs": { "type": "integer", "minimum": 1, "maximum": 120000 } } } } },
579
+ "crosscheck": {
580
+ "type": "object",
581
+ "required": ["entity", "writer", "authoritative_readback", "observers", "targets"],
582
+ "additionalProperties": false,
583
+ "properties": {
584
+ "entity": { "type": "string", "minLength": 1 },
585
+ "entityIdentity": { "$ref": "#/$defs/entityIdentity" },
586
+ "mutationIdentity": { "$ref": "#/$defs/mutationIdentity" },
587
+ "writer": { "type": "string", "minLength": 1 },
588
+ "writerIdentity": { "$ref": "#/$defs/principalIdentity" },
589
+ "authoritative_readback": { "type": "string", "minLength": 1 },
590
+ "plan_journey": { "type": "string", "minLength": 1 },
591
+ "isolation": { "const": "per-flow" },
592
+ "causal": { "$ref": "#/$defs/causalContract" },
593
+ "observers": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/observer" } },
594
+ "targets": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/semanticTarget" } }
595
+ }
596
+ },
597
+ "rawFlowDeclaration": {
598
+ "type": "object",
599
+ "required": ["name", "production", "crosscheck"],
600
+ "additionalProperties": true,
601
+ "properties": {
602
+ "name": { "type": "string", "minLength": 1 },
603
+ "route": { "type": "string" },
604
+ "declared_endpoint": { "type": "string" },
605
+ "cleanup_required": { "type": "boolean" },
606
+ "production": { "const": false },
607
+ "identity": { "$ref": "#/$defs/flowIdentity" },
608
+ "crosscheck": { "$ref": "#/$defs/crosscheck" }
609
+ }
610
+ },
611
+ "selectedFlowDeclarations": {
612
+ "type": "object",
613
+ "required": ["namespace", "version", "schemaVersion", "flows"],
614
+ "additionalProperties": false,
615
+ "properties": {
616
+ "namespace": { "const": "coherence/selected-flow-declarations" },
617
+ "version": { "const": 1 },
618
+ "schemaVersion": { "enum": [1, 2, 3] },
619
+ "flows": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/rawFlowDeclaration" } }
620
+ }
621
+ },
622
+ "cleanupPermit": {
623
+ "type": "object",
624
+ "required": ["required", "allowed"],
625
+ "additionalProperties": false,
626
+ "properties": {
627
+ "required": { "type": "boolean" },
628
+ "allowed": { "type": "boolean" }
629
+ }
630
+ },
631
+ "mutationPermit": {
632
+ "type": "object",
633
+ "required": ["namespace", "version", "allowed", "mutateRequested", "overrideNonLocalRequested", "base", "lane", "maxMutations", "cleanupCapable", "fixtureNamespaceRule", "selectedFlows", "cleanup"],
634
+ "additionalProperties": false,
635
+ "properties": {
636
+ "namespace": { "const": "coherence/mutation-permit" },
637
+ "version": { "const": 1 },
638
+ "allowed": { "const": true },
639
+ "mutateRequested": { "const": true },
640
+ "overrideNonLocalRequested": { "type": "boolean" },
641
+ "base": { "type": "string", "minLength": 1 },
642
+ "lane": { "type": "string", "minLength": 1 },
643
+ "maxMutations": { "type": "integer", "minimum": 1 },
644
+ "cleanupCapable": { "const": true },
645
+ "fixtureNamespaceRule": { "const": "fixtureNamespaceFor(runId,flowName)/v1" },
646
+ "selectedFlows": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } },
647
+ "cleanup": { "$ref": "#/$defs/cleanupPermit" }
648
+ }
649
+ },
650
+ "measurementConfiguration": {
651
+ "type": "object",
652
+ "required": ["namespace", "version", "measurementConfig", "autoFlags", "prod"],
653
+ "additionalProperties": false,
654
+ "properties": {
655
+ "namespace": { "const": "marathon/measurement-configuration" },
656
+ "version": { "const": 1 },
657
+ "measurementConfig": {
658
+ "type": "object",
659
+ "required": ["widthsGiven", "states", "dark", "extraFlags", "autonomous"],
660
+ "additionalProperties": false,
661
+ "properties": {
662
+ "widthsGiven": { "type": "boolean" },
663
+ "states": { "type": "boolean" },
664
+ "dark": { "type": "boolean" },
665
+ "extraFlags": { "type": "array", "items": { "type": "string" } },
666
+ "autonomous": { "type": "boolean" }
667
+ }
668
+ },
669
+ "autoFlags": { "type": "array", "items": { "type": "string" } },
670
+ "prod": { "type": "boolean" }
671
+ }
672
+ },
673
+ "outerEvidenceIdentity": {
674
+ "type": "object",
675
+ "required": ["marathonRunId", "repoRealPath", "sourceDigest", "base", "lane", "flowWorkers", "planDigest", "flowDeclarationDigest", "principalDigest", "configurationDigest", "toolProtocol"],
676
+ "additionalProperties": false,
677
+ "properties": {
678
+ "marathonRunId": { "type": "string", "minLength": 1 },
679
+ "repoRealPath": { "type": "string", "minLength": 1 },
680
+ "sourceDigest": { "$ref": "#/$defs/sha256Digest" },
681
+ "base": { "type": "string", "minLength": 1 },
682
+ "lane": { "type": "string", "minLength": 1 },
683
+ "flowWorkers": { "type": "integer", "minimum": 1 },
684
+ "planDigest": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/sha256Digest" }] },
685
+ "flowDeclarationDigest": { "$ref": "#/$defs/sha256Digest" },
686
+ "principalDigest": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/sha256Digest" }] },
687
+ "configurationDigest": { "$ref": "#/$defs/sha256Digest" },
688
+ "toolProtocol": { "const": "marathon-adapter/v1" }
689
+ }
690
+ },
691
+ "documentCoordinate": {
692
+ "type": "object",
693
+ "required": ["status", "kind"],
694
+ "additionalProperties": false,
695
+ "properties": {
696
+ "status": { "enum": ["absent", "present"] },
697
+ "kind": { "enum": ["coherence-plan", "principal-declaration"] },
698
+ "document": { "type": "object" }
699
+ }
700
+ },
701
+ "envelope": {
702
+ "type": "object",
703
+ "required": ["namespace", "version", "outerEvidenceIdentity", "coordinates", "digest"],
704
+ "additionalProperties": false,
705
+ "properties": {
706
+ "namespace": { "const": "coherence-evidence-envelope" },
707
+ "version": { "const": 1 },
708
+ "outerEvidenceIdentity": {
709
+ "type": "object",
710
+ "required": ["material", "digest"],
711
+ "additionalProperties": false,
712
+ "properties": { "material": { "$ref": "#/$defs/outerEvidenceIdentity" }, "digest": { "$ref": "#/$defs/digest" } }
713
+ },
714
+ "coordinates": {
715
+ "type": "object",
716
+ "required": ["runId", "repoRealPath", "source", "base", "served", "lane", "flowWorkers", "plan", "flowDeclaration", "principal", "mutationPermit", "configuration", "protocol", "toolBuild"],
717
+ "additionalProperties": false,
718
+ "properties": {
719
+ "runId": { "$ref": "#/$defs/stringCoordinate" },
720
+ "repoRealPath": { "$ref": "#/$defs/stringCoordinate" },
721
+ "source": { "$ref": "#/$defs/sourceCoordinate" },
722
+ "base": { "$ref": "#/$defs/stringCoordinate" },
723
+ "served": { "$ref": "#/$defs/servedCoordinate" },
724
+ "lane": { "$ref": "#/$defs/stringCoordinate" },
725
+ "flowWorkers": { "$ref": "#/$defs/integerCoordinate" },
726
+ "plan": { "$ref": "#/$defs/documentDigestCoordinate" },
727
+ "flowDeclaration": { "$ref": "#/$defs/flowDeclarationCoordinate" },
728
+ "principal": { "$ref": "#/$defs/documentDigestCoordinate" },
729
+ "mutationPermit": { "$ref": "#/$defs/mutationPermitCoordinate" },
730
+ "configuration": { "$ref": "#/$defs/configurationCoordinate" },
731
+ "protocol": { "$ref": "#/$defs/protocolCoordinate" },
732
+ "toolBuild": { "$ref": "#/$defs/toolBuildCoordinate" }
733
+ }
734
+ },
735
+ "digest": { "$ref": "#/$defs/digest" }
736
+ }
737
+ },
738
+ "stringCoordinate": {
739
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
740
+ "properties": { "material": { "type": "string", "minLength": 1 }, "digest": { "$ref": "#/$defs/digest" } }
741
+ },
742
+ "integerCoordinate": {
743
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
744
+ "properties": { "material": { "type": "integer", "minimum": 1 }, "digest": { "$ref": "#/$defs/digest" } }
745
+ },
746
+ "sourceCoordinate": {
747
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
748
+ "properties": { "material": { "$ref": "#/$defs/sourceIdentity" }, "digest": { "$ref": "#/$defs/digest" } }
749
+ },
750
+ "servedCoordinate": {
751
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
752
+ "properties": { "material": { "$ref": "#/$defs/servedIdentity" }, "digest": { "$ref": "#/$defs/digest" } }
753
+ },
754
+ "documentDigestCoordinate": {
755
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
756
+ "properties": { "material": { "$ref": "#/$defs/documentCoordinate" }, "digest": { "$ref": "#/$defs/digest" } }
757
+ },
758
+ "flowDeclarationCoordinate": {
759
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
760
+ "properties": { "material": { "$ref": "#/$defs/selectedFlowDeclarations" }, "digest": { "$ref": "#/$defs/digest" } }
761
+ },
762
+ "mutationPermitCoordinate": {
763
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
764
+ "properties": { "material": { "$ref": "#/$defs/mutationPermit" }, "digest": { "$ref": "#/$defs/digest" } }
765
+ },
766
+ "configurationCoordinate": {
767
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
768
+ "properties": { "material": { "$ref": "#/$defs/measurementConfiguration" }, "digest": { "$ref": "#/$defs/digest" } }
769
+ },
770
+ "protocolCoordinate": {
771
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
772
+ "properties": {
773
+ "material": { "type": "object", "required": ["namespace", "version", "outer"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/runtime-protocol" }, "version": { "const": 1 }, "outer": { "const": "marathon-adapter/v1" } } },
774
+ "digest": { "$ref": "#/$defs/digest" }
775
+ }
776
+ },
777
+ "toolBuildCoordinate": {
778
+ "type": "object", "required": ["material", "digest"], "additionalProperties": false,
779
+ "properties": {
780
+ "material": { "type": "object", "required": ["namespace", "version", "files"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/tool-build" }, "version": { "const": 1 }, "files": { "type": "object", "additionalProperties": { "$ref": "#/$defs/digest" } } } },
781
+ "digest": { "$ref": "#/$defs/digest" }
782
+ }
783
+ },
784
+ "cell": {
785
+ "type": "object",
786
+ "required": ["cellId", "material"],
787
+ "additionalProperties": false,
788
+ "properties": {
789
+ "cellId": { "$ref": "#/$defs/digest" },
790
+ "material": {
791
+ "type": "object",
792
+ "required": ["namespace", "version", "mutation", "target", "surface", "principal", "context", "invariant"],
793
+ "additionalProperties": false,
794
+ "properties": {
795
+ "namespace": { "const": "coherence/observation-cell" },
796
+ "version": { "const": 1 },
797
+ "mutation": { "anyOf": [{
798
+ "type": "object",
799
+ "required": ["flow", "matchedPlanMutation", "entity", "writer", "authoritativeReadback"],
800
+ "additionalProperties": false,
801
+ "properties": {
802
+ "flow": { "type": "string", "minLength": 1 },
803
+ "matchedPlanMutation": {
804
+ "type": "object",
805
+ "oneOf": [
806
+ { "required": ["status"], "additionalProperties": false, "properties": { "status": { "const": "absent" } } },
807
+ { "required": ["status", "id"], "additionalProperties": false, "properties": { "status": { "const": "resolved" }, "id": { "type": "string", "minLength": 1 } } }
808
+ ]
809
+ },
810
+ "entity": { "type": "string", "minLength": 1 },
811
+ "writer": { "type": "string", "minLength": 1 },
812
+ "authoritativeReadback": { "type": "string", "minLength": 1 }
813
+ }
814
+ }, { "$ref": "#/$defs/mutationIdentity" }] },
815
+ "target": { "anyOf": [{ "$ref": "#/$defs/semanticTarget" }, { "$ref": "#/$defs/targetIdentity" }] },
816
+ "surface": { "anyOf": [{
817
+ "type": "object",
818
+ "required": ["status", "reason"],
819
+ "additionalProperties": false,
820
+ "properties": { "status": { "const": "unresolved" }, "reason": { "const": "logical-surface-not-resolved" } }
821
+ }, { "$ref": "#/$defs/surfaceIdentity" }] },
822
+ "principal": { "anyOf": [{
823
+ "type": "object",
824
+ "required": ["persona", "expect"],
825
+ "additionalProperties": false,
826
+ "properties": { "persona": { "type": "string", "minLength": 1 }, "expect": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] } }
827
+ }, { "$ref": "#/$defs/principalIdentity" }] },
828
+ "context": { "anyOf": [{
829
+ "type": "object",
830
+ "required": ["kind", "transition"],
831
+ "additionalProperties": false,
832
+ "properties": {
833
+ "kind": { "enum": ["warm-cache", "fresh-context"] },
834
+ "transition": { "anyOf": [{ "type": "null" }, { "enum": ["same-surface", "client-navigation", "reload", "fresh-context", "history-back", "history-forward", "direct-url", "offline-replay"] }] }
835
+ }
836
+ }, { "$ref": "#/$defs/contextIdentity" }] },
837
+ "invariant": { "anyOf": [{ "enum": ["field-parity", "visibility-policy", "durability"] }, { "$ref": "#/$defs/invariantIdentity" }] },
838
+ "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] }
839
+ }
840
+ }
841
+ }
842
+ },
843
+ "canonicalFlowDeclaration": {
844
+ "type": "object",
845
+ "required": ["name", "route", "declaredEndpoint", "cleanupRequired", "crosscheck"],
846
+ "additionalProperties": false,
847
+ "properties": {
848
+ "name": { "type": "string", "minLength": 1 },
849
+ "route": { "type": ["string", "null"] },
850
+ "declaredEndpoint": { "type": ["string", "null"] },
851
+ "cleanupRequired": { "type": "boolean" },
852
+ "identity": { "$ref": "#/$defs/flowIdentity" },
853
+ "crosscheck": { "$ref": "#/$defs/crosscheck" }
854
+ }
855
+ },
856
+ "flowMutationPolicy": {
857
+ "type": "object",
858
+ "required": ["namespace", "version", "permit", "selectedFlow"],
859
+ "additionalProperties": false,
860
+ "properties": {
861
+ "namespace": { "const": "coherence/flow-mutation-policy" },
862
+ "version": { "const": 1 },
863
+ "permit": { "$ref": "#/$defs/mutationPermit" },
864
+ "selectedFlow": { "type": "string", "minLength": 1 }
865
+ }
866
+ },
867
+ "flowPlanJourney": {
868
+ "type": "object",
869
+ "oneOf": [
870
+ { "required": ["status"], "additionalProperties": false, "properties": { "status": { "const": "absent" } } },
871
+ { "required": ["status", "journey"], "additionalProperties": false, "properties": { "status": { "const": "matched" }, "journey": { "type": "object" } } }
872
+ ]
873
+ },
874
+ "flowExecutionCell": {
875
+ "type": "object",
876
+ "required": ["cellId", "materialDigest"],
877
+ "additionalProperties": false,
878
+ "properties": { "cellId": { "$ref": "#/$defs/digest" }, "materialDigest": { "$ref": "#/$defs/digest" } }
879
+ },
880
+ "flowExecutionMaterial": {
881
+ "type": "object",
882
+ "required": ["namespace", "version", "declaration", "mutationPolicy", "planJourney", "cells"],
883
+ "additionalProperties": false,
884
+ "properties": {
885
+ "namespace": { "const": "coherence/flow-execution" },
886
+ "version": { "const": 1 },
887
+ "declaration": { "$ref": "#/$defs/canonicalFlowDeclaration" },
888
+ "mutationPolicy": { "$ref": "#/$defs/flowMutationPolicy" },
889
+ "planJourney": { "$ref": "#/$defs/flowPlanJourney" },
890
+ "cells": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/flowExecutionCell" } }
891
+ }
892
+ },
893
+ "caseCounts": {
894
+ "type": "object",
895
+ "required": ["targets", "personas", "contexts", "cleanups"],
896
+ "additionalProperties": false,
897
+ "properties": {
898
+ "targets": { "$ref": "#/$defs/targets" },
899
+ "personas": { "$ref": "#/$defs/funnel" },
900
+ "contexts": { "$ref": "#/$defs/funnel" },
901
+ "cleanups": { "$ref": "#/$defs/funnel" }
902
+ }
903
+ },
904
+ "stateDigest": {
905
+ "type": "object",
906
+ "required": ["status", "state", "hash", "reason"],
907
+ "additionalProperties": false,
908
+ "properties": {
909
+ "status": { "enum": ["measured", "unmeasured"] },
910
+ "state": { "anyOf": [{ "type": "null" }, { "enum": ["value", "empty", "absent", "failed", "withheld", "redacted", "forbidden", "loading"] }] },
911
+ "hash": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/sha256Digest" }] },
912
+ "reason": { "type": ["string", "null"] }
913
+ }
914
+ },
915
+ "warmObservation": {
916
+ "type": "object",
917
+ "required": ["persona", "context", "transition", "invariant", "status", "agreed", "reason", "comparisonReason", "refetched", "typed", "authoritative", "observed"],
918
+ "additionalProperties": false,
919
+ "properties": {
920
+ "persona": { "type": "string", "minLength": 1 },
921
+ "context": { "enum": ["warm-cache", "fresh-context"] },
922
+ "transition": { "anyOf": [{ "type": "null" }, { "enum": ["same-surface", "client-navigation", "reload", "fresh-context", "history-back", "history-forward", "direct-url", "offline-replay"] }] },
923
+ "invariant": { "enum": ["field-parity", "visibility-policy"] },
924
+ "principalId": { "$ref": "#/$defs/coherenceId" },
925
+ "contextId": { "$ref": "#/$defs/coherenceId" },
926
+ "invariantId": { "$ref": "#/$defs/coherenceId" },
927
+ "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] },
928
+ "status": { "enum": ["measured", "unmeasured"] },
929
+ "agreed": { "type": ["boolean", "null"] },
930
+ "reason": { "type": ["string", "null"] },
931
+ "comparisonReason": { "type": ["string", "null"] },
932
+ "refetched": { "type": "boolean" },
933
+ "typed": { "type": "boolean" },
934
+ "authoritative": { "$ref": "#/$defs/stateDigest" },
935
+ "observed": { "$ref": "#/$defs/stateDigest" }
936
+ }
937
+ },
938
+ "freshObservation": {
939
+ "type": "object",
940
+ "required": ["persona", "context", "invariants", "status", "agreed", "reason", "authoritative", "observed"],
941
+ "additionalProperties": false,
942
+ "properties": {
943
+ "persona": { "type": "string", "minLength": 1 },
944
+ "context": { "const": "fresh-context" },
945
+ "invariants": { "type": "array", "minItems": 2, "maxItems": 2, "items": { "enum": ["field-parity", "durability"] } },
946
+ "principalId": { "$ref": "#/$defs/coherenceId" },
947
+ "contextId": { "$ref": "#/$defs/coherenceId" },
948
+ "invariantIds": { "type": "array", "minItems": 2, "maxItems": 2, "items": { "$ref": "#/$defs/coherenceId" } },
949
+ "expectation": { "const": "visible" },
950
+ "status": { "enum": ["measured", "unmeasured"] },
951
+ "agreed": { "type": ["boolean", "null"] },
952
+ "reason": { "type": ["string", "null"] },
953
+ "authoritative": { "$ref": "#/$defs/stateDigest" },
954
+ "observed": { "$ref": "#/$defs/stateDigest" }
955
+ }
956
+ },
957
+ "observationCase": {
958
+ "type": "object",
959
+ "required": ["targetId", "route", "observations", "fresh", "status", "comparison"],
960
+ "additionalProperties": false,
961
+ "properties": {
962
+ "targetId": { "type": ["string", "null"] },
963
+ "surfaceId": { "type": ["string", "null"] },
964
+ "route": { "type": ["string", "null"] },
965
+ "observations": { "type": "array", "items": { "$ref": "#/$defs/warmObservation" } },
966
+ "fresh": { "$ref": "#/$defs/freshObservation" },
967
+ "status": { "enum": ["measured", "unmeasured"] },
968
+ "reason": { "type": "string" },
969
+ "comparison": {
970
+ "anyOf": [
971
+ { "type": "null" },
972
+ {
973
+ "type": "object", "required": ["agreed", "authoritative", "fresh"], "additionalProperties": false,
974
+ "properties": { "agreed": { "type": "boolean" }, "authoritative": { "$ref": "#/$defs/stateDigest" }, "fresh": { "$ref": "#/$defs/stateDigest" } }
975
+ }
976
+ ]
977
+ }
978
+ }
979
+ },
980
+ "finding": {
981
+ "type": "object",
982
+ "required": ["kind", "severity"],
983
+ "additionalProperties": false,
984
+ "properties": {
985
+ "kind": { "type": "string", "minLength": 1 },
986
+ "severity": { "enum": ["P0", "P1", "P2", "P3"] },
987
+ "rootCauseId": { "type": "string", "pattern": "^crc:[a-f0-9]{64}$" },
988
+ "targetId": { "type": ["string", "null"] },
989
+ "surfaceId": { "type": ["string", "null"] },
990
+ "route": { "type": ["string", "null"] },
991
+ "persona": { "type": "string" }
992
+ }
993
+ },
994
+ "caseTiming": {
995
+ "type": "object",
996
+ "required": ["startedAt", "endedAt", "durationMs"],
997
+ "additionalProperties": false,
998
+ "properties": {
999
+ "startedAt": { "type": "string", "minLength": 1 },
1000
+ "endedAt": { "type": "string", "minLength": 1 },
1001
+ "durationMs": { "type": "integer", "minimum": 0 }
1002
+ }
1003
+ },
1004
+ "case": {
1005
+ "type": "object",
1006
+ "required": ["id", "flow", "flowExecutionId", "flowExecutionMaterial", "cells", "status", "counts", "findings"],
1007
+ "additionalProperties": false,
1008
+ "properties": {
1009
+ "id": { "type": "string" },
1010
+ "flow": { "type": "string" },
1011
+ "observers": { "type": "array", "items": { "$ref": "#/$defs/observer" } },
1012
+ "rootCauseId": { "type": "string", "pattern": "^crc:[a-f0-9]{64}$" },
1013
+ "flowExecutionId": { "$ref": "#/$defs/digest" },
1014
+ "flowExecutionMaterial": { "$ref": "#/$defs/flowExecutionMaterial" },
1015
+ "cells": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/cell" } },
1016
+ "status": { "enum": ["measured", "invalid"] },
1017
+ "reason": { "type": "string" },
1018
+ "counts": { "$ref": "#/$defs/caseCounts" },
1019
+ "findings": { "type": "array", "items": { "$ref": "#/$defs/finding" } },
1020
+ "cases": { "type": "array", "items": { "$ref": "#/$defs/observationCase" } },
1021
+ "causal": { "$ref": "#/$defs/causalEvidence" },
1022
+ "mutationAccepted": { "type": "boolean" },
1023
+ "timing": { "$ref": "#/$defs/caseTiming" }
1024
+ }
1025
+ },
1026
+ "journalInvalid": {
1027
+ "type": "object",
1028
+ "required": ["reason", "detail", "quarantinePath", "quarantineDigest", "at"],
1029
+ "additionalProperties": false,
1030
+ "properties": {
1031
+ "reason": { "type": "string", "minLength": 1 },
1032
+ "detail": { "type": ["string", "null"] },
1033
+ "quarantinePath": { "type": "string", "minLength": 1 },
1034
+ "quarantineDigest": { "$ref": "#/$defs/digest" },
1035
+ "at": { "type": "string", "minLength": 1 }
1036
+ }
1037
+ },
1038
+ "planObligation": {
1039
+ "type": "object",
1040
+ "required": [
1041
+ "id",
1042
+ "status"
1043
+ ],
1044
+ "additionalProperties": false,
1045
+ "properties": {
1046
+ "id": {
1047
+ "type": "string",
1048
+ "minLength": 1
1049
+ },
1050
+ "mutationId": { "$ref": "#/$defs/coherenceId" },
1051
+ "targetId": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" },
1052
+ "surfaceId": { "$ref": "#/$defs/coherenceId" },
1053
+ "principalId": { "$ref": "#/$defs/coherenceId" },
1054
+ "contextId": { "$ref": "#/$defs/coherenceId" },
1055
+ "invariantId": { "$ref": "#/$defs/coherenceId" },
1056
+ "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] },
1057
+ "status": {
1058
+ "type": "string",
1059
+ "enum": [
1060
+ "unmeasured",
1061
+ "reached",
1062
+ "agreed",
1063
+ "disagreed"
1064
+ ]
1065
+ },
1066
+ "reason": {
1067
+ "type": "string"
1068
+ }
1069
+ }
1070
+ },
1071
+ "planTargetCounts": {
1072
+ "type": "object",
1073
+ "required": [
1074
+ "planned",
1075
+ "reached",
1076
+ "compared",
1077
+ "agreed",
1078
+ "disagreed",
1079
+ "unmeasured"
1080
+ ],
1081
+ "additionalProperties": false,
1082
+ "properties": {
1083
+ "planned": {
1084
+ "type": "integer",
1085
+ "minimum": 0
1086
+ },
1087
+ "reached": {
1088
+ "type": "integer",
1089
+ "minimum": 0
1090
+ },
1091
+ "compared": {
1092
+ "type": "integer",
1093
+ "minimum": 0
1094
+ },
1095
+ "agreed": {
1096
+ "type": "integer",
1097
+ "minimum": 0
1098
+ },
1099
+ "disagreed": {
1100
+ "type": "integer",
1101
+ "minimum": 0
1102
+ },
1103
+ "unmeasured": {
1104
+ "type": "integer",
1105
+ "minimum": 0
1106
+ }
1107
+ }
1108
+ },
1109
+ "planTarget": {
1110
+ "type": "object",
1111
+ "required": [
1112
+ "surfaceId",
1113
+ "route",
1114
+ "status",
1115
+ "counts",
1116
+ "obligations"
1117
+ ],
1118
+ "additionalProperties": false,
1119
+ "properties": {
1120
+ "targetId": { "$ref": "#/$defs/coherenceId" },
1121
+ "surfaceId": {
1122
+ "type": "string"
1123
+ },
1124
+ "route": {
1125
+ "type": "string"
1126
+ },
1127
+ "status": {
1128
+ "type": "string",
1129
+ "enum": [
1130
+ "unmeasured",
1131
+ "partial",
1132
+ "agreed",
1133
+ "disagreed"
1134
+ ]
1135
+ },
1136
+ "reason": {
1137
+ "type": "string"
1138
+ },
1139
+ "counts": {
1140
+ "$ref": "#/$defs/planTargetCounts"
1141
+ },
1142
+ "obligations": {
1143
+ "type": "array",
1144
+ "items": {
1145
+ "$ref": "#/$defs/planObligation"
1146
+ }
1147
+ }
1148
+ }
1149
+ },
1150
+ "planNeeded": {
1151
+ "type": "object",
1152
+ "required": [
1153
+ "journeyId",
1154
+ "reason",
1155
+ "contract"
1156
+ ],
1157
+ "additionalProperties": false,
1158
+ "properties": {
1159
+ "journeyId": {
1160
+ "type": "string"
1161
+ },
1162
+ "reason": {
1163
+ "type": "string"
1164
+ },
1165
+ "contract": {
1166
+ "type": "string"
1167
+ }
1168
+ }
1169
+ }
1170
+ }
1171
+ }