@ship.zone/ci-spec 2.0.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 (116) hide show
  1. package/.smartconfig.json +46 -0
  2. package/changelog.md +190 -0
  3. package/conformance/archive-cases.json +446 -0
  4. package/conformance/ci-actions/compile-invalid/build-arg-secret-collision.yml +31 -0
  5. package/conformance/ci-actions/compile-invalid/candidate-without-needs.yml +36 -0
  6. package/conformance/ci-actions/compile-invalid/needs-wider-triggers.yml +42 -0
  7. package/conformance/ci-actions/compile-invalid/npm-read-registry-not-allowlisted.yml +34 -0
  8. package/conformance/ci-actions/compile-invalid/publish-job-excludes-tag.yml +57 -0
  9. package/conformance/ci-actions/compile-invalid/shared-memory-above-memory.yml +28 -0
  10. package/conformance/ci-actions/compile-invalid/trigger-kind-without-job.yml +30 -0
  11. package/conformance/ci-actions/invalid/alias-affix-invalid.yml +33 -0
  12. package/conformance/ci-actions/invalid/alias.yml +32 -0
  13. package/conformance/ci-actions/invalid/bridge-network.yml +27 -0
  14. package/conformance/ci-actions/invalid/build-darwin-platform.yml +24 -0
  15. package/conformance/ci-actions/invalid/build-with-steps.yml +27 -0
  16. package/conformance/ci-actions/invalid/concurrency-empty-group.yml +28 -0
  17. package/conformance/ci-actions/invalid/concurrency-without-cancel-in-progress.yml +27 -0
  18. package/conformance/ci-actions/invalid/container-job-build-profile.yml +25 -0
  19. package/conformance/ci-actions/invalid/custom-tag.txt +23 -0
  20. package/conformance/ci-actions/invalid/duplicate-key.txt +24 -0
  21. package/conformance/ci-actions/invalid/egress-bare-wildcard.yml +29 -0
  22. package/conformance/ci-actions/invalid/egress-empty-allowlist.yml +28 -0
  23. package/conformance/ci-actions/invalid/egress-ip-literal.yml +29 -0
  24. package/conformance/ci-actions/invalid/egress-single-label-wildcard.yml +29 -0
  25. package/conformance/ci-actions/invalid/job-publish-permission.yml +28 -0
  26. package/conformance/ci-actions/invalid/job-trigger-undeclared-kind.yml +27 -0
  27. package/conformance/ci-actions/invalid/literal-alias-affix.yml +33 -0
  28. package/conformance/ci-actions/invalid/missing-spec.yml +24 -0
  29. package/conformance/ci-actions/invalid/multiple-documents.yml +25 -0
  30. package/conformance/ci-actions/invalid/npm-read-invalid-scope.yml +33 -0
  31. package/conformance/ci-actions/invalid/oci-darwin-platform.yml +25 -0
  32. package/conformance/ci-actions/invalid/permission-without-publication.yml +31 -0
  33. package/conformance/ci-actions/invalid/publish-order-duplicate.yml +50 -0
  34. package/conformance/ci-actions/invalid/publish-order-missing-kind.yml +48 -0
  35. package/conformance/ci-actions/invalid/publish-order-undeclared-kind.yml +45 -0
  36. package/conformance/ci-actions/invalid/publish-without-permission.yml +31 -0
  37. package/conformance/ci-actions/invalid/publish-without-tag-trigger.yml +31 -0
  38. package/conformance/ci-actions/invalid/release-notes-without-assets.yml +46 -0
  39. package/conformance/ci-actions/invalid/reserved-label-prefix.yml +25 -0
  40. package/conformance/ci-actions/invalid/reserved-label.yml +25 -0
  41. package/conformance/ci-actions/invalid/retention-above-maximum.yml +83 -0
  42. package/conformance/ci-actions/invalid/retention-below-minimum.yml +83 -0
  43. package/conformance/ci-actions/invalid/schema-version-field.yml +26 -0
  44. package/conformance/ci-actions/invalid/shared-memory-below-minimum.yml +28 -0
  45. package/conformance/ci-actions/invalid/shell-string.yml +21 -0
  46. package/conformance/ci-actions/invalid/spec-number.yml +25 -0
  47. package/conformance/ci-actions/invalid/spec-prerelease.yml +25 -0
  48. package/conformance/ci-actions/invalid/spec-range.yml +25 -0
  49. package/conformance/ci-actions/invalid/timeout-above-maximum.yml +26 -0
  50. package/conformance/ci-actions/invalid/timeout-below-minimum.yml +26 -0
  51. package/conformance/ci-actions/invalid/unknown-alias-kind.yml +31 -0
  52. package/conformance/ci-actions/invalid/unknown-key.yml +24 -0
  53. package/conformance/ci-actions/invalid/vm-darwin-candidate.yml +38 -0
  54. package/conformance/ci-actions/invalid/vm-darwin-shared-memory.yml +28 -0
  55. package/conformance/ci-actions/invalid/vm-oci-execution.yml +25 -0
  56. package/conformance/ci-actions/invalid/vm-unsupported-platform.yml +25 -0
  57. package/conformance/ci-actions/invalid/vm-without-platform.yml +24 -0
  58. package/conformance/ci-actions/valid/concurrency.yml +83 -0
  59. package/conformance/ci-actions/valid/egress.yml +40 -0
  60. package/conformance/ci-actions/valid/image-build.yml +80 -0
  61. package/conformance/ci-actions/valid/matrix.yml +45 -0
  62. package/conformance/ci-actions/valid/minimal.yml +25 -0
  63. package/conformance/ci-actions/valid/npm-read.yml +60 -0
  64. package/conformance/ci-actions/valid/release-assets.yml +114 -0
  65. package/conformance/ci-actions/valid/release-signing.yml +71 -0
  66. package/conformance/ci-actions/valid/release.yml +109 -0
  67. package/conformance/ci-actions/valid/resources.yml +79 -0
  68. package/conformance/ci-actions/valid/vm.yml +77 -0
  69. package/conformance/compile-cases.json +5885 -0
  70. package/conformance/compile-cases.schema.json +766 -0
  71. package/conformance/digest-cases.json +144 -0
  72. package/conformance/runner-cases.json +1238 -0
  73. package/conformance/runner-jobs/invalid/bridge-network.json +70 -0
  74. package/conformance/runner-jobs/invalid/build-darwin-platform.json +100 -0
  75. package/conformance/runner-jobs/invalid/build-with-steps.json +111 -0
  76. package/conformance/runner-jobs/invalid/build-without-microvm.json +100 -0
  77. package/conformance/runner-jobs/invalid/egress-empty-allowlist.json +71 -0
  78. package/conformance/runner-jobs/invalid/mutable-image.json +70 -0
  79. package/conformance/runner-jobs/invalid/npm-read-reserved-environment.json +82 -0
  80. package/conformance/runner-jobs/invalid/oci-darwin-platform.json +71 -0
  81. package/conformance/runner-jobs/invalid/push-permission-container.json +70 -0
  82. package/conformance/runner-jobs/invalid/shared-memory-below-minimum.json +71 -0
  83. package/conformance/runner-jobs/invalid/timeout-missing.json +69 -0
  84. package/conformance/runner-jobs/invalid/vm-without-microvm.json +82 -0
  85. package/conformance/runner-jobs/valid/candidate-test.json +72 -0
  86. package/conformance/runner-jobs/valid/egress.json +80 -0
  87. package/conformance/runner-jobs/valid/image-build.json +100 -0
  88. package/conformance/runner-jobs/valid/minimal.json +70 -0
  89. package/conformance/runner-jobs/valid/npm-read.json +81 -0
  90. package/conformance/runner-jobs/valid/resources.json +71 -0
  91. package/conformance/runner-jobs/valid/timeout-retention-defaults.json +91 -0
  92. package/conformance/runner-jobs/valid/vm-darwin.json +70 -0
  93. package/conformance/runner-jobs/valid/vm.json +82 -0
  94. package/conformance/runner-messages.json +2035 -0
  95. package/conformance/version-cases.json +125 -0
  96. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  97. package/dist_ts/00_commitinfo_data.js +9 -0
  98. package/dist_ts/constants.d.ts +199 -0
  99. package/dist_ts/constants.js +106 -0
  100. package/dist_ts/index.d.ts +1 -0
  101. package/dist_ts/index.js +2 -0
  102. package/dist_ts/plugins.d.ts +1 -0
  103. package/dist_ts/plugins.js +3 -0
  104. package/examples/ci_actions.yml +64 -0
  105. package/license.md +21 -0
  106. package/package.json +72 -0
  107. package/readme.md +146 -0
  108. package/schemas/ci_actions.schema.json +1664 -0
  109. package/schemas/runner-job.schema.json +1172 -0
  110. package/spec/ci-actions.md +433 -0
  111. package/spec/runner-protocol.md +378 -0
  112. package/spec/runner.openapi.json +2182 -0
  113. package/ts/00_commitinfo_data.ts +8 -0
  114. package/ts/constants.ts +112 -0
  115. package/ts/index.ts +1 -0
  116. package/ts/plugins.ts +1 -0
@@ -0,0 +1,766 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ship.zone/spec/ci/conformance/compile-cases.schema.json",
4
+ "title": "ship.zone ci_actions.yml compile vectors",
5
+ "description": "Conformance vectors for ci_actions.yml compilation: the ordered failure codes, trigger pattern and tag version vectors, and cases that bind a workflow, a run context, and a deployment policy to the expected failure code, to not-triggered, or to the compiled nodes and plan digests.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "spec",
10
+ "failureCodes",
11
+ "patternCases",
12
+ "tagVersionCases",
13
+ "cases"
14
+ ],
15
+ "properties": {
16
+ "spec": {
17
+ "$ref": "../schemas/runner-job.schema.json#/$defs/specVersion"
18
+ },
19
+ "failureCodes": {
20
+ "description": "Every compilation failure code in the precedence order of spec/ci-actions.md, Compilation Failures.",
21
+ "type": "array",
22
+ "minItems": 1,
23
+ "uniqueItems": true,
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": [
28
+ "code",
29
+ "layer"
30
+ ],
31
+ "properties": {
32
+ "code": {
33
+ "$ref": "#/$defs/failureCode"
34
+ },
35
+ "layer": {
36
+ "$ref": "#/$defs/failureLayer"
37
+ }
38
+ }
39
+ }
40
+ },
41
+ "patternCases": {
42
+ "type": "array",
43
+ "minItems": 1,
44
+ "items": {
45
+ "$ref": "#/$defs/patternCase"
46
+ }
47
+ },
48
+ "tagVersionCases": {
49
+ "type": "array",
50
+ "minItems": 1,
51
+ "items": {
52
+ "$ref": "#/$defs/tagVersionCase"
53
+ }
54
+ },
55
+ "cases": {
56
+ "type": "array",
57
+ "minItems": 1,
58
+ "items": {
59
+ "$ref": "#/$defs/compileCase"
60
+ }
61
+ }
62
+ },
63
+ "$defs": {
64
+ "identifier": {
65
+ "$ref": "../schemas/runner-job.schema.json#/$defs/identifier"
66
+ },
67
+ "failureLayer": {
68
+ "enum": [
69
+ "source",
70
+ "yaml",
71
+ "version",
72
+ "schema",
73
+ "workflow",
74
+ "policy",
75
+ "run"
76
+ ]
77
+ },
78
+ "failureCode": {
79
+ "enum": [
80
+ "workflow_too_large",
81
+ "workflow_encoding_invalid",
82
+ "workflow_yaml_syntax",
83
+ "workflow_yaml_document_count",
84
+ "workflow_yaml_directive",
85
+ "workflow_yaml_duplicate_key",
86
+ "workflow_yaml_key_type",
87
+ "workflow_yaml_anchor",
88
+ "workflow_yaml_merge_key",
89
+ "workflow_yaml_tag",
90
+ "workflow_number_invalid",
91
+ "spec_incompatible",
92
+ "workflow_schema_invalid",
93
+ "trigger_pattern_invalid",
94
+ "needs_unknown",
95
+ "needs_cycle",
96
+ "expansion_limit_exceeded",
97
+ "needs_trigger_wider",
98
+ "trigger_kind_unused",
99
+ "permission_escalation",
100
+ "permission_insufficient",
101
+ "environment_conflict",
102
+ "environment_limit_exceeded",
103
+ "command_limit_exceeded",
104
+ "transfer_name_duplicate",
105
+ "cache_path_overlap",
106
+ "resources_invalid",
107
+ "network_host_duplicate",
108
+ "npm_read_invalid",
109
+ "build_input_conflict",
110
+ "candidate_reference_invalid",
111
+ "candidate_platform_missing",
112
+ "publish_reference_invalid",
113
+ "policy_limit_exceeded",
114
+ "policy_timeout_exceeded",
115
+ "policy_retention_exceeded",
116
+ "policy_egress_denied",
117
+ "policy_npm_registry_denied",
118
+ "policy_denied",
119
+ "manual_input_invalid",
120
+ "tag_version_required",
121
+ "alias_invalid",
122
+ "alias_duplicate",
123
+ "secret_untrusted",
124
+ "npm_read_untrusted",
125
+ "secret_unknown",
126
+ "protected_secret_denied",
127
+ "secret_too_short"
128
+ ]
129
+ },
130
+ "patternCase": {
131
+ "description": "A branch or tag filter pattern. A valid pattern matches every name in matches and none in nonMatches; an invalid pattern lists neither.",
132
+ "type": "object",
133
+ "additionalProperties": false,
134
+ "required": [
135
+ "id",
136
+ "pattern",
137
+ "valid"
138
+ ],
139
+ "properties": {
140
+ "id": {
141
+ "$ref": "#/$defs/identifier"
142
+ },
143
+ "pattern": {
144
+ "type": "string",
145
+ "minLength": 1,
146
+ "maxLength": 256
147
+ },
148
+ "valid": {
149
+ "type": "boolean"
150
+ },
151
+ "matches": {
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string",
155
+ "minLength": 1
156
+ }
157
+ },
158
+ "nonMatches": {
159
+ "type": "array",
160
+ "items": {
161
+ "type": "string",
162
+ "minLength": 1
163
+ }
164
+ }
165
+ },
166
+ "if": {
167
+ "type": "object",
168
+ "properties": {
169
+ "valid": {
170
+ "const": false
171
+ }
172
+ },
173
+ "required": [
174
+ "valid"
175
+ ]
176
+ },
177
+ "then": {
178
+ "type": "object",
179
+ "properties": {
180
+ "matches": false,
181
+ "nonMatches": false
182
+ }
183
+ },
184
+ "else": {
185
+ "type": "object",
186
+ "properties": {
187
+ "matches": {},
188
+ "nonMatches": {}
189
+ },
190
+ "required": [
191
+ "matches",
192
+ "nonMatches"
193
+ ]
194
+ }
195
+ },
196
+ "tagVersionCase": {
197
+ "type": "object",
198
+ "additionalProperties": false,
199
+ "required": [
200
+ "id",
201
+ "tag",
202
+ "tagVersion"
203
+ ],
204
+ "properties": {
205
+ "id": {
206
+ "$ref": "#/$defs/identifier"
207
+ },
208
+ "tag": {
209
+ "type": "string",
210
+ "minLength": 1
211
+ },
212
+ "tagVersion": {
213
+ "anyOf": [
214
+ {
215
+ "type": "string",
216
+ "minLength": 1
217
+ },
218
+ {
219
+ "type": "null"
220
+ }
221
+ ]
222
+ }
223
+ }
224
+ },
225
+ "workflowSource": {
226
+ "description": "The raw workflow bytes: a packaged fixture, UTF-8 text, or base64 for bytes that are not UTF-8.",
227
+ "oneOf": [
228
+ {
229
+ "type": "object",
230
+ "additionalProperties": false,
231
+ "required": [
232
+ "fixture"
233
+ ],
234
+ "properties": {
235
+ "fixture": {
236
+ "type": "string",
237
+ "pattern": "^(?:conformance/ci-actions/(?:valid|invalid|compile-invalid)/[a-z0-9-]+\\.(?:yml|txt)|examples/ci_actions\\.yml)$"
238
+ }
239
+ }
240
+ },
241
+ {
242
+ "type": "object",
243
+ "additionalProperties": false,
244
+ "required": [
245
+ "source"
246
+ ],
247
+ "properties": {
248
+ "source": {
249
+ "type": "string"
250
+ }
251
+ }
252
+ },
253
+ {
254
+ "type": "object",
255
+ "additionalProperties": false,
256
+ "required": [
257
+ "sourceBase64"
258
+ ],
259
+ "properties": {
260
+ "sourceBase64": {
261
+ "type": "string",
262
+ "contentEncoding": "base64"
263
+ }
264
+ }
265
+ }
266
+ ]
267
+ },
268
+ "trigger": {
269
+ "oneOf": [
270
+ {
271
+ "type": "object",
272
+ "additionalProperties": false,
273
+ "required": [
274
+ "kind",
275
+ "ref"
276
+ ],
277
+ "properties": {
278
+ "kind": {
279
+ "const": "push"
280
+ },
281
+ "ref": {
282
+ "type": "string",
283
+ "pattern": "^refs/heads/.+$"
284
+ }
285
+ }
286
+ },
287
+ {
288
+ "type": "object",
289
+ "additionalProperties": false,
290
+ "required": [
291
+ "kind",
292
+ "ref"
293
+ ],
294
+ "properties": {
295
+ "kind": {
296
+ "const": "tag"
297
+ },
298
+ "ref": {
299
+ "type": "string",
300
+ "pattern": "^refs/tags/.+$"
301
+ }
302
+ }
303
+ },
304
+ {
305
+ "type": "object",
306
+ "additionalProperties": false,
307
+ "required": [
308
+ "kind",
309
+ "pullRequest",
310
+ "targetBranch"
311
+ ],
312
+ "properties": {
313
+ "kind": {
314
+ "const": "pullRequest"
315
+ },
316
+ "pullRequest": {
317
+ "type": "string",
318
+ "minLength": 1
319
+ },
320
+ "targetBranch": {
321
+ "type": "string",
322
+ "minLength": 1
323
+ }
324
+ }
325
+ },
326
+ {
327
+ "type": "object",
328
+ "additionalProperties": false,
329
+ "required": [
330
+ "kind",
331
+ "ref",
332
+ "inputs"
333
+ ],
334
+ "properties": {
335
+ "kind": {
336
+ "const": "manual"
337
+ },
338
+ "ref": {
339
+ "type": "string",
340
+ "pattern": "^refs/.+$"
341
+ },
342
+ "inputs": {
343
+ "type": "object",
344
+ "additionalProperties": {
345
+ "anyOf": [
346
+ {
347
+ "type": "string"
348
+ },
349
+ {
350
+ "type": "boolean"
351
+ },
352
+ {
353
+ "type": "number"
354
+ },
355
+ {
356
+ "type": "null"
357
+ }
358
+ ]
359
+ }
360
+ }
361
+ }
362
+ }
363
+ ]
364
+ },
365
+ "context": {
366
+ "description": "The run a case compiles. trustClass and protectedTagRun are derived by the coordinator as defined in Trust and Triggers; secrets lists the repository secrets by name, protected mark, and value length in UTF-8 bytes, never by value.",
367
+ "type": "object",
368
+ "additionalProperties": false,
369
+ "required": [
370
+ "repository",
371
+ "sourceObjectId",
372
+ "source",
373
+ "trigger",
374
+ "trustClass",
375
+ "protectedTagRun",
376
+ "secrets"
377
+ ],
378
+ "properties": {
379
+ "repository": {
380
+ "type": "object",
381
+ "additionalProperties": false,
382
+ "required": [
383
+ "tenantId",
384
+ "repositoryId",
385
+ "url"
386
+ ],
387
+ "properties": {
388
+ "tenantId": {
389
+ "type": "string",
390
+ "minLength": 1
391
+ },
392
+ "repositoryId": {
393
+ "type": "string",
394
+ "minLength": 1
395
+ },
396
+ "url": {
397
+ "type": "string",
398
+ "pattern": "^https://"
399
+ }
400
+ }
401
+ },
402
+ "sourceObjectId": {
403
+ "$ref": "../schemas/runner-job.schema.json#/$defs/objectId"
404
+ },
405
+ "source": {
406
+ "$ref": "../schemas/runner-job.schema.json#/$defs/source"
407
+ },
408
+ "trigger": {
409
+ "$ref": "#/$defs/trigger"
410
+ },
411
+ "trustClass": {
412
+ "enum": [
413
+ "trusted",
414
+ "untrusted"
415
+ ]
416
+ },
417
+ "protectedTagRun": {
418
+ "type": "boolean"
419
+ },
420
+ "secrets": {
421
+ "type": "array",
422
+ "items": {
423
+ "type": "object",
424
+ "additionalProperties": false,
425
+ "required": [
426
+ "name",
427
+ "protected",
428
+ "valueBytes"
429
+ ],
430
+ "properties": {
431
+ "name": {
432
+ "$ref": "#/$defs/identifier"
433
+ },
434
+ "protected": {
435
+ "type": "boolean"
436
+ },
437
+ "valueBytes": {
438
+ "type": "integer",
439
+ "minimum": 0
440
+ }
441
+ }
442
+ }
443
+ }
444
+ }
445
+ },
446
+ "policy": {
447
+ "description": "A vector representation of the deployment policy; deployments configure policy in their own format. Omitted maxima impose no maximum, and only the listed egress hosts and npm registries are rejected.",
448
+ "type": "object",
449
+ "additionalProperties": false,
450
+ "required": [
451
+ "limits",
452
+ "ociIsolation"
453
+ ],
454
+ "properties": {
455
+ "limits": {
456
+ "type": "object",
457
+ "additionalProperties": false,
458
+ "required": [
459
+ "maximumSourceArchiveBytes",
460
+ "maximumSourceExtractedBytes",
461
+ "maximumSourceEntries",
462
+ "maximumLogChunkBytes",
463
+ "maximumTotalLogBytes",
464
+ "maximumWorkspaceBytes",
465
+ "maximumWorkspaceEntries"
466
+ ],
467
+ "properties": {
468
+ "maximumSourceArchiveBytes": {
469
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumSourceArchiveBytes"
470
+ },
471
+ "maximumSourceExtractedBytes": {
472
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumSourceExtractedBytes"
473
+ },
474
+ "maximumSourceEntries": {
475
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumSourceEntries"
476
+ },
477
+ "maximumLogChunkBytes": {
478
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumLogChunkBytes"
479
+ },
480
+ "maximumTotalLogBytes": {
481
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumTotalLogBytes"
482
+ },
483
+ "maximumWorkspaceBytes": {
484
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumWorkspaceBytes"
485
+ },
486
+ "maximumWorkspaceEntries": {
487
+ "$ref": "../schemas/runner-job.schema.json#/$defs/limits/properties/maximumWorkspaceEntries"
488
+ }
489
+ }
490
+ },
491
+ "ociIsolation": {
492
+ "$ref": "../schemas/runner-job.schema.json#/$defs/isolation"
493
+ },
494
+ "maximumTimeoutMs": {
495
+ "type": "integer",
496
+ "minimum": 1000,
497
+ "maximum": 86400000
498
+ },
499
+ "maximumRetentionDays": {
500
+ "type": "integer",
501
+ "minimum": 1,
502
+ "maximum": 3650
503
+ },
504
+ "deniedEgressHosts": {
505
+ "type": "array",
506
+ "items": {
507
+ "$ref": "../schemas/runner-job.schema.json#/$defs/egressHost"
508
+ }
509
+ },
510
+ "deniedNpmRegistries": {
511
+ "type": "array",
512
+ "items": {
513
+ "$ref": "../schemas/runner-job.schema.json#/$defs/npmRegistry"
514
+ }
515
+ }
516
+ }
517
+ },
518
+ "jobNode": {
519
+ "description": "A job node. job is the compiled job with every secrets value replaced by true, as in the compiled plan digest projection, and with its compiledPlanDigest; secretBindings maps every secrets member to the name of the repository secret whose value the lease inserts.",
520
+ "type": "object",
521
+ "additionalProperties": false,
522
+ "required": [
523
+ "id",
524
+ "kind",
525
+ "needs",
526
+ "job",
527
+ "secretBindings"
528
+ ],
529
+ "properties": {
530
+ "id": {
531
+ "type": "string",
532
+ "minLength": 1
533
+ },
534
+ "kind": {
535
+ "const": "job"
536
+ },
537
+ "needs": {
538
+ "type": "array",
539
+ "uniqueItems": true,
540
+ "items": {
541
+ "type": "string",
542
+ "minLength": 1
543
+ }
544
+ },
545
+ "job": {
546
+ "type": "object"
547
+ },
548
+ "secretBindings": {
549
+ "type": "object",
550
+ "additionalProperties": {
551
+ "$ref": "#/$defs/identifier"
552
+ }
553
+ }
554
+ }
555
+ },
556
+ "assemblyNode": {
557
+ "type": "object",
558
+ "additionalProperties": false,
559
+ "required": [
560
+ "id",
561
+ "kind",
562
+ "needs"
563
+ ],
564
+ "properties": {
565
+ "id": {
566
+ "$ref": "#/$defs/identifier"
567
+ },
568
+ "kind": {
569
+ "const": "assembly"
570
+ },
571
+ "needs": {
572
+ "type": "array",
573
+ "minItems": 1,
574
+ "uniqueItems": true,
575
+ "items": {
576
+ "type": "string",
577
+ "minLength": 1
578
+ }
579
+ }
580
+ }
581
+ },
582
+ "failedExpectation": {
583
+ "type": "object",
584
+ "additionalProperties": false,
585
+ "required": [
586
+ "outcome",
587
+ "code"
588
+ ],
589
+ "properties": {
590
+ "outcome": {
591
+ "const": "failed"
592
+ },
593
+ "code": {
594
+ "$ref": "#/$defs/failureCode"
595
+ }
596
+ }
597
+ },
598
+ "notTriggeredExpectation": {
599
+ "type": "object",
600
+ "additionalProperties": false,
601
+ "required": [
602
+ "outcome"
603
+ ],
604
+ "properties": {
605
+ "outcome": {
606
+ "const": "not-triggered"
607
+ }
608
+ }
609
+ },
610
+ "compiledExpectation": {
611
+ "description": "The run's nodes in plan order. tagVersion is present exactly on a tag run with a tag version; images lists the expanded aliases of every image publication destination exactly on a protected tag run whose workflow publishes images.",
612
+ "type": "object",
613
+ "additionalProperties": false,
614
+ "required": [
615
+ "outcome",
616
+ "workflowDigest",
617
+ "nodes"
618
+ ],
619
+ "properties": {
620
+ "outcome": {
621
+ "const": "compiled"
622
+ },
623
+ "workflowDigest": {
624
+ "$ref": "../schemas/runner-job.schema.json#/$defs/sha256"
625
+ },
626
+ "nodes": {
627
+ "type": "array",
628
+ "minItems": 1,
629
+ "items": {
630
+ "oneOf": [
631
+ {
632
+ "$ref": "#/$defs/jobNode"
633
+ },
634
+ {
635
+ "$ref": "#/$defs/assemblyNode"
636
+ }
637
+ ]
638
+ }
639
+ },
640
+ "tagVersion": {
641
+ "type": "string",
642
+ "minLength": 1
643
+ },
644
+ "images": {
645
+ "type": "array",
646
+ "items": {
647
+ "type": "object",
648
+ "additionalProperties": false,
649
+ "required": [
650
+ "candidate",
651
+ "registry",
652
+ "repository",
653
+ "tags"
654
+ ],
655
+ "properties": {
656
+ "candidate": {
657
+ "$ref": "#/$defs/identifier"
658
+ },
659
+ "registry": {
660
+ "type": "string",
661
+ "minLength": 1
662
+ },
663
+ "repository": {
664
+ "type": "string",
665
+ "minLength": 1
666
+ },
667
+ "tags": {
668
+ "type": "array",
669
+ "minItems": 1,
670
+ "uniqueItems": true,
671
+ "items": {
672
+ "type": "string"
673
+ }
674
+ }
675
+ }
676
+ }
677
+ }
678
+ }
679
+ },
680
+ "compileCase": {
681
+ "description": "One compilation. A case without context and policy expects a failure of the source, yaml, version, schema, or workflow layer, which no run or policy can change. isolated marks a yaml-layer case whose workflow is schema-valid once the violated YAML rule alone is lifted.",
682
+ "type": "object",
683
+ "additionalProperties": false,
684
+ "required": [
685
+ "id",
686
+ "workflow",
687
+ "expected"
688
+ ],
689
+ "properties": {
690
+ "id": {
691
+ "$ref": "#/$defs/identifier"
692
+ },
693
+ "description": {
694
+ "type": "string",
695
+ "minLength": 1
696
+ },
697
+ "workflow": {
698
+ "$ref": "#/$defs/workflowSource"
699
+ },
700
+ "context": {
701
+ "$ref": "#/$defs/context"
702
+ },
703
+ "policy": {
704
+ "$ref": "#/$defs/policy"
705
+ },
706
+ "isolated": {
707
+ "const": true
708
+ },
709
+ "expected": {
710
+ "oneOf": [
711
+ {
712
+ "$ref": "#/$defs/failedExpectation"
713
+ },
714
+ {
715
+ "$ref": "#/$defs/notTriggeredExpectation"
716
+ },
717
+ {
718
+ "$ref": "#/$defs/compiledExpectation"
719
+ }
720
+ ]
721
+ }
722
+ },
723
+ "dependentRequired": {
724
+ "context": [
725
+ "policy"
726
+ ],
727
+ "policy": [
728
+ "context"
729
+ ]
730
+ },
731
+ "if": {
732
+ "type": "object",
733
+ "properties": {
734
+ "expected": {
735
+ "type": "object",
736
+ "properties": {
737
+ "outcome": {
738
+ "enum": [
739
+ "compiled",
740
+ "not-triggered"
741
+ ]
742
+ }
743
+ },
744
+ "required": [
745
+ "outcome"
746
+ ]
747
+ }
748
+ },
749
+ "required": [
750
+ "expected"
751
+ ]
752
+ },
753
+ "then": {
754
+ "type": "object",
755
+ "properties": {
756
+ "context": {},
757
+ "policy": {}
758
+ },
759
+ "required": [
760
+ "context",
761
+ "policy"
762
+ ]
763
+ }
764
+ }
765
+ }
766
+ }