@lovrozagar/oat 0.10.0 → 0.12.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 (278) hide show
  1. package/README.md +25 -2006
  2. package/dist/cli.js +283 -59
  3. package/dist/config/define-config.d.ts +8 -0
  4. package/dist/config/define-config.d.ts.map +1 -1
  5. package/dist/config/define-config.js.map +1 -1
  6. package/dist/config/validate.d.ts +12 -0
  7. package/dist/config/validate.d.ts.map +1 -0
  8. package/dist/config/validate.js +86 -0
  9. package/dist/config/validate.js.map +1 -0
  10. package/dist/conformance/effects.d.ts +9 -0
  11. package/dist/conformance/effects.d.ts.map +1 -0
  12. package/dist/conformance/effects.js +276 -0
  13. package/dist/conformance/effects.js.map +1 -0
  14. package/dist/conformance/expected-failures.d.ts +18 -0
  15. package/dist/conformance/expected-failures.d.ts.map +1 -0
  16. package/dist/conformance/expected-failures.js +48 -0
  17. package/dist/conformance/expected-failures.js.map +1 -0
  18. package/dist/conformance/feature-gate.d.ts +7 -0
  19. package/dist/conformance/feature-gate.d.ts.map +1 -0
  20. package/dist/conformance/feature-gate.js +428 -0
  21. package/dist/conformance/feature-gate.js.map +1 -0
  22. package/dist/conformance/fuzz.d.ts +108 -0
  23. package/dist/conformance/fuzz.d.ts.map +1 -0
  24. package/dist/conformance/fuzz.js +246 -0
  25. package/dist/conformance/fuzz.js.map +1 -0
  26. package/dist/conformance/leaks.d.ts +10 -0
  27. package/dist/conformance/leaks.d.ts.map +1 -0
  28. package/dist/conformance/leaks.js +23 -0
  29. package/dist/conformance/leaks.js.map +1 -0
  30. package/dist/conformance/pool.d.ts +49 -0
  31. package/dist/conformance/pool.d.ts.map +1 -0
  32. package/dist/conformance/pool.js +75 -0
  33. package/dist/conformance/pool.js.map +1 -0
  34. package/dist/conformance/rate-limit.d.ts +7 -0
  35. package/dist/conformance/rate-limit.d.ts.map +1 -0
  36. package/dist/conformance/rate-limit.js +372 -0
  37. package/dist/conformance/rate-limit.js.map +1 -0
  38. package/dist/conformance/scope.d.ts +15 -0
  39. package/dist/conformance/scope.d.ts.map +1 -0
  40. package/dist/conformance/scope.js +78 -0
  41. package/dist/conformance/scope.js.map +1 -0
  42. package/dist/conformance/seed-contract.d.ts +11 -0
  43. package/dist/conformance/seed-contract.d.ts.map +1 -0
  44. package/dist/conformance/seed-contract.js +680 -0
  45. package/dist/conformance/seed-contract.js.map +1 -0
  46. package/dist/conformance/shapes.d.ts +35 -0
  47. package/dist/conformance/shapes.d.ts.map +1 -0
  48. package/dist/conformance/shapes.js +162 -0
  49. package/dist/conformance/shapes.js.map +1 -0
  50. package/dist/conformance/specs.d.ts +21 -0
  51. package/dist/conformance/specs.d.ts.map +1 -0
  52. package/dist/conformance/specs.js +306 -0
  53. package/dist/conformance/specs.js.map +1 -0
  54. package/dist/conformance/suite.d.ts +209 -0
  55. package/dist/conformance/suite.d.ts.map +1 -0
  56. package/dist/conformance/suite.js +1538 -0
  57. package/dist/conformance/suite.js.map +1 -0
  58. package/dist/conformance/unique.d.ts +7 -0
  59. package/dist/conformance/unique.d.ts.map +1 -0
  60. package/dist/conformance/unique.js +586 -0
  61. package/dist/conformance/unique.js.map +1 -0
  62. package/dist/conformance/worker.d.ts +3 -0
  63. package/dist/conformance/worker.d.ts.map +1 -0
  64. package/dist/conformance/worker.js +27 -0
  65. package/dist/conformance/worker.js.map +1 -0
  66. package/dist/index.d.ts +8 -3
  67. package/dist/index.js +5 -2
  68. package/dist/reference/defects.d.ts +71 -1
  69. package/dist/reference/defects.d.ts.map +1 -1
  70. package/dist/reference/defects.js +74 -8
  71. package/dist/reference/defects.js.map +1 -1
  72. package/dist/reference/dialect.d.ts +6 -4
  73. package/dist/reference/dialect.d.ts.map +1 -1
  74. package/dist/reference/dialect.js +1 -0
  75. package/dist/reference/dialect.js.map +1 -1
  76. package/dist/reference/http.d.ts +17 -25
  77. package/dist/reference/http.d.ts.map +1 -1
  78. package/dist/reference/http.js +574 -224
  79. package/dist/reference/http.js.map +1 -1
  80. package/dist/reference/listing.d.ts +51 -0
  81. package/dist/reference/listing.d.ts.map +1 -0
  82. package/dist/reference/listing.js +256 -0
  83. package/dist/reference/listing.js.map +1 -0
  84. package/dist/reference/model.d.ts +35 -1
  85. package/dist/reference/model.d.ts.map +1 -1
  86. package/dist/reference/model.js +42 -0
  87. package/dist/reference/model.js.map +1 -1
  88. package/dist/reference/query.d.ts +132 -43
  89. package/dist/reference/query.d.ts.map +1 -1
  90. package/dist/reference/query.js +397 -315
  91. package/dist/reference/query.js.map +1 -1
  92. package/dist/reference/shapes.d.ts +60 -0
  93. package/dist/reference/shapes.d.ts.map +1 -0
  94. package/dist/reference/shapes.js +142 -0
  95. package/dist/reference/shapes.js.map +1 -0
  96. package/dist/reference/spec.d.ts +9 -2
  97. package/dist/reference/spec.d.ts.map +1 -1
  98. package/dist/reference/spec.js +291 -71
  99. package/dist/reference/spec.js.map +1 -1
  100. package/dist/reference/store-api.d.ts +14 -43
  101. package/dist/reference/store-api.d.ts.map +1 -1
  102. package/dist/reference/store-api.js +8 -58
  103. package/dist/reference/store-api.js.map +1 -1
  104. package/dist/reference/stores/memory.d.ts +12 -15
  105. package/dist/reference/stores/memory.d.ts.map +1 -1
  106. package/dist/reference/stores/memory.js +22 -70
  107. package/dist/reference/stores/memory.js.map +1 -1
  108. package/dist/reference/stores/postgres.d.ts +11 -23
  109. package/dist/reference/stores/postgres.d.ts.map +1 -1
  110. package/dist/reference/stores/postgres.js +53 -334
  111. package/dist/reference/stores/postgres.js.map +1 -1
  112. package/dist/reference/stores/sql-compile.d.ts +36 -0
  113. package/dist/reference/stores/sql-compile.d.ts.map +1 -0
  114. package/dist/reference/stores/sql-compile.js +95 -0
  115. package/dist/reference/stores/sql-compile.js.map +1 -0
  116. package/dist/reference/stores/sqlite.d.ts +12 -27
  117. package/dist/reference/stores/sqlite.d.ts.map +1 -1
  118. package/dist/reference/stores/sqlite.js +54 -355
  119. package/dist/reference/stores/sqlite.js.map +1 -1
  120. package/dist/report/console.d.ts.map +1 -1
  121. package/dist/report/console.js +23 -9
  122. package/dist/report/console.js.map +1 -1
  123. package/dist/report/matrix.d.ts +2 -0
  124. package/dist/report/matrix.d.ts.map +1 -1
  125. package/dist/report/matrix.js +63 -10
  126. package/dist/report/matrix.js.map +1 -1
  127. package/dist/report/render.d.ts +10 -1
  128. package/dist/report/render.d.ts.map +1 -1
  129. package/dist/report/render.js +75 -13
  130. package/dist/report/render.js.map +1 -1
  131. package/dist/runtime/async.d.ts +16 -3
  132. package/dist/runtime/async.d.ts.map +1 -1
  133. package/dist/runtime/async.js +24 -19
  134. package/dist/runtime/async.js.map +1 -1
  135. package/dist/runtime/auth.d.ts +8 -9
  136. package/dist/runtime/auth.d.ts.map +1 -1
  137. package/dist/runtime/auth.js +60 -62
  138. package/dist/runtime/auth.js.map +1 -1
  139. package/dist/runtime/body.d.ts +15 -3
  140. package/dist/runtime/body.d.ts.map +1 -1
  141. package/dist/runtime/body.js +61 -12
  142. package/dist/runtime/body.js.map +1 -1
  143. package/dist/runtime/check-costs.d.ts +15 -0
  144. package/dist/runtime/check-costs.d.ts.map +1 -0
  145. package/dist/runtime/check-costs.js +114 -0
  146. package/dist/runtime/check-costs.js.map +1 -0
  147. package/dist/runtime/check-ids.d.ts +15 -0
  148. package/dist/runtime/check-ids.d.ts.map +1 -0
  149. package/dist/runtime/check-ids.js +140 -0
  150. package/dist/runtime/check-ids.js.map +1 -0
  151. package/dist/runtime/checks.d.ts +88 -20
  152. package/dist/runtime/checks.d.ts.map +1 -1
  153. package/dist/runtime/checks.js +3288 -1947
  154. package/dist/runtime/checks.js.map +1 -1
  155. package/dist/runtime/client.d.ts +112 -0
  156. package/dist/runtime/client.d.ts.map +1 -1
  157. package/dist/runtime/client.js +271 -39
  158. package/dist/runtime/client.js.map +1 -1
  159. package/dist/runtime/cookies.d.ts +16 -2
  160. package/dist/runtime/cookies.d.ts.map +1 -1
  161. package/dist/runtime/cookies.js +83 -22
  162. package/dist/runtime/cookies.js.map +1 -1
  163. package/dist/runtime/exchanges.d.ts +4 -5
  164. package/dist/runtime/exchanges.d.ts.map +1 -1
  165. package/dist/runtime/exchanges.js +33 -55
  166. package/dist/runtime/exchanges.js.map +1 -1
  167. package/dist/runtime/exit.d.ts +40 -0
  168. package/dist/runtime/exit.d.ts.map +1 -0
  169. package/dist/runtime/exit.js +48 -0
  170. package/dist/runtime/exit.js.map +1 -0
  171. package/dist/runtime/feature-gate.d.ts +0 -9
  172. package/dist/runtime/feature-gate.d.ts.map +1 -1
  173. package/dist/runtime/feature-gate.js +0 -21
  174. package/dist/runtime/feature-gate.js.map +1 -1
  175. package/dist/runtime/finding.d.ts +49 -8
  176. package/dist/runtime/finding.d.ts.map +1 -1
  177. package/dist/runtime/finding.js +51 -8
  178. package/dist/runtime/finding.js.map +1 -1
  179. package/dist/runtime/fixture.d.ts +35 -28
  180. package/dist/runtime/fixture.d.ts.map +1 -1
  181. package/dist/runtime/fixture.js +92 -731
  182. package/dist/runtime/fixture.js.map +1 -1
  183. package/dist/runtime/generate.d.ts +63 -0
  184. package/dist/runtime/generate.d.ts.map +1 -0
  185. package/dist/runtime/generate.js +635 -0
  186. package/dist/runtime/generate.js.map +1 -0
  187. package/dist/runtime/headers.d.ts +6 -0
  188. package/dist/runtime/headers.d.ts.map +1 -0
  189. package/dist/runtime/headers.js +16 -0
  190. package/dist/runtime/headers.js.map +1 -0
  191. package/dist/runtime/path.d.ts +7 -0
  192. package/dist/runtime/path.d.ts.map +1 -0
  193. package/dist/runtime/path.js +44 -0
  194. package/dist/runtime/path.js.map +1 -0
  195. package/dist/runtime/payloads.d.ts +2 -0
  196. package/dist/runtime/payloads.d.ts.map +1 -1
  197. package/dist/runtime/payloads.js +2 -1
  198. package/dist/runtime/payloads.js.map +1 -1
  199. package/dist/runtime/rate-limit.d.ts +6 -4
  200. package/dist/runtime/rate-limit.d.ts.map +1 -1
  201. package/dist/runtime/rate-limit.js +22 -33
  202. package/dist/runtime/rate-limit.js.map +1 -1
  203. package/dist/runtime/redact.d.ts +24 -0
  204. package/dist/runtime/redact.d.ts.map +1 -0
  205. package/dist/runtime/redact.js +98 -0
  206. package/dist/runtime/redact.js.map +1 -0
  207. package/dist/runtime/run.d.ts +34 -2
  208. package/dist/runtime/run.d.ts.map +1 -1
  209. package/dist/runtime/run.js +374 -138
  210. package/dist/runtime/run.js.map +1 -1
  211. package/dist/runtime/runs.d.ts +5 -0
  212. package/dist/runtime/runs.d.ts.map +1 -1
  213. package/dist/runtime/runs.js +7 -1
  214. package/dist/runtime/runs.js.map +1 -1
  215. package/dist/runtime/teardown.d.ts +17 -4
  216. package/dist/runtime/teardown.d.ts.map +1 -1
  217. package/dist/runtime/teardown.js +49 -16
  218. package/dist/runtime/teardown.js.map +1 -1
  219. package/dist/runtime/transcript.d.ts +34 -2
  220. package/dist/runtime/transcript.d.ts.map +1 -1
  221. package/dist/runtime/transcript.js +119 -24
  222. package/dist/runtime/transcript.js.map +1 -1
  223. package/dist/runtime/unique.d.ts +2 -11
  224. package/dist/runtime/unique.d.ts.map +1 -1
  225. package/dist/runtime/unique.js +27 -53
  226. package/dist/runtime/unique.js.map +1 -1
  227. package/dist/runtime/validate.d.ts +13 -2
  228. package/dist/runtime/validate.d.ts.map +1 -1
  229. package/dist/runtime/validate.js +51 -31
  230. package/dist/runtime/validate.js.map +1 -1
  231. package/dist/runtime/wait.d.ts +2 -1
  232. package/dist/runtime/wait.d.ts.map +1 -1
  233. package/dist/runtime/wait.js +2 -36
  234. package/dist/runtime/wait.js.map +1 -1
  235. package/dist/runtime/world.d.ts +24 -1
  236. package/dist/runtime/world.d.ts.map +1 -1
  237. package/dist/runtime/world.js +101 -26
  238. package/dist/runtime/world.js.map +1 -1
  239. package/dist/spec/collection.d.ts +8 -2
  240. package/dist/spec/collection.d.ts.map +1 -1
  241. package/dist/spec/collection.js +47 -7
  242. package/dist/spec/collection.js.map +1 -1
  243. package/dist/spec/extensions.d.ts +11 -1
  244. package/dist/spec/extensions.d.ts.map +1 -1
  245. package/dist/spec/extensions.js +10 -2
  246. package/dist/spec/extensions.js.map +1 -1
  247. package/dist/spec/graph.d.ts +46 -0
  248. package/dist/spec/graph.d.ts.map +1 -1
  249. package/dist/spec/graph.js +175 -11
  250. package/dist/spec/graph.js.map +1 -1
  251. package/dist/spec/load.d.ts +25 -5
  252. package/dist/spec/load.d.ts.map +1 -1
  253. package/dist/spec/load.js +160 -59
  254. package/dist/spec/load.js.map +1 -1
  255. package/dist/spec/query-capabilities.d.ts +4 -0
  256. package/dist/spec/query-capabilities.d.ts.map +1 -1
  257. package/dist/spec/query-capabilities.js +6 -0
  258. package/dist/spec/query-capabilities.js.map +1 -1
  259. package/dist/spec/schema.d.ts +20 -0
  260. package/dist/spec/schema.d.ts.map +1 -0
  261. package/dist/spec/schema.js +118 -0
  262. package/dist/spec/schema.js.map +1 -0
  263. package/dist/spec/tag-schema.d.ts +12 -0
  264. package/dist/spec/tag-schema.d.ts.map +1 -0
  265. package/dist/spec/tag-schema.js +144 -0
  266. package/dist/spec/tag-schema.js.map +1 -0
  267. package/dist/spec/types.js +17 -1
  268. package/dist/spec/types.js.map +1 -1
  269. package/docs/api.md +59 -0
  270. package/docs/assumptions.md +99 -0
  271. package/docs/checks.md +183 -0
  272. package/docs/commands.md +214 -0
  273. package/docs/configuration.md +650 -0
  274. package/docs/model.md +184 -0
  275. package/docs/reference-defects.md +94 -0
  276. package/docs/reports.md +211 -0
  277. package/docs/tags.md +403 -0
  278. package/package.json +3 -1
@@ -0,0 +1,114 @@
1
+ import { CHECKS } from "./checks.js";
2
+ export const TYPICAL_REQUESTS = {
3
+ "async.reaches-terminal-state": 5,
4
+ "async.receipt-identifies-the-job": 1,
5
+ "auth.invite-grants-then-revokes": 7,
6
+ "auth.rank-is-monotonic": 3,
7
+ "concurrency.no-lost-update": 5,
8
+ "consistency.projections-agree": 6,
9
+ "count.consistent-with-returned-page": 1,
10
+ "count.matches-filtered-set": 1,
11
+ "create.persists-submitted-fields": 1,
12
+ "create.status-matches-document": 1,
13
+ "create.unique-conflict-rejected": 3,
14
+ "delete.absent-record-returns-404": 1,
15
+ "effects.declared-effect-occurs": 3,
16
+ "effects.side-effect-arrives": 3,
17
+ "error.malformed-filter-not-5xx": 1,
18
+ "filter.alias-matches-canonical": 1,
19
+ "filter.and-composes-as-intersection": 4,
20
+ "filter.condition-cap-rejected": 1,
21
+ "filter.contains-membership": 1,
22
+ "filter.empty-in": 2,
23
+ "filter.equality-selects-exactly-one": 1,
24
+ "filter.gte-is-gt-or-eq": 4,
25
+ "filter.ilike-is-case-insensitive": 2,
26
+ "filter.illegal-op-rejected": 2,
27
+ "filter.in-is-union-of-eq": 3,
28
+ "filter.in-over-limit-rejected": 1,
29
+ "filter.is-null-selects-nulls": 2,
30
+ "filter.like-metacharacters-escaped": 2,
31
+ "filter.lte-is-lt-or-eq": 3,
32
+ "filter.negation-partitions-the-set": 3,
33
+ "filter.nested-and-or-distributes": 4,
34
+ "filter.nin-complements-in": 2,
35
+ "filter.numeric-comparison-is-numeric": 1,
36
+ "filter.or-composes-as-union": 2,
37
+ "filter.ordered-triple-partitions": 6,
38
+ "filter.unknown-field-rejected": 2,
39
+ "filter.zero-match-returns-none": 1,
40
+ "idempotency.replay-does-not-duplicate": 7,
41
+ "invalidation.declared-route-changes": 5,
42
+ "list.read-after-write": 2,
43
+ "pagination.cursor-agrees-with-page": 10,
44
+ "pagination.has-more-is-accurate": 2,
45
+ "pagination.limit-bounds-page-size": 1,
46
+ "pagination.limit-respects-documented-max": 1,
47
+ "pagination.page-walk-covers-set": 13,
48
+ "patch.immutable-field-rejected": 2,
49
+ "patch.minimality": 6,
50
+ "payload.string-survives": 128,
51
+ "query.axes-compose": 5,
52
+ "query.filter-and-select-compose": 4,
53
+ "query.filter-search-select-compose": 1,
54
+ "query.filter-search-sort-compose": 1,
55
+ "query.filter-search-sort-select-compose": 1,
56
+ "query.filter-selects-from-whole-set": 21,
57
+ "query.filter-sort-select-compose": 4,
58
+ "query.search-and-filter-compose": 2,
59
+ "query.search-and-select-compose": 4,
60
+ "query.search-and-sort-compose": 2,
61
+ "query.sort-and-select-compose": 1,
62
+ "response.status-is-documented": 1,
63
+ "schema.error-response-matches-document": 1,
64
+ "schema.success-response-matches-document": 1,
65
+ "search.case-insensitive": 1,
66
+ "search.empty-q": 4,
67
+ "search.mode-accepted": 2,
68
+ "search.q-narrows-result": 2,
69
+ "search.tokens-and": 3,
70
+ "select.nested-honoured": 1,
71
+ "select.projection-honoured": 1,
72
+ "select.requested-fields-present": 1,
73
+ "select.unknown-field-rejected": 1,
74
+ "softdelete.absent-from-default-list": 3,
75
+ "sort.default-order-applied": 3,
76
+ "sort.multi-key-tiebreak": 2,
77
+ "sort.nulls-first-last": 2,
78
+ "sort.numeric-order-is-numeric": 1,
79
+ "sort.order-is-applied": 1,
80
+ "sort.reverse-symmetry": 4,
81
+ "sort.stable-tiebreak": 4,
82
+ "sort.unknown-field-rejected": 1,
83
+ "spec.declared-filterable-is-filterable": 9,
84
+ "spec.declared-filterable-ops-accepted": 41,
85
+ "spec.declared-rate-limit-is-honoured": 1,
86
+ "spec.declared-selectable-is-selectable": 10,
87
+ "spec.declared-sortable-is-sortable": 8,
88
+ "spec.declared-sortable-nulls-accepted": 20,
89
+ "tenant.denial-does-not-reveal-existence": 2,
90
+ "tenant.filter-does-not-bypass-scope": 1,
91
+ "tenant.item-not-readable-cross-tenant": 1,
92
+ "update.unique-conflict-rejected": 5,
93
+ "validation.content-type-enforced": 1,
94
+ "validation.enum-enforced": 1,
95
+ "validation.max-length-enforced": 1,
96
+ "validation.required-enforced": 1,
97
+ };
98
+ const DEFAULT_CHECK_COST = 2;
99
+ /**
100
+ * Estimated requests for testing one entity: seeding the cohort, then every check that would
101
+ * grade one of its operations. Static, like the plan it belongs to — the real count depends on
102
+ * what the backend answers.
103
+ */
104
+ export function estimateRequests(entity, model, cohortSize = 7) {
105
+ const seeding = entity.create === undefined ? 1 : cohortSize + 1;
106
+ let checks = 0;
107
+ for (const check of CHECKS) {
108
+ if (check.subjects(entity, model).length === 0)
109
+ continue;
110
+ checks += TYPICAL_REQUESTS[check.id] ?? DEFAULT_CHECK_COST;
111
+ }
112
+ return seeding + checks;
113
+ }
114
+ //# sourceMappingURL=check-costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-costs.js","sourceRoot":"","sources":["../../src/runtime/check-costs.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,gBAAgB,GAAqC;IACjE,8BAA8B,EAAE,CAAC;IACjC,kCAAkC,EAAE,CAAC;IACrC,iCAAiC,EAAE,CAAC;IACpC,wBAAwB,EAAE,CAAC;IAC3B,4BAA4B,EAAE,CAAC;IAC/B,+BAA+B,EAAE,CAAC;IAClC,qCAAqC,EAAE,CAAC;IACxC,4BAA4B,EAAE,CAAC;IAC/B,kCAAkC,EAAE,CAAC;IACrC,gCAAgC,EAAE,CAAC;IACnC,iCAAiC,EAAE,CAAC;IACpC,kCAAkC,EAAE,CAAC;IACrC,gCAAgC,EAAE,CAAC;IACnC,6BAA6B,EAAE,CAAC;IAChC,gCAAgC,EAAE,CAAC;IACnC,gCAAgC,EAAE,CAAC;IACnC,qCAAqC,EAAE,CAAC;IACxC,+BAA+B,EAAE,CAAC;IAClC,4BAA4B,EAAE,CAAC;IAC/B,iBAAiB,EAAE,CAAC;IACpB,qCAAqC,EAAE,CAAC;IACxC,wBAAwB,EAAE,CAAC;IAC3B,kCAAkC,EAAE,CAAC;IACrC,4BAA4B,EAAE,CAAC;IAC/B,0BAA0B,EAAE,CAAC;IAC7B,+BAA+B,EAAE,CAAC;IAClC,8BAA8B,EAAE,CAAC;IACjC,oCAAoC,EAAE,CAAC;IACvC,wBAAwB,EAAE,CAAC;IAC3B,oCAAoC,EAAE,CAAC;IACvC,kCAAkC,EAAE,CAAC;IACrC,2BAA2B,EAAE,CAAC;IAC9B,sCAAsC,EAAE,CAAC;IACzC,6BAA6B,EAAE,CAAC;IAChC,kCAAkC,EAAE,CAAC;IACrC,+BAA+B,EAAE,CAAC;IAClC,gCAAgC,EAAE,CAAC;IACnC,uCAAuC,EAAE,CAAC;IAC1C,qCAAqC,EAAE,CAAC;IACxC,uBAAuB,EAAE,CAAC;IAC1B,oCAAoC,EAAE,EAAE;IACxC,iCAAiC,EAAE,CAAC;IACpC,mCAAmC,EAAE,CAAC;IACtC,0CAA0C,EAAE,CAAC;IAC7C,iCAAiC,EAAE,EAAE;IACrC,gCAAgC,EAAE,CAAC;IACnC,kBAAkB,EAAE,CAAC;IACrB,yBAAyB,EAAE,GAAG;IAC9B,oBAAoB,EAAE,CAAC;IACvB,iCAAiC,EAAE,CAAC;IACpC,oCAAoC,EAAE,CAAC;IACvC,kCAAkC,EAAE,CAAC;IACrC,yCAAyC,EAAE,CAAC;IAC5C,qCAAqC,EAAE,EAAE;IACzC,kCAAkC,EAAE,CAAC;IACrC,iCAAiC,EAAE,CAAC;IACpC,iCAAiC,EAAE,CAAC;IACpC,+BAA+B,EAAE,CAAC;IAClC,+BAA+B,EAAE,CAAC;IAClC,+BAA+B,EAAE,CAAC;IAClC,wCAAwC,EAAE,CAAC;IAC3C,0CAA0C,EAAE,CAAC;IAC7C,yBAAyB,EAAE,CAAC;IAC5B,gBAAgB,EAAE,CAAC;IACnB,sBAAsB,EAAE,CAAC;IACzB,yBAAyB,EAAE,CAAC;IAC5B,mBAAmB,EAAE,CAAC;IACtB,wBAAwB,EAAE,CAAC;IAC3B,4BAA4B,EAAE,CAAC;IAC/B,iCAAiC,EAAE,CAAC;IACpC,+BAA+B,EAAE,CAAC;IAClC,qCAAqC,EAAE,CAAC;IACxC,4BAA4B,EAAE,CAAC;IAC/B,yBAAyB,EAAE,CAAC;IAC5B,uBAAuB,EAAE,CAAC;IAC1B,+BAA+B,EAAE,CAAC;IAClC,uBAAuB,EAAE,CAAC;IAC1B,uBAAuB,EAAE,CAAC;IAC1B,sBAAsB,EAAE,CAAC;IACzB,6BAA6B,EAAE,CAAC;IAChC,wCAAwC,EAAE,CAAC;IAC3C,uCAAuC,EAAE,EAAE;IAC3C,sCAAsC,EAAE,CAAC;IACzC,wCAAwC,EAAE,EAAE;IAC5C,oCAAoC,EAAE,CAAC;IACvC,uCAAuC,EAAE,EAAE;IAC3C,yCAAyC,EAAE,CAAC;IAC5C,qCAAqC,EAAE,CAAC;IACxC,uCAAuC,EAAE,CAAC;IAC1C,iCAAiC,EAAE,CAAC;IACpC,kCAAkC,EAAE,CAAC;IACrC,0BAA0B,EAAE,CAAC;IAC7B,gCAAgC,EAAE,CAAC;IACnC,8BAA8B,EAAE,CAAC;CACjC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAE5B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,KAAgB,EAAE,UAAU,GAAG,CAAC;IACrF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAA;IAChE,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACxD,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,kBAAkB,CAAA;IAC3D,CAAC;IACD,OAAO,OAAO,GAAG,MAAM,CAAA;AACxB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Every registered check id. `Check.id` and `dependsOn` are typed against this list, so a
3
+ * misspelled dependency fails to compile instead of silently never suppressing anything; the
4
+ * registry is checked against it again when it loads.
5
+ */
6
+ export declare const CHECK_IDS: readonly ["async.reaches-terminal-state", "async.receipt-identifies-the-job", "auth.invite-grants-then-revokes", "auth.rank-is-monotonic", "auth.rank-is-monotonic-on-writes", "concurrency.no-lost-update", "consistency.projections-agree", "count.consistent-with-returned-page", "count.matches-filtered-set", "create.persists-submitted-fields", "create.status-matches-document", "create.unique-conflict-rejected", "delete.absent-record-returns-404", "effects.declared-effect-occurs", "effects.side-effect-arrives", "error.malformed-filter-not-5xx", "filter.alias-matches-canonical", "filter.and-composes-as-intersection", "filter.condition-cap-rejected", "filter.contains-membership", "filter.empty-in", "filter.equality-selects-exactly-one", "filter.gte-is-gt-or-eq", "filter.ilike-is-case-insensitive", "filter.illegal-op-rejected", "filter.in-is-union-of-eq", "filter.in-over-limit-rejected", "filter.is-null-selects-nulls", "filter.like-metacharacters-escaped", "filter.lte-is-lt-or-eq", "filter.negation-partitions-the-set", "filter.nested-and-or-distributes", "filter.nin-complements-in", "filter.numeric-comparison-is-numeric", "filter.or-composes-as-union", "filter.ordered-triple-partitions", "filter.unknown-field-rejected", "filter.zero-match-returns-none", "idempotency.replay-does-not-duplicate", "invalidation.declared-route-changes", "list.read-after-write", "pagination.bounds-handled", "pagination.cursor-agrees-with-page", "pagination.has-more-is-accurate", "pagination.limit-bounds-page-size", "pagination.limit-respects-documented-max", "pagination.page-walk-covers-set", "patch.immutable-field-rejected", "patch.minimality", "payload.string-survives", "query.axes-compose", "query.filter-and-select-compose", "query.filter-search-select-compose", "query.filter-search-sort-compose", "query.filter-search-sort-select-compose", "query.filter-selects-from-whole-set", "query.filter-sort-select-compose", "query.search-and-filter-compose", "query.search-and-select-compose", "query.search-and-sort-compose", "query.sort-and-select-compose", "query.unknown-parameter-consistent", "response.status-is-documented", "schema.error-response-matches-document", "schema.success-response-matches-document", "search.case-insensitive", "search.empty-q", "search.mode-accepted", "search.q-narrows-result", "search.tokens-and", "select.nested-honoured", "select.projection-honoured", "select.requested-fields-present", "select.unknown-field-rejected", "softdelete.absent-from-default-list", "sort.default-order-applied", "sort.multi-key-tiebreak", "sort.nulls-first-last", "sort.numeric-order-is-numeric", "sort.order-is-applied", "sort.reverse-symmetry", "sort.stable-tiebreak", "sort.unknown-field-rejected", "spec.declared-filterable-is-filterable", "spec.declared-filterable-ops-accepted", "spec.declared-rate-limit-is-honoured", "spec.declared-selectable-is-selectable", "spec.declared-sortable-is-sortable", "spec.declared-sortable-nulls-accepted", "tenant.denial-does-not-reveal-existence", "tenant.filter-does-not-bypass-scope", "tenant.item-not-readable-cross-tenant", "tenant.parent-not-reachable-from-another-root", "tenant.item-not-writable-cross-tenant", "update.unique-conflict-rejected", "validation.content-type-enforced", "validation.enum-enforced", "validation.max-length-enforced", "validation.required-enforced"];
7
+ export type CheckId = (typeof CHECK_IDS)[number];
8
+ /** The families checks are grouped, built and verified by. */
9
+ export type CheckFamily = "pagination" | "filter" | "sort" | "search/select" | "composition" | "write" | "validation" | "isolation" | "effects/async" | "conformance" | "spec declarations" | "consistency";
10
+ type Prefix<Id> = Id extends `${infer Head}.${string}` ? Head : never;
11
+ /** Every check id prefix belongs to exactly one family; a new prefix fails to compile until it has one. */
12
+ export declare const FAMILY_OF_PREFIX: Record<Prefix<CheckId>, CheckFamily>;
13
+ export declare function familyOf(id: CheckId): CheckFamily;
14
+ export {};
15
+ //# sourceMappingURL=check-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-ids.d.ts","sourceRoot":"","sources":["../../src/runtime/check-ids.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,SAAS,wwGAoGZ,CAAA;AAEV,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhD,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GACpB,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,eAAe,GACf,aAAa,GACb,OAAO,GACP,YAAY,GACZ,WAAW,GACX,eAAe,GACf,aAAa,GACb,mBAAmB,GACnB,aAAa,CAAA;AAEhB,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,GAAG,IAAI,GAAG,KAAK,CAAA;AAErE,2GAA2G;AAC3G,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,CA4BjE,CAAA;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,WAAW,CAEjD"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Every registered check id. `Check.id` and `dependsOn` are typed against this list, so a
3
+ * misspelled dependency fails to compile instead of silently never suppressing anything; the
4
+ * registry is checked against it again when it loads.
5
+ */
6
+ export const CHECK_IDS = [
7
+ "async.reaches-terminal-state",
8
+ "async.receipt-identifies-the-job",
9
+ "auth.invite-grants-then-revokes",
10
+ "auth.rank-is-monotonic",
11
+ "auth.rank-is-monotonic-on-writes",
12
+ "concurrency.no-lost-update",
13
+ "consistency.projections-agree",
14
+ "count.consistent-with-returned-page",
15
+ "count.matches-filtered-set",
16
+ "create.persists-submitted-fields",
17
+ "create.status-matches-document",
18
+ "create.unique-conflict-rejected",
19
+ "delete.absent-record-returns-404",
20
+ "effects.declared-effect-occurs",
21
+ "effects.side-effect-arrives",
22
+ "error.malformed-filter-not-5xx",
23
+ "filter.alias-matches-canonical",
24
+ "filter.and-composes-as-intersection",
25
+ "filter.condition-cap-rejected",
26
+ "filter.contains-membership",
27
+ "filter.empty-in",
28
+ "filter.equality-selects-exactly-one",
29
+ "filter.gte-is-gt-or-eq",
30
+ "filter.ilike-is-case-insensitive",
31
+ "filter.illegal-op-rejected",
32
+ "filter.in-is-union-of-eq",
33
+ "filter.in-over-limit-rejected",
34
+ "filter.is-null-selects-nulls",
35
+ "filter.like-metacharacters-escaped",
36
+ "filter.lte-is-lt-or-eq",
37
+ "filter.negation-partitions-the-set",
38
+ "filter.nested-and-or-distributes",
39
+ "filter.nin-complements-in",
40
+ "filter.numeric-comparison-is-numeric",
41
+ "filter.or-composes-as-union",
42
+ "filter.ordered-triple-partitions",
43
+ "filter.unknown-field-rejected",
44
+ "filter.zero-match-returns-none",
45
+ "idempotency.replay-does-not-duplicate",
46
+ "invalidation.declared-route-changes",
47
+ "list.read-after-write",
48
+ "pagination.bounds-handled",
49
+ "pagination.cursor-agrees-with-page",
50
+ "pagination.has-more-is-accurate",
51
+ "pagination.limit-bounds-page-size",
52
+ "pagination.limit-respects-documented-max",
53
+ "pagination.page-walk-covers-set",
54
+ "patch.immutable-field-rejected",
55
+ "patch.minimality",
56
+ "payload.string-survives",
57
+ "query.axes-compose",
58
+ "query.filter-and-select-compose",
59
+ "query.filter-search-select-compose",
60
+ "query.filter-search-sort-compose",
61
+ "query.filter-search-sort-select-compose",
62
+ "query.filter-selects-from-whole-set",
63
+ "query.filter-sort-select-compose",
64
+ "query.search-and-filter-compose",
65
+ "query.search-and-select-compose",
66
+ "query.search-and-sort-compose",
67
+ "query.sort-and-select-compose",
68
+ "query.unknown-parameter-consistent",
69
+ "response.status-is-documented",
70
+ "schema.error-response-matches-document",
71
+ "schema.success-response-matches-document",
72
+ "search.case-insensitive",
73
+ "search.empty-q",
74
+ "search.mode-accepted",
75
+ "search.q-narrows-result",
76
+ "search.tokens-and",
77
+ "select.nested-honoured",
78
+ "select.projection-honoured",
79
+ "select.requested-fields-present",
80
+ "select.unknown-field-rejected",
81
+ "softdelete.absent-from-default-list",
82
+ "sort.default-order-applied",
83
+ "sort.multi-key-tiebreak",
84
+ "sort.nulls-first-last",
85
+ "sort.numeric-order-is-numeric",
86
+ "sort.order-is-applied",
87
+ "sort.reverse-symmetry",
88
+ "sort.stable-tiebreak",
89
+ "sort.unknown-field-rejected",
90
+ "spec.declared-filterable-is-filterable",
91
+ "spec.declared-filterable-ops-accepted",
92
+ "spec.declared-rate-limit-is-honoured",
93
+ "spec.declared-selectable-is-selectable",
94
+ "spec.declared-sortable-is-sortable",
95
+ "spec.declared-sortable-nulls-accepted",
96
+ "tenant.denial-does-not-reveal-existence",
97
+ "tenant.filter-does-not-bypass-scope",
98
+ "tenant.item-not-readable-cross-tenant",
99
+ "tenant.parent-not-reachable-from-another-root",
100
+ "tenant.item-not-writable-cross-tenant",
101
+ "update.unique-conflict-rejected",
102
+ "validation.content-type-enforced",
103
+ "validation.enum-enforced",
104
+ "validation.max-length-enforced",
105
+ "validation.required-enforced",
106
+ ];
107
+ /** Every check id prefix belongs to exactly one family; a new prefix fails to compile until it has one. */
108
+ export const FAMILY_OF_PREFIX = {
109
+ async: "effects/async",
110
+ auth: "isolation",
111
+ concurrency: "write",
112
+ consistency: "consistency",
113
+ count: "pagination",
114
+ create: "write",
115
+ delete: "write",
116
+ effects: "effects/async",
117
+ error: "filter",
118
+ filter: "filter",
119
+ idempotency: "write",
120
+ invalidation: "consistency",
121
+ list: "consistency",
122
+ pagination: "pagination",
123
+ patch: "write",
124
+ payload: "write",
125
+ query: "composition",
126
+ response: "conformance",
127
+ schema: "conformance",
128
+ search: "search/select",
129
+ select: "search/select",
130
+ softdelete: "write",
131
+ sort: "sort",
132
+ spec: "spec declarations",
133
+ tenant: "isolation",
134
+ update: "write",
135
+ validation: "validation",
136
+ };
137
+ export function familyOf(id) {
138
+ return FAMILY_OF_PREFIX[id.slice(0, id.indexOf("."))];
139
+ }
140
+ //# sourceMappingURL=check-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-ids.js","sourceRoot":"","sources":["../../src/runtime/check-ids.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,14 @@
5
5
  * ground truth — they compare the API against itself, through independent projections, or against
6
6
  * the oracle of what oat just wrote. Check ids are stable: the conformance suite asserts on them.
7
7
  */
8
- import type { Hooks } from "../config/define-config.ts";
8
+ import type { Hooks, PayloadPolicy } from "../config/define-config.ts";
9
9
  import type { InviteSpec } from "../spec/extensions.ts";
10
+ import { type CheckId } from "./check-ids.ts";
10
11
  import type { QueryCapability } from "../spec/extensions.ts";
11
12
  import { type EffectiveQueryCapabilities } from "../spec/query-capabilities.ts";
12
- import type { EntityModel, OperationModel, SpecModel } from "../spec/graph.ts";
13
- import type { Client } from "./client.ts";
14
- import type { FindingCollector } from "./finding.ts";
13
+ import { type EntityModel, type OperationModel, type SpecModel } from "../spec/graph.ts";
14
+ import type { Client, ReadClient } from "./client.ts";
15
+ import { type FindingCollector, type Outcome } from "./finding.ts";
15
16
  import type { BackoffConfig } from "./poll.ts";
16
17
  import type { UploadContext } from "./upload.ts";
17
18
  import type { SchemaValidator } from "./validate.ts";
@@ -23,17 +24,26 @@ export interface Actor {
23
24
  /** Higher can do everything a lower rank can. Same rank = peers. */
24
25
  rank: number;
25
26
  headers: () => Record<string, string>;
27
+ /**
28
+ * Replace this actor's credential after a response issues a new one.
29
+ * Static principals and auth flows both implement it. Absent means the actor cannot.
30
+ */
31
+ adoptCredential?: (token: string) => void;
26
32
  /** Tenant identity from config / the auth flow — not the full path scope. */
27
33
  roots: Record<string, string>;
28
34
  scope: Record<string, string>;
29
35
  /** Value the owner puts in an invite body for this principal. */
30
36
  inviteAs: string | undefined;
31
37
  }
32
- export interface CheckContext {
38
+ /**
39
+ * What a check runs against. A check that does not mutate gets a client that cannot write; a
40
+ * helper that writes asks for a `WriteContext`, so a read-only check calling it does not compile.
41
+ */
42
+ export interface CheckContext<C extends ReadClient = ReadClient> {
33
43
  entityName: string;
34
44
  identity: string;
35
45
  model: SpecModel;
36
- client: Client;
46
+ client: C;
37
47
  findings: FindingCollector;
38
48
  scope: Record<string, string>;
39
49
  listOp: OperationModel;
@@ -61,6 +71,8 @@ export interface CheckContext {
61
71
  altScope: Record<string, string> | undefined;
62
72
  validator: SchemaValidator | undefined;
63
73
  seed: number;
74
+ /** Per-run token for values that must not collide across runs: unique columns, idempotency keys. */
75
+ nonce: string;
64
76
  /** Effective unique column sets for this entity (`[]` when the tag is absent or empty). */
65
77
  uniqueSets: string[][];
66
78
  /** First-variant create 409 adopted a same-tenant row; unique probes still run. */
@@ -79,12 +91,26 @@ export interface CheckContext {
79
91
  waitOps: OperationModel[];
80
92
  hooks: Hooks;
81
93
  outOfBand: BackoffConfig;
94
+ /**
95
+ * The payload policy, and the write paths that have had the whole catalog this run — keyed
96
+ * by media type and field type, naming the entity that ran it. Optional so a hand-built
97
+ * context still works; absent means the whole catalog.
98
+ */
99
+ payloads?: {
100
+ policy: PayloadPolicy;
101
+ ran: Map<string, string>;
102
+ };
82
103
  /**
83
104
  * Whether an operation is graded by this run. Always true on a full run. Checks that judge
84
105
  * several operations consult it before invoking or judging one. Optional so a hand-built
85
106
  * context still works.
86
107
  */
87
108
  inScope?: (op: OperationModel) => boolean;
109
+ /**
110
+ * Registers a record this check caused to exist — a declared effect, a started job — for
111
+ * teardown. Records made through the entity's own create are tracked without it.
112
+ */
113
+ recordCreated?: (entity: string, id: string, scope: Record<string, string>) => void;
88
114
  /**
89
115
  * Narrows what this check graded to the operations it actually judged. A check that judges
90
116
  * after the fact — from whatever the transcript happens to hold — calls it, so an operation
@@ -92,31 +118,52 @@ export interface CheckContext {
92
118
  */
93
119
  judged?: (operationIds: readonly string[]) => void;
94
120
  }
95
- export interface Check {
96
- id: string;
97
- /** Skipped silently when the entity lacks the operations this check needs. */
98
- applicable: (ctx: CheckContext) => boolean;
121
+ /** The context of a check that changes server state. */
122
+ export type WriteContext = CheckContext<Client>;
123
+ /**
124
+ * What a check's planning step decided: it can run, with what it needs to — or it cannot, and why.
125
+ *
126
+ * Planning is the only place a check decides whether it applies, and `run` receives what the plan
127
+ * found instead of looking again. A check that applies but then finds nothing to test cannot
128
+ * happen by construction: the two questions are one.
129
+ */
130
+ export type Plan<T> = {
131
+ ok: true;
132
+ value: T;
133
+ } | {
134
+ ok: false;
135
+ needs?: string;
136
+ };
137
+ export declare function ready<T>(value: T): Plan<T>;
138
+ /** The check cannot run here; `needs` says what is missing, else the check's own `needs` does. */
139
+ export declare function cannot(needs?: string): Plan<never>;
140
+ /** `next`, once `gate` holds — a plan built in stages, stopping at the first thing missing. */
141
+ export declare function andThen<A, T>(gate: Plan<A>, next: (value: A) => Plan<T>): Plan<T>;
142
+ /** A plan that carries nothing: the check applies exactly when `condition` holds. */
143
+ export declare function when(condition: boolean, needs?: string): Plan<undefined>;
144
+ interface CheckBase<T> {
145
+ id: CheckId;
146
+ /** Decides whether the check applies to this entity, and gathers what `run` needs if it does. */
147
+ plan(ctx: CheckContext): Plan<T>;
99
148
  /**
100
149
  * Check ids whose failure makes this one's result meaningless. When any has already fired for
101
150
  * this entity, the check is skipped rather than reporting a consequence as a separate defect —
102
151
  * one root cause should produce one finding, not a page of them.
103
152
  */
104
- dependsOn?: string[];
153
+ dependsOn?: CheckId[];
154
+ /**
155
+ * Whether the check judges traffic other checks sent. It runs after every check before it has
156
+ * finished, never alongside them, so it cannot miss what its batch-mates were still sending.
157
+ */
158
+ judgesTranscript?: boolean;
105
159
  /**
106
160
  * What this check needs in order to run at all, in the reader's terms.
107
161
  *
108
- * Reported when `applicable` returns false. Skipping silently would leave someone on an API
162
+ * Reported when the plan cannot run. Skipping silently would leave someone on an API
109
163
  * shaped differently from the fixture believing a quiet run meant a clean one, when in truth
110
164
  * half the suite never fired.
111
165
  */
112
166
  needs?: string;
113
- /**
114
- * Whether the check changes server state. Mutating checks run alone and in order; read-only
115
- * checks batch together. Two writers racing on the same cohort would make each other's
116
- * observations wrong, and the resulting finding would describe the interference rather than
117
- * the backend.
118
- */
119
- mutates?: boolean;
120
167
  /**
121
168
  * Operations whose contract this check judges, decided from the entity graph alone.
122
169
  *
@@ -126,8 +173,20 @@ export interface Check {
126
173
  * cannot run invisibly under `--ops`.
127
174
  */
128
175
  subjects: (entity: EntityModel, model: SpecModel) => string[];
129
- run: (ctx: CheckContext) => Promise<void>;
130
176
  }
177
+ /**
178
+ * Whether the check changes server state. Mutating checks run alone and in order, with a client
179
+ * that can write; read-only checks batch together, with one that cannot. Two writers racing on
180
+ * the same cohort would make each other's observations wrong, and the resulting finding would
181
+ * describe the interference rather than the backend.
182
+ */
183
+ export type Check<T = unknown> = CheckBase<T> & ({
184
+ mutates: true;
185
+ run(ctx: WriteContext, plan: T): Promise<Outcome>;
186
+ } | {
187
+ mutates?: false;
188
+ run(ctx: CheckContext, plan: T): Promise<Outcome>;
189
+ });
131
190
  /** Subject sets shared by the registry. Each reads the same fields the check's context is built from. */
132
191
  export declare const subjectsOf: {
133
192
  async: (entity: EntityModel, model: SpecModel) => string[];
@@ -149,4 +208,13 @@ export declare const subjectsOf: {
149
208
  writeAndRead: (entity: EntityModel) => string[];
150
209
  };
151
210
  export declare const CHECKS: readonly Check[];
211
+ /** Plans a check and, when it applies, runs it — what the scheduler does, for one check. */
212
+ export declare function runCheck(check: Check, ctx: WriteContext): Promise<Outcome>;
213
+ /**
214
+ * The registry checks itself as it loads: ids are unique, every id is one `CheckId` names, and
215
+ * every dependency is registered earlier. A dependency registered later can never suppress
216
+ * anything — it has not run yet when the scheduler consults it.
217
+ */
218
+ export declare function validateRegistry(checks: readonly Check[]): void;
219
+ export {};
152
220
  //# sourceMappingURL=checks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAEN,KAAK,0BAA0B,EAS/B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAI9E,OAAO,KAAK,EAAE,MAAM,EAA4B,MAAM,aAAa,CAAA;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAKpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,EAAE,KAAK,OAAO,EAAiC,MAAM,YAAY,CAAA;AAqBxE,kGAAkG;AAClG,MAAM,WAAW,KAAK;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,cAAc,GAAG,SAAS,CAAA;IAClC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAA;IACpC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAA;IACpC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAA;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAA;IAC7B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,0BAA0B,CAAA;IACzC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,uFAAuF;IACvF,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD;;;OAGG;IACH,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,6FAA6F;IAC7F,OAAO,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;IAC5C,SAAS,EAAE,eAAe,GAAG,SAAS,CAAA;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,2FAA2F;IAC3F,UAAU,EAAE,MAAM,EAAE,EAAE,CAAA;IACtB,mFAAmF;IACnF,aAAa,EAAE,OAAO,CAAA;IACtB,6EAA6E;IAC7E,cAAc,EAAE,cAAc,GAAG,SAAS,CAAA;IAC1C,6EAA6E;IAC7E,cAAc,EAAE,cAAc,GAAG,SAAS,CAAA;IAC1C,wDAAwD;IACxD,OAAO,EAAE,aAAa,CAAA;IACtB,8DAA8D;IAC9D,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,0DAA0D;IAC1D,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,uDAAuD;IACvD,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,aAAa,CAAA;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAA;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;CAClD;AASD,MAAM,WAAW,KAAK;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,8EAA8E;IAC9E,UAAU,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAA;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;;;;OAOG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,KAAK,MAAM,EAAE,CAAA;IAC7D,GAAG,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC;AAQD,yGAAyG;AACzG,eAAO,MAAM,UAAU;oBACN,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;2BACjC,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;qBAE9C,WAAW,KAAG,MAAM,EAAE;oCACP,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;4BAYhD,WAAW,KAAG,MAAM,EAAE;qBAC7B,WAAW,KAAG,MAAM,EAAE;4BACf,WAAW,KAAG,MAAM,EAAE;sBAC5B,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;qBACzC,WAAW,KAAG,MAAM,EAAE;mBAExB,WAAW,KAAG,MAAM,EAAE;wBACjB,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;mBAC7C,WAAW,KAAG,MAAM,EAAE;2BACd,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;0BAGzC,WAAW,KAAG,MAAM,EAAE;qBAC3B,WAAW,KAAG,MAAM,EAAE;oBACvB,WAAW,SAAS,SAAS,KAAG,MAAM,EAAE;2BACjC,WAAW,KAAG,MAAM,EAAE;CAC7C,CAAA;AAiwND,eAAO,MAAM,MAAM,EAAE,SAAS,KAAK,EAqHlC,CAAA"}
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../src/runtime/checks.ts"],"names":[],"mappings":"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"}