@kirrosh/zond 0.22.0 → 0.23.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 (256) hide show
  1. package/CHANGELOG.md +648 -0
  2. package/README.md +58 -6
  3. package/package.json +9 -6
  4. package/src/cli/argv.ts +122 -0
  5. package/src/cli/commands/add-api.ts +134 -0
  6. package/src/cli/commands/api/annotate/idempotency.ts +59 -0
  7. package/src/cli/commands/api/annotate/index.ts +525 -0
  8. package/src/cli/commands/api/annotate/lifecycle.ts +74 -0
  9. package/src/cli/commands/api/annotate/overlay.ts +206 -0
  10. package/src/cli/commands/api/annotate/pagination.ts +60 -0
  11. package/src/cli/commands/api/annotate/prompts.ts +183 -0
  12. package/src/cli/commands/api/annotate/readback.ts +58 -0
  13. package/src/cli/commands/api/annotate/resources.ts +91 -0
  14. package/src/cli/commands/api/annotate/seed-bodies.ts +61 -0
  15. package/src/cli/commands/audit.ts +480 -0
  16. package/src/cli/commands/bootstrap.ts +710 -0
  17. package/src/cli/commands/catalog.ts +35 -0
  18. package/src/cli/commands/check.ts +348 -0
  19. package/src/cli/commands/checks.ts +756 -0
  20. package/src/cli/commands/ci-init.ts +43 -0
  21. package/src/cli/commands/clean.ts +212 -0
  22. package/src/cli/commands/cleanup.ts +262 -0
  23. package/src/cli/commands/completions.ts +16 -0
  24. package/src/cli/commands/coverage.ts +605 -132
  25. package/src/cli/commands/db.ts +178 -7
  26. package/src/cli/commands/describe.ts +37 -2
  27. package/src/cli/commands/discover.ts +1236 -0
  28. package/src/cli/commands/doctor.ts +607 -0
  29. package/src/cli/commands/fixtures.ts +402 -0
  30. package/src/cli/commands/generate.ts +420 -46
  31. package/src/cli/commands/init/bootstrap.ts +30 -1
  32. package/src/cli/commands/{init.ts → init/index.ts} +99 -5
  33. package/src/cli/commands/init/skills.ts +56 -3
  34. package/src/cli/commands/init/templates/agents.md +65 -61
  35. package/src/cli/commands/init/templates/skills/zond-checks.md +397 -0
  36. package/src/cli/commands/init/templates/skills/zond-triage.md +210 -0
  37. package/src/cli/commands/init/templates/skills/zond.md +592 -125
  38. package/src/cli/commands/init/templates/zond-config.yml +8 -9
  39. package/src/cli/commands/prepare-fixtures.ts +135 -0
  40. package/src/cli/commands/probe/mass-assignment.ts +503 -0
  41. package/src/cli/commands/probe/security.ts +454 -0
  42. package/src/cli/commands/probe/static.ts +255 -0
  43. package/src/cli/commands/probe/webhooks.ts +161 -0
  44. package/src/cli/commands/probe.ts +459 -0
  45. package/src/cli/commands/reference.ts +87 -0
  46. package/src/cli/commands/refresh-api.ts +169 -0
  47. package/src/cli/commands/remove-api.ts +150 -0
  48. package/src/cli/commands/report-bundle.ts +318 -0
  49. package/src/cli/commands/report.ts +241 -0
  50. package/src/cli/commands/request.ts +379 -4
  51. package/src/cli/commands/run.ts +842 -53
  52. package/src/cli/commands/session.ts +244 -0
  53. package/src/cli/commands/use.ts +18 -1
  54. package/src/cli/index.ts +20 -3
  55. package/src/cli/json-envelope.ts +112 -3
  56. package/src/cli/json-schemas.ts +263 -0
  57. package/src/cli/program.ts +198 -635
  58. package/src/cli/resolve.ts +105 -0
  59. package/src/cli/status-filter.ts +124 -0
  60. package/src/cli/util/api-context.ts +85 -0
  61. package/src/cli/version.ts +5 -0
  62. package/src/core/anti-fp/bootstrap.ts +34 -0
  63. package/src/core/anti-fp/index.ts +33 -0
  64. package/src/core/anti-fp/registry.ts +44 -0
  65. package/src/core/anti-fp/rules/baseline-echo.ts +74 -0
  66. package/src/core/anti-fp/rules/schemathesis/body_negation_becomes_valid.ts +52 -0
  67. package/src/core/anti-fp/rules/schemathesis/coverage_phase_boundary_positive.ts +38 -0
  68. package/src/core/anti-fp/rules/schemathesis/has_unverifiable_mutations.ts +35 -0
  69. package/src/core/anti-fp/rules/schemathesis/index.ts +24 -0
  70. package/src/core/anti-fp/rules/schemathesis/string_type_mutation_becomes_valid.ts +53 -0
  71. package/src/core/anti-fp/rules/subscription-gated/index.ts +11 -0
  72. package/src/core/anti-fp/rules/subscription-gated/paid-plan-403.ts +75 -0
  73. package/src/core/anti-fp/types.ts +68 -0
  74. package/src/core/checks/checks/_crud-helpers.ts +133 -0
  75. package/src/core/checks/checks/_negative_mutator.ts +133 -0
  76. package/src/core/checks/checks/_readback-helpers.ts +133 -0
  77. package/src/core/checks/checks/content_type_conformance.ts +39 -0
  78. package/src/core/checks/checks/cross_call_references.ts +134 -0
  79. package/src/core/checks/checks/ensure_resource_availability.ts +62 -0
  80. package/src/core/checks/checks/idempotency_replay.ts +246 -0
  81. package/src/core/checks/checks/ignored_auth.ts +211 -0
  82. package/src/core/checks/checks/index.ts +65 -0
  83. package/src/core/checks/checks/lifecycle_transitions.ts +273 -0
  84. package/src/core/checks/checks/missing_required_header.ts +40 -0
  85. package/src/core/checks/checks/negative_data_rejection.ts +45 -0
  86. package/src/core/checks/checks/not_a_server_error.ts +27 -0
  87. package/src/core/checks/checks/open_cors_on_sensitive.ts +131 -0
  88. package/src/core/checks/checks/pagination_invariants.ts +238 -0
  89. package/src/core/checks/checks/positive_data_acceptance.ts +36 -0
  90. package/src/core/checks/checks/rate_limit_headers_absent.ts +77 -0
  91. package/src/core/checks/checks/response_headers_conformance.ts +74 -0
  92. package/src/core/checks/checks/response_schema_conformance.ts +30 -0
  93. package/src/core/checks/checks/status_code_conformance.ts +61 -0
  94. package/src/core/checks/checks/unsupported_method.ts +63 -0
  95. package/src/core/checks/checks/use_after_free.ts +78 -0
  96. package/src/core/checks/index.ts +30 -0
  97. package/src/core/checks/mode.ts +79 -0
  98. package/src/core/checks/recommended-action.ts +64 -0
  99. package/src/core/checks/registry.ts +78 -0
  100. package/src/core/checks/runner.ts +874 -0
  101. package/src/core/checks/sarif.ts +230 -0
  102. package/src/core/checks/stateful.ts +121 -0
  103. package/src/core/checks/types.ts +189 -0
  104. package/src/core/classifier/recommended-action.ts +222 -0
  105. package/src/core/context/current.ts +22 -6
  106. package/src/core/context/session.ts +78 -0
  107. package/src/core/coverage/loader.ts +185 -0
  108. package/src/core/coverage/reasons.ts +300 -0
  109. package/src/core/diagnostics/db-analysis.ts +151 -11
  110. package/src/core/diagnostics/failure-class.ts +120 -0
  111. package/src/core/diagnostics/failure-hints.ts +212 -9
  112. package/src/core/diagnostics/spec-pointer.ts +99 -0
  113. package/src/core/diagnostics/suggested-fixes.ts +156 -0
  114. package/src/core/exporter/case-study/index.ts +270 -0
  115. package/src/core/exporter/curl.ts +40 -0
  116. package/src/core/exporter/exporter.ts +48 -0
  117. package/src/core/exporter/html-report/escape.ts +24 -0
  118. package/src/core/exporter/html-report/index.ts +479 -0
  119. package/src/core/exporter/html-report/script.ts +100 -0
  120. package/src/core/exporter/html-report/styles.ts +408 -0
  121. package/src/core/generator/chunker.ts +42 -16
  122. package/src/core/generator/coverage-phase.ts +0 -0
  123. package/src/core/generator/create-body.ts +89 -0
  124. package/src/core/generator/data-factory.ts +445 -19
  125. package/src/core/generator/describe.ts +1 -1
  126. package/src/core/generator/fixtures-builder.ts +325 -0
  127. package/src/core/generator/index.ts +7 -5
  128. package/src/core/generator/openapi-reader.ts +37 -3
  129. package/src/core/generator/path-param-disambig.ts +114 -0
  130. package/src/core/generator/resources-builder.ts +648 -0
  131. package/src/core/generator/schema-utils.ts +11 -3
  132. package/src/core/generator/serializer.ts +103 -13
  133. package/src/core/generator/suite-generator.ts +419 -111
  134. package/src/core/generator/types.ts +8 -0
  135. package/src/core/identity/identity-file.ts +129 -0
  136. package/src/core/lint/affects.ts +28 -0
  137. package/src/core/lint/config.ts +96 -0
  138. package/src/core/lint/format.ts +42 -0
  139. package/src/core/lint/index.ts +94 -0
  140. package/src/core/lint/reporter.ts +128 -0
  141. package/src/core/lint/rules/consistency.ts +158 -0
  142. package/src/core/lint/rules/heuristics.ts +97 -0
  143. package/src/core/lint/rules/strictness.ts +109 -0
  144. package/src/core/lint/types.ts +96 -0
  145. package/src/core/lint/walker.ts +248 -0
  146. package/src/core/meta/meta-store.ts +6 -73
  147. package/src/core/output/README.md +91 -0
  148. package/src/core/output/index.ts +13 -0
  149. package/src/core/output/run.ts +126 -0
  150. package/src/core/output/types.ts +129 -0
  151. package/src/core/parser/env-interpolation.ts +104 -0
  152. package/src/core/parser/filter.ts +57 -0
  153. package/src/core/parser/schema.ts +129 -4
  154. package/src/core/parser/types.ts +19 -1
  155. package/src/core/parser/variables.ts +0 -0
  156. package/src/core/parser/yaml-parser.ts +58 -12
  157. package/src/core/probe/bootstrap.ts +34 -0
  158. package/src/core/probe/dry-run-envelope.ts +57 -0
  159. package/src/core/probe/mass-assignment-probe-class.ts +198 -0
  160. package/src/core/probe/mass-assignment-probe.ts +1122 -0
  161. package/src/core/probe/mass-assignment-template.ts +212 -0
  162. package/src/core/probe/method-probe.ts +43 -76
  163. package/src/core/probe/method-shared.ts +69 -0
  164. package/src/core/probe/negative-probe.ts +183 -149
  165. package/src/core/probe/orphan-tracker.ts +188 -0
  166. package/src/core/probe/path-discovery.ts +440 -0
  167. package/src/core/probe/probe-harness.ts +120 -0
  168. package/src/core/probe/registry.ts +89 -0
  169. package/src/core/probe/runner.ts +136 -0
  170. package/src/core/probe/security-probe-class.ts +201 -0
  171. package/src/core/probe/security-probe.ts +1453 -0
  172. package/src/core/probe/shared.ts +505 -0
  173. package/src/core/probe/static-probe-class.ts +125 -0
  174. package/src/core/probe/types.ts +165 -0
  175. package/src/core/probe/verdict-aggregator.ts +33 -0
  176. package/src/core/probe/webhooks-probe.ts +284 -0
  177. package/src/core/reporter/console.ts +41 -2
  178. package/src/core/reporter/index.ts +2 -3
  179. package/src/core/reporter/json.ts +11 -1
  180. package/src/core/reporter/junit.ts +27 -12
  181. package/src/core/reporter/ndjson.ts +37 -0
  182. package/src/core/reporter/types.ts +3 -0
  183. package/src/core/runner/assertions.ts +58 -1
  184. package/src/core/runner/async-pool.ts +108 -0
  185. package/src/core/runner/auth-path.ts +8 -0
  186. package/src/core/runner/ci-context.ts +72 -0
  187. package/src/core/runner/executor.ts +264 -20
  188. package/src/core/runner/form-encode.ts +51 -0
  189. package/src/core/runner/http-client.ts +75 -2
  190. package/src/core/runner/learn-drift.ts +293 -0
  191. package/src/core/runner/preflight-vars.ts +149 -0
  192. package/src/core/runner/progress-tracker.ts +73 -0
  193. package/src/core/runner/rate-limiter.ts +89 -17
  194. package/src/core/runner/run-kind.ts +39 -0
  195. package/src/core/runner/schema-validator.ts +312 -0
  196. package/src/core/runner/send-request.ts +153 -20
  197. package/src/core/runner/types.ts +38 -0
  198. package/src/core/secrets/registry.ts +164 -0
  199. package/src/core/secrets/secrets-file.ts +115 -0
  200. package/src/core/selectors/operation-filter.ts +144 -0
  201. package/src/core/setup-api.ts +415 -16
  202. package/src/core/severity/category.ts +94 -0
  203. package/src/core/severity/index.ts +121 -0
  204. package/src/core/spec/layers.ts +154 -0
  205. package/src/core/util/format-eta.ts +21 -0
  206. package/src/core/utils.ts +5 -1
  207. package/src/core/workspace/config.ts +129 -0
  208. package/src/core/workspace/manifest.ts +283 -0
  209. package/src/core/workspace/output-rotation.ts +62 -0
  210. package/src/core/workspace/triage-path.ts +87 -0
  211. package/src/db/lint-runs.ts +47 -0
  212. package/src/db/migrate.ts +126 -0
  213. package/src/db/migrations/0001_run_kind.sql +25 -0
  214. package/src/db/migrations/sql.d.ts +4 -0
  215. package/src/db/queries/collections.ts +133 -0
  216. package/src/db/queries/coverage.ts +9 -0
  217. package/src/db/queries/dashboard.ts +59 -0
  218. package/src/db/queries/results.ts +128 -0
  219. package/src/db/queries/runs.ts +235 -0
  220. package/src/db/queries/sessions.ts +42 -0
  221. package/src/db/queries/settings.ts +28 -0
  222. package/src/db/queries/types.ts +172 -0
  223. package/src/db/queries.ts +72 -802
  224. package/src/db/schema.ts +178 -50
  225. package/src/cli/commands/export.ts +0 -144
  226. package/src/cli/commands/guide.ts +0 -127
  227. package/src/cli/commands/init/templates/skills/scenarios.md +0 -97
  228. package/src/cli/commands/probe-methods.ts +0 -108
  229. package/src/cli/commands/probe-validation.ts +0 -124
  230. package/src/cli/commands/serve.ts +0 -114
  231. package/src/cli/commands/sync.ts +0 -268
  232. package/src/cli/commands/update.ts +0 -189
  233. package/src/cli/commands/validate.ts +0 -34
  234. package/src/core/diagnostics/render-md.ts +0 -112
  235. package/src/core/exporter/postman.ts +0 -963
  236. package/src/core/generator/guide-builder.ts +0 -253
  237. package/src/core/meta/types.ts +0 -19
  238. package/src/core/parser/index.ts +0 -21
  239. package/src/core/runner/execute-run.ts +0 -132
  240. package/src/core/runner/index.ts +0 -12
  241. package/src/core/sync/spec-differ.ts +0 -38
  242. package/src/web/data/collection-state.ts +0 -362
  243. package/src/web/routes/api.ts +0 -314
  244. package/src/web/routes/dashboard.ts +0 -350
  245. package/src/web/routes/runs.ts +0 -64
  246. package/src/web/schemas.ts +0 -121
  247. package/src/web/server.ts +0 -134
  248. package/src/web/static/htmx.min.cjs +0 -1
  249. package/src/web/static/style.css +0 -1148
  250. package/src/web/views/endpoints-tab.ts +0 -174
  251. package/src/web/views/explorer-tab.ts +0 -402
  252. package/src/web/views/health-strip.ts +0 -92
  253. package/src/web/views/layout.ts +0 -48
  254. package/src/web/views/results.ts +0 -210
  255. package/src/web/views/runs-tab.ts +0 -126
  256. package/src/web/views/suites-tab.ts +0 -181
@@ -0,0 +1,263 @@
1
+ /**
2
+ * TASK-295: zod sources of truth for the `--json` envelope shape and its
3
+ * sub-types. Run `bun run scripts/emit-json-schemas.ts` after changing
4
+ * any of these to regenerate `docs/json-schema/*.schema.json`.
5
+ *
6
+ * Why zod first, JSON Schema second: zod is the type AND the validator
7
+ * we already ship; emitting JSON Schema from it keeps the published
8
+ * schema and the runtime checks in lock-step. New fields land here and
9
+ * propagate, instead of drifting between two hand-maintained shapes.
10
+ */
11
+
12
+ import { z } from "zod";
13
+
14
+ /** TASK-296 closed enum — must stay in sync with `ZondErrorCode` in
15
+ * `src/cli/json-envelope.ts`. */
16
+ export const ZondErrorCodeSchema = z.enum([
17
+ "unknown_error",
18
+ "env_missing",
19
+ "fixture_missing",
20
+ "network_timeout",
21
+ "network_error",
22
+ "sandbox_blocked",
23
+ "spec_load_failure",
24
+ "yaml_parse_error",
25
+ "workspace_not_found",
26
+ "file_not_found",
27
+ "permission_denied",
28
+ "argument_invalid",
29
+ "api_not_registered",
30
+ "db_error",
31
+ "auth_config_error",
32
+ ]);
33
+
34
+ export const ZondErrorSchema = z.object({
35
+ code: ZondErrorCodeSchema,
36
+ message: z.string(),
37
+ details: z.record(z.string(), z.unknown()).optional(),
38
+ });
39
+
40
+ /** TASK-294 closed enum — must stay in sync with `RecommendedAction` in
41
+ * `src/core/diagnostics/failure-hints.ts` and the per-check mapping in
42
+ * `src/core/checks/recommended-action.ts` (ARV-11).
43
+ * ARV-11 added three values for the depth-checks framework:
44
+ * - `tighten_validation` — server accepted invalid input.
45
+ * - `add_required_header` — server didn't enforce a required header.
46
+ * - `wontfix_known_limitation` — known/accepted gap; agent should
47
+ * not retry or report. */
48
+ export const RecommendedActionSchema = z.enum([
49
+ "report_backend_bug",
50
+ "fix_auth_config",
51
+ "fix_test_logic",
52
+ "fix_network_config",
53
+ "fix_env",
54
+ "fix_spec",
55
+ "fix_fixture",
56
+ // ARV-42 — re-run `zond generate` for failures rooted in generator-emitted
57
+ // bodies; editing the YAML directly is overwritten by the next regenerate.
58
+ "regenerate_suite",
59
+ "tighten_validation",
60
+ "add_required_header",
61
+ "wontfix_known_limitation",
62
+ ]);
63
+
64
+ /** Envelope body. `data` is open (`unknown`) so this schema covers every
65
+ * command without enumerating each payload — command-specific schemas
66
+ * can refine `data` per-command in a follow-up. */
67
+ export const JsonEnvelopeSchema = z.object({
68
+ ok: z.boolean(),
69
+ command: z.string(),
70
+ data: z.unknown(),
71
+ warnings: z.array(z.string()),
72
+ errors: z.array(ZondErrorSchema),
73
+ exit_code: z.number().int().optional(),
74
+ });
75
+
76
+ /** ARV-1 (m-15): shape of `data` for `zond checks run --json`. The
77
+ * envelope itself stays the generic JsonEnvelopeSchema; this schema
78
+ * pins the per-command payload so agents can validate findings without
79
+ * parsing them by-hand. ARV-11 adds `recommended_action` as a closed
80
+ * enum on each finding. */
81
+ export const SeveritySchema = z.enum(["critical", "high", "medium", "low", "info"]);
82
+ export const CategorySchema = z.enum(["security", "reliability", "contract", "hygiene"]);
83
+
84
+ export const CheckFindingSchema = z.object({
85
+ check: z.string(),
86
+ severity: SeveritySchema,
87
+ // ARV-251: category drives per-section roll-up. Optional on the wire
88
+ // for backwards compat with older NDJSON streams — derived by reader
89
+ // from check id if absent.
90
+ category: CategorySchema.optional(),
91
+ operation: z.object({
92
+ path: z.string(),
93
+ method: z.string(),
94
+ operationId: z.string().optional(),
95
+ }),
96
+ request_signature: z.string(),
97
+ response_summary: z.object({
98
+ status: z.number().int(),
99
+ content_type: z.string().optional(),
100
+ }),
101
+ message: z.string(),
102
+ evidence: z.record(z.string(), z.unknown()).optional(),
103
+ // ARV-11: recommended_action is now a closed enum so agents can
104
+ // route on it without parsing free-form strings. Same enum used by
105
+ // `db diagnose` (TASK-294) plus three depth-check additions.
106
+ recommended_action: RecommendedActionSchema.optional(),
107
+ });
108
+
109
+ export const CheckRunSummarySchema = z.object({
110
+ operations: z.number().int().nonnegative(),
111
+ cases: z.number().int().nonnegative(),
112
+ checks_run: z.number().int().nonnegative(),
113
+ findings: z.number().int().nonnegative(),
114
+ by_severity: z.object({
115
+ critical: z.number().int().nonnegative(),
116
+ high: z.number().int().nonnegative(),
117
+ medium: z.number().int().nonnegative(),
118
+ low: z.number().int().nonnegative(),
119
+ info: z.number().int().nonnegative(),
120
+ }),
121
+ by_category: z.object({
122
+ security: z.number().int().nonnegative(),
123
+ reliability: z.number().int().nonnegative(),
124
+ contract: z.number().int().nonnegative(),
125
+ hygiene: z.number().int().nonnegative(),
126
+ }),
127
+ // ARV-26: per-(check, reason) skip tally — surfaces probe outcomes that
128
+ // never produced a checkable response (e.g. probe got 4xx, schema only on
129
+ // 200) so "0 findings" doesn't read as "all green".
130
+ skipped_outcomes: z.record(z.string(), z.number().int().nonnegative()),
131
+ });
132
+
133
+ export const ChecksRunDataSchema = z.object({
134
+ findings: z.array(CheckFindingSchema),
135
+ summary: CheckRunSummarySchema,
136
+ });
137
+
138
+ /** ARV-10 (m-15): NDJSON streaming events emitted by `zond checks run
139
+ * --ndjson`. Each event is a snapshot JSON line on stdout — agents pipe
140
+ * the stream into `jq` / a validator and consume findings as they happen
141
+ * rather than waiting for the run to finish. The discriminated union
142
+ * below is the schema we publish — every emitted line MUST match one
143
+ * branch exactly (verified by ajv in tests). */
144
+ const OperationRefSchema = z.object({
145
+ path: z.string(),
146
+ method: z.string(),
147
+ operationId: z.string().optional(),
148
+ });
149
+
150
+ export const NdjsonCheckStartEventSchema = z.object({
151
+ type: z.literal("check_start"),
152
+ ts: z.string(),
153
+ operation: OperationRefSchema,
154
+ });
155
+
156
+ export const NdjsonCheckResultEventSchema = z.object({
157
+ type: z.literal("check_result"),
158
+ ts: z.string(),
159
+ check: z.string(),
160
+ verdict: z.enum(["pass", "fail"]),
161
+ operation: OperationRefSchema,
162
+ request_signature: z.string(),
163
+ response: z.object({
164
+ status: z.number().int(),
165
+ content_type: z.string().optional(),
166
+ }),
167
+ });
168
+
169
+ export const NdjsonFindingEventSchema = z.object({
170
+ type: z.literal("finding"),
171
+ ts: z.string(),
172
+ // ARV-156: mirror the top-level `check` field carried by check_start /
173
+ // check_result so consumer pipelines can `jq -c '.check'` uniformly
174
+ // across event types without branching on `.type`. The same value lives
175
+ // inside `.finding.check` — existing consumers reading the nested form
176
+ // keep working (back-compat addition, not a rename).
177
+ check: z.string(),
178
+ finding: CheckFindingSchema,
179
+ });
180
+
181
+ export const NdjsonSummaryEventSchema = z.object({
182
+ type: z.literal("summary"),
183
+ ts: z.string(),
184
+ summary: CheckRunSummarySchema,
185
+ });
186
+
187
+ export const NdjsonEventSchema = z.discriminatedUnion("type", [
188
+ NdjsonCheckStartEventSchema,
189
+ NdjsonCheckResultEventSchema,
190
+ NdjsonFindingEventSchema,
191
+ NdjsonSummaryEventSchema,
192
+ ]);
193
+
194
+ /** m-17 / ARV-50: shape of `data` for `zond probe <class> --dry-run --json`.
195
+ * Severity is intentionally absent — nothing is classified yet, so
196
+ * reusing the run-time bucket would mislead CI gates (F1-15). The
197
+ * `skip_reason` enum is open across probe families (e.g. security has
198
+ * `isolated-protected`, mass-assignment has its own subset); we keep
199
+ * it as a string with documented values rather than a closed enum
200
+ * that needs to be rev'd every time a new class lands. */
201
+ export const ProbeEndpointPlanSchema = z.object({
202
+ path: z.string(),
203
+ method: z.string(),
204
+ planned: z.boolean(),
205
+ classes_planned: z.array(z.string()),
206
+ fields_planned: z.array(z.string()),
207
+ skip_reason: z.string().nullable(),
208
+ });
209
+
210
+ export const ProbeDryRunDataSchema = z.object({
211
+ endpoints: z.array(ProbeEndpointPlanSchema),
212
+ summary: z.object({
213
+ totalEndpoints: z.number().int().nonnegative(),
214
+ planned: z.number().int().nonnegative(),
215
+ skipped: z.number().int().nonnegative(),
216
+ }),
217
+ });
218
+
219
+ /** m-17 / ARV-51: shape of `data` for live probe runs (`zond probe <class>
220
+ * --report json` or the default `--json`). One entry per endpoint with
221
+ * structured findings — no markdown blob. The legacy `data.digest.stdout`
222
+ * field is gone (F3-15 / F4-15). */
223
+ export const ProbeFindingSchema = z.object({
224
+ class: z.string(),
225
+ severity: z.enum(["high", "low", "inconclusive", "ok"]),
226
+ evidence: z.record(z.string(), z.unknown()),
227
+ });
228
+
229
+ export const ProbeEndpointResultSchema = z.object({
230
+ path: z.string(),
231
+ method: z.string(),
232
+ classes_run: z.array(z.string()),
233
+ findings: z.array(ProbeFindingSchema),
234
+ status: z.enum(["ok", "high", "low", "inconclusive", "skipped"]),
235
+ skip_reason: z.string().optional(),
236
+ });
237
+
238
+ export const ProbeRunDataSchema = z.object({
239
+ endpoints: z.array(ProbeEndpointResultSchema),
240
+ summary: z.object({
241
+ totalEndpoints: z.number().int().nonnegative(),
242
+ probed: z.number().int().nonnegative(),
243
+ by_status: z.object({
244
+ ok: z.number().int().nonnegative(),
245
+ high: z.number().int().nonnegative(),
246
+ low: z.number().int().nonnegative(),
247
+ inconclusive: z.number().int().nonnegative(),
248
+ skipped: z.number().int().nonnegative(),
249
+ }),
250
+ }),
251
+ });
252
+
253
+ export const SCHEMAS = {
254
+ envelope: JsonEnvelopeSchema,
255
+ error: ZondErrorSchema,
256
+ errorCode: ZondErrorCodeSchema,
257
+ recommendedAction: RecommendedActionSchema,
258
+ checksRunData: ChecksRunDataSchema,
259
+ checkFinding: CheckFindingSchema,
260
+ "ndjson-events": NdjsonEventSchema,
261
+ probeDryRun: ProbeDryRunDataSchema,
262
+ probeRun: ProbeRunDataSchema,
263
+ } as const;