@ship.zone/ci-spec 2.0.0 → 2.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 (34) hide show
  1. package/changelog.md +18 -0
  2. package/conformance/compile-cases.json +2 -2
  3. package/conformance/runner-job-cases.json +703 -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/environment-above-limit.json +206 -0
  9. package/conformance/runner-jobs/incoherent/plan-digest-mismatch.json +70 -0
  10. package/conformance/runner-jobs/incoherent/precedence-limit-before-digest.json +70 -0
  11. package/conformance/runner-jobs/incoherent/reserved-prefix-environment.json +71 -0
  12. package/conformance/runner-jobs/incoherent/reserved-prefix-secret-target.json +72 -0
  13. package/conformance/runner-jobs/incoherent/reserved-variable-missing.json +69 -0
  14. package/conformance/runner-jobs/incoherent/reserved-variable-not-canonical.json +70 -0
  15. package/conformance/runner-jobs/incoherent/secret-target-environment-duplicate.json +72 -0
  16. package/conformance/runner-jobs/incoherent/secret-target-without-build-secret.json +101 -0
  17. package/conformance/runner-jobs/incoherent/secret-value-too-short.json +72 -0
  18. package/conformance/runner-jobs/incoherent/shared-memory-above-memory.json +71 -0
  19. package/conformance/runner-jobs/incoherent/source-above-limit.json +70 -0
  20. package/conformance/runner-jobs/invalid/artifacts-feature-missing.json +91 -0
  21. package/conformance/runner-jobs/invalid/artifacts-none-permission.json +91 -0
  22. package/conformance/runner-jobs/invalid/build-without-push-permission.json +100 -0
  23. package/conformance/runner-jobs/invalid/read-write-cache-read-permission.json +91 -0
  24. package/conformance/runner-jobs/invalid/source-feature-missing.json +70 -0
  25. package/conformance/runner-jobs/invalid/vm-without-platform.json +81 -0
  26. package/dist_ts/00_commitinfo_data.js +1 -1
  27. package/dist_ts/constants.d.ts +42 -0
  28. package/dist_ts/constants.js +57 -1
  29. package/package.json +4 -2
  30. package/readme.md +13 -4
  31. package/spec/runner-protocol.md +31 -1
  32. package/spec/runner.openapi.json +1 -1
  33. package/ts/00_commitinfo_data.ts +1 -1
  34. package/ts/constants.ts +65 -0
@@ -0,0 +1,703 @@
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-environment-above-limit",
311
+ "description": "128 step environment names and NPM_CONFIG_USERCONFIG of npmRead: 129 names.",
312
+ "job": {
313
+ "fixture": "conformance/runner-jobs/incoherent/environment-above-limit.json"
314
+ },
315
+ "expected": {
316
+ "outcome": "incoherent",
317
+ "code": "job_environment_incoherent"
318
+ }
319
+ },
320
+ {
321
+ "id": "fixture-incoherent-plan-digest-mismatch",
322
+ "description": "timeoutMs changed after the digest was computed.",
323
+ "job": {
324
+ "fixture": "conformance/runner-jobs/incoherent/plan-digest-mismatch.json"
325
+ },
326
+ "expected": {
327
+ "outcome": "incoherent",
328
+ "code": "job_digest_mismatch"
329
+ }
330
+ },
331
+ {
332
+ "id": "fixture-incoherent-precedence-limit-before-digest",
333
+ "description": "A source above its limit and a stale digest: the earlier row decides.",
334
+ "job": {
335
+ "fixture": "conformance/runner-jobs/incoherent/precedence-limit-before-digest.json"
336
+ },
337
+ "expected": {
338
+ "outcome": "incoherent",
339
+ "code": "job_limit_incoherent"
340
+ }
341
+ },
342
+ {
343
+ "id": "fixture-incoherent-reserved-prefix-environment",
344
+ "description": "A step environment name with the reserved prefix that the protocol does not reserve.",
345
+ "job": {
346
+ "fixture": "conformance/runner-jobs/incoherent/reserved-prefix-environment.json"
347
+ },
348
+ "expected": {
349
+ "outcome": "incoherent",
350
+ "code": "job_environment_incoherent"
351
+ }
352
+ },
353
+ {
354
+ "id": "fixture-incoherent-reserved-prefix-secret-target",
355
+ "description": "A secret target with the reserved prefix.",
356
+ "job": {
357
+ "fixture": "conformance/runner-jobs/incoherent/reserved-prefix-secret-target.json"
358
+ },
359
+ "expected": {
360
+ "outcome": "incoherent",
361
+ "code": "job_environment_incoherent"
362
+ }
363
+ },
364
+ {
365
+ "id": "fixture-incoherent-reserved-variable-missing",
366
+ "description": "A step without SHIPZONE_CI_INPUTS_JSON.",
367
+ "job": {
368
+ "fixture": "conformance/runner-jobs/incoherent/reserved-variable-missing.json"
369
+ },
370
+ "expected": {
371
+ "outcome": "incoherent",
372
+ "code": "job_environment_incoherent"
373
+ }
374
+ },
375
+ {
376
+ "id": "fixture-incoherent-reserved-variable-not-canonical",
377
+ "description": "SHIPZONE_CI_MATRIX_JSON is a JSON object but not its RFC 8785 serialization.",
378
+ "job": {
379
+ "fixture": "conformance/runner-jobs/incoherent/reserved-variable-not-canonical.json"
380
+ },
381
+ "expected": {
382
+ "outcome": "incoherent",
383
+ "code": "job_environment_incoherent"
384
+ }
385
+ },
386
+ {
387
+ "id": "fixture-incoherent-secret-target-environment-duplicate",
388
+ "description": "A secret target equal to a step environment name.",
389
+ "job": {
390
+ "fixture": "conformance/runner-jobs/incoherent/secret-target-environment-duplicate.json"
391
+ },
392
+ "expected": {
393
+ "outcome": "incoherent",
394
+ "code": "job_environment_incoherent"
395
+ }
396
+ },
397
+ {
398
+ "id": "fixture-incoherent-secret-target-without-build-secret",
399
+ "description": "A key of secrets that no build secret names.",
400
+ "job": {
401
+ "fixture": "conformance/runner-jobs/incoherent/secret-target-without-build-secret.json"
402
+ },
403
+ "expected": {
404
+ "outcome": "incoherent",
405
+ "code": "job_secret_incoherent"
406
+ }
407
+ },
408
+ {
409
+ "id": "fixture-incoherent-secret-value-too-short",
410
+ "description": "A secret value of 7 UTF-8 bytes.",
411
+ "job": {
412
+ "fixture": "conformance/runner-jobs/incoherent/secret-value-too-short.json"
413
+ },
414
+ "expected": {
415
+ "outcome": "incoherent",
416
+ "code": "job_secret_inadmissible"
417
+ }
418
+ },
419
+ {
420
+ "id": "fixture-incoherent-shared-memory-above-memory",
421
+ "description": "sharedMemoryBytes above memoryBytes.",
422
+ "job": {
423
+ "fixture": "conformance/runner-jobs/incoherent/shared-memory-above-memory.json"
424
+ },
425
+ "expected": {
426
+ "outcome": "incoherent",
427
+ "code": "job_resources_incoherent"
428
+ }
429
+ },
430
+ {
431
+ "id": "fixture-incoherent-source-above-limit",
432
+ "description": "A source extractedSizeBytes above maximumSourceExtractedBytes.",
433
+ "job": {
434
+ "fixture": "conformance/runner-jobs/incoherent/source-above-limit.json"
435
+ },
436
+ "expected": {
437
+ "outcome": "incoherent",
438
+ "code": "job_limit_incoherent"
439
+ }
440
+ },
441
+ {
442
+ "id": "version-newer",
443
+ "description": "A canonical spec of a later minor version; otherwise the job is minimal.json.",
444
+ "job": {
445
+ "document": {
446
+ "spec": "2.999.0",
447
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
448
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
449
+ "compiledPlanDigest": "3803b29c9ccb4029f16217883f4d23d15b2ec5fe2052d010cf2ecc533786d887",
450
+ "requirements": {
451
+ "executionProfile": "oci",
452
+ "isolation": "container",
453
+ "labels": [
454
+ "linux"
455
+ ],
456
+ "features": [
457
+ "source.tar-gz"
458
+ ],
459
+ "limits": {
460
+ "maximumSourceArchiveBytes": 1048576,
461
+ "maximumSourceExtractedBytes": 4194304,
462
+ "maximumSourceEntries": 1000,
463
+ "maximumArtifactArchiveBytes": 0,
464
+ "maximumArtifactExtractedBytes": 0,
465
+ "maximumArtifactEntries": 0,
466
+ "maximumArtifacts": 0,
467
+ "maximumCacheArchiveBytes": 0,
468
+ "maximumCacheExtractedBytes": 0,
469
+ "maximumCacheEntries": 0,
470
+ "maximumCaches": 0,
471
+ "maximumLogChunkBytes": 65536,
472
+ "maximumTotalLogBytes": 10485760,
473
+ "maximumWorkspaceBytes": 268435456,
474
+ "maximumWorkspaceEntries": 100000
475
+ }
476
+ },
477
+ "permissions": {
478
+ "source": "read",
479
+ "artifacts": "none",
480
+ "caches": "none",
481
+ "images": "none"
482
+ },
483
+ "network": {
484
+ "mode": "none"
485
+ },
486
+ "execution": {
487
+ "profile": "oci",
488
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
489
+ "workingDirectory": "/workspace"
490
+ },
491
+ "steps": [
492
+ {
493
+ "name": "Test",
494
+ "command": [
495
+ "pnpm",
496
+ "test"
497
+ ],
498
+ "environment": {
499
+ "CI": "true",
500
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
501
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
502
+ }
503
+ }
504
+ ],
505
+ "source": {
506
+ "format": "tar.gz",
507
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
508
+ "sizeBytes": 1024,
509
+ "extractedSizeBytes": 4096,
510
+ "entryCount": 4
511
+ },
512
+ "secrets": {},
513
+ "timeoutMs": 60000,
514
+ "resources": {
515
+ "memoryBytes": 268435456,
516
+ "cpus": 1,
517
+ "pids": 256
518
+ },
519
+ "artifacts": [],
520
+ "caches": []
521
+ }
522
+ },
523
+ "expected": {
524
+ "outcome": "incoherent",
525
+ "code": "spec_incompatible"
526
+ }
527
+ },
528
+ {
529
+ "id": "version-major-mismatch",
530
+ "description": "A canonical spec of another major version; otherwise the job is minimal.json.",
531
+ "job": {
532
+ "document": {
533
+ "spec": "1.2.0",
534
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
535
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
536
+ "compiledPlanDigest": "181ac40a57cc67029f4b3d2d723d4fc9b61fe22e54fefbe16ed71fca1f39fb93",
537
+ "requirements": {
538
+ "executionProfile": "oci",
539
+ "isolation": "container",
540
+ "labels": [
541
+ "linux"
542
+ ],
543
+ "features": [
544
+ "source.tar-gz"
545
+ ],
546
+ "limits": {
547
+ "maximumSourceArchiveBytes": 1048576,
548
+ "maximumSourceExtractedBytes": 4194304,
549
+ "maximumSourceEntries": 1000,
550
+ "maximumArtifactArchiveBytes": 0,
551
+ "maximumArtifactExtractedBytes": 0,
552
+ "maximumArtifactEntries": 0,
553
+ "maximumArtifacts": 0,
554
+ "maximumCacheArchiveBytes": 0,
555
+ "maximumCacheExtractedBytes": 0,
556
+ "maximumCacheEntries": 0,
557
+ "maximumCaches": 0,
558
+ "maximumLogChunkBytes": 65536,
559
+ "maximumTotalLogBytes": 10485760,
560
+ "maximumWorkspaceBytes": 268435456,
561
+ "maximumWorkspaceEntries": 100000
562
+ }
563
+ },
564
+ "permissions": {
565
+ "source": "read",
566
+ "artifacts": "none",
567
+ "caches": "none",
568
+ "images": "none"
569
+ },
570
+ "network": {
571
+ "mode": "none"
572
+ },
573
+ "execution": {
574
+ "profile": "oci",
575
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
576
+ "workingDirectory": "/workspace"
577
+ },
578
+ "steps": [
579
+ {
580
+ "name": "Test",
581
+ "command": [
582
+ "pnpm",
583
+ "test"
584
+ ],
585
+ "environment": {
586
+ "CI": "true",
587
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
588
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
589
+ }
590
+ }
591
+ ],
592
+ "source": {
593
+ "format": "tar.gz",
594
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
595
+ "sizeBytes": 1024,
596
+ "extractedSizeBytes": 4096,
597
+ "entryCount": 4
598
+ },
599
+ "secrets": {},
600
+ "timeoutMs": 60000,
601
+ "resources": {
602
+ "memoryBytes": 268435456,
603
+ "cpus": 1,
604
+ "pids": 256
605
+ },
606
+ "artifacts": [],
607
+ "caches": []
608
+ }
609
+ },
610
+ "expected": {
611
+ "outcome": "incoherent",
612
+ "code": "spec_incompatible"
613
+ }
614
+ },
615
+ {
616
+ "id": "version-malformed",
617
+ "description": "A malformed spec is a schema failure, not a version failure.",
618
+ "job": {
619
+ "document": {
620
+ "spec": "2.1",
621
+ "sourceObjectId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
622
+ "workflowDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
623
+ "compiledPlanDigest": "b3388562a9b8a7ec0335dd726c348d50cd397ff3aa8a894ea00ab50676cbdba1",
624
+ "requirements": {
625
+ "executionProfile": "oci",
626
+ "isolation": "container",
627
+ "labels": [
628
+ "linux"
629
+ ],
630
+ "features": [
631
+ "source.tar-gz"
632
+ ],
633
+ "limits": {
634
+ "maximumSourceArchiveBytes": 1048576,
635
+ "maximumSourceExtractedBytes": 4194304,
636
+ "maximumSourceEntries": 1000,
637
+ "maximumArtifactArchiveBytes": 0,
638
+ "maximumArtifactExtractedBytes": 0,
639
+ "maximumArtifactEntries": 0,
640
+ "maximumArtifacts": 0,
641
+ "maximumCacheArchiveBytes": 0,
642
+ "maximumCacheExtractedBytes": 0,
643
+ "maximumCacheEntries": 0,
644
+ "maximumCaches": 0,
645
+ "maximumLogChunkBytes": 65536,
646
+ "maximumTotalLogBytes": 10485760,
647
+ "maximumWorkspaceBytes": 268435456,
648
+ "maximumWorkspaceEntries": 100000
649
+ }
650
+ },
651
+ "permissions": {
652
+ "source": "read",
653
+ "artifacts": "none",
654
+ "caches": "none",
655
+ "images": "none"
656
+ },
657
+ "network": {
658
+ "mode": "none"
659
+ },
660
+ "execution": {
661
+ "profile": "oci",
662
+ "image": "registry.example/ci@sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
663
+ "workingDirectory": "/workspace"
664
+ },
665
+ "steps": [
666
+ {
667
+ "name": "Test",
668
+ "command": [
669
+ "pnpm",
670
+ "test"
671
+ ],
672
+ "environment": {
673
+ "CI": "true",
674
+ "SHIPZONE_CI_INPUTS_JSON": "{}",
675
+ "SHIPZONE_CI_MATRIX_JSON": "{}"
676
+ }
677
+ }
678
+ ],
679
+ "source": {
680
+ "format": "tar.gz",
681
+ "sha256": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
682
+ "sizeBytes": 1024,
683
+ "extractedSizeBytes": 4096,
684
+ "entryCount": 4
685
+ },
686
+ "secrets": {},
687
+ "timeoutMs": 60000,
688
+ "resources": {
689
+ "memoryBytes": 268435456,
690
+ "cpus": 1,
691
+ "pids": 256
692
+ },
693
+ "artifacts": [],
694
+ "caches": []
695
+ }
696
+ },
697
+ "expected": {
698
+ "outcome": "incoherent",
699
+ "code": "job_schema_invalid"
700
+ }
701
+ }
702
+ ]
703
+ }