devcontour-harness 0.1.0-alpha.5 → 0.1.0-alpha.7

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 (263) hide show
  1. package/README.md +42 -2
  2. package/docs/compatibility-versions.md +56 -0
  3. package/docs/compatibility.md +2 -2
  4. package/docs/connectors.md +323 -0
  5. package/docs/contracts.md +33 -5
  6. package/docs/integrations/hindsight.md +148 -0
  7. package/docs/quickstart.md +1 -1
  8. package/docs/release-notes/0.1.0-alpha.6.md +238 -0
  9. package/docs/release-notes/0.1.0-alpha.7.md +71 -0
  10. package/docs/review-probes.md +199 -0
  11. package/docs/review-protocol.md +251 -0
  12. package/docs/toolchains.md +167 -0
  13. package/docs/turbo-starter.md +269 -0
  14. package/docs/upgrade.md +77 -24
  15. package/examples/README.md +1 -0
  16. package/examples/toolchains/README.md +32 -0
  17. package/examples/toolchains/go/bad/label/label.go +9 -0
  18. package/examples/toolchains/go/good/label/label.go +9 -0
  19. package/examples/toolchains/go/policy.json +79 -0
  20. package/examples/toolchains/go/repo/REQUIREMENTS.md +9 -0
  21. package/examples/toolchains/go/repo/_gitignore +1 -0
  22. package/examples/toolchains/go/repo/go.mod +5 -0
  23. package/examples/toolchains/go/repo/go.sum +2 -0
  24. package/examples/toolchains/go/repo/label/label.go +9 -0
  25. package/examples/toolchains/go/repo/label/label_test.go +27 -0
  26. package/examples/toolchains/go/repo/label/version.go +9 -0
  27. package/examples/toolchains/go/task.json +25 -0
  28. package/examples/toolchains/mixed-go/bad/backend/label/label.go +9 -0
  29. package/examples/toolchains/mixed-go/bad/frontend/src/label.js +4 -0
  30. package/examples/toolchains/mixed-go/good/backend/label/label.go +9 -0
  31. package/examples/toolchains/mixed-go/good/frontend/src/label.js +4 -0
  32. package/examples/toolchains/mixed-go/policy.json +126 -0
  33. package/examples/toolchains/mixed-go/repo/REQUIREMENTS.md +9 -0
  34. package/examples/toolchains/mixed-go/repo/_gitignore +6 -0
  35. package/examples/toolchains/mixed-go/repo/backend/go.mod +3 -0
  36. package/examples/toolchains/mixed-go/repo/backend/label/label.go +9 -0
  37. package/examples/toolchains/mixed-go/repo/backend/label/label_test.go +30 -0
  38. package/examples/toolchains/mixed-go/repo/contract/check.mjs +17 -0
  39. package/examples/toolchains/mixed-go/repo/contract/label.json +9 -0
  40. package/examples/toolchains/mixed-go/repo/frontend/package.json +15 -0
  41. package/examples/toolchains/mixed-go/repo/frontend/pnpm-lock.yaml +22 -0
  42. package/examples/toolchains/mixed-go/repo/frontend/src/label.js +4 -0
  43. package/examples/toolchains/mixed-go/repo/frontend/test/label.test.js +11 -0
  44. package/examples/toolchains/mixed-go/task.json +25 -0
  45. package/examples/toolchains/mixed-python/bad/backend/src/fx_backend/__init__.py +6 -0
  46. package/examples/toolchains/mixed-python/bad/frontend/src/label.js +4 -0
  47. package/examples/toolchains/mixed-python/good/backend/src/fx_backend/__init__.py +6 -0
  48. package/examples/toolchains/mixed-python/good/frontend/src/label.js +4 -0
  49. package/examples/toolchains/mixed-python/policy.json +121 -0
  50. package/examples/toolchains/mixed-python/repo/REQUIREMENTS.md +9 -0
  51. package/examples/toolchains/mixed-python/repo/_gitignore +6 -0
  52. package/examples/toolchains/mixed-python/repo/backend/.python-version +1 -0
  53. package/examples/toolchains/mixed-python/repo/backend/pyproject.toml +19 -0
  54. package/examples/toolchains/mixed-python/repo/backend/src/fx_backend/__init__.py +6 -0
  55. package/examples/toolchains/mixed-python/repo/backend/tests/test_label.py +11 -0
  56. package/examples/toolchains/mixed-python/repo/backend/uv.lock +108 -0
  57. package/examples/toolchains/mixed-python/repo/contract/check.mjs +17 -0
  58. package/examples/toolchains/mixed-python/repo/contract/label.json +9 -0
  59. package/examples/toolchains/mixed-python/repo/frontend/package.json +15 -0
  60. package/examples/toolchains/mixed-python/repo/frontend/pnpm-lock.yaml +22 -0
  61. package/examples/toolchains/mixed-python/repo/frontend/src/label.js +4 -0
  62. package/examples/toolchains/mixed-python/repo/frontend/test/label.test.js +11 -0
  63. package/examples/toolchains/mixed-python/task.json +25 -0
  64. package/examples/toolchains/npm/bad/src/label.js +4 -0
  65. package/examples/toolchains/npm/good/src/label.js +4 -0
  66. package/examples/toolchains/npm/policy.json +82 -0
  67. package/examples/toolchains/npm/repo/REQUIREMENTS.md +9 -0
  68. package/examples/toolchains/npm/repo/_gitignore +4 -0
  69. package/examples/toolchains/npm/repo/package-lock.json +22 -0
  70. package/examples/toolchains/npm/repo/package.json +13 -0
  71. package/examples/toolchains/npm/repo/src/label.js +4 -0
  72. package/examples/toolchains/npm/repo/test/label.test.js +13 -0
  73. package/examples/toolchains/npm/task.json +25 -0
  74. package/examples/toolchains/pnpm/bad/packages/label/src/label.js +4 -0
  75. package/examples/toolchains/pnpm/good/packages/label/src/label.js +4 -0
  76. package/examples/toolchains/pnpm/policy.json +85 -0
  77. package/examples/toolchains/pnpm/repo/REQUIREMENTS.md +9 -0
  78. package/examples/toolchains/pnpm/repo/_gitignore +4 -0
  79. package/examples/toolchains/pnpm/repo/package.json +10 -0
  80. package/examples/toolchains/pnpm/repo/packages/checker/check.mjs +5 -0
  81. package/examples/toolchains/pnpm/repo/packages/checker/package.json +9 -0
  82. package/examples/toolchains/pnpm/repo/packages/label/package.json +14 -0
  83. package/examples/toolchains/pnpm/repo/packages/label/src/label.js +4 -0
  84. package/examples/toolchains/pnpm/repo/packages/label/test/label.test.js +13 -0
  85. package/examples/toolchains/pnpm/repo/pnpm-lock.yaml +29 -0
  86. package/examples/toolchains/pnpm/repo/pnpm-workspace.yaml +2 -0
  87. package/examples/toolchains/pnpm/task.json +25 -0
  88. package/examples/toolchains/python/bad/src/fx_label/__init__.py +6 -0
  89. package/examples/toolchains/python/good/src/fx_label/__init__.py +6 -0
  90. package/examples/toolchains/python/policy.json +80 -0
  91. package/examples/toolchains/python/repo/.python-version +1 -0
  92. package/examples/toolchains/python/repo/REQUIREMENTS.md +9 -0
  93. package/examples/toolchains/python/repo/_gitignore +5 -0
  94. package/examples/toolchains/python/repo/pyproject.toml +19 -0
  95. package/examples/toolchains/python/repo/src/fx_label/__init__.py +6 -0
  96. package/examples/toolchains/python/repo/tests/test_label.py +13 -0
  97. package/examples/toolchains/python/repo/uv.lock +108 -0
  98. package/examples/toolchains/python/task.json +25 -0
  99. package/examples/toolchains/turbo/bad/packages/label/src/label.js +4 -0
  100. package/examples/toolchains/turbo/good/packages/label/src/label.js +4 -0
  101. package/examples/toolchains/turbo/policy.json +110 -0
  102. package/examples/toolchains/turbo/repo/REQUIREMENTS.md +9 -0
  103. package/examples/toolchains/turbo/repo/_gitignore +4 -0
  104. package/examples/toolchains/turbo/repo/package.json +13 -0
  105. package/examples/toolchains/turbo/repo/packages/checker/check.mjs +5 -0
  106. package/examples/toolchains/turbo/repo/packages/checker/package.json +9 -0
  107. package/examples/toolchains/turbo/repo/packages/label/package.json +14 -0
  108. package/examples/toolchains/turbo/repo/packages/label/src/label.js +4 -0
  109. package/examples/toolchains/turbo/repo/packages/label/test/label.test.js +13 -0
  110. package/examples/toolchains/turbo/repo/pnpm-lock.yaml +94 -0
  111. package/examples/toolchains/turbo/repo/pnpm-workspace.yaml +2 -0
  112. package/examples/toolchains/turbo/repo/turbo.json +7 -0
  113. package/examples/toolchains/turbo/task.json +25 -0
  114. package/examples/turbo-starter/README.md +16 -0
  115. package/examples/turbo-starter/changes/issued-at-consumer-only.patch +12 -0
  116. package/examples/turbo-starter/changes/issued-at.patch +130 -0
  117. package/examples/turbo-starter/cleanup.mjs +58 -0
  118. package/examples/turbo-starter/graph.json +32 -0
  119. package/examples/turbo-starter/harness/acceptance/db-isolation.test.mjs +97 -0
  120. package/examples/turbo-starter/harness/acceptance/env-probe.test.mjs +75 -0
  121. package/examples/turbo-starter/harness/acceptance/generation.test.mjs +54 -0
  122. package/examples/turbo-starter/harness/acceptance/issued-at.test.mjs +43 -0
  123. package/examples/turbo-starter/harness/acceptance/lifecycle-probe.test.mjs +47 -0
  124. package/examples/turbo-starter/harness/compose-bridge.mjs +593 -0
  125. package/examples/turbo-starter/harness/compose.acceptance.yml +23 -0
  126. package/examples/turbo-starter/harness/env/backend.env.template +7 -0
  127. package/examples/turbo-starter/harness/env/compose.env.template +6 -0
  128. package/examples/turbo-starter/policy.json +109 -0
  129. package/examples/turbo-starter/policy.lifecycle.json +114 -0
  130. package/examples/turbo-starter/setup.mjs +352 -0
  131. package/lib/agents/cli-adapter.js +10 -1
  132. package/lib/agents/inspect.d.ts +56 -2
  133. package/lib/agents/inspect.js +264 -14
  134. package/lib/agents/review-probe.d.ts +229 -7
  135. package/lib/agents/review-probe.js +830 -72
  136. package/lib/agents/schemas.d.ts +3 -1
  137. package/lib/agents/schemas.js +7 -3
  138. package/lib/cli.js +167 -7
  139. package/lib/contracts/cli.d.ts +820 -11
  140. package/lib/contracts/cli.js +243 -4
  141. package/lib/contracts/errors.d.ts +3 -1
  142. package/lib/contracts/errors.js +2 -0
  143. package/lib/contracts/events.d.ts +37 -5
  144. package/lib/contracts/events.js +9 -0
  145. package/lib/contracts/execution.d.ts +389 -15
  146. package/lib/contracts/execution.js +76 -4
  147. package/lib/contracts/failure.js +5 -0
  148. package/lib/contracts/index.d.ts +1 -0
  149. package/lib/contracts/index.js +1 -0
  150. package/lib/contracts/policy.d.ts +15 -0
  151. package/lib/contracts/policy.js +10 -0
  152. package/lib/contracts/ports.d.ts +50 -0
  153. package/lib/contracts/profiles.d.ts +14 -0
  154. package/lib/contracts/profiles.js +4 -0
  155. package/lib/contracts/published.d.ts +279 -8
  156. package/lib/contracts/result.d.ts +171 -0
  157. package/lib/contracts/result.js +39 -1
  158. package/lib/contracts/review.d.ts +231 -0
  159. package/lib/contracts/review.js +326 -2
  160. package/lib/contracts/toolchain.d.ts +96 -0
  161. package/lib/contracts/toolchain.js +89 -0
  162. package/lib/control/doctor.d.ts +16 -1
  163. package/lib/control/doctor.js +45 -3
  164. package/lib/control/harness.d.ts +52 -6
  165. package/lib/control/harness.js +28 -1
  166. package/lib/control/recovery.d.ts +3 -1
  167. package/lib/control/review.js +23 -11
  168. package/lib/engine/budget.d.ts +3 -3
  169. package/lib/engine/classify.js +1 -0
  170. package/lib/engine/engine.d.ts +67 -17
  171. package/lib/engine/prompt.d.ts +29 -1
  172. package/lib/engine/prompt.js +57 -0
  173. package/lib/engine/property-recovery.js +2 -0
  174. package/lib/engine/result.js +52 -0
  175. package/lib/engine/reuse.js +6 -1
  176. package/lib/engine/runner.d.ts +25 -0
  177. package/lib/engine/runner.js +500 -123
  178. package/lib/environment/lifecycle.js +6 -0
  179. package/lib/environment/live-calls.js +3 -2
  180. package/lib/environment/os-tools.d.ts +16 -0
  181. package/lib/environment/os-tools.js +35 -0
  182. package/lib/environment/process.d.ts +8 -0
  183. package/lib/environment/process.js +13 -6
  184. package/lib/integrations/connector/commands.d.ts +358 -0
  185. package/lib/integrations/connector/commands.js +428 -0
  186. package/lib/integrations/connector/config.d.ts +215 -0
  187. package/lib/integrations/connector/config.js +214 -0
  188. package/lib/integrations/connector/delivery.d.ts +107 -0
  189. package/lib/integrations/connector/delivery.js +591 -0
  190. package/lib/integrations/connector/fake.d.ts +291 -0
  191. package/lib/integrations/connector/fake.js +786 -0
  192. package/lib/integrations/connector/history.d.ts +124 -0
  193. package/lib/integrations/connector/history.js +497 -0
  194. package/lib/integrations/connector/index.d.ts +16 -0
  195. package/lib/integrations/connector/index.js +16 -0
  196. package/lib/integrations/connector/redact.d.ts +19 -0
  197. package/lib/integrations/connector/redact.js +91 -0
  198. package/lib/integrations/connector/registry.d.ts +15 -0
  199. package/lib/integrations/connector/registry.js +43 -0
  200. package/lib/integrations/connector/snapshot.d.ts +131 -0
  201. package/lib/integrations/connector/snapshot.js +422 -0
  202. package/lib/integrations/connector/source.d.ts +37 -0
  203. package/lib/integrations/connector/source.js +73 -0
  204. package/lib/integrations/connector/steps.d.ts +71 -0
  205. package/lib/integrations/connector/steps.js +188 -0
  206. package/lib/integrations/connector/store.d.ts +140 -0
  207. package/lib/integrations/connector/store.js +277 -0
  208. package/lib/integrations/connector/summary.d.ts +38 -0
  209. package/lib/integrations/connector/summary.js +59 -0
  210. package/lib/integrations/connector/testing-worker.d.ts +1 -0
  211. package/lib/integrations/connector/testing-worker.js +81 -0
  212. package/lib/integrations/connector/testing.d.ts +205 -0
  213. package/lib/integrations/connector/testing.js +1615 -0
  214. package/lib/integrations/connector/transport.d.ts +240 -0
  215. package/lib/integrations/connector/transport.js +28 -0
  216. package/lib/integrations/memory/context.d.ts +120 -0
  217. package/lib/integrations/memory/context.js +239 -0
  218. package/lib/integrations/memory/index.d.ts +8 -0
  219. package/lib/integrations/memory/index.js +8 -0
  220. package/lib/integrations/memory/provider.d.ts +79 -0
  221. package/lib/integrations/memory/provider.js +22 -0
  222. package/lib/integrations/memory/sink.d.ts +56 -0
  223. package/lib/integrations/memory/sink.js +116 -0
  224. package/lib/integrations/memory/testing.d.ts +44 -0
  225. package/lib/integrations/memory/testing.js +61 -0
  226. package/lib/integrations/relay-v1/index.d.ts +122 -0
  227. package/lib/integrations/relay-v1/index.js +860 -0
  228. package/lib/integrations/relay-v2/index.d.ts +145 -0
  229. package/lib/integrations/relay-v2/index.js +752 -0
  230. package/lib/integrations/relay-v2/process.d.ts +32 -0
  231. package/lib/integrations/relay-v2/process.js +112 -0
  232. package/lib/integrations/relay-v2/protocol.d.ts +172 -0
  233. package/lib/integrations/relay-v2/protocol.js +142 -0
  234. package/lib/profiles/resolve.d.ts +5 -1
  235. package/lib/profiles/resolve.js +31 -0
  236. package/lib/storage/document.d.ts +116 -16
  237. package/lib/toolchains/index.d.ts +9 -0
  238. package/lib/toolchains/index.js +9 -0
  239. package/lib/toolchains/inspect.d.ts +105 -0
  240. package/lib/toolchains/inspect.js +831 -0
  241. package/lib/toolchains/manifests.d.ts +67 -0
  242. package/lib/toolchains/manifests.js +238 -0
  243. package/lib/toolchains/probe.d.ts +28 -0
  244. package/lib/toolchains/probe.js +54 -0
  245. package/lib/toolchains/recipes.d.ts +33 -0
  246. package/lib/toolchains/recipes.js +51 -0
  247. package/lib/verification/acceptance.d.ts +16 -0
  248. package/lib/verification/acceptance.js +16 -0
  249. package/lib/verification/gates.d.ts +38 -0
  250. package/lib/verification/gates.js +108 -26
  251. package/package.json +22 -1
  252. package/profiles/go-gotestsum.json +21 -0
  253. package/profiles/npm-ci.json +22 -0
  254. package/profiles/pnpm-frozen.json +24 -0
  255. package/profiles/python-uv.json +26 -0
  256. package/schemas/execution-document.schema.json +345 -4
  257. package/schemas/execution-policy.schema.json +48 -0
  258. package/schemas/result-envelope.schema.json +213 -1
  259. package/schemas/run-event.schema.json +93 -0
  260. package/schemas/run-result.schema.json +207 -0
  261. package/schemas/stack-profile.schema.json +43 -0
  262. package/templates/controller-mode/AGENTS.controller.md +58 -0
  263. package/templates/controller-mode/README.md +44 -0
@@ -533,6 +533,97 @@
533
533
  "sameVendor"
534
534
  ],
535
535
  "additionalProperties": false
536
+ },
537
+ "review": {
538
+ "type": "object",
539
+ "properties": {
540
+ "round": {
541
+ "type": "integer",
542
+ "exclusiveMinimum": 0,
543
+ "maximum": 9007199254740991
544
+ },
545
+ "call": {
546
+ "type": "integer",
547
+ "exclusiveMinimum": 0,
548
+ "maximum": 9007199254740991
549
+ },
550
+ "protocol": {
551
+ "type": "string",
552
+ "enum": [
553
+ "valid",
554
+ "invalid",
555
+ "unsafe"
556
+ ]
557
+ },
558
+ "issues": {
559
+ "maxItems": 50,
560
+ "type": "array",
561
+ "items": {
562
+ "type": "object",
563
+ "properties": {
564
+ "path": {
565
+ "type": "string",
566
+ "maxLength": 300
567
+ },
568
+ "reason": {
569
+ "type": "string",
570
+ "maxLength": 40
571
+ },
572
+ "message": {
573
+ "type": "string",
574
+ "maxLength": 1000
575
+ }
576
+ },
577
+ "required": [
578
+ "path",
579
+ "reason",
580
+ "message"
581
+ ],
582
+ "additionalProperties": false
583
+ }
584
+ },
585
+ "transitions": {
586
+ "maxItems": 500,
587
+ "type": "array",
588
+ "items": {
589
+ "type": "object",
590
+ "properties": {
591
+ "id": {
592
+ "type": "string",
593
+ "pattern": "^[a-f0-9]{64}$"
594
+ },
595
+ "from": {
596
+ "type": "string",
597
+ "enum": [
598
+ "open",
599
+ "closed",
600
+ "withdrawn"
601
+ ]
602
+ },
603
+ "to": {
604
+ "type": "string",
605
+ "enum": [
606
+ "open",
607
+ "closed",
608
+ "withdrawn"
609
+ ]
610
+ }
611
+ },
612
+ "required": [
613
+ "id",
614
+ "from",
615
+ "to"
616
+ ],
617
+ "additionalProperties": false
618
+ }
619
+ }
620
+ },
621
+ "required": [
622
+ "round",
623
+ "call",
624
+ "protocol"
625
+ ],
626
+ "additionalProperties": false
536
627
  }
537
628
  },
538
629
  "required": [
@@ -590,6 +681,18 @@
590
681
  "rule": {
591
682
  "type": "string",
592
683
  "maxLength": 100
684
+ },
685
+ "id": {
686
+ "type": "string",
687
+ "pattern": "^[a-f0-9]{64}$"
688
+ },
689
+ "status": {
690
+ "type": "string",
691
+ "enum": [
692
+ "open",
693
+ "closed",
694
+ "withdrawn"
695
+ ]
593
696
  }
594
697
  },
595
698
  "required": [
@@ -1187,6 +1290,97 @@
1187
1290
  "sameVendor"
1188
1291
  ],
1189
1292
  "additionalProperties": false
1293
+ },
1294
+ "review": {
1295
+ "type": "object",
1296
+ "properties": {
1297
+ "round": {
1298
+ "type": "integer",
1299
+ "exclusiveMinimum": 0,
1300
+ "maximum": 9007199254740991
1301
+ },
1302
+ "call": {
1303
+ "type": "integer",
1304
+ "exclusiveMinimum": 0,
1305
+ "maximum": 9007199254740991
1306
+ },
1307
+ "protocol": {
1308
+ "type": "string",
1309
+ "enum": [
1310
+ "valid",
1311
+ "invalid",
1312
+ "unsafe"
1313
+ ]
1314
+ },
1315
+ "issues": {
1316
+ "maxItems": 50,
1317
+ "type": "array",
1318
+ "items": {
1319
+ "type": "object",
1320
+ "properties": {
1321
+ "path": {
1322
+ "type": "string",
1323
+ "maxLength": 300
1324
+ },
1325
+ "reason": {
1326
+ "type": "string",
1327
+ "maxLength": 40
1328
+ },
1329
+ "message": {
1330
+ "type": "string",
1331
+ "maxLength": 1000
1332
+ }
1333
+ },
1334
+ "required": [
1335
+ "path",
1336
+ "reason",
1337
+ "message"
1338
+ ],
1339
+ "additionalProperties": false
1340
+ }
1341
+ },
1342
+ "transitions": {
1343
+ "maxItems": 500,
1344
+ "type": "array",
1345
+ "items": {
1346
+ "type": "object",
1347
+ "properties": {
1348
+ "id": {
1349
+ "type": "string",
1350
+ "pattern": "^[a-f0-9]{64}$"
1351
+ },
1352
+ "from": {
1353
+ "type": "string",
1354
+ "enum": [
1355
+ "open",
1356
+ "closed",
1357
+ "withdrawn"
1358
+ ]
1359
+ },
1360
+ "to": {
1361
+ "type": "string",
1362
+ "enum": [
1363
+ "open",
1364
+ "closed",
1365
+ "withdrawn"
1366
+ ]
1367
+ }
1368
+ },
1369
+ "required": [
1370
+ "id",
1371
+ "from",
1372
+ "to"
1373
+ ],
1374
+ "additionalProperties": false
1375
+ }
1376
+ }
1377
+ },
1378
+ "required": [
1379
+ "round",
1380
+ "call",
1381
+ "protocol"
1382
+ ],
1383
+ "additionalProperties": false
1190
1384
  }
1191
1385
  },
1192
1386
  "required": [
@@ -1244,6 +1438,18 @@
1244
1438
  "rule": {
1245
1439
  "type": "string",
1246
1440
  "maxLength": 100
1441
+ },
1442
+ "id": {
1443
+ "type": "string",
1444
+ "pattern": "^[a-f0-9]{64}$"
1445
+ },
1446
+ "status": {
1447
+ "type": "string",
1448
+ "enum": [
1449
+ "open",
1450
+ "closed",
1451
+ "withdrawn"
1452
+ ]
1247
1453
  }
1248
1454
  },
1249
1455
  "required": [
@@ -1327,6 +1533,7 @@
1327
1533
  "NOT_FOUND",
1328
1534
  "STATE_VERSION_UNSUPPORTED",
1329
1535
  "RUNTIME_UNAVAILABLE",
1536
+ "REVIEW_PROTOCOL_INVALID",
1330
1537
  "SANDBOX_UNAVAILABLE",
1331
1538
  "GIT_FAILED",
1332
1539
  "STORAGE_FAILED",
@@ -1393,7 +1600,8 @@
1393
1600
  "pending",
1394
1601
  "delivered",
1395
1602
  "failed",
1396
- "conflict"
1603
+ "conflict",
1604
+ "uncertain"
1397
1605
  ]
1398
1606
  },
1399
1607
  "attempts": {
@@ -1405,6 +1613,10 @@
1405
1613
  "type": "string",
1406
1614
  "maxLength": 4000
1407
1615
  },
1616
+ "operation": {
1617
+ "type": "string",
1618
+ "maxLength": 300
1619
+ },
1408
1620
  "currentRevision": {
1409
1621
  "type": "string",
1410
1622
  "maxLength": 200
@@ -800,6 +800,7 @@
800
800
  "scope-violation",
801
801
  "gate",
802
802
  "review",
803
+ "review-protocol",
803
804
  "merge",
804
805
  "cancelled",
805
806
  "budget",
@@ -1226,6 +1227,7 @@
1226
1227
  "scope-violation",
1227
1228
  "gate",
1228
1229
  "review",
1230
+ "review-protocol",
1229
1231
  "merge",
1230
1232
  "cancelled",
1231
1233
  "budget",
@@ -2360,6 +2362,97 @@
2360
2362
  "payload"
2361
2363
  ],
2362
2364
  "additionalProperties": false
2365
+ },
2366
+ {
2367
+ "type": "object",
2368
+ "properties": {
2369
+ "apiVersion": {
2370
+ "type": "string",
2371
+ "const": "devcontour-harness/v1alpha1"
2372
+ },
2373
+ "seq": {
2374
+ "type": "integer",
2375
+ "exclusiveMinimum": 0,
2376
+ "maximum": 9007199254740991
2377
+ },
2378
+ "at": {
2379
+ "type": "string",
2380
+ "format": "date-time",
2381
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
2382
+ },
2383
+ "graphId": {
2384
+ "type": "string",
2385
+ "pattern": "^[A-Za-z0-9_-]{1,80}$"
2386
+ },
2387
+ "workId": {
2388
+ "type": "string",
2389
+ "pattern": "^[A-Za-z0-9_-]{1,80}$"
2390
+ },
2391
+ "runId": {
2392
+ "type": "string",
2393
+ "minLength": 1,
2394
+ "maxLength": 200
2395
+ },
2396
+ "attempt": {
2397
+ "type": "integer",
2398
+ "exclusiveMinimum": 0,
2399
+ "maximum": 9007199254740991
2400
+ },
2401
+ "type": {
2402
+ "type": "string",
2403
+ "const": "delivery.uncertain"
2404
+ },
2405
+ "payload": {
2406
+ "type": "object",
2407
+ "properties": {
2408
+ "sink": {
2409
+ "type": "string",
2410
+ "pattern": "^[A-Za-z0-9_-]{1,80}$"
2411
+ },
2412
+ "key": {
2413
+ "type": "string",
2414
+ "minLength": 1,
2415
+ "maxLength": 300
2416
+ },
2417
+ "revision": {
2418
+ "type": "string",
2419
+ "minLength": 1,
2420
+ "maxLength": 200
2421
+ },
2422
+ "attempts": {
2423
+ "type": "integer",
2424
+ "minimum": 0,
2425
+ "maximum": 9007199254740991
2426
+ },
2427
+ "operation": {
2428
+ "type": "string",
2429
+ "minLength": 1,
2430
+ "maxLength": 300
2431
+ },
2432
+ "reason": {
2433
+ "type": "string",
2434
+ "maxLength": 4000
2435
+ }
2436
+ },
2437
+ "required": [
2438
+ "sink",
2439
+ "key",
2440
+ "revision",
2441
+ "attempts",
2442
+ "operation",
2443
+ "reason"
2444
+ ],
2445
+ "additionalProperties": false
2446
+ }
2447
+ },
2448
+ "required": [
2449
+ "apiVersion",
2450
+ "seq",
2451
+ "at",
2452
+ "type",
2453
+ "payload"
2454
+ ],
2455
+ "additionalProperties": false
2363
2456
  }
2364
2457
  ]
2365
2458
  }
@@ -526,6 +526,97 @@
526
526
  "sameVendor"
527
527
  ],
528
528
  "additionalProperties": false
529
+ },
530
+ "review": {
531
+ "type": "object",
532
+ "properties": {
533
+ "round": {
534
+ "type": "integer",
535
+ "exclusiveMinimum": 0,
536
+ "maximum": 9007199254740991
537
+ },
538
+ "call": {
539
+ "type": "integer",
540
+ "exclusiveMinimum": 0,
541
+ "maximum": 9007199254740991
542
+ },
543
+ "protocol": {
544
+ "type": "string",
545
+ "enum": [
546
+ "valid",
547
+ "invalid",
548
+ "unsafe"
549
+ ]
550
+ },
551
+ "issues": {
552
+ "maxItems": 50,
553
+ "type": "array",
554
+ "items": {
555
+ "type": "object",
556
+ "properties": {
557
+ "path": {
558
+ "type": "string",
559
+ "maxLength": 300
560
+ },
561
+ "reason": {
562
+ "type": "string",
563
+ "maxLength": 40
564
+ },
565
+ "message": {
566
+ "type": "string",
567
+ "maxLength": 1000
568
+ }
569
+ },
570
+ "required": [
571
+ "path",
572
+ "reason",
573
+ "message"
574
+ ],
575
+ "additionalProperties": false
576
+ }
577
+ },
578
+ "transitions": {
579
+ "maxItems": 500,
580
+ "type": "array",
581
+ "items": {
582
+ "type": "object",
583
+ "properties": {
584
+ "id": {
585
+ "type": "string",
586
+ "pattern": "^[a-f0-9]{64}$"
587
+ },
588
+ "from": {
589
+ "type": "string",
590
+ "enum": [
591
+ "open",
592
+ "closed",
593
+ "withdrawn"
594
+ ]
595
+ },
596
+ "to": {
597
+ "type": "string",
598
+ "enum": [
599
+ "open",
600
+ "closed",
601
+ "withdrawn"
602
+ ]
603
+ }
604
+ },
605
+ "required": [
606
+ "id",
607
+ "from",
608
+ "to"
609
+ ],
610
+ "additionalProperties": false
611
+ }
612
+ }
613
+ },
614
+ "required": [
615
+ "round",
616
+ "call",
617
+ "protocol"
618
+ ],
619
+ "additionalProperties": false
529
620
  }
530
621
  },
531
622
  "required": [
@@ -583,6 +674,18 @@
583
674
  "rule": {
584
675
  "type": "string",
585
676
  "maxLength": 100
677
+ },
678
+ "id": {
679
+ "type": "string",
680
+ "pattern": "^[a-f0-9]{64}$"
681
+ },
682
+ "status": {
683
+ "type": "string",
684
+ "enum": [
685
+ "open",
686
+ "closed",
687
+ "withdrawn"
688
+ ]
586
689
  }
587
690
  },
588
691
  "required": [
@@ -1180,6 +1283,97 @@
1180
1283
  "sameVendor"
1181
1284
  ],
1182
1285
  "additionalProperties": false
1286
+ },
1287
+ "review": {
1288
+ "type": "object",
1289
+ "properties": {
1290
+ "round": {
1291
+ "type": "integer",
1292
+ "exclusiveMinimum": 0,
1293
+ "maximum": 9007199254740991
1294
+ },
1295
+ "call": {
1296
+ "type": "integer",
1297
+ "exclusiveMinimum": 0,
1298
+ "maximum": 9007199254740991
1299
+ },
1300
+ "protocol": {
1301
+ "type": "string",
1302
+ "enum": [
1303
+ "valid",
1304
+ "invalid",
1305
+ "unsafe"
1306
+ ]
1307
+ },
1308
+ "issues": {
1309
+ "maxItems": 50,
1310
+ "type": "array",
1311
+ "items": {
1312
+ "type": "object",
1313
+ "properties": {
1314
+ "path": {
1315
+ "type": "string",
1316
+ "maxLength": 300
1317
+ },
1318
+ "reason": {
1319
+ "type": "string",
1320
+ "maxLength": 40
1321
+ },
1322
+ "message": {
1323
+ "type": "string",
1324
+ "maxLength": 1000
1325
+ }
1326
+ },
1327
+ "required": [
1328
+ "path",
1329
+ "reason",
1330
+ "message"
1331
+ ],
1332
+ "additionalProperties": false
1333
+ }
1334
+ },
1335
+ "transitions": {
1336
+ "maxItems": 500,
1337
+ "type": "array",
1338
+ "items": {
1339
+ "type": "object",
1340
+ "properties": {
1341
+ "id": {
1342
+ "type": "string",
1343
+ "pattern": "^[a-f0-9]{64}$"
1344
+ },
1345
+ "from": {
1346
+ "type": "string",
1347
+ "enum": [
1348
+ "open",
1349
+ "closed",
1350
+ "withdrawn"
1351
+ ]
1352
+ },
1353
+ "to": {
1354
+ "type": "string",
1355
+ "enum": [
1356
+ "open",
1357
+ "closed",
1358
+ "withdrawn"
1359
+ ]
1360
+ }
1361
+ },
1362
+ "required": [
1363
+ "id",
1364
+ "from",
1365
+ "to"
1366
+ ],
1367
+ "additionalProperties": false
1368
+ }
1369
+ }
1370
+ },
1371
+ "required": [
1372
+ "round",
1373
+ "call",
1374
+ "protocol"
1375
+ ],
1376
+ "additionalProperties": false
1183
1377
  }
1184
1378
  },
1185
1379
  "required": [
@@ -1237,6 +1431,18 @@
1237
1431
  "rule": {
1238
1432
  "type": "string",
1239
1433
  "maxLength": 100
1434
+ },
1435
+ "id": {
1436
+ "type": "string",
1437
+ "pattern": "^[a-f0-9]{64}$"
1438
+ },
1439
+ "status": {
1440
+ "type": "string",
1441
+ "enum": [
1442
+ "open",
1443
+ "closed",
1444
+ "withdrawn"
1445
+ ]
1240
1446
  }
1241
1447
  },
1242
1448
  "required": [
@@ -1320,6 +1526,7 @@
1320
1526
  "NOT_FOUND",
1321
1527
  "STATE_VERSION_UNSUPPORTED",
1322
1528
  "RUNTIME_UNAVAILABLE",
1529
+ "REVIEW_PROTOCOL_INVALID",
1323
1530
  "SANDBOX_UNAVAILABLE",
1324
1531
  "GIT_FAILED",
1325
1532
  "STORAGE_FAILED",
@@ -298,6 +298,49 @@
298
298
  ],
299
299
  "additionalProperties": false
300
300
  },
301
+ "toolchain": {
302
+ "type": "object",
303
+ "properties": {
304
+ "tools": {
305
+ "default": {},
306
+ "type": "object",
307
+ "propertyNames": {
308
+ "type": "string",
309
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$"
310
+ },
311
+ "additionalProperties": {
312
+ "type": "string",
313
+ "pattern": "^(>=)?\\d+(\\.\\d+){0,2}$"
314
+ }
315
+ },
316
+ "packageManagers": {
317
+ "default": {},
318
+ "type": "object",
319
+ "propertyNames": {
320
+ "anyOf": [
321
+ {
322
+ "type": "string",
323
+ "const": "."
324
+ },
325
+ {
326
+ "type": "string",
327
+ "minLength": 1,
328
+ "maxLength": 500,
329
+ "pattern": "^(?!\\/)(?!.*[\\\\:*?\\[\\]\\x00])(?!(?:.*\\/)?\\.{1,2}(?:\\/|$))(?=.{1,500}$).+$"
330
+ }
331
+ ]
332
+ },
333
+ "additionalProperties": {
334
+ "type": "string",
335
+ "enum": [
336
+ "npm",
337
+ "pnpm"
338
+ ]
339
+ }
340
+ }
341
+ },
342
+ "additionalProperties": false
343
+ },
301
344
  "protectedPaths": {
302
345
  "default": [],
303
346
  "maxItems": 100,