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,77 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/coherence-plan.schema.json",
4
+ "title": "coherence plan v2",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "coverage", "universe", "invariants", "families", "unattributed", "obligationIds", "operationIds", "sideChannelIds", "cacheKeys", "reads", "mutations", "surfaces", "operations", "sideChannels", "obligations", "perRoute", "plan"],
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "schemaVersion": { "const": 2 },
10
+ "coverage": { "$ref": "#/$defs/coverage" },
11
+ "universe": { "$ref": "#/$defs/universe" },
12
+ "invariants": { "type": "array", "items": { "enum": ["field-parity", "visibility-policy", "durability"] } },
13
+ "families": { "type": "array", "items": { "$ref": "#/$defs/familyAccounting" } },
14
+ "unattributed": { "$ref": "#/$defs/unattributed" },
15
+ "obligationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } },
16
+ "operationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } },
17
+ "sideChannelIds": { "type": "array", "items": { "$ref": "#/$defs/pairId" } },
18
+ "cacheKeys": { "type": "array", "items": { "$ref": "#/$defs/cacheKey" } },
19
+ "reads": { "type": "array", "items": { "$ref": "#/$defs/read" } },
20
+ "mutations": { "type": "array", "items": { "$ref": "#/$defs/mutation" } },
21
+ "surfaces": { "type": "array", "items": { "$ref": "#/$defs/surface" } },
22
+ "operations": { "type": "array", "items": { "$ref": "#/$defs/cacheOperation" } },
23
+ "sideChannels": { "type": "array", "items": { "$ref": "#/$defs/sideChannel" } },
24
+ "obligations": { "type": "array", "items": { "$ref": "#/$defs/obligation" } },
25
+ "perRoute": { "type": "array", "items": { "$ref": "#/$defs/perRoute" } },
26
+ "plan": { "$ref": "#/$defs/plan" }
27
+ },
28
+ "$defs": {
29
+ "id": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
30
+ "pairId": { "type": "string", "pattern": "^[a-f0-9]{64}:sha256:[a-f0-9]{64}$" },
31
+ "evidenceId": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
32
+ "jcsValue": { "anyOf": [{ "type": ["string", "boolean", "null"] }, { "type": "number", "minimum": -9007199254740991, "maximum": 9007199254740991 }, { "type": "array", "items": { "$ref": "#/$defs/jcsValue" } }, { "type": "object", "additionalProperties": { "$ref": "#/$defs/jcsValue" } }] },
33
+ "keyOrigin": { "type": "object", "required": ["file", "start", "end", "line", "column"], "additionalProperties": false, "properties": { "file": { "type": "string" }, "start": { "type": "integer", "minimum": 0 }, "end": { "type": "integer", "minimum": 1 }, "line": { "type": "integer", "minimum": 1 }, "column": { "type": "integer", "minimum": 1 } } },
34
+ "literalTerm": { "type": "object", "required": ["kind", "value"], "additionalProperties": false, "properties": { "kind": { "const": "literal" }, "value": { "$ref": "#/$defs/jcsValue" }, "origin": { "$ref": "#/$defs/keyOrigin" } } },
35
+ "symbolicTerm": { "type": "object", "required": ["kind", "expression", "ownerSymbol", "targetSymbol", "origin", "resolutionPath", "resolution", "reason"], "additionalProperties": false, "properties": { "kind": { "enum": ["parameter", "wildcard", "call", "unknown"] }, "expression": { "type": "string" }, "ownerSymbol": { "type": ["string", "null"] }, "targetSymbol": { "type": ["string", "null"] }, "origin": { "$ref": "#/$defs/keyOrigin" }, "resolutionPath": { "type": "array", "maxItems": 26, "items": { "type": "string" } }, "resolution": { "const": "unresolved" }, "reason": { "type": "string" } } },
36
+ "term": { "oneOf": [{ "$ref": "#/$defs/literalTerm" }, { "$ref": "#/$defs/symbolicTerm" }] },
37
+ "pattern": { "type": "object", "required": ["segments"], "additionalProperties": false, "properties": { "segments": { "type": "array", "items": { "$ref": "#/$defs/term" } } } },
38
+ "cacheKey": { "type": "object", "required": ["id", "material", "provenance"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "type": "object", "required": ["namespace", "version", "segments"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/cache-key" }, "version": { "const": 1 }, "segments": { "type": "array", "items": { "$ref": "#/$defs/term" } } } }, "provenance": { "type": "array", "minItems": 1, "items": { "type": "object" } } } },
39
+ "sourceSpan": { "type": "object", "required": ["file", "start", "end", "line", "column"], "additionalProperties": false, "properties": { "file": { "type": "string" }, "start": { "type": "integer", "minimum": 0 }, "end": { "type": "integer", "minimum": 1 }, "line": { "type": "integer", "minimum": 1 }, "column": { "type": "integer", "minimum": 1 } } },
40
+ "read": { "type": "object", "required": ["id", "keyId", "file", "line", "span", "pattern", "endpoint", "family", "confidence"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/evidenceId" }, "keyId": { "$ref": "#/$defs/id" }, "file": { "type": "string" }, "line": { "type": "integer", "minimum": 0 }, "span": { "$ref": "#/$defs/sourceSpan" }, "pattern": { "$ref": "#/$defs/pattern" }, "endpoint": { "type": ["string", "null"] }, "family": { "type": ["string", "null"] }, "familySource": { "enum": ["declaration", "endpoint", "unresolved"] }, "confidence": { "enum": ["exact", "resolved", "coarse", "unresolved", "uncertain"] } } },
41
+ "mutation": { "type": "object", "required": ["id", "material", "file", "line", "endpoint", "family", "writes", "operationIds", "confidence"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/mutationMaterial" }, "file": { "type": "string" }, "line": { "type": "integer" }, "hook": { "type": ["string", "null"] }, "endpoint": { "type": ["string", "null"] }, "family": { "type": ["string", "null"] }, "familySource": { "enum": ["declaration", "endpoint", "unresolved"] }, "writes": { "type": "array" }, "operationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } }, "confidence": { "type": "string" } } },
42
+ "surface": { "type": "object", "required": ["id", "material", "route", "file", "component", "readIds", "families", "confidence", "kind"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/surfaceMaterial" }, "route": { "type": "string" }, "file": { "type": ["string", "null"] }, "component": { "type": ["string", "null"] }, "readIds": { "type": "array", "items": { "$ref": "#/$defs/evidenceId" } }, "families": { "type": "array", "items": { "type": "string" } }, "confidence": { "enum": ["exact", "resolved", "coarse", "unresolved"] }, "kind": { "enum": ["route", "component", "modal", "drawer", "tab", "wizard-step", "embedded-widget"] } } },
43
+ "operationSpan": { "type": "object", "required": ["file", "start", "end"], "additionalProperties": false, "properties": { "file": { "type": "string" }, "start": { "type": "integer", "minimum": 0 }, "end": { "type": "integer", "minimum": 1 } } },
44
+ "receiver": { "type": "object", "required": ["expression", "ownerSymbol", "targetSymbol", "kind", "resolution", "reason"], "additionalProperties": false, "properties": { "expression": { "type": "string" }, "ownerSymbol": { "type": ["string", "null"] }, "targetSymbol": { "type": ["string", "null"] }, "kind": { "enum": ["query-client", "query-cache", "unknown"] }, "resolution": { "enum": ["resolved", "unresolved"] }, "reason": { "enum": [null, "unsupported-client"] } } },
45
+ "effect": { "type": "object", "required": ["kind", "scope"], "additionalProperties": false, "properties": { "kind": { "enum": ["invalidate", "refetch", "reset", "remove", "update", "clear-query-cache", "clear-mutation-cache"] }, "scope": { "type": "string" } } },
46
+ "cacheOperation": { "type": "object", "required": ["id", "material", "provenance"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "type": "object", "required": ["namespace", "version", "sourceRef", "receiver", "operation", "keyId", "keyMatch", "exact", "predicate", "filters", "effects"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/cache-operation" }, "version": { "const": 1 }, "sourceRef": { "$ref": "#/$defs/operationSpan" }, "receiver": { "$ref": "#/$defs/receiver" }, "operation": { "enum": ["invalidateQueries", "refetchQueries", "resetQueries", "removeQueries", "setQueryData", "setQueriesData", "clear"] }, "keyId": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" }, "keyMatch": { "enum": ["all", "prefix", "exact", "unknown"] }, "exact": { "type": ["boolean", "null"] }, "predicate": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/term" }] }, "filters": { "type": "object", "additionalProperties": false, "properties": { "type": {}, "stale": {}, "fetchStatus": {}, "refetchType": {} } }, "effects": { "type": "array", "items": { "$ref": "#/$defs/effect" } } } }, "provenance": { "type": "array", "minItems": 1, "items": { "type": "object" } } } },
47
+ "sideChannel": { "type": "object", "required": ["id", "operationId", "readId", "keyCoverage", "effectCoverage", "mandatory"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/pairId" }, "operationId": { "$ref": "#/$defs/id" }, "readId": { "$ref": "#/$defs/evidenceId" }, "keyCoverage": { "enum": ["covered", "not-covered", "unresolved"] }, "effectCoverage": { "enum": ["covered", "not-covered", "unresolved"] }, "mandatory": { "type": "boolean" } } },
48
+ "sourceRef": { "type": "object", "required": ["file", "line"], "additionalProperties": false, "properties": { "file": { "type": ["string", "null"] }, "line": { "type": "integer", "minimum": 0 } } },
49
+ "mutationMaterial": { "type": "object", "required": ["namespace", "version", "sourceRef", "endpoint"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/mutation" }, "version": { "const": 1 }, "sourceRef": { "$ref": "#/$defs/sourceRef" }, "endpoint": { "type": ["string", "null"] } } },
50
+ "surfaceMaterial": { "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/sourceRef" } } },
51
+ "targetMaterial": { "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": { "$ref": "#/$defs/targetRepresentation" } } },
52
+ "targetRepresentation": { "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" } } },
53
+ "principalMaterial": { "type": "object", "required": ["namespace", "version", "name"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/principal" }, "version": { "const": 1 }, "name": { "type": "string" } } },
54
+ "contextMaterial": { "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"] } } },
55
+ "invariantMaterial": { "type": "object", "required": ["namespace", "version", "name"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/invariant" }, "version": { "const": 1 }, "name": { "enum": ["field-parity", "visibility-policy", "durability"] } } },
56
+ "flowMaterial": { "type": "object", "required": ["namespace", "version", "route", "declaredEndpoint"], "additionalProperties": false, "properties": { "namespace": { "const": "coherence/flow" }, "version": { "const": 1 }, "route": { "type": "string" }, "declaredEndpoint": { "type": "string" } } },
57
+ "mutationIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/mutationMaterial" } } },
58
+ "surfaceIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/surfaceMaterial" } } },
59
+ "targetIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/targetMaterial" } } },
60
+ "principalIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/principalMaterial" } } },
61
+ "contextIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/contextMaterial" } } },
62
+ "invariantIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/invariantMaterial" } } },
63
+ "flowIdentity": { "type": "object", "required": ["id", "material"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/flowMaterial" } } },
64
+ "unresolvedTarget": { "type": "object", "required": ["status", "reason"], "additionalProperties": false, "properties": { "status": { "const": "unresolved" }, "reason": { "const": "declaration-target-not-joined" } } },
65
+ "coordinates": { "type": "object", "required": ["mutation", "target", "surface", "principal", "context", "invariant", "expectation"], "additionalProperties": false, "properties": { "mutation": { "$ref": "#/$defs/mutationIdentity" }, "target": { "oneOf": [{ "$ref": "#/$defs/targetIdentity" }, { "$ref": "#/$defs/unresolvedTarget" }] }, "surface": { "$ref": "#/$defs/surfaceIdentity" }, "principal": { "$ref": "#/$defs/principalIdentity" }, "context": { "$ref": "#/$defs/contextIdentity" }, "invariant": { "$ref": "#/$defs/invariantIdentity" }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] } } },
66
+ "cellMaterial": { "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": { "oneOf": [{ "$ref": "#/$defs/targetIdentity" }, { "$ref": "#/$defs/unresolvedTarget" }] }, "surface": { "$ref": "#/$defs/surfaceIdentity" }, "principal": { "$ref": "#/$defs/principalIdentity" }, "context": { "$ref": "#/$defs/contextIdentity" }, "invariant": { "$ref": "#/$defs/invariantIdentity" }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] } } },
67
+ "obligation": { "type": "object", "required": ["id", "material", "coordinates", "mutationId", "surfaceId", "route", "principal", "principalId", "context", "invariant", "expectation", "weight", "mandatory", "operationIds", "sideChannelIds", "sideChannels", "sideChannelStatus", "family", "component"], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/id" }, "material": { "$ref": "#/$defs/cellMaterial" }, "coordinates": { "$ref": "#/$defs/coordinates" }, "mutationId": { "$ref": "#/$defs/id" }, "surfaceId": { "$ref": "#/$defs/id" }, "route": { "type": "string" }, "principal": { "type": "string" }, "principalId": { "$ref": "#/$defs/id" }, "context": { "enum": ["warm-cache", "fresh-context"] }, "invariant": { "enum": ["field-parity", "visibility-policy", "durability"] }, "expectation": { "enum": ["visible", "absent", "redacted", "withheld", "forbidden"] }, "weight": { "type": "integer", "minimum": 0 }, "mandatory": { "type": "boolean" }, "operationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } }, "sideChannelIds": { "type": "array", "items": { "$ref": "#/$defs/pairId" } }, "sideChannels": { "type": "array", "items": { "$ref": "#/$defs/sideChannel" } }, "sideChannelStatus": { "enum": ["covered", "not-covered", "unresolved"] }, "family": { "type": "string" }, "component": { "type": ["string", "null"] }, "flowIdentity": { "$ref": "#/$defs/flowIdentity" } } },
68
+ "target": { "type": "object", "required": ["surfaceId", "surfaceIdentity", "route", "component", "family", "obligationIds", "obligations", "operationIds", "sideChannelIds", "sideChannels", "sideChannelStatus"], "additionalProperties": false, "properties": { "surfaceId": { "$ref": "#/$defs/id" }, "surfaceIdentity": { "$ref": "#/$defs/surfaceIdentity" }, "route": { "type": "string" }, "component": { "type": ["string", "null"] }, "family": { "type": "string" }, "obligationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } }, "obligations": { "type": "array", "items": { "$ref": "#/$defs/obligation" } }, "operationIds": { "type": "array", "items": { "$ref": "#/$defs/id" } }, "sideChannelIds": { "type": "array", "items": { "$ref": "#/$defs/pairId" } }, "sideChannels": { "type": "array", "items": { "$ref": "#/$defs/sideChannel" } }, "sideChannelStatus": { "enum": ["covered", "not-covered", "unresolved"] } } },
69
+ "journey": { "type": "object", "required": ["journeyId", "mutationId", "mutationIdentity", "route", "covers", "weight", "cost", "targets"], "additionalProperties": false, "properties": { "journeyId": { "type": "string" }, "mutationId": { "$ref": "#/$defs/id" }, "mutationIdentity": { "$ref": "#/$defs/mutationIdentity" }, "flowIdentity": { "$ref": "#/$defs/flowIdentity" }, "route": { "type": "string" }, "covers": { "type": "integer", "minimum": 0 }, "weight": { "type": "integer", "minimum": 0 }, "cost": { "type": "number", "minimum": 0 }, "targets": { "type": "array", "items": { "$ref": "#/$defs/target" } } } },
70
+ "coverage": { "type": "object", "required": ["discovered", "resolved", "unresolved", "planned", "reached", "compared", "agreed"], "additionalProperties": false, "properties": { "discovered": { "type": "integer", "minimum": 0 }, "resolved": { "type": "integer", "minimum": 0 }, "unresolved": { "type": "integer", "minimum": 0 }, "planned": { "type": "integer", "minimum": 0 }, "reached": { "type": "integer", "minimum": 0 }, "compared": { "type": "integer", "minimum": 0 }, "agreed": { "type": "integer", "minimum": 0 } } },
71
+ "universe": { "type": "object", "required": ["obligations", "discovered", "unresolved", "mutations", "surfaces", "principals", "contexts", "invariants", "operations", "sideChannels", "unresolvedSideChannels"], "additionalProperties": false, "properties": { "obligations": { "type": "integer", "minimum": 0 }, "discovered": { "type": "integer", "minimum": 0 }, "unresolved": { "type": "integer", "minimum": 0 }, "mutations": { "type": "integer", "minimum": 0 }, "surfaces": { "type": "integer", "minimum": 0 }, "principals": { "type": "integer", "minimum": 0 }, "contexts": { "type": "integer", "minimum": 0 }, "invariants": { "type": "integer", "minimum": 0 }, "operations": { "type": "integer", "minimum": 0 }, "sideChannels": { "type": "integer", "minimum": 0 }, "unresolvedSideChannels": { "type": "integer", "minimum": 0 } } },
72
+ "familyAccounting": { "type": "object", "required": ["family", "mutations", "surfaces", "principals", "contexts", "invariants", "possible", "excluded", "discovered", "resolved", "unresolved", "planned"], "additionalProperties": false, "properties": { "family": { "type": "string" }, "mutations": { "type": "integer", "minimum": 0 }, "surfaces": { "type": "integer", "minimum": 0 }, "principals": { "type": "integer", "minimum": 0 }, "contexts": { "type": "integer", "minimum": 0 }, "invariants": { "type": "integer", "minimum": 0 }, "possible": { "type": "integer", "minimum": 0 }, "excluded": { "type": "object", "additionalProperties": { "type": "integer", "minimum": 0 } }, "discovered": { "type": "integer", "minimum": 0 }, "resolved": { "type": "integer", "minimum": 0 }, "unresolved": { "type": "integer", "minimum": 0 }, "planned": { "type": "integer", "minimum": 0 } } },
73
+ "unattributed": { "type": "object", "required": ["unresolvedWriters", "unresolvedWriterObligations", "writersWithNoReaderSurface", "writerFamiliesWithNoReaderSurface"], "additionalProperties": false, "properties": { "unresolvedWriters": { "type": "integer", "minimum": 0 }, "unresolvedWriterObligations": { "type": "integer", "minimum": 0 }, "writersWithNoReaderSurface": { "type": "integer", "minimum": 0 }, "writerFamiliesWithNoReaderSurface": { "type": "array", "items": { "type": "string" } } } },
74
+ "perRoute": { "type": "object", "required": ["route", "obligations", "uncovered"], "additionalProperties": false, "properties": { "route": { "type": "string" }, "obligations": { "type": "integer", "minimum": 0 }, "uncovered": { "type": "integer", "minimum": 0 } } },
75
+ "plan": { "type": "object", "required": ["ok", "reason", "budget", "selected", "rejected", "unselected"], "additionalProperties": false, "properties": { "ok": { "type": "boolean" }, "reason": { "type": ["string", "null"] }, "budget": { "type": "number", "minimum": 0 }, "selected": { "type": "array", "items": { "$ref": "#/$defs/journey" } }, "rejected": { "type": "integer", "minimum": 0 }, "unselected": { "type": "integer", "minimum": 0 } } }
76
+ }
77
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/coherence-risk.schema.json",
4
+ "title": "coherence-risk.json",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "status", "windowDays", "commitsInWindow", "counts", "families"],
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "schemaVersion": { "const": 1 },
10
+ "status": { "type": "string", "enum": ["measured", "unmeasured"] },
11
+ "reason": { "type": ["string", "null"] },
12
+ "windowDays": { "type": "integer", "minimum": 1 },
13
+ "commitsInWindow": { "type": "integer", "minimum": 0 },
14
+ "counts": {
15
+ "type": "object",
16
+ "required": ["families", "ranked", "unmeasured"],
17
+ "additionalProperties": false,
18
+ "properties": {
19
+ "families": { "type": "integer", "minimum": 0 },
20
+ "ranked": { "type": "integer", "minimum": 0 },
21
+ "unmeasured": { "type": "integer", "minimum": 0 }
22
+ }
23
+ },
24
+ "families": { "type": "array", "items": { "$ref": "#/$defs/family" } }
25
+ },
26
+ "$defs": {
27
+ "family": {
28
+ "type": "object",
29
+ "required": ["family", "files", "impact", "uncertainty", "affectedSurfaces", "commits", "changeRate", "risk", "neverCompared", "remeasureOn"],
30
+ "additionalProperties": false,
31
+ "properties": {
32
+ "family": { "type": "string", "minLength": 1 },
33
+ "files": { "type": "array", "items": { "type": "string" } },
34
+ "impact": { "type": "number", "minimum": 0 },
35
+ "uncertainty": { "type": ["number", "null"], "minimum": 0 },
36
+ "affectedSurfaces": { "type": "integer", "minimum": 0 },
37
+ "commits": { "type": ["integer", "null"], "minimum": 0 },
38
+ "changeRate": { "type": ["number", "null"], "minimum": 0 },
39
+ "risk": { "type": ["number", "null"], "minimum": 0 },
40
+ "reason": { "type": ["string", "null"] },
41
+ "neverCompared": { "type": "boolean" },
42
+ "remeasureOn": { "type": "array", "items": { "type": "string" } }
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,118 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/crud-observed.schema.json",
4
+ "title": "crud-observed.json",
5
+ "description": "bin/crud-runner.mjs — executable CRUD reconciliation: create/read/update/delete plus reload/navigation reconciliation through a real browser.",
6
+ "type": "object",
7
+ "required": ["status", "runId", "base", "flows", "findings"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "status": { "type": "string", "enum": ["measured", "invalid"] },
11
+ "runId": { "type": "string", "minLength": 1 },
12
+ "base": { "type": "string" },
13
+ "lane": { "type": "string" },
14
+ "fixtureNamespace": { "type": "string" },
15
+ "attempts": { "type": "integer", "minimum": 0 },
16
+ "counts": { "$ref": "#/$defs/stepCounts" },
17
+ "coverage": { "$ref": "#/$defs/coverage" },
18
+ "invalid": { "$ref": "#/$defs/invalid" },
19
+ "reason": { "type": "string" },
20
+ "flows": { "type": "array", "items": { "$ref": "#/$defs/flowResult" } },
21
+ "findings": { "type": "array", "items": { "$ref": "#/$defs/finding" } }
22
+ },
23
+ "$defs": {
24
+ "stepCounts": {
25
+ "type": "object",
26
+ "additionalProperties": { "$ref": "#/$defs/counts" }
27
+ },
28
+ "counts": {
29
+ "type": "object",
30
+ "required": ["true", "false", "unmeasured"],
31
+ "additionalProperties": false,
32
+ "properties": {
33
+ "true": { "type": "integer", "minimum": 0 },
34
+ "false": { "type": "integer", "minimum": 0 },
35
+ "unmeasured": { "type": "integer", "minimum": 0 }
36
+ }
37
+ },
38
+ "coverage": {
39
+ "type": "object",
40
+ "additionalProperties": {
41
+ "type": "object",
42
+ "required": ["planned", "measured", "unmeasured", "failed"],
43
+ "additionalProperties": false,
44
+ "properties": {
45
+ "planned": { "type": "integer", "minimum": 0 },
46
+ "measured": { "type": "integer", "minimum": 0 },
47
+ "unmeasured": { "type": "integer", "minimum": 0 },
48
+ "failed": { "type": "integer", "minimum": 0 }
49
+ }
50
+ }
51
+ },
52
+ "invalid": {
53
+ "type": "object",
54
+ "required": ["reason", "gaps"],
55
+ "additionalProperties": false,
56
+ "properties": {
57
+ "reason": { "type": "string", "minLength": 1 },
58
+ "gaps": { "type": "array", "items": { "type": "string" } }
59
+ }
60
+ },
61
+ "tristate": { "anyOf": [{ "type": "boolean" }, { "const": "unmeasured" }] },
62
+ "request": {
63
+ "type": "object",
64
+ "required": ["method", "path", "status"],
65
+ "additionalProperties": true,
66
+ "properties": {
67
+ "method": { "type": "string" },
68
+ "path": { "type": "string" },
69
+ "status": { "type": "integer" }
70
+ }
71
+ },
72
+ "outcome": {
73
+ "type": "object",
74
+ "required": ["role", "create", "read", "update", "delete", "reload_reconciled", "navigation_reconciled", "authorized", "cleanup"],
75
+ "additionalProperties": true,
76
+ "properties": {
77
+ "role": { "type": "string" },
78
+ "create": { "$ref": "#/$defs/tristate" },
79
+ "read": { "$ref": "#/$defs/tristate" },
80
+ "update": { "$ref": "#/$defs/tristate" },
81
+ "delete": { "$ref": "#/$defs/tristate" },
82
+ "reload_reconciled": { "$ref": "#/$defs/tristate" },
83
+ "navigation_reconciled": { "$ref": "#/$defs/tristate" },
84
+ "authorized": { "$ref": "#/$defs/tristate" },
85
+ "cleanup": { "$ref": "#/$defs/tristate" },
86
+ "gap": { "type": ["string", "null"] }
87
+ }
88
+ },
89
+ "flowResult": {
90
+ "type": "object",
91
+ "required": ["name", "persona", "outcome", "requests"],
92
+ "additionalProperties": true,
93
+ "properties": {
94
+ "name": { "type": "string" },
95
+ "persona": { "type": "string" },
96
+ "route": { "type": ["string", "null"] },
97
+ "outcome": { "$ref": "#/$defs/outcome" },
98
+ "requests": { "type": "array", "items": { "$ref": "#/$defs/request" } },
99
+ "gaps": { "type": "array", "items": { "type": "string" } }
100
+ }
101
+ },
102
+ "finding": {
103
+ "type": "object",
104
+ "required": ["kind", "severity", "at", "detail"],
105
+ "additionalProperties": true,
106
+ "properties": {
107
+ "kind": {
108
+ "type": "string",
109
+ "enum": ["crud.create-failed", "crud.write-lost", "crud.update-lost", "crud.delete-ineffective", "crud.unauthorized-allowed", "crud.cleanup-failed"]
110
+ },
111
+ "severity": { "type": "string", "enum": ["P0", "P1", "P2", "P3"] },
112
+ "at": { "type": "string" },
113
+ "route": { "type": ["string", "null"] },
114
+ "detail": { "type": "string" }
115
+ }
116
+ }
117
+ }
118
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/experiment-execution.schema.json",
4
+ "title": "experiment-execution.json",
5
+ "description": "bin/experiment-executor.mjs — executes the accepted candidates from the Rust experiment queue as targeted control/treatment sweeps, written to .verify/autonomous/experiment-execution.json.",
6
+ "type": "object",
7
+ "required": ["status", "executed", "skipped", "effect", "budget"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "status": { "type": "string", "enum": ["measured", "invalid", "unmeasured"] },
11
+ "reason": { "type": "string" },
12
+ "executed": { "type": "array", "items": { "$ref": "#/$defs/executedEntry" } },
13
+ "skipped": { "type": "array", "items": { "$ref": "#/$defs/skippedEntry" } },
14
+ "effect": { "type": "array", "items": { "$ref": "#/$defs/effectEntry" } },
15
+ "budget": {
16
+ "type": "object",
17
+ "required": ["cells", "cellsUsed", "wallMs", "elapsedMs"],
18
+ "additionalProperties": true,
19
+ "properties": {
20
+ "cells": { "type": "integer", "minimum": 0 },
21
+ "cellsUsed": { "type": "integer", "minimum": 0 },
22
+ "wallMs": { "type": "integer", "minimum": 0 },
23
+ "elapsedMs": { "type": "integer", "minimum": 0 }
24
+ }
25
+ },
26
+ "integrity_hash": { "type": ["string", "null"] },
27
+ "runnerExit": { "type": ["integer", "null"] },
28
+ "experimentId": { "type": ["string", "null"] }
29
+ },
30
+ "$defs": {
31
+ "observation": {
32
+ "type": "object",
33
+ "required": ["arm", "route", "outcome", "integrity_hash", "evidence_id"],
34
+ "additionalProperties": true,
35
+ "properties": {
36
+ "arm": { "type": "string", "enum": ["control", "treatment"] },
37
+ "route": { "type": "string" },
38
+ "status": { "type": ["integer", "null"] },
39
+ "outcome": { "type": "array", "items": { "type": "string" } },
40
+ "metric": { "type": ["number", "null"] },
41
+ "integrity_hash": { "type": "string" },
42
+ "evidence_id": { "type": "string", "pattern": "^sha256:" }
43
+ }
44
+ },
45
+ "executedEntry": {
46
+ "type": "object",
47
+ "required": ["route", "family", "status"],
48
+ "additionalProperties": true,
49
+ "properties": {
50
+ "route": { "type": "string" },
51
+ "family": { "type": "string" },
52
+ "status": { "type": "string", "enum": ["measured", "invalid"] },
53
+ "reason": { "type": "string" },
54
+ "control": { "$ref": "#/$defs/observation" },
55
+ "treatment": { "$ref": "#/$defs/observation" }
56
+ }
57
+ },
58
+ "skippedEntry": {
59
+ "type": "object",
60
+ "required": ["route", "family", "reason"],
61
+ "additionalProperties": true,
62
+ "properties": {
63
+ "route": { "type": "string" },
64
+ "family": { "type": "string" },
65
+ "reason": { "type": "string" }
66
+ }
67
+ },
68
+ "effectEntry": {
69
+ "type": "object",
70
+ "required": ["route", "family", "kind", "severity"],
71
+ "additionalProperties": true,
72
+ "properties": {
73
+ "route": { "type": "string" },
74
+ "family": { "type": "string" },
75
+ "kind": { "type": "string" },
76
+ "severity": { "type": "string", "enum": ["P0", "P1", "P2", "P3"] },
77
+ "detail": { "type": ["string", "null"] },
78
+ "at": { "type": ["string", "null"] }
79
+ }
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/graph-edge.schema.json",
4
+ "title": "edges.jsonl (one line)",
5
+ "description": "agent/src/graph_schema.rs — one line of the finite graph edge contract. Nine edge relations, a full SHA-256 edgeId over the canonical (fromRecordId, toRecordId, relation, semantic-key) tuple. Design: ARCHITECTURE.md, section L2 -- the Rust reduction kernel.",
6
+ "type": "object",
7
+ "required": ["edgeId", "from", "to", "relation"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "edgeId": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
11
+ "from": { "type": "string", "pattern": "^[0-9a-f]{64}$", "description": "the source node's recordId" },
12
+ "to": { "type": "string", "pattern": "^[0-9a-f]{64}$", "description": "the target node's recordId" },
13
+ "relation": { "$ref": "#/$defs/edgeRelation" },
14
+ "semanticKey": { "type": "string", "maxLength": 200, "description": "participates in edgeId; disambiguates multiple edges between the same pair under the same relation" }
15
+ },
16
+ "$defs": {
17
+ "edgeRelation": {
18
+ "type": "string",
19
+ "enum": ["renders-through", "reads", "writes", "writes-to", "invalidates", "transitions-to", "owned-by", "evidenced-by", "observed-as"]
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://frontend-verify.dev/schemas/graph-node.schema.json",
4
+ "title": "nodes.jsonl (one line)",
5
+ "description": "agent/src/graph_schema.rs — one line of the finite graph node contract. Ten node kinds, per-kind bounded attributes, a full 256-bit recordId. Design: ARCHITECTURE.md, section L2 -- the Rust reduction kernel.",
6
+ "type": "object",
7
+ "required": ["recordId", "kind", "attrs"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "recordId": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
11
+ "fid": { "type": "string", "description": "legacy display prefix only, never the record identity" },
12
+ "kind": { "$ref": "#/$defs/nodeKind" },
13
+ "attrs": { "$ref": "#/$defs/nodeAttrs" }
14
+ },
15
+ "$defs": {
16
+ "nodeKind": {
17
+ "type": "string",
18
+ "enum": ["finding", "route", "component", "query", "mutation", "entity", "endpoint", "role", "transition", "evidence"]
19
+ },
20
+ "evidenceRef": {
21
+ "type": "object",
22
+ "required": ["report", "pointer"],
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "report": { "type": "string", "enum": ["inventory", "classify", "sweep"] },
26
+ "pointer": { "type": "string", "pattern": "^(/[^/]*)*$" },
27
+ "file": { "type": "string", "minLength": 1, "maxLength": 200, "not": { "pattern": "^(/|\\\\|[A-Za-z]:)" } },
28
+ "line": { "type": "integer", "minimum": 1 }
29
+ }
30
+ },
31
+ "boundedName": { "type": "string", "minLength": 1, "maxLength": 200 },
32
+ "routeTemplate": {
33
+ "type": "string",
34
+ "maxLength": 512,
35
+ "pattern": "^/([A-Za-z0-9._~-]{1,64}|:[A-Za-z][A-Za-z0-9_]{0,63})(/([A-Za-z0-9._~-]{1,64}|:[A-Za-z][A-Za-z0-9_]{0,63}))*$"
36
+ },
37
+ "nodeAttrs": {
38
+ "description": "Untagged: shape alone matches one of the ten kinds this node's own `kind` field already names. There is no free-form attributes slot.",
39
+ "oneOf": [
40
+ {
41
+ "type": "object",
42
+ "required": ["severity", "findingKind", "status", "evidenceRef"],
43
+ "additionalProperties": false,
44
+ "properties": {
45
+ "severity": { "$ref": "#/$defs/boundedName" },
46
+ "findingKind": { "$ref": "#/$defs/boundedName" },
47
+ "status": { "$ref": "#/$defs/boundedName" },
48
+ "evidenceRef": { "$ref": "#/$defs/evidenceRef" }
49
+ }
50
+ },
51
+ {
52
+ "type": "object",
53
+ "required": ["template"],
54
+ "additionalProperties": false,
55
+ "properties": { "template": { "$ref": "#/$defs/routeTemplate" } }
56
+ },
57
+ {
58
+ "type": "object",
59
+ "required": ["fromRoute", "toRoute"],
60
+ "additionalProperties": false,
61
+ "properties": {
62
+ "fromRoute": { "$ref": "#/$defs/routeTemplate" },
63
+ "toRoute": { "$ref": "#/$defs/routeTemplate" }
64
+ }
65
+ },
66
+ {
67
+ "type": "object",
68
+ "required": ["evidenceRef"],
69
+ "additionalProperties": false,
70
+ "properties": { "evidenceRef": { "$ref": "#/$defs/evidenceRef" } }
71
+ },
72
+ {
73
+ "type": "object",
74
+ "required": ["name"],
75
+ "additionalProperties": false,
76
+ "properties": { "name": { "$ref": "#/$defs/boundedName" } }
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ }