@revisium/orchestrator 0.2.0-alpha.2 → 0.2.0-alpha.4

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 (268) hide show
  1. package/README.md +3 -3
  2. package/control-plane/bootstrap.config.json +104 -550
  3. package/control-plane/default-playbook/catalog/pipelines.json +405 -1065
  4. package/control-plane/default-playbook/catalog/run-profiles.json +208 -0
  5. package/control-plane/default-playbook/package.json +1 -1
  6. package/control-plane/default-playbook/playbook.json +2 -1
  7. package/control-plane/default-playbook/prompts/developer.md +6 -6
  8. package/dist/__generated__/client/browser.js +18 -0
  9. package/dist/__generated__/client/browser.js.map +1 -0
  10. package/dist/__generated__/client/client.js +32 -0
  11. package/dist/__generated__/client/client.js.map +1 -0
  12. package/dist/__generated__/client/commonInputTypes.js +11 -0
  13. package/dist/__generated__/client/commonInputTypes.js.map +1 -0
  14. package/dist/__generated__/client/enums.js +19 -0
  15. package/dist/__generated__/client/enums.js.map +1 -0
  16. package/dist/__generated__/client/internal/class.js +53 -0
  17. package/dist/__generated__/client/internal/class.js.map +1 -0
  18. package/dist/__generated__/client/internal/prismaNamespace.js +451 -0
  19. package/dist/__generated__/client/internal/prismaNamespace.js.map +1 -0
  20. package/dist/__generated__/client/internal/prismaNamespaceBrowser.js +422 -0
  21. package/dist/__generated__/client/internal/prismaNamespaceBrowser.js.map +1 -0
  22. package/dist/__generated__/client/models/Branch.js +2 -0
  23. package/dist/__generated__/client/models/Branch.js.map +1 -0
  24. package/dist/__generated__/client/models/CostLedgerEntry.js +2 -0
  25. package/dist/__generated__/client/models/CostLedgerEntry.js.map +1 -0
  26. package/dist/__generated__/client/models/FileBlob.js +2 -0
  27. package/dist/__generated__/client/models/FileBlob.js.map +1 -0
  28. package/dist/__generated__/client/models/InboxItem.js +2 -0
  29. package/dist/__generated__/client/models/InboxItem.js.map +1 -0
  30. package/dist/__generated__/client/models/ProjectFileUsage.js +2 -0
  31. package/dist/__generated__/client/models/ProjectFileUsage.js.map +1 -0
  32. package/dist/__generated__/client/models/Revision.js +2 -0
  33. package/dist/__generated__/client/models/Revision.js.map +1 -0
  34. package/dist/__generated__/client/models/RevoProject.js +2 -0
  35. package/dist/__generated__/client/models/RevoProject.js.map +1 -0
  36. package/dist/__generated__/client/models/Row.js +2 -0
  37. package/dist/__generated__/client/models/Row.js.map +1 -0
  38. package/dist/__generated__/client/models/RunAttempt.js +2 -0
  39. package/dist/__generated__/client/models/RunAttempt.js.map +1 -0
  40. package/dist/__generated__/client/models/RunEvent.js +2 -0
  41. package/dist/__generated__/client/models/RunEvent.js.map +1 -0
  42. package/dist/__generated__/client/models/RunOutput.js +2 -0
  43. package/dist/__generated__/client/models/RunOutput.js.map +1 -0
  44. package/dist/__generated__/client/models/RunTask.js +2 -0
  45. package/dist/__generated__/client/models/RunTask.js.map +1 -0
  46. package/dist/__generated__/client/models/Table.js +2 -0
  47. package/dist/__generated__/client/models/Table.js.map +1 -0
  48. package/dist/__generated__/client/models/TableMigration.js +2 -0
  49. package/dist/__generated__/client/models/TableMigration.js.map +1 -0
  50. package/dist/__generated__/client/models/TaskRun.js +2 -0
  51. package/dist/__generated__/client/models/TaskRun.js.map +1 -0
  52. package/dist/__generated__/client/models.js +2 -0
  53. package/dist/__generated__/client/models.js.map +1 -0
  54. package/dist/api/graphql-api/graphql-ws/pubsub.module.js +2 -1
  55. package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
  56. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js +110 -28
  57. package/dist/api/graphql-api/graphql-ws/subscription-bridge.service.js.map +1 -1
  58. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -1
  59. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
  60. package/dist/api/graphql-api/inbox/inputs/resolve-gate.input.js +46 -0
  61. package/dist/api/graphql-api/inbox/inputs/resolve-gate.input.js.map +1 -1
  62. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
  63. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
  64. package/dist/api/graphql-api/registerGraphqlEnums.js +2 -0
  65. package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -1
  66. package/dist/api/graphql-api/runs/inputs/create-run.input.js +17 -0
  67. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
  68. package/dist/api/graphql-api/runs/inputs/execution-profile.input.js +85 -0
  69. package/dist/api/graphql-api/runs/inputs/execution-profile.input.js.map +1 -0
  70. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js +11 -0
  71. package/dist/api/graphql-api/runs/inputs/simulate-route.input.js.map +1 -1
  72. package/dist/api/graphql-api/runs/model/run-workflow.model.js +5 -0
  73. package/dist/api/graphql-api/runs/model/run-workflow.model.js.map +1 -1
  74. package/dist/api/graphql-api/share/model/issue-action.model.js +7 -0
  75. package/dist/api/graphql-api/share/model/issue-action.model.js.map +1 -0
  76. package/dist/cli/commands/doctor-report.js +1 -13
  77. package/dist/cli/commands/doctor-report.js.map +1 -1
  78. package/dist/cli/commands/lifecycle.js +50 -65
  79. package/dist/cli/commands/lifecycle.js.map +1 -1
  80. package/dist/cli/commands/{revisium-helpers.js → process-helpers.js} +1 -24
  81. package/dist/cli/commands/process-helpers.js.map +1 -0
  82. package/dist/config.js +17 -55
  83. package/dist/config.js.map +1 -1
  84. package/dist/control-plane/audit-validation-helpers.js +31 -0
  85. package/dist/control-plane/audit-validation-helpers.js.map +1 -0
  86. package/dist/control-plane/bootstrap-json-validator.js +65 -0
  87. package/dist/control-plane/bootstrap-json-validator.js.map +1 -0
  88. package/dist/control-plane/bootstrap.js +25 -38
  89. package/dist/control-plane/bootstrap.js.map +1 -1
  90. package/dist/control-plane/change-notifications.js +45 -14
  91. package/dist/control-plane/change-notifications.js.map +1 -1
  92. package/dist/control-plane/data-access.js +1 -106
  93. package/dist/control-plane/data-access.js.map +1 -1
  94. package/dist/control-plane/default-playbook-policy.js +499 -78
  95. package/dist/control-plane/default-playbook-policy.js.map +1 -1
  96. package/dist/control-plane/definitions.js +4 -5
  97. package/dist/control-plane/definitions.js.map +1 -1
  98. package/dist/control-plane/engine-transport.js +381 -0
  99. package/dist/control-plane/engine-transport.js.map +1 -0
  100. package/dist/control-plane/inbox.js +15 -7
  101. package/dist/control-plane/inbox.js.map +1 -1
  102. package/dist/control-plane/index.js +0 -1
  103. package/dist/control-plane/index.js.map +1 -1
  104. package/dist/control-plane/manual-adoption-audit.js +3 -24
  105. package/dist/control-plane/manual-adoption-audit.js.map +1 -1
  106. package/dist/control-plane/merge-override-audit.js +44 -0
  107. package/dist/control-plane/merge-override-audit.js.map +1 -0
  108. package/dist/control-plane/pipeline-coverage-registry.js +478 -0
  109. package/dist/control-plane/pipeline-coverage-registry.js.map +1 -0
  110. package/dist/control-plane/query-types.js +2 -0
  111. package/dist/control-plane/query-types.js.map +1 -0
  112. package/dist/control-plane/run-profiles.js +89 -0
  113. package/dist/control-plane/run-profiles.js.map +1 -0
  114. package/dist/control-plane/schema-migration.js +0 -35
  115. package/dist/control-plane/schema-migration.js.map +1 -1
  116. package/dist/control-plane/seed-default-playbook.js +2 -31
  117. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  118. package/dist/control-plane/tables.js +8 -0
  119. package/dist/control-plane/tables.js.map +1 -1
  120. package/dist/control-plane/transport.js +16 -0
  121. package/dist/control-plane/transport.js.map +1 -0
  122. package/dist/control-plane/versioned-meaning.js +56 -14
  123. package/dist/control-plane/versioned-meaning.js.map +1 -1
  124. package/dist/e2e/kit/agents.js +60 -6
  125. package/dist/e2e/kit/agents.js.map +1 -1
  126. package/dist/e2e/kit/assertions.js +13 -1
  127. package/dist/e2e/kit/assertions.js.map +1 -1
  128. package/dist/e2e/kit/drive.js +46 -11
  129. package/dist/e2e/kit/drive.js.map +1 -1
  130. package/dist/e2e/kit/env.js +17 -1
  131. package/dist/e2e/kit/env.js.map +1 -1
  132. package/dist/e2e/kit/fake-integrator.js +25 -5
  133. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  134. package/dist/e2e/kit/gh-emulator.js +172 -40
  135. package/dist/e2e/kit/gh-emulator.js.map +1 -1
  136. package/dist/e2e/kit/harness.js +44 -10
  137. package/dist/e2e/kit/harness.js.map +1 -1
  138. package/dist/e2e/kit/index.js +1 -0
  139. package/dist/e2e/kit/index.js.map +1 -1
  140. package/dist/e2e/kit/scenario.js +165 -0
  141. package/dist/e2e/kit/scenario.js.map +1 -0
  142. package/dist/e2e/kit/scenarios.js +12 -18
  143. package/dist/e2e/kit/scenarios.js.map +1 -1
  144. package/dist/engine/dbos.service.js +8 -1
  145. package/dist/engine/dbos.service.js.map +1 -1
  146. package/dist/features/inbox/commands/impl/resolve-gate.command.js.map +1 -1
  147. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
  148. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
  149. package/dist/host/daemon.js +32 -8
  150. package/dist/host/daemon.js.map +1 -1
  151. package/dist/host/ensure-host.js +3 -3
  152. package/dist/host/ensure-host.js.map +1 -1
  153. package/dist/host/host-runtime.js.map +1 -1
  154. package/dist/host/host.lifecycle.js +3 -16
  155. package/dist/host/host.lifecycle.js.map +1 -1
  156. package/dist/http/graphql-host.js +17 -8
  157. package/dist/http/graphql-host.js.map +1 -1
  158. package/dist/mcp/mcp-capabilities.js +12 -11
  159. package/dist/mcp/mcp-capabilities.js.map +1 -1
  160. package/dist/mcp/mcp-facade.service.js +45 -5
  161. package/dist/mcp/mcp-facade.service.js.map +1 -1
  162. package/dist/mcp/mcp-tools.js +59 -5
  163. package/dist/mcp/mcp-tools.js.map +1 -1
  164. package/dist/mcp/monitoring-directive.js +43 -0
  165. package/dist/mcp/monitoring-directive.js.map +1 -0
  166. package/dist/pipeline/data-driven-task.workflow.js +393 -182
  167. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  168. package/dist/pipeline/pipeline.service.js +27 -5
  169. package/dist/pipeline/pipeline.service.js.map +1 -1
  170. package/dist/pipeline/route-contract.js +123 -3
  171. package/dist/pipeline/route-contract.js.map +1 -1
  172. package/dist/pipeline-core/condition-scopes.js +15 -0
  173. package/dist/pipeline-core/condition-scopes.js.map +1 -0
  174. package/dist/pipeline-core/index.js +2 -0
  175. package/dist/pipeline-core/index.js.map +1 -1
  176. package/dist/pipeline-core/kit/fixtures.js +81 -44
  177. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  178. package/dist/pipeline-core/materialize.js +221 -0
  179. package/dist/pipeline-core/materialize.js.map +1 -0
  180. package/dist/pipeline-core/types.js +5 -0
  181. package/dist/pipeline-core/types.js.map +1 -1
  182. package/dist/pipeline-core/validate-loops.js +2 -15
  183. package/dist/pipeline-core/validate-loops.js.map +1 -1
  184. package/dist/pipeline-core/validate-resilience.js +257 -0
  185. package/dist/pipeline-core/validate-resilience.js.map +1 -0
  186. package/dist/pipeline-core/validate.js +2 -0
  187. package/dist/pipeline-core/validate.js.map +1 -1
  188. package/dist/playbook/catalog-loader.js +39 -2
  189. package/dist/playbook/catalog-loader.js.map +1 -1
  190. package/dist/playbook/catalog-schema-validator.js +438 -0
  191. package/dist/playbook/catalog-schema-validator.js.map +1 -0
  192. package/dist/playbook/import-mapper.js +41 -0
  193. package/dist/playbook/import-mapper.js.map +1 -1
  194. package/dist/playbook/manifest.js +5 -0
  195. package/dist/playbook/manifest.js.map +1 -1
  196. package/dist/playbook/playbook-installer.js +17 -1
  197. package/dist/playbook/playbook-installer.js.map +1 -1
  198. package/dist/poller/pr-readiness-core.js +280 -94
  199. package/dist/poller/pr-readiness-core.js.map +1 -1
  200. package/dist/poller/pr-readiness.js +2 -2
  201. package/dist/poller/pr-readiness.js.map +1 -1
  202. package/dist/revisium/inbox.service.js +8 -8
  203. package/dist/revisium/inbox.service.js.map +1 -1
  204. package/dist/revisium/playbooks.service.js +116 -21
  205. package/dist/revisium/playbooks.service.js.map +1 -1
  206. package/dist/revisium/revisium.module.js +8 -8
  207. package/dist/revisium/revisium.module.js.map +1 -1
  208. package/dist/revisium/roles.service.js +3 -1
  209. package/dist/revisium/roles.service.js.map +1 -1
  210. package/dist/revisium/run.service.js +9 -8
  211. package/dist/revisium/run.service.js.map +1 -1
  212. package/dist/revisium/tokens.js +0 -1
  213. package/dist/revisium/tokens.js.map +1 -1
  214. package/dist/run/create-run.js +1 -1
  215. package/dist/run/create-run.js.map +1 -1
  216. package/dist/run/inspect-run.js +32 -28
  217. package/dist/run/inspect-run.js.map +1 -1
  218. package/dist/run/issue-ref.js +97 -2
  219. package/dist/run/issue-ref.js.map +1 -1
  220. package/dist/run/prisma-runtime-data-access.js +619 -0
  221. package/dist/run/prisma-runtime-data-access.js.map +1 -0
  222. package/dist/run/run-outputs.js +39 -14
  223. package/dist/run/run-outputs.js.map +1 -1
  224. package/dist/run/terminal-run-status.js.map +1 -1
  225. package/dist/runners/integrator.js +657 -56
  226. package/dist/runners/integrator.js.map +1 -1
  227. package/dist/runners/worktree.service.js +10 -8
  228. package/dist/runners/worktree.service.js.map +1 -1
  229. package/dist/schema/ajv-errors.js +15 -0
  230. package/dist/schema/ajv-errors.js.map +1 -0
  231. package/dist/smoke/isolation.js +7 -16
  232. package/dist/smoke/isolation.js.map +1 -1
  233. package/dist/storage/ensure-storage.js +117 -0
  234. package/dist/storage/ensure-storage.js.map +1 -0
  235. package/dist/storage/revo-database.js +39 -0
  236. package/dist/storage/revo-database.js.map +1 -0
  237. package/dist/storage/revo-prisma.service.js +31 -0
  238. package/dist/storage/revo-prisma.service.js.map +1 -0
  239. package/dist/storage/revo-storage.module.js +18 -0
  240. package/dist/storage/revo-storage.module.js.map +1 -0
  241. package/dist/task-control-plane/pr-readiness.service.js +5 -2
  242. package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
  243. package/dist/task-control-plane/run-watch.service.js +3 -6
  244. package/dist/task-control-plane/run-watch.service.js.map +1 -1
  245. package/dist/task-control-plane/task-control-plane-api.service.js +234 -43
  246. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  247. package/dist/testing/runtime-data-access.js +175 -0
  248. package/dist/testing/runtime-data-access.js.map +1 -0
  249. package/dist/worker/build-context.js +178 -2
  250. package/dist/worker/build-context.js.map +1 -1
  251. package/dist/worker/claude-code-runner.js +22 -3
  252. package/dist/worker/claude-code-runner.js.map +1 -1
  253. package/dist/worker/codex-runner.js +6 -1
  254. package/dist/worker/codex-runner.js.map +1 -1
  255. package/package.json +20 -7
  256. package/prisma/migrations/20260707080500_initial_schema/migration.sql +259 -0
  257. package/prisma/migrations/20260707103000_prisma_runtime_tables/migration.sql +235 -0
  258. package/prisma/migrations/migration_lock.toml +3 -0
  259. package/prisma/schema.prisma +339 -0
  260. package/prisma.config.ts +11 -0
  261. package/dist/cli/commands/revisium-helpers.js.map +0 -1
  262. package/dist/control-plane/client-transport.js +0 -168
  263. package/dist/control-plane/client-transport.js.map +0 -1
  264. package/dist/engine/ensure-postgres.js +0 -46
  265. package/dist/engine/ensure-postgres.js.map +0 -1
  266. package/dist/host/ensure-revisium.js +0 -135
  267. package/dist/host/ensure-revisium.js.map +0 -1
  268. package/revisium.config.json +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/control-plane/inbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/control-plane/inbox.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  export { ControlPlaneError } from './errors.js';
2
- export { createControlPlaneDataAccess, createControlPlaneDataAccessForTransport, } from './data-access.js';
3
2
  export { runtimeTables } from './tables.js';
4
3
  export { fnv1a64Hex, } from './steps.js';
5
4
  export { loadRole, loadModelProfile } from './definitions.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/control-plane/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA8B,MAAM,aAAa,CAAC;AAC5E,OAAO,EACL,4BAA4B,EAC5B,wCAAwC,GAQzC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,UAAU,GAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAgC,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/control-plane/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA8B,MAAM,aAAa,CAAC;AAS5E,OAAO,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/D,OAAO,EACL,UAAU,GAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAgC,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { ControlPlaneError } from './errors.js';
2
+ import { asRecord, nonBlankString, requireAuditRecord, normalizeAuditStringFields } from './audit-validation-helpers.js';
2
3
  const REQUIRED_STRING_FIELDS = [
3
4
  'runId',
4
5
  'step',
@@ -10,18 +11,6 @@ const REQUIRED_STRING_FIELDS = [
10
11
  'risk',
11
12
  'verificationResponsibility',
12
13
  ];
13
- function asRecord(value) {
14
- if (value === null || typeof value !== 'object' || Array.isArray(value))
15
- return null;
16
- return value;
17
- }
18
- function nonBlankString(record, key) {
19
- const value = record[key];
20
- if (typeof value !== 'string')
21
- return undefined;
22
- const trimmed = value.trim();
23
- return trimmed.length > 0 ? trimmed : undefined;
24
- }
25
14
  function adoptionAuditContextRunId(item) {
26
15
  if (typeof item.runId === 'string' && item.runId.trim().length > 0)
27
16
  return item.runId;
@@ -30,18 +19,8 @@ function adoptionAuditContextRunId(item) {
30
19
  return runId;
31
20
  }
32
21
  export function validateManualAdoptionAudit(input, item) {
33
- const record = asRecord(input);
34
- if (!record) {
35
- throw new ControlPlaneError('VALIDATION_FAILURE', 'adopt_patch_manually requires adoptionAudit');
36
- }
37
- const normalized = {};
38
- for (const field of REQUIRED_STRING_FIELDS) {
39
- const value = nonBlankString(record, field);
40
- if (!value) {
41
- throw new ControlPlaneError('VALIDATION_FAILURE', `adopt_patch_manually adoptionAudit.${field} is required`);
42
- }
43
- normalized[field] = value;
44
- }
22
+ const record = requireAuditRecord(input, 'adopt_patch_manually requires adoptionAudit');
23
+ const normalized = normalizeAuditStringFields(record, REQUIRED_STRING_FIELDS, 'adopt_patch_manually adoptionAudit');
45
24
  const artifactRef = nonBlankString(record, 'artifactRef');
46
25
  const worktreeRef = nonBlankString(record, 'worktreeRef');
47
26
  if (!artifactRef && !worktreeRef) {
@@ -1 +1 @@
1
- {"version":3,"file":"manual-adoption-audit.js","sourceRoot":"","sources":["../../src/control-plane/manual-adoption-audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manual-adoption-audit.js","sourceRoot":"","sources":["../../src/control-plane/manual-adoption-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAkBzH,MAAM,sBAAsB,GAAG;IAC7B,OAAO;IACP,MAAM;IACN,MAAM;IACN,YAAY;IACZ,cAAc;IACd,OAAO;IACP,OAAO;IACP,MAAM;IACN,4BAA4B;CACpB,CAAC;AAEX,SAAS,yBAAyB,CAAC,IAAe;IAChD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IACtF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc,EAAE,IAAe;IACzE,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,0BAA0B,CAAC,MAAM,EAAE,sBAAsB,EAAE,oCAAoC,CAAC,CAAC;IAEpH,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,iBAAiB,CACzB,oBAAoB,EACpB,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,iBAAiB,CACzB,oBAAoB,EACpB,4EAA4E,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI,iBAAiB,CACzB,oBAAoB,EACpB,kEAAkE,YAAY,EAAE,CACjF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,0BAA0B,EAAE,UAAU,CAAC,0BAA0B;QACjE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { ControlPlaneError } from './errors.js';
2
+ import { asRecord, nonBlankString, requireAuditRecord, normalizeAuditStringFields } from './audit-validation-helpers.js';
3
+ const REQUIRED_STRING_FIELDS = [
4
+ 'actor',
5
+ 'reason',
6
+ 'risk',
7
+ 'verificationResponsibility',
8
+ 'headSha',
9
+ ];
10
+ function overrideAuditContextRunId(item) {
11
+ if (typeof item.runId === 'string' && item.runId.trim().length > 0)
12
+ return item.runId;
13
+ const context = asRecord(item.context);
14
+ if (context && typeof context.runId === 'string' && context.runId.trim().length > 0)
15
+ return context.runId.trim();
16
+ return undefined;
17
+ }
18
+ export function validateMergeOverrideAudit(input, item) {
19
+ const record = requireAuditRecord(input, 'override_merge requires mergeOverrideAudit');
20
+ const normalized = normalizeAuditStringFields(record, REQUIRED_STRING_FIELDS, 'override_merge mergeOverrideAudit');
21
+ const threadIds = record['threadIds'];
22
+ if (!Array.isArray(threadIds)) {
23
+ throw new ControlPlaneError('VALIDATION_FAILURE', 'override_merge mergeOverrideAudit.threadIds must be an array');
24
+ }
25
+ const validThreadIds = threadIds.filter((id) => typeof id === 'string' && id.trim().length > 0);
26
+ if (validThreadIds.length !== threadIds.length) {
27
+ throw new ControlPlaneError('VALIDATION_FAILURE', 'override_merge mergeOverrideAudit.threadIds must contain non-empty strings');
28
+ }
29
+ const contextRunId = overrideAuditContextRunId(item);
30
+ if (!contextRunId) {
31
+ throw new ControlPlaneError('VALIDATION_FAILURE', 'override_merge requires a gate runId to validate the override headSha');
32
+ }
33
+ const fingerprint = nonBlankString(record, 'fingerprint');
34
+ return {
35
+ threadIds: validThreadIds,
36
+ actor: normalized.actor,
37
+ reason: normalized.reason,
38
+ risk: normalized.risk,
39
+ verificationResponsibility: normalized.verificationResponsibility,
40
+ headSha: normalized.headSha,
41
+ ...(fingerprint ? { fingerprint } : {}),
42
+ };
43
+ }
44
+ //# sourceMappingURL=merge-override-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-override-audit.js","sourceRoot":"","sources":["../../src/control-plane/merge-override-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAczH,MAAM,sBAAsB,GAAG;IAC7B,OAAO;IACP,QAAQ;IACR,MAAM;IACN,4BAA4B;IAC5B,SAAS;CACD,CAAC;AAEX,SAAS,yBAAyB,CAAC,IAAe;IAChD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IACtF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACjH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc,EAAE,IAAe;IACxE,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,4CAA4C,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,0BAA0B,CAAC,MAAM,EAAE,sBAAsB,EAAE,mCAAmC,CAAC,CAAC;IAEnH,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,8DAA8D,CAAC,CAAC;IACpH,CAAC;IACD,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9G,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,4EAA4E,CAAC,CAAC;IAClI,CAAC;IAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,uEAAuE,CAAC,CAAC;IAC7H,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE1D,OAAO;QACL,SAAS,EAAE,cAAc;QACzB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,0BAA0B,EAAE,UAAU,CAAC,0BAA0B;QACjE,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,478 @@
1
+ import { isDefaultBranch, isGuardedBranch } from '../pipeline-core/types.js';
2
+ const DEFAULT_PLAYBOOK_POLICY_TEST = 'src/control-plane/default-playbook-policy.test.ts';
3
+ const RECOVERY_GRAPH_E2E_TEST = 'src/e2e/recovery-graph.e2e.test.ts';
4
+ const SEED_DEFAULT_PLAYBOOK_E2E_TEST = 'src/e2e/seed-default-playbook.e2e.test.ts';
5
+ const TARGET_CONTRACT_E2E_TEST = 'src/e2e/target-contract-red-suite.e2e.test.ts';
6
+ function compareStrings(left, right) {
7
+ return left.localeCompare(right);
8
+ }
9
+ function dslScenario(id, ownerSurface, tags) {
10
+ return { id, ownerSurface, tags };
11
+ }
12
+ function recoveryGraphScenario(id, tags) {
13
+ return dslScenario(id, RECOVERY_GRAPH_E2E_TEST, tags);
14
+ }
15
+ function targetContractScenario(id, tags) {
16
+ return dslScenario(id, TARGET_CONTRACT_E2E_TEST, tags);
17
+ }
18
+ function seedDefaultPlaybookScenario(id, tags) {
19
+ return dslScenario(id, SEED_DEFAULT_PLAYBOOK_E2E_TEST, tags);
20
+ }
21
+ function nodeOutcome(nodeId, outcome) {
22
+ return `node:${nodeId}:outcome:${outcome}`;
23
+ }
24
+ function nodeOutcomes(nodeId, outcomes) {
25
+ return outcomes.map((outcome) => nodeOutcome(nodeId, outcome));
26
+ }
27
+ function nodeCatch(nodeId, errorCode) {
28
+ return `node:${nodeId}:catch:${errorCode}`;
29
+ }
30
+ function nodeCatches(nodeIds) {
31
+ const tags = [];
32
+ for (const nodeId of nodeIds) {
33
+ tags.push(nodeCatch(nodeId, 'revo.ScriptBlocked'), nodeCatch(nodeId, 'revo.ScriptFailed'));
34
+ }
35
+ return tags;
36
+ }
37
+ function nodeDefault(nodeId) {
38
+ return `node:${nodeId}:default`;
39
+ }
40
+ function profileSignature(profileId, signature) {
41
+ return `profile:${profileId}:signature:${signature}`;
42
+ }
43
+ function staticPolicy(diagnosticCode, tags) {
44
+ return {
45
+ owner: 'static-policy',
46
+ ownerSurface: DEFAULT_PLAYBOOK_POLICY_TEST,
47
+ diagnosticCode,
48
+ tags,
49
+ };
50
+ }
51
+ function unit(ownerSurface, tags) {
52
+ return { owner: 'unit', ownerSurface, tags };
53
+ }
54
+ const SINGLE_REVIEW_PROFILE_TAGS = [
55
+ profileSignature('claude-standard', 'single-review'),
56
+ profileSignature('codex-standard', 'single-review'),
57
+ ];
58
+ const CONSENSUS_PROFILE_TAGS = [
59
+ profileSignature('codex-primary-claude-review-consensus', 'dual-consensus-review'),
60
+ profileSignature('claude-primary-codex-review-consensus', 'dual-consensus-review'),
61
+ ];
62
+ export const PIPELINE_DSL_COVERAGE_SCENARIOS = [
63
+ recoveryGraphScenario('RG-A-merge-approved', [
64
+ nodeOutcome('mergeGate', 'approved'),
65
+ nodeOutcome('mergeApproveReverifyRouter', 'clean'),
66
+ ]),
67
+ recoveryGraphScenario('RG-B-merge-cancel', [
68
+ nodeOutcome('mergeGate', 'cancel'),
69
+ ]),
70
+ recoveryGraphScenario('RG-C-merge-override', [
71
+ nodeOutcome('mergeGate', 'override_merge'),
72
+ nodeOutcome('overrideMergeRouter', 'clean'),
73
+ ]),
74
+ recoveryGraphScenario('RG-D-merge-recheck-clean', [
75
+ nodeOutcome('mergeGate', 'recheck'),
76
+ nodeOutcome('mergeRecheckRouter', 'clean'),
77
+ nodeOutcome('mergeGate', 'cancel'),
78
+ ]),
79
+ recoveryGraphScenario('RG-E-ci-loop-recovery', [
80
+ nodeOutcome('prRouter', 'ci_changes'),
81
+ nodeDefault('prRouter'),
82
+ nodeOutcome('recoveryGate', 'cancel'),
83
+ ]),
84
+ recoveryGraphScenario('RG-F-unknown-then-clean', [
85
+ nodeOutcome('prRouter', 'recheck'),
86
+ nodeOutcome('prRouter', 'clean'),
87
+ nodeOutcome('mergeReadinessRouter', 'clean'),
88
+ nodeOutcome('mergeGate', 'approved'),
89
+ nodeOutcome('mergeApproveReverifyRouter', 'clean'),
90
+ ]),
91
+ recoveryGraphScenario('RG-G-stale-reverify-recovery', [
92
+ nodeCatch('mergeApproveReverify', 'revo.ScriptBlocked'),
93
+ nodeOutcome('recoveryGate', 'cancel'),
94
+ ]),
95
+ targetContractScenario('TC-272-no-checks-clean', [
96
+ nodeOutcome('prRouter', 'clean'),
97
+ nodeOutcome('mergeReadinessRouter', 'clean'),
98
+ nodeOutcome('mergeGate', 'cancel'),
99
+ ]),
100
+ targetContractScenario('TC-272-never-settling-recovery', [
101
+ nodeOutcome('prRouter', 'recheck'),
102
+ nodeDefault('prRouter'),
103
+ nodeOutcome('recoveryGate', 'cancel'),
104
+ ]),
105
+ targetContractScenario('TC-272-unclassifiable-recovery', [
106
+ nodeDefault('recoveryRouter'),
107
+ nodeOutcome('recoveryGate', 'cancel'),
108
+ ]),
109
+ targetContractScenario('TC-273-externally-merged', [
110
+ nodeOutcome('prRouter', 'merged'),
111
+ ]),
112
+ targetContractScenario('TC-273-externally-closed', [
113
+ nodeOutcome('prRouter', 'closed'),
114
+ nodeOutcome('recoveryGate', 'cancel'),
115
+ ]),
116
+ targetContractScenario('TC-274-head-moved-reopens-merge-gate', [
117
+ nodeOutcome('mergeGate', 'approved'),
118
+ nodeOutcome('mergeGate', 'cancel'),
119
+ ]),
120
+ targetContractScenario('TC-275-graphql-outage-recovery', [
121
+ nodeCatch('pollPr', 'revo.ScriptFailed'),
122
+ nodeDefault('recoveryRouter'),
123
+ nodeOutcome('recoveryGate', 'cancel'),
124
+ ]),
125
+ targetContractScenario('TC-276-question-fix', [
126
+ nodeOutcome('prRouter', 'review_changes'),
127
+ nodeOutcome('triageRouter', 'question'),
128
+ nodeOutcome('questionGate', 'fix'),
129
+ ]),
130
+ targetContractScenario('TC-276-question-wontfix', [
131
+ nodeOutcome('prRouter', 'review_changes'),
132
+ nodeOutcome('triageRouter', 'question'),
133
+ nodeOutcome('questionGate', 'wontfix'),
134
+ ]),
135
+ targetContractScenario('TC-277-cleanup-dirty-preserve', [
136
+ nodeOutcome('mergeGate', 'approved'),
137
+ nodeOutcome('mergeApproveReverifyRouter', 'clean'),
138
+ ]),
139
+ targetContractScenario('TC-279-override-advisory-thread', [
140
+ nodeOutcome('mergeGate', 'override_merge'),
141
+ nodeOutcome('overrideMergeRouter', 'clean'),
142
+ ]),
143
+ seedDefaultPlaybookScenario('M1-profile-single', [
144
+ profileSignature('codex-standard', 'single-review'),
145
+ nodeOutcome('planReviewRouter', 'approved'),
146
+ nodeOutcome('planGate', 'approved'),
147
+ nodeOutcome('codeReviewRouter', 'approved'),
148
+ nodeOutcome('mergeGate', 'approved'),
149
+ ]),
150
+ seedDefaultPlaybookScenario('M1b-profile-consensus-rework', [
151
+ profileSignature('codex-primary-claude-review-consensus', 'dual-consensus-review'),
152
+ nodeOutcome('planReviewRouter', 'changes_requested'),
153
+ nodeOutcome('planReviewRouter', 'approved'),
154
+ nodeOutcome('planGate', 'approved'),
155
+ nodeOutcome('codeReviewRouter', 'approved'),
156
+ nodeOutcome('mergeGate', 'approved'),
157
+ ]),
158
+ ];
159
+ export const PIPELINE_COVERAGE_OWNERSHIP = [
160
+ staticPolicy('DEFAULT_POLICY_LOOP_EXHAUSTION_ESCALATION_MISSING', [
161
+ ...nodeOutcomes('planReviewRouter', ['approved', 'clean', 'blocker', 'changes_requested']),
162
+ nodeDefault('planReviewRouter'),
163
+ ...nodeOutcomes('planGate', ['approved', 'rework', 'cancel']),
164
+ nodeDefault('planGate'),
165
+ ...nodeOutcomes('planStuckGate', ['approved', 'rework', 'cancel']),
166
+ nodeDefault('planStuckGate'),
167
+ ...nodeOutcomes('codeReviewRouter', ['approved', 'clean', 'blocker', 'changes_requested']),
168
+ nodeDefault('codeReviewRouter'),
169
+ ...nodeOutcomes('codeStuckGate', ['approve_anyway', 'rework', 'cancel']),
170
+ nodeDefault('codeStuckGate'),
171
+ nodeOutcome('prRouter', 'recheck'),
172
+ nodeOutcome('mergeReadinessRouter', 'recheck'),
173
+ ]),
174
+ staticPolicy('DEFAULT_POLICY_PR_FRESHNESS_WIRING_MISSING', [
175
+ ...nodeOutcomes('prRouter', ['clean', 'merged', 'closed']),
176
+ ...nodeOutcomes('mergeReadinessRouter', ['clean', 'merged', 'closed']),
177
+ ]),
178
+ staticPolicy('DEFAULT_POLICY_CI_CHANGES_ROUTE_MISSING', [
179
+ nodeOutcome('prRouter', 'ci_changes'),
180
+ nodeOutcome('mergeReadinessRouter', 'ci_changes'),
181
+ ]),
182
+ staticPolicy('DEFAULT_POLICY_REVIEW_CHANGES_ROUTE_MISSING', [
183
+ nodeOutcome('prRouter', 'review_changes'),
184
+ nodeOutcome('mergeReadinessRouter', 'review_changes'),
185
+ ...nodeOutcomes('triageRouter', ['question', 'fix', 'wontfix']),
186
+ ...nodeOutcomes('questionGate', ['fix', 'wontfix', 'cancel']),
187
+ nodeDefault('questionGate'),
188
+ ]),
189
+ staticPolicy('DEFAULT_POLICY_APPROVE_REVERIFY_MISSING', [
190
+ nodeOutcome('mergeGate', 'approved'),
191
+ ...nodeOutcomes('mergeApproveReverifyRouter', ['clean', 'merged', 'closed']),
192
+ nodeDefault('mergeApproveReverifyRouter'),
193
+ ]),
194
+ staticPolicy('DEFAULT_POLICY_MERGE_RECHECK_ROUTE_MISSING', [
195
+ ...nodeOutcomes('mergeGate', ['recheck', 'address_review_threads', 'return_to_development', 'cancel']),
196
+ ...nodeOutcomes('mergeRecheckRouter', ['clean', 'merged', 'closed', 'review_changes', 'ci_changes', 'recheck']),
197
+ nodeDefault('mergeRecheckRouter'),
198
+ ]),
199
+ staticPolicy('DEFAULT_POLICY_OVERRIDE_MERGE_ROUTE_MISSING', [
200
+ nodeOutcome('mergeGate', 'override_merge'),
201
+ ...nodeOutcomes('overrideMergeRouter', ['clean', 'merged', 'closed']),
202
+ nodeDefault('overrideMergeRouter'),
203
+ ]),
204
+ staticPolicy('DEFAULT_POLICY_GATE_OUTCOMES_IMPLICIT', [
205
+ ...nodeOutcomes('recoveryGate', ['recheck', 'cancel']),
206
+ nodeDefault('mergeGate'),
207
+ nodeDefault('recoveryGate'),
208
+ ]),
209
+ staticPolicy('DEFAULT_POLICY_CAP_EXHAUSTION_OFFRAMP_MISSING', [
210
+ nodeDefault('prRouter'),
211
+ nodeDefault('mergeReadinessRouter'),
212
+ nodeDefault('mergeRecheckRouter'),
213
+ nodeDefault('overrideMergeRouter'),
214
+ nodeDefault('triageRouter'),
215
+ nodeDefault('recoveryRouter'),
216
+ nodeDefault('planReviewRouter'),
217
+ nodeDefault('codeReviewRouter'),
218
+ ]),
219
+ staticPolicy('DEFAULT_POLICY_RECOVERABLE_CATCH_TERMINAL', [
220
+ ...nodeCatches([
221
+ 'pollPr',
222
+ 'mergeReadiness',
223
+ 'mergeRecheck',
224
+ 'mergeApproveReverify',
225
+ 'overrideMerge',
226
+ 'integrator',
227
+ 'reviewIntegrator',
228
+ 'questionReviewIntegrator',
229
+ 'respondThreads',
230
+ ]),
231
+ ]),
232
+ staticPolicy('DEFAULT_POLICY_CONFIRM_MERGE_FAILURE_TERMINAL', [
233
+ ...nodeCatches(['confirmMerge', 'overrideConfirmMerge']),
234
+ ]),
235
+ staticPolicy('DEFAULT_POLICY_POST_MERGE_CLEANUP_MISSING', [
236
+ ...nodeCatches(['cleanupWorktree']),
237
+ ]),
238
+ unit('src/control-plane/run-profiles.test.ts', [
239
+ ...SINGLE_REVIEW_PROFILE_TAGS,
240
+ ...CONSENSUS_PROFILE_TAGS,
241
+ ]),
242
+ unit('src/control-plane/seed-default-playbook.test.ts', [
243
+ ...SINGLE_REVIEW_PROFILE_TAGS,
244
+ ...CONSENSUS_PROFILE_TAGS,
245
+ ]),
246
+ unit('src/pipeline-core/interpret.test.ts', [
247
+ nodeOutcome('recoveryRouter', 'fix'),
248
+ ]),
249
+ ];
250
+ export const PIPELINE_COVERAGE_WAIVERS = [
251
+ {
252
+ id: 'waive-agent-question-resume-234',
253
+ ownerSurface: 'src/e2e/agent-failures.e2e.test.ts',
254
+ reason: '#234 agent-question resume is intentionally deferred; the hard-skipped executable spec remains tracked and must not be counted as zero-gap coverage.',
255
+ },
256
+ ];
257
+ export const PIPELINE_COVERAGE_REGISTRY = {
258
+ scenarios: PIPELINE_DSL_COVERAGE_SCENARIOS,
259
+ ownership: PIPELINE_COVERAGE_OWNERSHIP,
260
+ waivers: PIPELINE_COVERAGE_WAIVERS,
261
+ };
262
+ const scenarioCoverageById = new Map(PIPELINE_DSL_COVERAGE_SCENARIOS.map((scenario) => [scenario.id, scenario]));
263
+ export function coverageForScenario(scenarioId) {
264
+ const scenario = scenarioCoverageById.get(scenarioId);
265
+ if (!scenario)
266
+ throw new Error(`unknown pipeline coverage scenario: ${scenarioId}`);
267
+ return { scenarioId, tags: [...scenario.tags] };
268
+ }
269
+ export function graphCoverageTagsForTemplate(template) {
270
+ const tags = new Set();
271
+ for (const [nodeId, node] of Object.entries(template.nodes)) {
272
+ if (node.kind === 'humanGate') {
273
+ for (const outcome of node.outcomes)
274
+ tags.add(nodeOutcome(nodeId, outcome));
275
+ addBranchTags(tags, nodeId, node.branches);
276
+ continue;
277
+ }
278
+ if (node.kind === 'choice') {
279
+ addBranchTags(tags, nodeId, node.branches);
280
+ continue;
281
+ }
282
+ if (node.kind === 'agent' || node.kind === 'script') {
283
+ for (const entry of node.catch ?? [])
284
+ tags.add(nodeCatch(nodeId, entry.onError));
285
+ }
286
+ }
287
+ return [...tags].sort(compareStrings);
288
+ }
289
+ export function profileCoverageTag(profile) {
290
+ return profileSignature(profile.id, routingSignatureForRunProfile(profile));
291
+ }
292
+ export function routingSignatureForRunProfile(profile) {
293
+ const stages = asRecord(asRecord(profile.topology).stages);
294
+ const stageEntries = Object.entries(stages)
295
+ .map(([stage, config]) => [stage, stageSignature(config)])
296
+ .sort(([left], [right]) => left.localeCompare(right));
297
+ const canonical = stageEntries.map(([stage, signature]) => `${stage}:${signature}`).join('|');
298
+ if (canonical === 'codeReview:single|planReviewer:single')
299
+ return 'single-review';
300
+ if (canonical === 'codeReview:consensus2|planReviewer:consensus2')
301
+ return 'dual-consensus-review';
302
+ return stageEntries.map(([stage, signature]) => `${stage}-${signature}`).join('__') || 'no-review-stages';
303
+ }
304
+ export function expectedCoverageTags(pipelines, runProfiles) {
305
+ const tags = new Set();
306
+ for (const pipeline of pipelines) {
307
+ const template = pipeline.execution_policy?.template_json;
308
+ if (!template)
309
+ continue;
310
+ for (const tag of graphCoverageTagsForTemplate(template))
311
+ tags.add(tag);
312
+ }
313
+ for (const profile of runProfiles) {
314
+ if (profile.status !== undefined && profile.status !== 'active')
315
+ continue;
316
+ tags.add(profileCoverageTag(profile));
317
+ }
318
+ return [...tags].sort(compareStrings);
319
+ }
320
+ export function validatePipelineCoverageRegistry(input) {
321
+ const registry = input.registry ?? PIPELINE_COVERAGE_REGISTRY;
322
+ const definedTags = new Set(expectedCoverageTags(input.pipelines, input.runProfiles));
323
+ const ownedTags = new Set();
324
+ const diagnostics = [];
325
+ addScenarioDiagnostics(diagnostics, definedTags, ownedTags, registry.scenarios);
326
+ addOwnershipDiagnostics(diagnostics, definedTags, ownedTags, registry.ownership);
327
+ addWaiverDiagnostics(diagnostics, definedTags, ownedTags, registry.waivers);
328
+ addUnownedTagDiagnostics(diagnostics, definedTags, ownedTags);
329
+ addProfileRoutingSignatureDiagnostics(diagnostics, input.runProfiles, registry);
330
+ return diagnostics;
331
+ }
332
+ function addScenarioDiagnostics(diagnostics, definedTags, ownedTags, scenarios) {
333
+ for (const scenario of scenarios) {
334
+ addDefinedTagDiagnostics(diagnostics, definedTags, scenario.tags, {
335
+ scenarioId: scenario.id,
336
+ ownerSurface: scenario.ownerSurface,
337
+ });
338
+ addOwnedTags(ownedTags, scenario.tags);
339
+ }
340
+ }
341
+ function addOwnershipDiagnostics(diagnostics, definedTags, ownedTags, ownership) {
342
+ for (const owner of ownership) {
343
+ addDefinedTagDiagnostics(diagnostics, definedTags, owner.tags, {
344
+ ownerSurface: owner.ownerSurface,
345
+ });
346
+ addOwnedTags(ownedTags, owner.tags);
347
+ }
348
+ }
349
+ function addWaiverDiagnostics(diagnostics, definedTags, ownedTags, waivers) {
350
+ for (const waiver of waivers) {
351
+ const complete = isCompleteCoverageWaiver(waiver);
352
+ if (!complete)
353
+ addIncompleteWaiverDiagnostic(diagnostics, waiver);
354
+ addDefinedTagDiagnostics(diagnostics, definedTags, waiver.tags ?? [], {
355
+ waiverId: waiver.id,
356
+ ownerSurface: waiver.ownerSurface,
357
+ });
358
+ if (complete)
359
+ addOwnedTags(ownedTags, waiver.tags ?? []);
360
+ }
361
+ }
362
+ function addUnownedTagDiagnostics(diagnostics, definedTags, ownedTags) {
363
+ for (const tag of definedTags) {
364
+ if (ownedTags.has(tag))
365
+ continue;
366
+ diagnostics.push({
367
+ code: 'PIPELINE_COVERAGE_UNOWNED_TAG',
368
+ message: `coverage tag ${tag} has no owner`,
369
+ tag,
370
+ });
371
+ }
372
+ }
373
+ function addProfileRoutingSignatureDiagnostics(diagnostics, runProfiles, registry) {
374
+ for (const signature of profileRoutingSignatures(runProfiles)) {
375
+ if (isProfileRoutingSignatureCovered(signature, registry))
376
+ continue;
377
+ diagnostics.push({
378
+ code: 'PIPELINE_COVERAGE_SIGNATURE_WITHOUT_DSL',
379
+ message: `profile routing signature ${signature} has no DSL scenario owner or waiver`,
380
+ });
381
+ }
382
+ }
383
+ function addDefinedTagDiagnostics(diagnostics, definedTags, tags, context) {
384
+ for (const tag of tags)
385
+ addDefinedTagDiagnostic(diagnostics, definedTags, tag, context);
386
+ }
387
+ function addOwnedTags(ownedTags, tags) {
388
+ for (const tag of tags)
389
+ ownedTags.add(tag);
390
+ }
391
+ function addIncompleteWaiverDiagnostic(diagnostics, waiver) {
392
+ diagnostics.push({
393
+ code: 'PIPELINE_COVERAGE_INCOMPLETE_WAIVER',
394
+ message: `coverage waiver ${waiver.id} must include reason and ownerSurface`,
395
+ waiverId: waiver.id,
396
+ });
397
+ }
398
+ function isProfileRoutingSignatureCovered(signature, registry) {
399
+ return hasDslScenarioForSignature(signature, registry.scenarios) ||
400
+ hasWaiverForProfileSignature(signature, registry.waivers);
401
+ }
402
+ function hasDslScenarioForSignature(signature, scenarios) {
403
+ return scenarios.some((scenario) => scenario.tags.some((tag) => profileSignatureFromTag(tag) === signature));
404
+ }
405
+ function hasWaiverForProfileSignature(signature, waivers) {
406
+ return waivers.some((waiver) => isCompleteCoverageWaiver(waiver) &&
407
+ (waiver.tags ?? []).some((tag) => profileSignatureFromTag(tag) === signature));
408
+ }
409
+ function isCompleteCoverageWaiver(waiver) {
410
+ return waiver.reason.trim().length > 0 && waiver.ownerSurface.trim().length > 0;
411
+ }
412
+ function addBranchTags(tags, nodeId, branches) {
413
+ for (const branch of branches) {
414
+ if (isDefaultBranch(branch)) {
415
+ tags.add(nodeDefault(nodeId));
416
+ continue;
417
+ }
418
+ if (isGuardedBranch(branch)) {
419
+ for (const verdict of verdictsInCondition(branch.when))
420
+ tags.add(nodeOutcome(nodeId, verdict));
421
+ }
422
+ }
423
+ }
424
+ function verdictsInCondition(condition) {
425
+ switch (condition.op) {
426
+ case 'verdict.eq':
427
+ return [condition.value];
428
+ case 'verdict.in':
429
+ return condition.value;
430
+ case 'counter.lt':
431
+ case 'counter.gte':
432
+ return [];
433
+ case 'all':
434
+ case 'any':
435
+ return condition.of.flatMap((child) => verdictsInCondition(child));
436
+ case 'not':
437
+ return [];
438
+ }
439
+ }
440
+ function asRecord(value) {
441
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
442
+ }
443
+ function stringValue(value) {
444
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
445
+ }
446
+ function stageSignature(value) {
447
+ const stage = asRecord(value);
448
+ const mode = stringValue(stage['mode']) ?? 'single';
449
+ const branches = stage['branches'];
450
+ if (mode === 'consensus') {
451
+ return `consensus${typeof branches === 'number' && Number.isInteger(branches) ? branches : 2}`;
452
+ }
453
+ return mode;
454
+ }
455
+ function addDefinedTagDiagnostic(diagnostics, definedTags, tag, context) {
456
+ if (definedTags.has(tag))
457
+ return;
458
+ diagnostics.push({
459
+ code: 'PIPELINE_COVERAGE_UNDEFINED_TAG',
460
+ message: `coverage tag ${tag} is not defined by the bundled default catalog`,
461
+ tag,
462
+ ...context,
463
+ });
464
+ }
465
+ function profileSignatureFromTag(tag) {
466
+ const match = /^profile:[^:]+:signature:(.+)$/.exec(tag);
467
+ return match?.[1];
468
+ }
469
+ function profileRoutingSignatures(runProfiles) {
470
+ const signatures = new Set();
471
+ for (const profile of runProfiles) {
472
+ if (profile.status !== undefined && profile.status !== 'active')
473
+ continue;
474
+ signatures.add(routingSignatureForRunProfile(profile));
475
+ }
476
+ return [...signatures].sort(compareStrings);
477
+ }
478
+ //# sourceMappingURL=pipeline-coverage-registry.js.map