@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,731 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/hellraisercenobit/skills/blob/main/skills/engineering/transpose-design-patterns/references/design-decision-record.schema.json",
4
+ "title": "Design decision record 1.0.0",
5
+ "description": "One record per pattern-shaped site, written by transpose-design-patterns before the first implementation write and read by review-design-patterns after its blind matrix is frozen. It carries the suite's common decision envelope; the gate validates shape, catalog membership and referential integrity, never semantics.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "dimension",
10
+ "schemaVersion",
11
+ "catalogVersion",
12
+ "contractVersions",
13
+ "need",
14
+ "scope",
15
+ "base",
16
+ "revision",
17
+ "cites",
18
+ "plans",
19
+ "forces",
20
+ "alternatives",
21
+ "decision",
22
+ "framework",
23
+ "artifacts",
24
+ "invariants"
25
+ ],
26
+ "properties": {
27
+ "dimension": {
28
+ "const": "design-patterns"
29
+ },
30
+ "schemaVersion": {
31
+ "const": "1.0.0"
32
+ },
33
+ "catalogVersion": {
34
+ "const": "1.0.0"
35
+ },
36
+ "contractVersions": {
37
+ "type": "array",
38
+ "minItems": 1,
39
+ "uniqueItems": true,
40
+ "items": {
41
+ "enum": [
42
+ "1.0.0",
43
+ "1.1.0"
44
+ ]
45
+ }
46
+ },
47
+ "need": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "scope": {
52
+ "type": "array",
53
+ "minItems": 1,
54
+ "items": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ }
58
+ },
59
+ "base": {
60
+ "type": "string",
61
+ "minLength": 1
62
+ },
63
+ "revision": {
64
+ "$ref": "#/$defs/revision"
65
+ },
66
+ "cites": {
67
+ "type": "array",
68
+ "items": {
69
+ "$ref": "#/$defs/citation"
70
+ }
71
+ },
72
+ "plans": {
73
+ "description": "Artifacts this record commits to produce. This dimension's only role is `implementation`.",
74
+ "type": "array",
75
+ "items": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": [
79
+ "path",
80
+ "role"
81
+ ],
82
+ "properties": {
83
+ "path": {
84
+ "type": "string",
85
+ "minLength": 1
86
+ },
87
+ "role": {
88
+ "const": "implementation"
89
+ }
90
+ }
91
+ }
92
+ },
93
+ "forces": {
94
+ "description": "All eight catalog forces, each answered with a value from its own set plus the site that carries it. Values, not prose: the reviewer compares them.",
95
+ "type": "array",
96
+ "minItems": 8,
97
+ "maxItems": 8,
98
+ "uniqueItems": true,
99
+ "items": {
100
+ "oneOf": [
101
+ {
102
+ "$ref": "#/$defs/forceVariability"
103
+ },
104
+ {
105
+ "$ref": "#/$defs/forceExtension"
106
+ },
107
+ {
108
+ "$ref": "#/$defs/forceCreationPolicy"
109
+ },
110
+ {
111
+ "$ref": "#/$defs/forceBoundaryMismatch"
112
+ },
113
+ {
114
+ "$ref": "#/$defs/forceReusableAction"
115
+ },
116
+ {
117
+ "$ref": "#/$defs/forceComposition"
118
+ },
119
+ {
120
+ "$ref": "#/$defs/forceSharedLifecycle"
121
+ },
122
+ {
123
+ "$ref": "#/$defs/forceCrossCutting"
124
+ }
125
+ ]
126
+ },
127
+ "allOf": [
128
+ {
129
+ "contains": {
130
+ "$ref": "#/$defs/named/variability"
131
+ }
132
+ },
133
+ {
134
+ "contains": {
135
+ "$ref": "#/$defs/named/extension"
136
+ }
137
+ },
138
+ {
139
+ "contains": {
140
+ "$ref": "#/$defs/named/creation-policy"
141
+ }
142
+ },
143
+ {
144
+ "contains": {
145
+ "$ref": "#/$defs/named/boundary-mismatch"
146
+ }
147
+ },
148
+ {
149
+ "contains": {
150
+ "$ref": "#/$defs/named/reusable-action"
151
+ }
152
+ },
153
+ {
154
+ "contains": {
155
+ "$ref": "#/$defs/named/composition"
156
+ }
157
+ },
158
+ {
159
+ "contains": {
160
+ "$ref": "#/$defs/named/shared-lifecycle"
161
+ }
162
+ },
163
+ {
164
+ "contains": {
165
+ "$ref": "#/$defs/named/cross-cutting-behavior"
166
+ }
167
+ }
168
+ ]
169
+ },
170
+ "alternatives": {
171
+ "description": "Each alternative considered and why it lost. The current shape of the code is always one of them.",
172
+ "type": "array",
173
+ "minItems": 1,
174
+ "items": {
175
+ "type": "string",
176
+ "minLength": 1
177
+ }
178
+ },
179
+ "decision": {
180
+ "type": "object",
181
+ "additionalProperties": false,
182
+ "required": [
183
+ "pattern",
184
+ "reason",
185
+ "extensionCost",
186
+ "reconsiderWhen"
187
+ ],
188
+ "properties": {
189
+ "pattern": {
190
+ "enum": [
191
+ "strategy",
192
+ "registry",
193
+ "factory",
194
+ "command",
195
+ "adapter",
196
+ "composition",
197
+ "singleton",
198
+ "none"
199
+ ]
200
+ },
201
+ "reason": {
202
+ "type": "string",
203
+ "minLength": 1
204
+ },
205
+ "extensionCost": {
206
+ "description": "The catalog's extension question answered: if one plausible variant is added next, which existing files and symbols must change, today and with this decision.",
207
+ "type": "string",
208
+ "minLength": 1
209
+ },
210
+ "reconsiderWhen": {
211
+ "description": "The trigger that reopens the decision. Required for `none`, allowed for any pattern.",
212
+ "type": [
213
+ "string",
214
+ "null"
215
+ ]
216
+ }
217
+ }
218
+ },
219
+ "framework": {
220
+ "type": "object",
221
+ "additionalProperties": false,
222
+ "required": [
223
+ "name",
224
+ "transposition"
225
+ ],
226
+ "properties": {
227
+ "name": {
228
+ "description": "`angular`, `react`, `vue`, `vanilla`, `quarkus`, `php`, or the detected stack when no guide covers it.",
229
+ "type": "string",
230
+ "minLength": 1
231
+ },
232
+ "transposition": {
233
+ "description": "The guide section followed, and what was adapted when its example did not fit. `null` when no guide covers the stack, or for `none`.",
234
+ "type": [
235
+ "string",
236
+ "null"
237
+ ]
238
+ }
239
+ }
240
+ },
241
+ "artifacts": {
242
+ "type": "array",
243
+ "items": {
244
+ "type": "object",
245
+ "additionalProperties": false,
246
+ "required": [
247
+ "file",
248
+ "symbol"
249
+ ],
250
+ "properties": {
251
+ "file": {
252
+ "type": "string",
253
+ "minLength": 1
254
+ },
255
+ "symbol": {
256
+ "type": "string",
257
+ "minLength": 1
258
+ }
259
+ }
260
+ }
261
+ },
262
+ "invariants": {
263
+ "description": "The catalog entry's Invariants, made concrete for this change. The reviewer checks each one against the code.",
264
+ "type": "array",
265
+ "minItems": 1,
266
+ "items": {
267
+ "type": "string",
268
+ "minLength": 1
269
+ }
270
+ }
271
+ },
272
+ "$defs": {
273
+ "site": {
274
+ "description": "The site or requirement that carries the force, or why it is absent.",
275
+ "type": "string",
276
+ "minLength": 1
277
+ },
278
+ "forceVariability": {
279
+ "type": "object",
280
+ "additionalProperties": false,
281
+ "required": [
282
+ "force",
283
+ "value",
284
+ "site"
285
+ ],
286
+ "properties": {
287
+ "force": {
288
+ "const": "variability"
289
+ },
290
+ "value": {
291
+ "enum": [
292
+ "absent",
293
+ "duplicated-body",
294
+ "interchangeable-closed",
295
+ "interchangeable-open"
296
+ ]
297
+ },
298
+ "site": {
299
+ "$ref": "#/$defs/site"
300
+ }
301
+ }
302
+ },
303
+ "forceExtension": {
304
+ "type": "object",
305
+ "additionalProperties": false,
306
+ "required": [
307
+ "force",
308
+ "value",
309
+ "site"
310
+ ],
311
+ "properties": {
312
+ "force": {
313
+ "const": "extension"
314
+ },
315
+ "value": {
316
+ "enum": [
317
+ "no-variant-expected",
318
+ "declaration-only",
319
+ "one-site",
320
+ "many-sites"
321
+ ]
322
+ },
323
+ "site": {
324
+ "$ref": "#/$defs/site"
325
+ }
326
+ }
327
+ },
328
+ "forceCreationPolicy": {
329
+ "type": "object",
330
+ "additionalProperties": false,
331
+ "required": [
332
+ "force",
333
+ "value",
334
+ "site"
335
+ ],
336
+ "properties": {
337
+ "force": {
338
+ "const": "creation-policy"
339
+ },
340
+ "value": {
341
+ "enum": [
342
+ "absent",
343
+ "runtime-input",
344
+ "business-rule"
345
+ ]
346
+ },
347
+ "site": {
348
+ "$ref": "#/$defs/site"
349
+ }
350
+ }
351
+ },
352
+ "forceBoundaryMismatch": {
353
+ "type": "object",
354
+ "additionalProperties": false,
355
+ "required": [
356
+ "force",
357
+ "value",
358
+ "site"
359
+ ],
360
+ "properties": {
361
+ "force": {
362
+ "const": "boundary-mismatch"
363
+ },
364
+ "value": {
365
+ "enum": [
366
+ "absent",
367
+ "shape-differs",
368
+ "shape-and-semantics-differ"
369
+ ]
370
+ },
371
+ "site": {
372
+ "$ref": "#/$defs/site"
373
+ }
374
+ }
375
+ },
376
+ "forceReusableAction": {
377
+ "type": "object",
378
+ "additionalProperties": false,
379
+ "required": [
380
+ "force",
381
+ "value",
382
+ "site"
383
+ ],
384
+ "properties": {
385
+ "force": {
386
+ "const": "reusable-action"
387
+ },
388
+ "value": {
389
+ "enum": [
390
+ "absent",
391
+ "state-container-bound",
392
+ "caller-independent"
393
+ ]
394
+ },
395
+ "site": {
396
+ "$ref": "#/$defs/site"
397
+ }
398
+ }
399
+ },
400
+ "forceComposition": {
401
+ "type": "object",
402
+ "additionalProperties": false,
403
+ "required": [
404
+ "force",
405
+ "value",
406
+ "site"
407
+ ],
408
+ "properties": {
409
+ "force": {
410
+ "const": "composition"
411
+ },
412
+ "value": {
413
+ "enum": [
414
+ "absent",
415
+ "sequential-steps",
416
+ "independent-behaviors"
417
+ ]
418
+ },
419
+ "site": {
420
+ "$ref": "#/$defs/site"
421
+ }
422
+ }
423
+ },
424
+ "forceSharedLifecycle": {
425
+ "type": "object",
426
+ "additionalProperties": false,
427
+ "required": [
428
+ "force",
429
+ "value",
430
+ "site"
431
+ ],
432
+ "properties": {
433
+ "force": {
434
+ "const": "shared-lifecycle"
435
+ },
436
+ "value": {
437
+ "enum": [
438
+ "absent",
439
+ "per-consumer",
440
+ "application-wide"
441
+ ]
442
+ },
443
+ "site": {
444
+ "$ref": "#/$defs/site"
445
+ }
446
+ }
447
+ },
448
+ "forceCrossCutting": {
449
+ "type": "object",
450
+ "additionalProperties": false,
451
+ "required": [
452
+ "force",
453
+ "value",
454
+ "site"
455
+ ],
456
+ "properties": {
457
+ "force": {
458
+ "const": "cross-cutting-behavior"
459
+ },
460
+ "value": {
461
+ "enum": [
462
+ "absent",
463
+ "one-operation",
464
+ "many-operations"
465
+ ]
466
+ },
467
+ "site": {
468
+ "$ref": "#/$defs/site"
469
+ }
470
+ }
471
+ },
472
+ "named": {
473
+ "variability": {
474
+ "type": "object",
475
+ "properties": {
476
+ "force": {
477
+ "const": "variability"
478
+ }
479
+ },
480
+ "required": [
481
+ "force"
482
+ ]
483
+ },
484
+ "extension": {
485
+ "type": "object",
486
+ "properties": {
487
+ "force": {
488
+ "const": "extension"
489
+ }
490
+ },
491
+ "required": [
492
+ "force"
493
+ ]
494
+ },
495
+ "creation-policy": {
496
+ "type": "object",
497
+ "properties": {
498
+ "force": {
499
+ "const": "creation-policy"
500
+ }
501
+ },
502
+ "required": [
503
+ "force"
504
+ ]
505
+ },
506
+ "boundary-mismatch": {
507
+ "type": "object",
508
+ "properties": {
509
+ "force": {
510
+ "const": "boundary-mismatch"
511
+ }
512
+ },
513
+ "required": [
514
+ "force"
515
+ ]
516
+ },
517
+ "reusable-action": {
518
+ "type": "object",
519
+ "properties": {
520
+ "force": {
521
+ "const": "reusable-action"
522
+ }
523
+ },
524
+ "required": [
525
+ "force"
526
+ ]
527
+ },
528
+ "composition": {
529
+ "type": "object",
530
+ "properties": {
531
+ "force": {
532
+ "const": "composition"
533
+ }
534
+ },
535
+ "required": [
536
+ "force"
537
+ ]
538
+ },
539
+ "shared-lifecycle": {
540
+ "type": "object",
541
+ "properties": {
542
+ "force": {
543
+ "const": "shared-lifecycle"
544
+ }
545
+ },
546
+ "required": [
547
+ "force"
548
+ ]
549
+ },
550
+ "cross-cutting-behavior": {
551
+ "type": "object",
552
+ "properties": {
553
+ "force": {
554
+ "const": "cross-cutting-behavior"
555
+ }
556
+ },
557
+ "required": [
558
+ "force"
559
+ ]
560
+ }
561
+ },
562
+ "citation": {
563
+ "type": "object",
564
+ "additionalProperties": false,
565
+ "required": [
566
+ "path",
567
+ "checkedAt",
568
+ "claim",
569
+ "covers"
570
+ ],
571
+ "properties": {
572
+ "path": {
573
+ "type": "string",
574
+ "minLength": 1
575
+ },
576
+ "checkedAt": {
577
+ "type": "string",
578
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
579
+ },
580
+ "claim": {
581
+ "type": "string",
582
+ "minLength": 1
583
+ },
584
+ "covers": {
585
+ "type": "array",
586
+ "minItems": 1,
587
+ "items": {
588
+ "type": "string",
589
+ "minLength": 1
590
+ }
591
+ },
592
+ "searched": {
593
+ "type": "array",
594
+ "minItems": 1,
595
+ "items": {
596
+ "type": "string",
597
+ "minLength": 1
598
+ }
599
+ }
600
+ }
601
+ },
602
+ "revision": {
603
+ "type": "object",
604
+ "additionalProperties": false,
605
+ "required": [
606
+ "number",
607
+ "previous",
608
+ "reason"
609
+ ],
610
+ "properties": {
611
+ "number": {
612
+ "type": "integer",
613
+ "minimum": 1
614
+ },
615
+ "previous": {
616
+ "type": [
617
+ "string",
618
+ "null"
619
+ ],
620
+ "minLength": 1
621
+ },
622
+ "reason": {
623
+ "type": "string",
624
+ "minLength": 1
625
+ },
626
+ "changed": {
627
+ "type": "array",
628
+ "minItems": 1,
629
+ "uniqueItems": true,
630
+ "items": {
631
+ "type": "string",
632
+ "minLength": 1
633
+ }
634
+ },
635
+ "addresses": {
636
+ "type": "array",
637
+ "minItems": 1,
638
+ "uniqueItems": true,
639
+ "items": {
640
+ "type": "string",
641
+ "minLength": 1
642
+ }
643
+ }
644
+ },
645
+ "allOf": [
646
+ {
647
+ "if": {
648
+ "properties": {
649
+ "number": {
650
+ "type": "integer",
651
+ "minimum": 2
652
+ }
653
+ },
654
+ "required": [
655
+ "number"
656
+ ]
657
+ },
658
+ "then": {
659
+ "properties": {
660
+ "previous": {
661
+ "type": "string",
662
+ "minLength": 1
663
+ }
664
+ }
665
+ },
666
+ "else": {
667
+ "properties": {
668
+ "previous": {
669
+ "type": "null"
670
+ }
671
+ }
672
+ }
673
+ }
674
+ ]
675
+ }
676
+ },
677
+ "allOf": [
678
+ {
679
+ "if": {
680
+ "type": "object",
681
+ "properties": {
682
+ "decision": {
683
+ "type": "object",
684
+ "properties": {
685
+ "pattern": {
686
+ "const": "none"
687
+ }
688
+ },
689
+ "required": [
690
+ "pattern"
691
+ ]
692
+ }
693
+ },
694
+ "required": [
695
+ "decision"
696
+ ]
697
+ },
698
+ "then": {
699
+ "type": "object",
700
+ "properties": {
701
+ "decision": {
702
+ "type": "object",
703
+ "properties": {
704
+ "reconsiderWhen": {
705
+ "type": "string",
706
+ "minLength": 1
707
+ }
708
+ }
709
+ },
710
+ "framework": {
711
+ "type": "object",
712
+ "properties": {
713
+ "transposition": {
714
+ "type": "null"
715
+ }
716
+ }
717
+ }
718
+ }
719
+ },
720
+ "else": {
721
+ "type": "object",
722
+ "properties": {
723
+ "artifacts": {
724
+ "type": "array",
725
+ "minItems": 1
726
+ }
727
+ }
728
+ }
729
+ }
730
+ ]
731
+ }