@frankzhang2026/opencode-android-orchestrator 1.0.5 → 1.1.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 (107) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +76 -15
  3. package/dist/config/queue-policy.d.ts.map +1 -1
  4. package/dist/config/queue-policy.js +1 -2
  5. package/dist/config/queue-policy.js.map +1 -1
  6. package/dist/doctor/index.d.ts.map +1 -1
  7. package/dist/doctor/index.js +14 -3
  8. package/dist/doctor/index.js.map +1 -1
  9. package/dist/doctor/installation.d.ts +1 -1
  10. package/dist/doctor/installation.d.ts.map +1 -1
  11. package/dist/doctor/installation.js +10 -1
  12. package/dist/doctor/installation.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/installer/adaptive-templates.d.ts +4 -1
  18. package/dist/installer/adaptive-templates.d.ts.map +1 -1
  19. package/dist/installer/adaptive-templates.js +38 -13
  20. package/dist/installer/adaptive-templates.js.map +1 -1
  21. package/dist/installer/android-project.d.ts +3 -1
  22. package/dist/installer/android-project.d.ts.map +1 -1
  23. package/dist/installer/android-project.js.map +1 -1
  24. package/dist/installer/capabilities-script.d.ts +2 -0
  25. package/dist/installer/capabilities-script.d.ts.map +1 -0
  26. package/dist/installer/capabilities-script.js +77 -0
  27. package/dist/installer/capabilities-script.js.map +1 -0
  28. package/dist/installer/gradle-verification.d.ts.map +1 -1
  29. package/dist/installer/gradle-verification.js +13 -6
  30. package/dist/installer/gradle-verification.js.map +1 -1
  31. package/dist/installer/init.d.ts.map +1 -1
  32. package/dist/installer/init.js +2 -1
  33. package/dist/installer/init.js.map +1 -1
  34. package/dist/installer/opencode-config.d.ts +3 -3
  35. package/dist/installer/opencode-config.js +1 -1
  36. package/dist/installer/project-capabilities.d.ts +35 -0
  37. package/dist/installer/project-capabilities.d.ts.map +1 -0
  38. package/dist/installer/project-capabilities.js +82 -0
  39. package/dist/installer/project-capabilities.js.map +1 -0
  40. package/dist/installer/upgrade.d.ts.map +1 -1
  41. package/dist/installer/upgrade.js +9 -1
  42. package/dist/installer/upgrade.js.map +1 -1
  43. package/dist/queue/cli.d.ts.map +1 -1
  44. package/dist/queue/cli.js +32 -5
  45. package/dist/queue/cli.js.map +1 -1
  46. package/dist/queue/executor.d.ts +1 -0
  47. package/dist/queue/executor.d.ts.map +1 -1
  48. package/dist/queue/executor.js +155 -11
  49. package/dist/queue/executor.js.map +1 -1
  50. package/dist/queue/process-ownership.d.ts +12 -0
  51. package/dist/queue/process-ownership.d.ts.map +1 -0
  52. package/dist/queue/process-ownership.js +58 -0
  53. package/dist/queue/process-ownership.js.map +1 -0
  54. package/dist/queue/queue.d.ts +25 -1
  55. package/dist/queue/queue.d.ts.map +1 -1
  56. package/dist/queue/queue.js +96 -11
  57. package/dist/queue/queue.js.map +1 -1
  58. package/dist/queue/service.d.ts.map +1 -1
  59. package/dist/queue/service.js +19 -2
  60. package/dist/queue/service.js.map +1 -1
  61. package/dist/queue/storage.d.ts +3 -1
  62. package/dist/queue/storage.d.ts.map +1 -1
  63. package/dist/queue/storage.js +25 -15
  64. package/dist/queue/storage.js.map +1 -1
  65. package/dist/queue/supervision.d.ts +38 -0
  66. package/dist/queue/supervision.d.ts.map +1 -0
  67. package/dist/queue/supervision.js +247 -0
  68. package/dist/queue/supervision.js.map +1 -0
  69. package/dist/queue/tools.d.ts.map +1 -1
  70. package/dist/queue/tools.js +4 -2
  71. package/dist/queue/tools.js.map +1 -1
  72. package/docs/MIGRATION.md +110 -9
  73. package/docs/QUEUE.md +350 -16
  74. package/docs/SECURITY.md +5 -2
  75. package/docs/TROUBLESHOOTING.md +82 -8
  76. package/package.json +1 -1
  77. package/templates/.opencode/agents/scheduled-coder.md +14 -1
  78. package/templates/.opencode/agents/scheduled-planner.md +64 -3
  79. package/templates/.opencode/skills/scheduled-quality-coder/SKILL.md +29 -3
  80. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +65 -4
  81. package/templates/.opencode/skills/scheduled-quality-reviewer/SKILL.md +19 -1
  82. package/templates/AGENTS.md.fragment +10 -4
  83. package/templates/README.md +3 -1
  84. package/templates/automation/config.schema.json +212 -22
  85. package/templates/automation/task-contract.schema.json +573 -49
  86. package/templates/automation/tasks/TASK-TEMPLATE.json.example +9 -4
  87. package/templates/automation/verification/collect.init.gradle +98 -0
  88. package/templates/automation/verification/contract.cjs +93 -0
  89. package/templates/automation/verification/inventory.cjs +433 -0
  90. package/templates/automation/verification/project.cjs +172 -0
  91. package/templates/automation/verification/recovery.cjs +426 -0
  92. package/templates/scripts/automation/acceptance-report.sh +17 -0
  93. package/templates/scripts/automation/claim-task.sh +35 -2
  94. package/templates/scripts/automation/integration-scope-gate.sh +3 -3
  95. package/templates/scripts/automation/lib.sh +61 -19
  96. package/templates/scripts/automation/orchestrate-task.sh +7 -1
  97. package/templates/scripts/automation/preflight.sh +1 -2
  98. package/templates/scripts/automation/quality-gate.sh +10 -1
  99. package/templates/scripts/automation/record-red.sh +13 -1
  100. package/templates/scripts/automation/resume-task.sh +3 -0
  101. package/templates/scripts/automation/scope-gate.sh +4 -4
  102. package/templates/scripts/automation/show-acceptance-review.sh +1 -0
  103. package/templates/scripts/automation/status.sh +32 -0
  104. package/templates/scripts/automation/submit-review.sh +10 -1
  105. package/templates/scripts/automation/validate-contract.sh +10 -1
  106. package/templates/scripts/automation/verify-integration.sh +3 -0
  107. package/templates/scripts/automation/verify-task.sh +3 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "urn:frankzhang2026:opencode-android-orchestrator:task-contract:v3",
3
+ "$id": "urn:frankzhang2026:opencode-android-orchestrator:task-contract:v8",
4
4
  "title": "Scheduled coding task contract",
5
5
  "type": "object",
6
6
  "additionalProperties": false,
@@ -18,57 +18,164 @@
18
18
  "expectedFailure": {
19
19
  "type": "object",
20
20
  "additionalProperties": false,
21
- "required": ["type", "origin"],
21
+ "required": [
22
+ "type",
23
+ "origin"
24
+ ],
22
25
  "properties": {
23
- "type": { "type": "string", "minLength": 1 },
24
- "messageIncludes": { "type": "string", "minLength": 3 },
25
- "origin": { "type": "string", "minLength": 12 }
26
+ "type": {
27
+ "type": "string",
28
+ "minLength": 1
29
+ },
30
+ "messageIncludes": {
31
+ "type": "string",
32
+ "minLength": 3
33
+ },
34
+ "origin": {
35
+ "type": "string",
36
+ "minLength": 12
37
+ }
26
38
  }
27
39
  },
28
40
  "verificationCase": {
29
41
  "type": "object",
30
42
  "additionalProperties": false,
31
- "required": ["id", "criterion", "intent", "before", "after", "source", "test"],
43
+ "required": [
44
+ "id",
45
+ "criterion",
46
+ "intent",
47
+ "before",
48
+ "after",
49
+ "source",
50
+ "test"
51
+ ],
32
52
  "properties": {
33
- "id": { "type": "string", "pattern": "^[A-Z][A-Z0-9-]{2,63}$" },
34
- "criterion": { "type": "integer", "minimum": 1 },
35
- "intent": { "enum": ["preserve", "change", "observe"] },
36
- "before": { "enum": ["pass", "fail", "observe"] },
37
- "after": { "const": "pass" },
38
- "source": { "enum": ["userRequirement", "existingTest", "baselineCapture", "measuredFact"] },
53
+ "id": {
54
+ "type": "string",
55
+ "pattern": "^[A-Z][A-Z0-9-]{2,63}$"
56
+ },
57
+ "criterion": {
58
+ "type": "integer",
59
+ "minimum": 1
60
+ },
61
+ "intent": {
62
+ "enum": [
63
+ "preserve",
64
+ "change",
65
+ "observe"
66
+ ]
67
+ },
68
+ "before": {
69
+ "enum": [
70
+ "pass",
71
+ "fail",
72
+ "observe"
73
+ ]
74
+ },
75
+ "after": {
76
+ "const": "pass"
77
+ },
78
+ "source": {
79
+ "enum": [
80
+ "userRequirement",
81
+ "existingTest",
82
+ "baselineCapture",
83
+ "measuredFact"
84
+ ]
85
+ },
39
86
  "test": {
40
87
  "type": "object",
41
88
  "additionalProperties": false,
42
- "required": ["target", "className", "name"],
89
+ "required": [
90
+ "target",
91
+ "className",
92
+ "name"
93
+ ],
43
94
  "properties": {
44
- "target": { "type": "integer", "minimum": 0 },
45
- "className": { "type": "string", "minLength": 1 },
46
- "name": { "type": "string", "minLength": 1 }
95
+ "target": {
96
+ "type": "integer",
97
+ "minimum": 0
98
+ },
99
+ "className": {
100
+ "type": "string",
101
+ "minLength": 1
102
+ },
103
+ "name": {
104
+ "type": "string",
105
+ "minLength": 1
106
+ }
47
107
  }
48
108
  },
49
- "expectedFailure": { "$ref": "#/$defs/expectedFailure" }
109
+ "expectedFailure": {
110
+ "$ref": "#/$defs/expectedFailure"
111
+ }
50
112
  },
51
113
  "allOf": [
52
114
  {
53
- "if": { "properties": { "intent": { "const": "preserve" } } },
115
+ "if": {
116
+ "properties": {
117
+ "intent": {
118
+ "const": "preserve"
119
+ }
120
+ }
121
+ },
54
122
  "then": {
55
123
  "properties": {
56
- "before": { "const": "pass" },
57
- "source": { "enum": ["existingTest", "baselineCapture", "measuredFact"] }
124
+ "before": {
125
+ "const": "pass"
126
+ },
127
+ "source": {
128
+ "enum": [
129
+ "existingTest",
130
+ "baselineCapture",
131
+ "measuredFact"
132
+ ]
133
+ }
58
134
  },
59
- "not": { "required": ["expectedFailure"] }
135
+ "not": {
136
+ "required": [
137
+ "expectedFailure"
138
+ ]
139
+ }
60
140
  }
61
141
  },
62
142
  {
63
- "if": { "properties": { "intent": { "const": "change" } } },
143
+ "if": {
144
+ "properties": {
145
+ "intent": {
146
+ "const": "change"
147
+ }
148
+ }
149
+ },
64
150
  "then": {
65
- "properties": { "before": { "const": "fail" }, "source": { "const": "userRequirement" } },
66
- "required": ["expectedFailure"]
151
+ "properties": {
152
+ "before": {
153
+ "const": "fail"
154
+ },
155
+ "source": {
156
+ "const": "userRequirement"
157
+ }
158
+ },
159
+ "required": [
160
+ "expectedFailure"
161
+ ]
67
162
  }
68
163
  },
69
164
  {
70
- "if": { "properties": { "intent": { "const": "observe" } } },
71
- "then": { "properties": { "before": { "const": "observe" } } }
165
+ "if": {
166
+ "properties": {
167
+ "intent": {
168
+ "const": "observe"
169
+ }
170
+ }
171
+ },
172
+ "then": {
173
+ "properties": {
174
+ "before": {
175
+ "const": "observe"
176
+ }
177
+ }
178
+ }
72
179
  }
73
180
  ]
74
181
  }
@@ -93,23 +200,59 @@
93
200
  "verification"
94
201
  ],
95
202
  "properties": {
96
- "schemaVersion": { "const": 3 },
97
- "id": { "type": "string", "pattern": "^TASK-[A-Z0-9-]+$" },
98
- "title": { "type": "string", "minLength": 1 },
99
- "designApproved": { "const": true },
100
- "planPath": { "type": "string", "minLength": 1 },
101
- "ambiguityPolicy": { "const": "BLOCKED" },
102
- "maxFixLoops": { "type": "integer", "minimum": 0, "maximum": 1 },
103
- "maxChangedFiles": { "type": "integer", "minimum": 1, "maximum": 12 },
203
+ "schemaVersion": {
204
+ "enum": [
205
+ 3,
206
+ 4,
207
+ 5,
208
+ 6,
209
+ 7,
210
+ 8
211
+ ]
212
+ },
213
+ "id": {
214
+ "type": "string",
215
+ "pattern": "^TASK-[A-Z0-9-]+$"
216
+ },
217
+ "title": {
218
+ "type": "string",
219
+ "minLength": 1
220
+ },
221
+ "designApproved": {
222
+ "const": true
223
+ },
224
+ "planPath": {
225
+ "type": "string",
226
+ "minLength": 1
227
+ },
228
+ "ambiguityPolicy": {
229
+ "const": "BLOCKED"
230
+ },
231
+ "maxFixLoops": {
232
+ "type": "integer",
233
+ "minimum": 0,
234
+ "maximum": 1
235
+ },
236
+ "maxChangedFiles": {
237
+ "type": "integer",
238
+ "minimum": 1,
239
+ "maximum": 12
240
+ },
104
241
  "allowedPaths": {
105
242
  "type": "array",
106
243
  "minItems": 1,
107
- "items": { "type": "string", "minLength": 1 }
244
+ "items": {
245
+ "type": "string",
246
+ "minLength": 1
247
+ }
108
248
  },
109
249
  "forbiddenPaths": {
110
250
  "type": "array",
111
251
  "minItems": 1,
112
- "items": { "type": "string", "minLength": 1 }
252
+ "items": {
253
+ "type": "string",
254
+ "minLength": 1
255
+ }
113
256
  },
114
257
  "allowedWorkflowSkills": {
115
258
  "type": "array",
@@ -122,12 +265,18 @@
122
265
  "acceptanceCriteria": {
123
266
  "type": "array",
124
267
  "minItems": 1,
125
- "items": { "type": "string", "minLength": 1 }
268
+ "items": {
269
+ "type": "string",
270
+ "minLength": 1
271
+ }
126
272
  },
127
273
  "nonGoals": {
128
274
  "type": "array",
129
275
  "minItems": 1,
130
- "items": { "type": "string", "minLength": 1 }
276
+ "items": {
277
+ "type": "string",
278
+ "minLength": 1
279
+ }
131
280
  },
132
281
  "targetTests": {
133
282
  "type": "array",
@@ -136,29 +285,404 @@
136
285
  "items": {
137
286
  "type": "object",
138
287
  "additionalProperties": false,
139
- "required": ["gradleTask", "filter"],
288
+ "required": [
289
+ "gradleTask",
290
+ "filter"
291
+ ],
140
292
  "properties": {
141
- "gradleTask": { "$ref": "#/$defs/gradleTask" },
142
- "filter": { "$ref": "#/$defs/testFilter" }
293
+ "gradleTask": {
294
+ "$ref": "#/$defs/gradleTask"
295
+ },
296
+ "filter": {
297
+ "$ref": "#/$defs/testFilter"
298
+ }
143
299
  }
144
300
  }
145
301
  },
146
- "deviceTestsRequired": { "type": "boolean" },
147
- "testPolicy": { "enum": ["required", "not-required"] },
148
- "testPolicyReason": { "type": "string" },
302
+ "deviceTestsRequired": {
303
+ "type": "boolean"
304
+ },
305
+ "testPolicy": {
306
+ "enum": [
307
+ "required",
308
+ "not-required"
309
+ ]
310
+ },
311
+ "testPolicyReason": {
312
+ "type": "string"
313
+ },
149
314
  "verification": {
150
315
  "type": "object",
151
316
  "additionalProperties": false,
152
- "required": ["version", "maxPreparationFixes", "cases"],
317
+ "required": [
318
+ "version",
319
+ "maxPreparationFixes",
320
+ "cases"
321
+ ],
153
322
  "properties": {
154
- "version": { "const": 1 },
155
- "maxPreparationFixes": { "type": "integer", "minimum": 0, "maximum": 1 },
323
+ "version": {
324
+ "enum": [
325
+ 1,
326
+ 2
327
+ ]
328
+ },
329
+ "maxPreparationFixes": {
330
+ "type": "integer",
331
+ "minimum": 0,
332
+ "maximum": 1
333
+ },
156
334
  "cases": {
157
335
  "type": "array",
158
336
  "minItems": 1,
159
- "items": { "$ref": "#/$defs/verificationCase" }
337
+ "items": {
338
+ "$ref": "#/$defs/verificationCase"
339
+ }
340
+ },
341
+ "inventory": {
342
+ "type": "object",
343
+ "additionalProperties": false,
344
+ "required": [
345
+ "mode",
346
+ "existingSkips",
347
+ "emptyBaseline"
348
+ ],
349
+ "properties": {
350
+ "mode": {
351
+ "const": "focusedBaseline"
352
+ },
353
+ "existingSkips": {
354
+ "enum": [
355
+ "reject",
356
+ "preserve"
357
+ ]
358
+ },
359
+ "emptyBaseline": {
360
+ "enum": [
361
+ "reject",
362
+ "allow"
363
+ ]
364
+ }
365
+ }
366
+ }
367
+ }
368
+ },
369
+ "recovery": {
370
+ "type": "object",
371
+ "additionalProperties": false,
372
+ "required": [
373
+ "version",
374
+ "scope",
375
+ "maxEnvironmentRetries",
376
+ "maxManualRetries",
377
+ "maxSameFailureRetries",
378
+ "maxElapsedMs",
379
+ "initialDelayMs",
380
+ "maxDelayMs"
381
+ ],
382
+ "properties": {
383
+ "version": {
384
+ "const": 1
385
+ },
386
+ "scope": {
387
+ "const": "baseline"
388
+ },
389
+ "maxEnvironmentRetries": {
390
+ "type": "integer",
391
+ "minimum": 0,
392
+ "maximum": 3
393
+ },
394
+ "maxManualRetries": {
395
+ "type": "integer",
396
+ "minimum": 0,
397
+ "maximum": 3
398
+ },
399
+ "maxSameFailureRetries": {
400
+ "type": "integer",
401
+ "minimum": 0,
402
+ "maximum": 3
403
+ },
404
+ "maxElapsedMs": {
405
+ "type": "integer",
406
+ "minimum": 1000,
407
+ "maximum": 86400000
408
+ },
409
+ "initialDelayMs": {
410
+ "type": "integer",
411
+ "minimum": 1000,
412
+ "maximum": 600000
413
+ },
414
+ "maxDelayMs": {
415
+ "type": "integer",
416
+ "minimum": 1000,
417
+ "maximum": 600000
418
+ }
419
+ }
420
+ },
421
+ "execution": {
422
+ "type": "object",
423
+ "additionalProperties": false,
424
+ "required": [
425
+ "version",
426
+ "maxRunMs",
427
+ "maxStageMs",
428
+ "terminationGraceMs"
429
+ ],
430
+ "properties": {
431
+ "version": {
432
+ "const": 1
433
+ },
434
+ "maxRunMs": {
435
+ "type": "integer",
436
+ "minimum": 1000,
437
+ "maximum": 86400000
438
+ },
439
+ "maxStageMs": {
440
+ "type": "integer",
441
+ "minimum": 1000,
442
+ "maximum": 86400000
443
+ },
444
+ "terminationGraceMs": {
445
+ "type": "integer",
446
+ "minimum": 1000,
447
+ "maximum": 60000
448
+ }
449
+ }
450
+ },
451
+ "stageRecovery": {
452
+ "type": "object",
453
+ "additionalProperties": false,
454
+ "required": [
455
+ "version",
456
+ "maxEnvironmentRetries",
457
+ "maxElapsedMs",
458
+ "initialDelayMs",
459
+ "maxDelayMs",
460
+ "maxSameFailureRetries"
461
+ ],
462
+ "properties": {
463
+ "version": {
464
+ "const": 1
465
+ },
466
+ "maxEnvironmentRetries": {
467
+ "type": "integer",
468
+ "minimum": 0,
469
+ "maximum": 3
470
+ },
471
+ "maxElapsedMs": {
472
+ "type": "integer",
473
+ "minimum": 1000,
474
+ "maximum": 86400000
475
+ },
476
+ "initialDelayMs": {
477
+ "type": "integer",
478
+ "minimum": 1000,
479
+ "maximum": 600000
480
+ },
481
+ "maxDelayMs": {
482
+ "type": "integer",
483
+ "minimum": 1000,
484
+ "maximum": 600000
485
+ },
486
+ "maxSameFailureRetries": {
487
+ "type": "integer",
488
+ "minimum": 0,
489
+ "maximum": 3
490
+ }
491
+ }
492
+ },
493
+ "continuity": {
494
+ "type": "object",
495
+ "additionalProperties": false,
496
+ "required": [
497
+ "version",
498
+ "isolatedAutoIntegration",
499
+ "planningRefresh",
500
+ "planningInputs"
501
+ ],
502
+ "properties": {
503
+ "version": {
504
+ "const": 1
505
+ },
506
+ "isolatedAutoIntegration": {
507
+ "type": "boolean"
508
+ },
509
+ "planningRefresh": {
510
+ "enum": [
511
+ "reject",
512
+ "completedQueueTasks"
513
+ ]
514
+ },
515
+ "planningInputs": {
516
+ "type": "array",
517
+ "minItems": 1,
518
+ "maxItems": 128,
519
+ "uniqueItems": true,
520
+ "items": {
521
+ "type": "string",
522
+ "minLength": 1,
523
+ "maxLength": 512,
524
+ "pattern": "^[A-Za-z0-9._/?*-]+$",
525
+ "not": {
526
+ "pattern": "(^/|\\.\\.|(^|/)(\\.git|\\.)(/|$)|//|/$)"
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }
532
+ },
533
+ "allOf": [
534
+ {
535
+ "if": {
536
+ "properties": {
537
+ "schemaVersion": {
538
+ "enum": [
539
+ 4,
540
+ 5,
541
+ 6,
542
+ 7,
543
+ 8
544
+ ]
545
+ }
546
+ }
547
+ },
548
+ "then": {
549
+ "properties": {
550
+ "testPolicy": {
551
+ "const": "required"
552
+ },
553
+ "targetTests": {
554
+ "items": {
555
+ "properties": {
556
+ "gradleTask": {
557
+ "pattern": "^(?::[A-Za-z0-9_.-]+)+$"
558
+ }
559
+ }
560
+ }
561
+ },
562
+ "verification": {
563
+ "required": [
564
+ "inventory"
565
+ ],
566
+ "properties": {
567
+ "version": {
568
+ "const": 2
569
+ }
570
+ }
571
+ }
572
+ }
573
+ },
574
+ "else": {
575
+ "properties": {
576
+ "verification": {
577
+ "properties": {
578
+ "version": {
579
+ "const": 1
580
+ }
581
+ },
582
+ "not": {
583
+ "required": [
584
+ "inventory"
585
+ ]
586
+ }
587
+ }
588
+ }
589
+ }
590
+ },
591
+ {
592
+ "if": {
593
+ "properties": {
594
+ "schemaVersion": {
595
+ "enum": [
596
+ 5,
597
+ 6,
598
+ 7,
599
+ 8
600
+ ]
601
+ }
602
+ }
603
+ },
604
+ "then": {
605
+ "required": [
606
+ "recovery"
607
+ ]
608
+ },
609
+ "else": {
610
+ "not": {
611
+ "required": [
612
+ "recovery"
613
+ ]
614
+ }
615
+ }
616
+ },
617
+ {
618
+ "if": {
619
+ "properties": {
620
+ "schemaVersion": {
621
+ "enum": [
622
+ 6,
623
+ 7,
624
+ 8
625
+ ]
626
+ }
627
+ }
628
+ },
629
+ "then": {
630
+ "required": [
631
+ "execution"
632
+ ]
633
+ },
634
+ "else": {
635
+ "not": {
636
+ "required": [
637
+ "execution"
638
+ ]
639
+ }
640
+ }
641
+ },
642
+ {
643
+ "if": {
644
+ "properties": {
645
+ "schemaVersion": {
646
+ "enum": [
647
+ 7,
648
+ 8
649
+ ]
650
+ }
651
+ }
652
+ },
653
+ "then": {
654
+ "required": [
655
+ "stageRecovery"
656
+ ]
657
+ },
658
+ "else": {
659
+ "not": {
660
+ "required": [
661
+ "stageRecovery"
662
+ ]
663
+ }
664
+ }
665
+ },
666
+ {
667
+ "if": {
668
+ "properties": {
669
+ "schemaVersion": {
670
+ "const": 8
671
+ }
672
+ }
673
+ },
674
+ "then": {
675
+ "required": [
676
+ "continuity"
677
+ ]
678
+ },
679
+ "else": {
680
+ "not": {
681
+ "required": [
682
+ "continuity"
683
+ ]
160
684
  }
161
685
  }
162
686
  }
163
- }
687
+ ]
164
688
  }