@ship.zone/ci-spec 2.0.0 → 2.1.1

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 (36) hide show
  1. package/changelog.md +33 -0
  2. package/conformance/compile-cases.json +822 -2
  3. package/conformance/runner-job-cases.json +714 -0
  4. package/conformance/runner-job-cases.schema.json +134 -0
  5. package/conformance/runner-jobs/incoherent/artifact-maximum-above-limit.json +91 -0
  6. package/conformance/runner-jobs/incoherent/build-secret-unknown-target.json +104 -0
  7. package/conformance/runner-jobs/incoherent/cache-count-above-limit.json +91 -0
  8. package/conformance/runner-jobs/incoherent/command-argument-above-limit.json +70 -0
  9. package/conformance/runner-jobs/incoherent/environment-above-limit.json +206 -0
  10. package/conformance/runner-jobs/incoherent/plan-digest-mismatch.json +70 -0
  11. package/conformance/runner-jobs/incoherent/precedence-limit-before-digest.json +70 -0
  12. package/conformance/runner-jobs/incoherent/reserved-prefix-environment.json +71 -0
  13. package/conformance/runner-jobs/incoherent/reserved-prefix-secret-target.json +72 -0
  14. package/conformance/runner-jobs/incoherent/reserved-variable-missing.json +69 -0
  15. package/conformance/runner-jobs/incoherent/reserved-variable-not-canonical.json +70 -0
  16. package/conformance/runner-jobs/incoherent/secret-target-environment-duplicate.json +72 -0
  17. package/conformance/runner-jobs/incoherent/secret-target-without-build-secret.json +101 -0
  18. package/conformance/runner-jobs/incoherent/secret-value-too-short.json +72 -0
  19. package/conformance/runner-jobs/incoherent/shared-memory-above-memory.json +71 -0
  20. package/conformance/runner-jobs/incoherent/source-above-limit.json +70 -0
  21. package/conformance/runner-jobs/invalid/artifacts-feature-missing.json +91 -0
  22. package/conformance/runner-jobs/invalid/artifacts-none-permission.json +91 -0
  23. package/conformance/runner-jobs/invalid/build-without-push-permission.json +100 -0
  24. package/conformance/runner-jobs/invalid/read-write-cache-read-permission.json +91 -0
  25. package/conformance/runner-jobs/invalid/source-feature-missing.json +70 -0
  26. package/conformance/runner-jobs/invalid/vm-without-platform.json +81 -0
  27. package/dist_ts/00_commitinfo_data.js +1 -1
  28. package/dist_ts/constants.d.ts +42 -0
  29. package/dist_ts/constants.js +57 -1
  30. package/package.json +4 -2
  31. package/readme.md +13 -4
  32. package/spec/ci-actions.md +12 -5
  33. package/spec/runner-protocol.md +32 -1
  34. package/spec/runner.openapi.json +1 -1
  35. package/ts/00_commitinfo_data.ts +1 -1
  36. package/ts/constants.ts +65 -0
@@ -0,0 +1,714 @@
1
+ {
2
+ "spec": "2.1.0",
3
+ "failureCodes": [
4
+ "spec_incompatible",
5
+ "job_schema_invalid",
6
+ "job_secret_incoherent",
7
+ "job_limit_incoherent",
8
+ "job_resources_incoherent",
9
+ "job_environment_incoherent",
10
+ "job_command_limit_exceeded",
11
+ "job_secret_inadmissible",
12
+ "job_digest_mismatch"
13
+ ],
14
+ "cases": [
15
+ {
16
+ "id": "fixture-valid-candidate-test",
17
+ "job": {
18
+ "fixture": "conformance/runner-jobs/valid/candidate-test.json"
19
+ },
20
+ "expected": {
21
+ "outcome": "coherent"
22
+ }
23
+ },
24
+ {
25
+ "id": "fixture-valid-egress",
26
+ "job": {
27
+ "fixture": "conformance/runner-jobs/valid/egress.json"
28
+ },
29
+ "expected": {
30
+ "outcome": "coherent"
31
+ }
32
+ },
33
+ {
34
+ "id": "fixture-valid-image-build",
35
+ "job": {
36
+ "fixture": "conformance/runner-jobs/valid/image-build.json"
37
+ },
38
+ "expected": {
39
+ "outcome": "coherent"
40
+ }
41
+ },
42
+ {
43
+ "id": "fixture-valid-minimal",
44
+ "job": {
45
+ "fixture": "conformance/runner-jobs/valid/minimal.json"
46
+ },
47
+ "expected": {
48
+ "outcome": "coherent"
49
+ }
50
+ },
51
+ {
52
+ "id": "fixture-valid-npm-read",
53
+ "job": {
54
+ "fixture": "conformance/runner-jobs/valid/npm-read.json"
55
+ },
56
+ "expected": {
57
+ "outcome": "coherent"
58
+ }
59
+ },
60
+ {
61
+ "id": "fixture-valid-resources",
62
+ "job": {
63
+ "fixture": "conformance/runner-jobs/valid/resources.json"
64
+ },
65
+ "expected": {
66
+ "outcome": "coherent"
67
+ }
68
+ },
69
+ {
70
+ "id": "fixture-valid-timeout-retention-defaults",
71
+ "job": {
72
+ "fixture": "conformance/runner-jobs/valid/timeout-retention-defaults.json"
73
+ },
74
+ "expected": {
75
+ "outcome": "coherent"
76
+ }
77
+ },
78
+ {
79
+ "id": "fixture-valid-vm-darwin",
80
+ "job": {
81
+ "fixture": "conformance/runner-jobs/valid/vm-darwin.json"
82
+ },
83
+ "expected": {
84
+ "outcome": "coherent"
85
+ }
86
+ },
87
+ {
88
+ "id": "fixture-valid-vm",
89
+ "job": {
90
+ "fixture": "conformance/runner-jobs/valid/vm.json"
91
+ },
92
+ "expected": {
93
+ "outcome": "coherent"
94
+ }
95
+ },
96
+ {
97
+ "id": "fixture-invalid-artifacts-feature-missing",
98
+ "job": {
99
+ "fixture": "conformance/runner-jobs/invalid/artifacts-feature-missing.json"
100
+ },
101
+ "expected": {
102
+ "outcome": "incoherent",
103
+ "code": "job_schema_invalid"
104
+ }
105
+ },
106
+ {
107
+ "id": "fixture-invalid-artifacts-none-permission",
108
+ "job": {
109
+ "fixture": "conformance/runner-jobs/invalid/artifacts-none-permission.json"
110
+ },
111
+ "expected": {
112
+ "outcome": "incoherent",
113
+ "code": "job_schema_invalid"
114
+ }
115
+ },
116
+ {
117
+ "id": "fixture-invalid-bridge-network",
118
+ "job": {
119
+ "fixture": "conformance/runner-jobs/invalid/bridge-network.json"
120
+ },
121
+ "expected": {
122
+ "outcome": "incoherent",
123
+ "code": "job_schema_invalid"
124
+ }
125
+ },
126
+ {
127
+ "id": "fixture-invalid-build-darwin-platform",
128
+ "job": {
129
+ "fixture": "conformance/runner-jobs/invalid/build-darwin-platform.json"
130
+ },
131
+ "expected": {
132
+ "outcome": "incoherent",
133
+ "code": "job_schema_invalid"
134
+ }
135
+ },
136
+ {
137
+ "id": "fixture-invalid-build-with-steps",
138
+ "job": {
139
+ "fixture": "conformance/runner-jobs/invalid/build-with-steps.json"
140
+ },
141
+ "expected": {
142
+ "outcome": "incoherent",
143
+ "code": "job_schema_invalid"
144
+ }
145
+ },
146
+ {
147
+ "id": "fixture-invalid-build-without-microvm",
148
+ "job": {
149
+ "fixture": "conformance/runner-jobs/invalid/build-without-microvm.json"
150
+ },
151
+ "expected": {
152
+ "outcome": "incoherent",
153
+ "code": "job_schema_invalid"
154
+ }
155
+ },
156
+ {
157
+ "id": "fixture-invalid-build-without-push-permission",
158
+ "job": {
159
+ "fixture": "conformance/runner-jobs/invalid/build-without-push-permission.json"
160
+ },
161
+ "expected": {
162
+ "outcome": "incoherent",
163
+ "code": "job_schema_invalid"
164
+ }
165
+ },
166
+ {
167
+ "id": "fixture-invalid-egress-empty-allowlist",
168
+ "job": {
169
+ "fixture": "conformance/runner-jobs/invalid/egress-empty-allowlist.json"
170
+ },
171
+ "expected": {
172
+ "outcome": "incoherent",
173
+ "code": "job_schema_invalid"
174
+ }
175
+ },
176
+ {
177
+ "id": "fixture-invalid-mutable-image",
178
+ "job": {
179
+ "fixture": "conformance/runner-jobs/invalid/mutable-image.json"
180
+ },
181
+ "expected": {
182
+ "outcome": "incoherent",
183
+ "code": "job_schema_invalid"
184
+ }
185
+ },
186
+ {
187
+ "id": "fixture-invalid-npm-read-reserved-environment",
188
+ "job": {
189
+ "fixture": "conformance/runner-jobs/invalid/npm-read-reserved-environment.json"
190
+ },
191
+ "expected": {
192
+ "outcome": "incoherent",
193
+ "code": "job_schema_invalid"
194
+ }
195
+ },
196
+ {
197
+ "id": "fixture-invalid-oci-darwin-platform",
198
+ "job": {
199
+ "fixture": "conformance/runner-jobs/invalid/oci-darwin-platform.json"
200
+ },
201
+ "expected": {
202
+ "outcome": "incoherent",
203
+ "code": "job_schema_invalid"
204
+ }
205
+ },
206
+ {
207
+ "id": "fixture-invalid-push-permission-container",
208
+ "job": {
209
+ "fixture": "conformance/runner-jobs/invalid/push-permission-container.json"
210
+ },
211
+ "expected": {
212
+ "outcome": "incoherent",
213
+ "code": "job_schema_invalid"
214
+ }
215
+ },
216
+ {
217
+ "id": "fixture-invalid-read-write-cache-read-permission",
218
+ "job": {
219
+ "fixture": "conformance/runner-jobs/invalid/read-write-cache-read-permission.json"
220
+ },
221
+ "expected": {
222
+ "outcome": "incoherent",
223
+ "code": "job_schema_invalid"
224
+ }
225
+ },
226
+ {
227
+ "id": "fixture-invalid-shared-memory-below-minimum",
228
+ "job": {
229
+ "fixture": "conformance/runner-jobs/invalid/shared-memory-below-minimum.json"
230
+ },
231
+ "expected": {
232
+ "outcome": "incoherent",
233
+ "code": "job_schema_invalid"
234
+ }
235
+ },
236
+ {
237
+ "id": "fixture-invalid-source-feature-missing",
238
+ "job": {
239
+ "fixture": "conformance/runner-jobs/invalid/source-feature-missing.json"
240
+ },
241
+ "expected": {
242
+ "outcome": "incoherent",
243
+ "code": "job_schema_invalid"
244
+ }
245
+ },
246
+ {
247
+ "id": "fixture-invalid-timeout-missing",
248
+ "job": {
249
+ "fixture": "conformance/runner-jobs/invalid/timeout-missing.json"
250
+ },
251
+ "expected": {
252
+ "outcome": "incoherent",
253
+ "code": "job_schema_invalid"
254
+ }
255
+ },
256
+ {
257
+ "id": "fixture-invalid-vm-without-microvm",
258
+ "job": {
259
+ "fixture": "conformance/runner-jobs/invalid/vm-without-microvm.json"
260
+ },
261
+ "expected": {
262
+ "outcome": "incoherent",
263
+ "code": "job_schema_invalid"
264
+ }
265
+ },
266
+ {
267
+ "id": "fixture-invalid-vm-without-platform",
268
+ "job": {
269
+ "fixture": "conformance/runner-jobs/invalid/vm-without-platform.json"
270
+ },
271
+ "expected": {
272
+ "outcome": "incoherent",
273
+ "code": "job_schema_invalid"
274
+ }
275
+ },
276
+ {
277
+ "id": "fixture-incoherent-artifact-maximum-above-limit",
278
+ "description": "An artifact maximumBytes above maximumArtifactArchiveBytes.",
279
+ "job": {
280
+ "fixture": "conformance/runner-jobs/incoherent/artifact-maximum-above-limit.json"
281
+ },
282
+ "expected": {
283
+ "outcome": "incoherent",
284
+ "code": "job_limit_incoherent"
285
+ }
286
+ },
287
+ {
288
+ "id": "fixture-incoherent-build-secret-unknown-target",
289
+ "description": "A build secret names an environment that is not a key of secrets.",
290
+ "job": {
291
+ "fixture": "conformance/runner-jobs/incoherent/build-secret-unknown-target.json"
292
+ },
293
+ "expected": {
294
+ "outcome": "incoherent",
295
+ "code": "job_secret_incoherent"
296
+ }
297
+ },
298
+ {
299
+ "id": "fixture-incoherent-cache-count-above-limit",
300
+ "description": "One cache with maximumCaches 0.",
301
+ "job": {
302
+ "fixture": "conformance/runner-jobs/incoherent/cache-count-above-limit.json"
303
+ },
304
+ "expected": {
305
+ "outcome": "incoherent",
306
+ "code": "job_limit_incoherent"
307
+ }
308
+ },
309
+ {
310
+ "id": "fixture-incoherent-command-argument-above-limit",
311
+ "description": "An argument of 8,193 characters and 16,385 UTF-8 bytes: within the schema, above the argument limit.",
312
+ "job": {
313
+ "fixture": "conformance/runner-jobs/incoherent/command-argument-above-limit.json"
314
+ },
315
+ "expected": {
316
+ "outcome": "incoherent",
317
+ "code": "job_command_limit_exceeded"
318
+ }
319
+ },
320
+ {
321
+ "id": "fixture-incoherent-environment-above-limit",
322
+ "description": "128 step environment names and NPM_CONFIG_USERCONFIG of npmRead: 129 names.",
323
+ "job": {
324
+ "fixture": "conformance/runner-jobs/incoherent/environment-above-limit.json"
325
+ },
326
+ "expected": {
327
+ "outcome": "incoherent",
328
+ "code": "job_environment_incoherent"
329
+ }
330
+ },
331
+ {
332
+ "id": "fixture-incoherent-plan-digest-mismatch",
333
+ "description": "timeoutMs changed after the digest was computed.",
334
+ "job": {
335
+ "fixture": "conformance/runner-jobs/incoherent/plan-digest-mismatch.json"
336
+ },
337
+ "expected": {
338
+ "outcome": "incoherent",
339
+ "code": "job_digest_mismatch"
340
+ }
341
+ },
342
+ {
343
+ "id": "fixture-incoherent-precedence-limit-before-digest",
344
+ "description": "A source above its limit and a stale digest: the earlier row decides.",
345
+ "job": {
346
+ "fixture": "conformance/runner-jobs/incoherent/precedence-limit-before-digest.json"
347
+ },
348
+ "expected": {
349
+ "outcome": "incoherent",
350
+ "code": "job_limit_incoherent"
351
+ }
352
+ },
353
+ {
354
+ "id": "fixture-incoherent-reserved-prefix-environment",
355
+ "description": "A step environment name with the reserved prefix that the protocol does not reserve.",
356
+ "job": {
357
+ "fixture": "conformance/runner-jobs/incoherent/reserved-prefix-environment.json"
358
+ },
359
+ "expected": {
360
+ "outcome": "incoherent",
361
+ "code": "job_environment_incoherent"
362
+ }
363
+ },
364
+ {
365
+ "id": "fixture-incoherent-reserved-prefix-secret-target",
366
+ "description": "A secret target with the reserved prefix.",
367
+ "job": {
368
+ "fixture": "conformance/runner-jobs/incoherent/reserved-prefix-secret-target.json"
369
+ },
370
+ "expected": {
371
+ "outcome": "incoherent",
372
+ "code": "job_environment_incoherent"
373
+ }
374
+ },
375
+ {
376
+ "id": "fixture-incoherent-reserved-variable-missing",
377
+ "description": "A step without SHIPZONE_CI_INPUTS_JSON.",
378
+ "job": {
379
+ "fixture": "conformance/runner-jobs/incoherent/reserved-variable-missing.json"
380
+ },
381
+ "expected": {
382
+ "outcome": "incoherent",
383
+ "code": "job_environment_incoherent"
384
+ }
385
+ },
386
+ {
387
+ "id": "fixture-incoherent-reserved-variable-not-canonical",
388
+ "description": "SHIPZONE_CI_MATRIX_JSON is a JSON object but not its RFC 8785 serialization.",
389
+ "job": {
390
+ "fixture": "conformance/runner-jobs/incoherent/reserved-variable-not-canonical.json"
391
+ },
392
+ "expected": {
393
+ "outcome": "incoherent",
394
+ "code": "job_environment_incoherent"
395
+ }
396
+ },
397
+ {
398
+ "id": "fixture-incoherent-secret-target-environment-duplicate",
399
+ "description": "A secret target equal to a step environment name.",
400
+ "job": {
401
+ "fixture": "conformance/runner-jobs/incoherent/secret-target-environment-duplicate.json"
402
+ },
403
+ "expected": {
404
+ "outcome": "incoherent",
405
+ "code": "job_environment_incoherent"
406
+ }
407
+ },
408
+ {
409
+ "id": "fixture-incoherent-secret-target-without-build-secret",
410
+ "description": "A key of secrets that no build secret names.",
411
+ "job": {
412
+ "fixture": "conformance/runner-jobs/incoherent/secret-target-without-build-secret.json"
413
+ },
414
+ "expected": {
415
+ "outcome": "incoherent",
416
+ "code": "job_secret_incoherent"
417
+ }
418
+ },
419
+ {
420
+ "id": "fixture-incoherent-secret-value-too-short",
421
+ "description": "A secret value of 7 UTF-8 bytes.",
422
+ "job": {
423
+ "fixture": "conformance/runner-jobs/incoherent/secret-value-too-short.json"
424
+ },
425
+ "expected": {
426
+ "outcome": "incoherent",
427
+ "code": "job_secret_inadmissible"
428
+ }
429
+ },
430
+ {
431
+ "id": "fixture-incoherent-shared-memory-above-memory",
432
+ "description": "sharedMemoryBytes above memoryBytes.",
433
+ "job": {
434
+ "fixture": "conformance/runner-jobs/incoherent/shared-memory-above-memory.json"
435
+ },
436
+ "expected": {
437
+ "outcome": "incoherent",
438
+ "code": "job_resources_incoherent"
439
+ }
440
+ },
441
+ {
442
+ "id": "fixture-incoherent-source-above-limit",
443
+ "description": "A source extractedSizeBytes above maximumSourceExtractedBytes.",
444
+ "job": {
445
+ "fixture": "conformance/runner-jobs/incoherent/source-above-limit.json"
446
+ },
447
+ "expected": {
448
+ "outcome": "incoherent",
449
+ "code": "job_limit_incoherent"
450
+ }
451
+ },
452
+ {
453
+ "id": "version-newer",
454
+ "description": "A canonical spec of a later minor version; otherwise the job is minimal.json.",
455
+ "job": {
456
+ "document": {
457
+ "spec": "2.999.0",
458
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
459
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
460
+ "compiledPlanDigest": "3803b29c9ccb4029f16217883f4d23d15b2ec5fe2052d010cf2ecc533786d887",
461
+ "requirements": {
462
+ "executionProfile": "oci",
463
+ "isolation": "container",
464
+ "labels": [
465
+ "linux"
466
+ ],
467
+ "features": [
468
+ "source.tar-gz"
469
+ ],
470
+ "limits": {
471
+ "maximumSourceArchiveBytes": 1048576,
472
+ "maximumSourceExtractedBytes": 4194304,
473
+ "maximumSourceEntries": 1000,
474
+ "maximumArtifactArchiveBytes": 0,
475
+ "maximumArtifactExtractedBytes": 0,
476
+ "maximumArtifactEntries": 0,
477
+ "maximumArtifacts": 0,
478
+ "maximumCacheArchiveBytes": 0,
479
+ "maximumCacheExtractedBytes": 0,
480
+ "maximumCacheEntries": 0,
481
+ "maximumCaches": 0,
482
+ "maximumLogChunkBytes": 65536,
483
+ "maximumTotalLogBytes": 10485760,
484
+ "maximumWorkspaceBytes": 268435456,
485
+ "maximumWorkspaceEntries": 100000
486
+ }
487
+ },
488
+ "permissions": {
489
+ "source": "read",
490
+ "artifacts": "none",
491
+ "caches": "none",
492
+ "images": "none"
493
+ },
494
+ "network": {
495
+ "mode": "none"
496
+ },
497
+ "execution": {
498
+ "profile": "oci",
499
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
500
+ "workingDirectory": "/workspace"
501
+ },
502
+ "steps": [
503
+ {
504
+ "name": "Test",
505
+ "command": [
506
+ "pnpm",
507
+ "test"
508
+ ],
509
+ "environment": {
510
+ "CI": "true",
511
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
512
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
513
+ }
514
+ }
515
+ ],
516
+ "source": {
517
+ "format": "tar.gz",
518
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
519
+ "sizeBytes": 1024,
520
+ "extractedSizeBytes": 4096,
521
+ "entryCount": 4
522
+ },
523
+ "secrets": {},
524
+ "timeoutMs": 60000,
525
+ "resources": {
526
+ "memoryBytes": 268435456,
527
+ "cpus": 1,
528
+ "pids": 256
529
+ },
530
+ "artifacts": [],
531
+ "caches": []
532
+ }
533
+ },
534
+ "expected": {
535
+ "outcome": "incoherent",
536
+ "code": "spec_incompatible"
537
+ }
538
+ },
539
+ {
540
+ "id": "version-major-mismatch",
541
+ "description": "A canonical spec of another major version; otherwise the job is minimal.json.",
542
+ "job": {
543
+ "document": {
544
+ "spec": "1.2.0",
545
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
546
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
547
+ "compiledPlanDigest": "181ac40a57cc67029f4b3d2d723d4fc9b61fe22e54fefbe16ed71fca1f39fb93",
548
+ "requirements": {
549
+ "executionProfile": "oci",
550
+ "isolation": "container",
551
+ "labels": [
552
+ "linux"
553
+ ],
554
+ "features": [
555
+ "source.tar-gz"
556
+ ],
557
+ "limits": {
558
+ "maximumSourceArchiveBytes": 1048576,
559
+ "maximumSourceExtractedBytes": 4194304,
560
+ "maximumSourceEntries": 1000,
561
+ "maximumArtifactArchiveBytes": 0,
562
+ "maximumArtifactExtractedBytes": 0,
563
+ "maximumArtifactEntries": 0,
564
+ "maximumArtifacts": 0,
565
+ "maximumCacheArchiveBytes": 0,
566
+ "maximumCacheExtractedBytes": 0,
567
+ "maximumCacheEntries": 0,
568
+ "maximumCaches": 0,
569
+ "maximumLogChunkBytes": 65536,
570
+ "maximumTotalLogBytes": 10485760,
571
+ "maximumWorkspaceBytes": 268435456,
572
+ "maximumWorkspaceEntries": 100000
573
+ }
574
+ },
575
+ "permissions": {
576
+ "source": "read",
577
+ "artifacts": "none",
578
+ "caches": "none",
579
+ "images": "none"
580
+ },
581
+ "network": {
582
+ "mode": "none"
583
+ },
584
+ "execution": {
585
+ "profile": "oci",
586
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
587
+ "workingDirectory": "/workspace"
588
+ },
589
+ "steps": [
590
+ {
591
+ "name": "Test",
592
+ "command": [
593
+ "pnpm",
594
+ "test"
595
+ ],
596
+ "environment": {
597
+ "CI": "true",
598
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
599
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
600
+ }
601
+ }
602
+ ],
603
+ "source": {
604
+ "format": "tar.gz",
605
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
606
+ "sizeBytes": 1024,
607
+ "extractedSizeBytes": 4096,
608
+ "entryCount": 4
609
+ },
610
+ "secrets": {},
611
+ "timeoutMs": 60000,
612
+ "resources": {
613
+ "memoryBytes": 268435456,
614
+ "cpus": 1,
615
+ "pids": 256
616
+ },
617
+ "artifacts": [],
618
+ "caches": []
619
+ }
620
+ },
621
+ "expected": {
622
+ "outcome": "incoherent",
623
+ "code": "spec_incompatible"
624
+ }
625
+ },
626
+ {
627
+ "id": "version-malformed",
628
+ "description": "A malformed spec is a schema failure, not a version failure.",
629
+ "job": {
630
+ "document": {
631
+ "spec": "2.1",
632
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
633
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
634
+ "compiledPlanDigest": "b3388562a9b8a7ec0335dd726c348d50cd397ff3aa8a894ea00ab50676cbdba1",
635
+ "requirements": {
636
+ "executionProfile": "oci",
637
+ "isolation": "container",
638
+ "labels": [
639
+ "linux"
640
+ ],
641
+ "features": [
642
+ "source.tar-gz"
643
+ ],
644
+ "limits": {
645
+ "maximumSourceArchiveBytes": 1048576,
646
+ "maximumSourceExtractedBytes": 4194304,
647
+ "maximumSourceEntries": 1000,
648
+ "maximumArtifactArchiveBytes": 0,
649
+ "maximumArtifactExtractedBytes": 0,
650
+ "maximumArtifactEntries": 0,
651
+ "maximumArtifacts": 0,
652
+ "maximumCacheArchiveBytes": 0,
653
+ "maximumCacheExtractedBytes": 0,
654
+ "maximumCacheEntries": 0,
655
+ "maximumCaches": 0,
656
+ "maximumLogChunkBytes": 65536,
657
+ "maximumTotalLogBytes": 10485760,
658
+ "maximumWorkspaceBytes": 268435456,
659
+ "maximumWorkspaceEntries": 100000
660
+ }
661
+ },
662
+ "permissions": {
663
+ "source": "read",
664
+ "artifacts": "none",
665
+ "caches": "none",
666
+ "images": "none"
667
+ },
668
+ "network": {
669
+ "mode": "none"
670
+ },
671
+ "execution": {
672
+ "profile": "oci",
673
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
674
+ "workingDirectory": "/workspace"
675
+ },
676
+ "steps": [
677
+ {
678
+ "name": "Test",
679
+ "command": [
680
+ "pnpm",
681
+ "test"
682
+ ],
683
+ "environment": {
684
+ "CI": "true",
685
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
686
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
687
+ }
688
+ }
689
+ ],
690
+ "source": {
691
+ "format": "tar.gz",
692
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
693
+ "sizeBytes": 1024,
694
+ "extractedSizeBytes": 4096,
695
+ "entryCount": 4
696
+ },
697
+ "secrets": {},
698
+ "timeoutMs": 60000,
699
+ "resources": {
700
+ "memoryBytes": 268435456,
701
+ "cpus": 1,
702
+ "pids": 256
703
+ },
704
+ "artifacts": [],
705
+ "caches": []
706
+ }
707
+ },
708
+ "expected": {
709
+ "outcome": "incoherent",
710
+ "code": "job_schema_invalid"
711
+ }
712
+ }
713
+ ]
714
+ }