@hellraisercenobit/ai-engineering-gate 0.8.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 (100) hide show
  1. package/README.md +82 -0
  2. package/agents/design-pattern-reviewer.md +40 -0
  3. package/agents/modern-typescript-reviewer.md +24 -0
  4. package/agents/testing-pattern-reviewer.md +23 -0
  5. package/bin/ai-engineering-gate.mjs +6 -0
  6. package/contracts/axi/axi-standard.md +273 -0
  7. package/contracts/axi/pin.json +36 -0
  8. package/contracts/members.json +58 -0
  9. package/contracts/schemas/arbitration.schema.json +45 -0
  10. package/contracts/schemas/decision-envelope.schema.json +215 -0
  11. package/contracts/schemas/declaration.schema.json +190 -0
  12. package/contracts/schemas/dispute.schema.json +67 -0
  13. package/contracts/schemas/evidence-append.schema.json +72 -0
  14. package/contracts/schemas/gate-output.schema.json +296 -0
  15. package/contracts/schemas/marker.schema.json +75 -0
  16. package/contracts/schemas/review-envelope.schema.json +378 -0
  17. package/contracts/schemas/verdict-record.schema.json +191 -0
  18. package/contracts/suite-contract.md +270 -0
  19. package/dist/ai-engineering-gate.mjs +2762 -0
  20. package/package.json +47 -0
  21. package/skills/engineering/review-design-patterns/LICENSE +6 -0
  22. package/skills/engineering/review-design-patterns/SKILL.md +196 -0
  23. package/skills/engineering/review-design-patterns/agents/openai.yaml +3 -0
  24. package/skills/engineering/review-design-patterns/references/smell-signatures.md +117 -0
  25. package/skills/engineering/review-design-patterns/review-design-patterns.yaml +25 -0
  26. package/skills/engineering/review-modern-typescript/LICENSE +21 -0
  27. package/skills/engineering/review-modern-typescript/SKILL.md +88 -0
  28. package/skills/engineering/review-modern-typescript/agents/openai.yaml +3 -0
  29. package/skills/engineering/review-modern-typescript/references/smell-signatures.md +36 -0
  30. package/skills/engineering/review-modern-typescript/review-modern-typescript.yaml +22 -0
  31. package/skills/engineering/review-testing-patterns/SKILL.md +108 -0
  32. package/skills/engineering/review-testing-patterns/agents/openai.yaml +4 -0
  33. package/skills/engineering/review-testing-patterns/references/compiler-profile.mjs +103 -0
  34. package/skills/engineering/review-testing-patterns/references/smell-signatures.md +30 -0
  35. package/skills/engineering/review-testing-patterns/review-testing-patterns.yaml +23 -0
  36. package/skills/engineering/transpose-design-patterns/LICENSE +6 -0
  37. package/skills/engineering/transpose-design-patterns/SKILL.md +231 -0
  38. package/skills/engineering/transpose-design-patterns/agents/openai.yaml +3 -0
  39. package/skills/engineering/transpose-design-patterns/references/arbitration.schema.json +45 -0
  40. package/skills/engineering/transpose-design-patterns/references/decision-envelope.schema.json +215 -0
  41. package/skills/engineering/transpose-design-patterns/references/declaration.schema.json +190 -0
  42. package/skills/engineering/transpose-design-patterns/references/design-decision-record.schema.json +731 -0
  43. package/skills/engineering/transpose-design-patterns/references/dispute.schema.json +67 -0
  44. package/skills/engineering/transpose-design-patterns/references/evidence-append.schema.json +72 -0
  45. package/skills/engineering/transpose-design-patterns/references/marker.schema.json +75 -0
  46. package/skills/engineering/transpose-design-patterns/references/pattern-catalog.md +305 -0
  47. package/skills/engineering/transpose-design-patterns/references/record.example.json +120 -0
  48. package/skills/engineering/transpose-design-patterns/references/review-envelope.schema.json +378 -0
  49. package/skills/engineering/transpose-design-patterns/references/suite-contract.md +270 -0
  50. package/skills/engineering/transpose-design-patterns/references/transpose-angular.md +224 -0
  51. package/skills/engineering/transpose-design-patterns/references/transpose-php.md +561 -0
  52. package/skills/engineering/transpose-design-patterns/references/transpose-quarkus.md +283 -0
  53. package/skills/engineering/transpose-design-patterns/references/transpose-react.md +256 -0
  54. package/skills/engineering/transpose-design-patterns/references/transpose-vanilla.md +204 -0
  55. package/skills/engineering/transpose-design-patterns/references/transpose-vue.md +234 -0
  56. package/skills/engineering/transpose-design-patterns/transpose-design-patterns.yaml +24 -0
  57. package/skills/engineering/transpose-modern-typescript/LICENSE +21 -0
  58. package/skills/engineering/transpose-modern-typescript/SKILL.md +90 -0
  59. package/skills/engineering/transpose-modern-typescript/agents/openai.yaml +3 -0
  60. package/skills/engineering/transpose-modern-typescript/references/arbitration.schema.json +45 -0
  61. package/skills/engineering/transpose-modern-typescript/references/catalog.md +38 -0
  62. package/skills/engineering/transpose-modern-typescript/references/collections.md +50 -0
  63. package/skills/engineering/transpose-modern-typescript/references/compatibility.md +61 -0
  64. package/skills/engineering/transpose-modern-typescript/references/decision-envelope.schema.json +215 -0
  65. package/skills/engineering/transpose-modern-typescript/references/decision-record.schema.json +830 -0
  66. package/skills/engineering/transpose-modern-typescript/references/declaration.schema.json +190 -0
  67. package/skills/engineering/transpose-modern-typescript/references/dispute.schema.json +67 -0
  68. package/skills/engineering/transpose-modern-typescript/references/evidence-append.schema.json +72 -0
  69. package/skills/engineering/transpose-modern-typescript/references/idioms.md +74 -0
  70. package/skills/engineering/transpose-modern-typescript/references/marker.schema.json +75 -0
  71. package/skills/engineering/transpose-modern-typescript/references/platform.md +147 -0
  72. package/skills/engineering/transpose-modern-typescript/references/record.example.json +172 -0
  73. package/skills/engineering/transpose-modern-typescript/references/record.md +37 -0
  74. package/skills/engineering/transpose-modern-typescript/references/review-envelope.schema.json +378 -0
  75. package/skills/engineering/transpose-modern-typescript/references/suite-contract.md +270 -0
  76. package/skills/engineering/transpose-modern-typescript/references/types.md +97 -0
  77. package/skills/engineering/transpose-modern-typescript/transpose-modern-typescript.yaml +22 -0
  78. package/skills/engineering/transpose-testing-patterns/SKILL.md +96 -0
  79. package/skills/engineering/transpose-testing-patterns/agents/openai.yaml +4 -0
  80. package/skills/engineering/transpose-testing-patterns/references/arbitration.schema.json +45 -0
  81. package/skills/engineering/transpose-testing-patterns/references/catalog.md +218 -0
  82. package/skills/engineering/transpose-testing-patterns/references/decision-envelope.schema.json +215 -0
  83. package/skills/engineering/transpose-testing-patterns/references/decision-record.schema.json +857 -0
  84. package/skills/engineering/transpose-testing-patterns/references/declaration.schema.json +190 -0
  85. package/skills/engineering/transpose-testing-patterns/references/detect-adapter.mjs +98 -0
  86. package/skills/engineering/transpose-testing-patterns/references/dispute.schema.json +67 -0
  87. package/skills/engineering/transpose-testing-patterns/references/doubles-data.md +45 -0
  88. package/skills/engineering/transpose-testing-patterns/references/evidence-append.schema.json +72 -0
  89. package/skills/engineering/transpose-testing-patterns/references/journal-event.schema.json +115 -0
  90. package/skills/engineering/transpose-testing-patterns/references/marker.schema.json +75 -0
  91. package/skills/engineering/transpose-testing-patterns/references/record.example.json +230 -0
  92. package/skills/engineering/transpose-testing-patterns/references/record.md +25 -0
  93. package/skills/engineering/transpose-testing-patterns/references/review-envelope.schema.json +378 -0
  94. package/skills/engineering/transpose-testing-patterns/references/suite-contract.md +270 -0
  95. package/skills/engineering/transpose-testing-patterns/references/tdd.md +62 -0
  96. package/skills/engineering/transpose-testing-patterns/references/transpose-codeception.md +84 -0
  97. package/skills/engineering/transpose-testing-patterns/references/transpose-karma-jasmine-angular.md +73 -0
  98. package/skills/engineering/transpose-testing-patterns/references/transpose-vitest.md +111 -0
  99. package/skills/engineering/transpose-testing-patterns/references/typescript.md +42 -0
  100. package/skills/engineering/transpose-testing-patterns/transpose-testing-patterns.yaml +23 -0
@@ -0,0 +1,230 @@
1
+ {
2
+ "dimension": "testing-patterns",
3
+ "schemaVersion": "2.0.0",
4
+ "catalogVersion": "1.0.0",
5
+ "contractVersions": [
6
+ "1.0.0",
7
+ "1.1.0"
8
+ ],
9
+ "adapter": {
10
+ "name": "vitest",
11
+ "version": "1.0.0"
12
+ },
13
+ "need": "Illustrative: orders of at least 100 cents ship free; otherwise shipping is 10 cents.",
14
+ "scope": [
15
+ "src/shipping.ts",
16
+ "test/shipping.test.ts",
17
+ "tsconfig.json"
18
+ ],
19
+ "base": "standalone illustrative fixture, not an observed execution",
20
+ "revision": {
21
+ "number": 1,
22
+ "previous": null,
23
+ "reason": "Initial illustrative choice before writes."
24
+ },
25
+ "cites": [
26
+ {
27
+ "path": "src/shipping.ts",
28
+ "checkedAt": "2026-09-16",
29
+ "claim": "The module has no shipping charge yet, so the behavior is new rather than characterized.",
30
+ "covers": [
31
+ "shipping"
32
+ ]
33
+ }
34
+ ],
35
+ "plans": [
36
+ {
37
+ "path": "test/shipping.test.ts",
38
+ "role": "test"
39
+ },
40
+ {
41
+ "path": "src/shipping.ts",
42
+ "role": "production"
43
+ },
44
+ {
45
+ "path": "shipping-events.jsonl",
46
+ "role": "journal"
47
+ }
48
+ ],
49
+ "profile": {
50
+ "language": "typescript",
51
+ "runner": "vitest 5.0.1",
52
+ "compiler": "typescript 7.0.2 tsc, target ES2022",
53
+ "declarations": "ES2024 and installed Node declarations",
54
+ "build": "Vitest/Vite ESM transform",
55
+ "configuration": [
56
+ "strict compiler project includes production and tests"
57
+ ],
58
+ "environments": [
59
+ "node"
60
+ ],
61
+ "runtimes": [
62
+ "Node 24"
63
+ ],
64
+ "evidence": [
65
+ {
66
+ "source": "Illustrative lockfile and version probes; replace with actual observations",
67
+ "checkedAt": "2026-09-16",
68
+ "claim": "Example profile only; no execution claimed",
69
+ "covers": [
70
+ "fixture"
71
+ ]
72
+ }
73
+ ]
74
+ },
75
+ "inventory": {
76
+ "behavior": {
77
+ "applicable": true,
78
+ "reason": "Boundary calculation.",
79
+ "sites": [
80
+ "shipping"
81
+ ]
82
+ },
83
+ "process": {
84
+ "applicable": true,
85
+ "reason": "New behavior using TDD.",
86
+ "sites": [
87
+ "shipping"
88
+ ]
89
+ },
90
+ "doubles": {
91
+ "applicable": false,
92
+ "reason": "Pure function has no collaborators.",
93
+ "sites": []
94
+ },
95
+ "data": {
96
+ "applicable": true,
97
+ "reason": "Inline amounts are sufficient.",
98
+ "sites": [
99
+ "shipping"
100
+ ]
101
+ },
102
+ "isolation": {
103
+ "applicable": false,
104
+ "reason": "No collaborating boundary.",
105
+ "sites": []
106
+ },
107
+ "testability": {
108
+ "applicable": false,
109
+ "reason": "Existing public function is sufficient.",
110
+ "sites": []
111
+ },
112
+ "types": {
113
+ "applicable": true,
114
+ "reason": "Compile consumer and implementation.",
115
+ "sites": [
116
+ "shipping"
117
+ ]
118
+ },
119
+ "async-lifetime": {
120
+ "applicable": false,
121
+ "reason": "Synchronous calculation owns no resource.",
122
+ "sites": []
123
+ },
124
+ "environment": {
125
+ "applicable": true,
126
+ "reason": "Node suffices for pure behavior.",
127
+ "sites": [
128
+ "shipping"
129
+ ]
130
+ },
131
+ "oracle": {
132
+ "applicable": true,
133
+ "reason": "Literal outputs from shipping requirement.",
134
+ "sites": [
135
+ "shipping"
136
+ ]
137
+ },
138
+ "execution": {
139
+ "applicable": true,
140
+ "reason": "Map boundary cases to executed tests.",
141
+ "sites": [
142
+ "shipping"
143
+ ]
144
+ }
145
+ },
146
+ "sites": [
147
+ {
148
+ "site": "shipping",
149
+ "behavior": "Shipping charge at, below and above free-shipping threshold.",
150
+ "risk": "Off-by-one threshold accepts the wrong charge.",
151
+ "ruleIds": [
152
+ "TP-01",
153
+ "TP-07",
154
+ "TP-12",
155
+ "TP-15",
156
+ "TP-16"
157
+ ],
158
+ "alternatives": [
159
+ {
160
+ "kind": "current",
161
+ "description": "No tests or behavior yet.",
162
+ "assessment": "Does not protect requested threshold."
163
+ },
164
+ {
165
+ "kind": "alternative",
166
+ "description": "Direct literal examples.",
167
+ "assessment": "Small and discriminating."
168
+ },
169
+ {
170
+ "kind": "alternative",
171
+ "description": "Generated properties and data builder.",
172
+ "assessment": "Extra setup gives little value for this boundary."
173
+ }
174
+ ],
175
+ "form": "input-output examples",
176
+ "level": "unit",
177
+ "seam": "shipping(amount: number): number",
178
+ "oracle": {
179
+ "kind": "specification",
180
+ "independence": "independent",
181
+ "statement": "The requested rule states 10 cents below 100 and zero at or above it, so 99 costs 10 and 100 and 101 cost zero.",
182
+ "source": "The requester's wording, quoted in the declaration."
183
+ },
184
+ "doubles": "none",
185
+ "data": "inline literals",
186
+ "isolation": "pure function, no boundary to isolate",
187
+ "decision": {
188
+ "choice": "none",
189
+ "patterns": [],
190
+ "action": "apply",
191
+ "reason": "Direct tests express the complete small contract.",
192
+ "tradeoffs": [
193
+ "Examples do not exhaust numeric inputs."
194
+ ],
195
+ "limits": [
196
+ "Input validation is outside this request."
197
+ ],
198
+ "reconsiderWhen": "Shipping rules acquire history or external effects."
199
+ },
200
+ "invariants": [
201
+ "99 costs 10; 100 and 101 cost zero."
202
+ ],
203
+ "mode": "tdd",
204
+ "checks": [
205
+ {
206
+ "kind": "runtime",
207
+ "command": "vitest run test/shipping.test.ts",
208
+ "guarantee": "Three named boundary examples execute without skips or retries."
209
+ },
210
+ {
211
+ "kind": "static",
212
+ "command": "tsc --noEmit -p tsconfig.json",
213
+ "guarantee": "Production and test source compile."
214
+ }
215
+ ],
216
+ "artifacts": [
217
+ "src/shipping.ts",
218
+ "test/shipping.test.ts"
219
+ ],
220
+ "evidence": [
221
+ "external/shipping-events.jsonl",
222
+ "external/snapshots/"
223
+ ],
224
+ "plausibleDefect": {
225
+ "description": "The threshold uses a strict comparison, so exactly 100 cents is still charged.",
226
+ "discrimination": "The 100-cent example fails on that implementation and passes on the specified one; the 99 and 101 examples pass on both."
227
+ }
228
+ }
229
+ ]
230
+ }
@@ -0,0 +1,25 @@
1
+ # Decision record 1.0.0
2
+
3
+ Use [the closed JSON Schema 2020-12](decision-record.schema.json) and
4
+ [illustrative example](record.example.json). Replace its facts; it claims no actual run.
5
+ Validate with a 2020-12 validator before the first affected test/helper/config/production
6
+ write. Rule IDs and specialized pattern IDs must be catalog members. Inventory site
7
+ references must resolve to unique entries in `sites`; check this cross-reference alongside
8
+ schema validation. Structural validity is not semantic approval or chronology proof.
9
+
10
+ Keep decisions outside the repository with scope/base, detected profile and dated source
11
+ evidence. Each revision links its predecessor; do not rewrite one to reflect later facts.
12
+ List each axis even when excluded, with a reason. Alternatives include current state,
13
+ including absence of existing tests. A `none` decision has no specialized pattern IDs;
14
+ it can still create direct tests. `retain` is separate and can retain a named pattern.
15
+
16
+ Per site distinguish behavior/risk, form/level, seam/oracle, doubles/data/isolation,
17
+ observable invariants, mode, checks and planned artifacts/evidence. Group coherent choices
18
+ without losing individual scenario identity. Artifact/evidence paths can name planned
19
+ outputs; they are not claims those outputs exist yet.
20
+
21
+ Append subsequent observations to the [TDD journal](tdd.md), not the initial record.
22
+ Preserve actual tool output and inspectable states. Store composition scope/hash/report
23
+ metadata in a separate execution index, never extra fields in another dimension's schema.
24
+ For catalog-only analysis on an unsupported runner, report the limitation; do not forge
25
+ a Vitest profile to satisfy this qualified-transposition schema.
@@ -0,0 +1,378 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/hellraisercenobit/skills/blob/main/contracts/schemas/review-envelope.schema.json",
4
+ "title": "Review envelope 1.0.0",
5
+ "description": "Emitted by a review beside its prose report and piped to `attest` for `SOUND` or to `report` for `SMELLS` and `VIOLATIONS`. It carries no fingerprint: the gate alone adds the state a verdict binds to.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "document",
10
+ "documentVersion",
11
+ "dimension",
12
+ "contractVersion",
13
+ "verdict",
14
+ "records",
15
+ "checks",
16
+ "reviewer",
17
+ "findings",
18
+ "challengedSurvived"
19
+ ],
20
+ "properties": {
21
+ "document": {
22
+ "const": "review-envelope"
23
+ },
24
+ "documentVersion": {
25
+ "const": "1.0.0"
26
+ },
27
+ "dimension": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "contractVersion": {
32
+ "description": "The contract version this review ran under.",
33
+ "type": "string",
34
+ "pattern": "^\\d+\\.\\d+\\.\\d+$"
35
+ },
36
+ "verdict": {
37
+ "enum": [
38
+ "SOUND",
39
+ "SMELLS",
40
+ "VIOLATIONS"
41
+ ]
42
+ },
43
+ "records": {
44
+ "description": "The record identifiers or paths the review examined.",
45
+ "type": "array",
46
+ "minItems": 1,
47
+ "items": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ }
51
+ },
52
+ "checks": {
53
+ "description": "The deterministic checks the reviewer saw executed. Enforcement validates their presence, never their result.",
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": [
59
+ "command",
60
+ "outcome",
61
+ "guarantee"
62
+ ],
63
+ "properties": {
64
+ "command": {
65
+ "type": "string",
66
+ "minLength": 1
67
+ },
68
+ "outcome": {
69
+ "type": "string",
70
+ "minLength": 1
71
+ },
72
+ "guarantee": {
73
+ "type": "string",
74
+ "minLength": 1
75
+ }
76
+ }
77
+ }
78
+ },
79
+ "reviewer": {
80
+ "type": "object",
81
+ "additionalProperties": false,
82
+ "required": [
83
+ "independence",
84
+ "identity"
85
+ ],
86
+ "properties": {
87
+ "independence": {
88
+ "description": "The reviewer's own claim about its brief: a fresh context with no builder history or rationale, or the exposure it must state.",
89
+ "type": "string",
90
+ "minLength": 1
91
+ },
92
+ "identity": {
93
+ "description": "The reviewer's declared identity. Enforcement compares it with the identity the harness reported and never takes it as proof.",
94
+ "type": "string",
95
+ "minLength": 1
96
+ },
97
+ "agentType": {
98
+ "type": "string",
99
+ "minLength": 1
100
+ }
101
+ }
102
+ },
103
+ "findings": {
104
+ "type": "array",
105
+ "items": {
106
+ "$ref": "#/$defs/finding"
107
+ }
108
+ },
109
+ "challengedSurvived": {
110
+ "description": "Candidates whose strongest defense held, and the defense.",
111
+ "type": "array",
112
+ "items": {
113
+ "type": "string",
114
+ "minLength": 1
115
+ }
116
+ },
117
+ "gaps": {
118
+ "description": "Catalog gaps, reported without severity or verdict impact.",
119
+ "type": "array",
120
+ "items": {
121
+ "type": "string",
122
+ "minLength": 1
123
+ }
124
+ }
125
+ },
126
+ "$defs": {
127
+ "finding": {
128
+ "type": "object",
129
+ "additionalProperties": false,
130
+ "required": [
131
+ "id",
132
+ "kind",
133
+ "severity",
134
+ "location",
135
+ "rule",
136
+ "expected",
137
+ "recorded",
138
+ "actual",
139
+ "impact",
140
+ "defense",
141
+ "refutation"
142
+ ],
143
+ "properties": {
144
+ "id": {
145
+ "type": "string",
146
+ "minLength": 1
147
+ },
148
+ "kind": {
149
+ "description": "`evidence` when an artifact is not on file, `judgment` when a decision is wrong against the catalog.",
150
+ "enum": [
151
+ "evidence",
152
+ "judgment"
153
+ ]
154
+ },
155
+ "severity": {
156
+ "description": "The contract's severity clause owns these tiers.",
157
+ "enum": [
158
+ "Blocker",
159
+ "Major",
160
+ "Minor"
161
+ ]
162
+ },
163
+ "location": {
164
+ "type": "string",
165
+ "minLength": 1
166
+ },
167
+ "rule": {
168
+ "type": "string",
169
+ "minLength": 1
170
+ },
171
+ "expected": {
172
+ "type": "string",
173
+ "minLength": 1
174
+ },
175
+ "recorded": {
176
+ "type": "string",
177
+ "minLength": 1
178
+ },
179
+ "actual": {
180
+ "type": "string",
181
+ "minLength": 1
182
+ },
183
+ "impact": {
184
+ "type": "string",
185
+ "minLength": 1
186
+ },
187
+ "defense": {
188
+ "type": "string",
189
+ "minLength": 1
190
+ },
191
+ "refutation": {
192
+ "type": "string",
193
+ "minLength": 1
194
+ },
195
+ "correction": {
196
+ "description": "The proposed correction C08 requires. Required for a judgment finding.",
197
+ "type": "string",
198
+ "minLength": 1
199
+ },
200
+ "remedy": {
201
+ "description": "Required for an evidence finding: an action the builder can execute.",
202
+ "$ref": "#/$defs/remedy"
203
+ }
204
+ },
205
+ "allOf": [
206
+ {
207
+ "if": {
208
+ "properties": {
209
+ "kind": {
210
+ "const": "evidence"
211
+ }
212
+ },
213
+ "required": [
214
+ "kind"
215
+ ]
216
+ },
217
+ "then": {
218
+ "required": [
219
+ "remedy"
220
+ ],
221
+ "properties": {
222
+ "remedy": {
223
+ "$ref": "#/$defs/remedy"
224
+ }
225
+ }
226
+ },
227
+ "else": {
228
+ "required": [
229
+ "correction"
230
+ ],
231
+ "properties": {
232
+ "correction": {
233
+ "description": "The proposed correction C08 requires. Required for a judgment finding.",
234
+ "type": "string",
235
+ "minLength": 1
236
+ }
237
+ }
238
+ }
239
+ }
240
+ ]
241
+ },
242
+ "remedy": {
243
+ "type": "object",
244
+ "additionalProperties": false,
245
+ "required": [
246
+ "kind"
247
+ ],
248
+ "properties": {
249
+ "kind": {
250
+ "enum": [
251
+ "produce",
252
+ "rerun",
253
+ "replay",
254
+ "dispute"
255
+ ]
256
+ },
257
+ "artifact": {
258
+ "type": "string",
259
+ "minLength": 1
260
+ },
261
+ "command": {
262
+ "type": "string",
263
+ "minLength": 1
264
+ },
265
+ "scenario": {
266
+ "type": "string",
267
+ "minLength": 1
268
+ }
269
+ },
270
+ "allOf": [
271
+ {
272
+ "if": {
273
+ "properties": {
274
+ "kind": {
275
+ "const": "produce"
276
+ }
277
+ },
278
+ "required": [
279
+ "kind"
280
+ ]
281
+ },
282
+ "then": {
283
+ "required": [
284
+ "artifact"
285
+ ],
286
+ "properties": {
287
+ "artifact": {
288
+ "type": "string",
289
+ "minLength": 1
290
+ }
291
+ }
292
+ }
293
+ },
294
+ {
295
+ "if": {
296
+ "properties": {
297
+ "kind": {
298
+ "const": "rerun"
299
+ }
300
+ },
301
+ "required": [
302
+ "kind"
303
+ ]
304
+ },
305
+ "then": {
306
+ "required": [
307
+ "command"
308
+ ],
309
+ "properties": {
310
+ "command": {
311
+ "type": "string",
312
+ "minLength": 1
313
+ }
314
+ }
315
+ }
316
+ },
317
+ {
318
+ "if": {
319
+ "properties": {
320
+ "kind": {
321
+ "const": "replay"
322
+ }
323
+ },
324
+ "required": [
325
+ "kind"
326
+ ]
327
+ },
328
+ "then": {
329
+ "required": [
330
+ "scenario",
331
+ "command"
332
+ ],
333
+ "properties": {
334
+ "scenario": {
335
+ "type": "string",
336
+ "minLength": 1
337
+ },
338
+ "command": {
339
+ "type": "string",
340
+ "minLength": 1
341
+ }
342
+ }
343
+ }
344
+ }
345
+ ]
346
+ }
347
+ },
348
+ "allOf": [
349
+ {
350
+ "if": {
351
+ "properties": {
352
+ "verdict": {
353
+ "const": "SOUND"
354
+ }
355
+ },
356
+ "required": [
357
+ "verdict"
358
+ ]
359
+ },
360
+ "then": {
361
+ "properties": {
362
+ "findings": {
363
+ "type": "array",
364
+ "maxItems": 0
365
+ }
366
+ }
367
+ },
368
+ "else": {
369
+ "properties": {
370
+ "findings": {
371
+ "type": "array",
372
+ "minItems": 1
373
+ }
374
+ }
375
+ }
376
+ }
377
+ ]
378
+ }