oh-my-super-agent 0.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 (461) hide show
  1. package/.agents/agents/advisor.md +15 -0
  2. package/.agents/agents/conductor.md +32 -0
  3. package/.agents/agents/dreamer.md +13 -0
  4. package/.agents/agents/executor.md +17 -0
  5. package/.agents/agents/grader.md +15 -0
  6. package/.agents/config/endurance-policy.json +8 -0
  7. package/.agents/config/oms-config.json +119 -0
  8. package/.agents/config/release-policy.json +12 -0
  9. package/.agents/config/secret-scan-policy.json +7 -0
  10. package/.agents/config/verification-plan.json +33 -0
  11. package/.agents/registry.json +11 -0
  12. package/.agents/rules/constitution.md +7 -0
  13. package/.agents/skills/conductor/SKILL.md +23 -0
  14. package/.agents/skills/dream/SKILL.md +14 -0
  15. package/.agents/skills/executor/SKILL.md +13 -0
  16. package/.agents/skills/oms/SKILL.md +52 -0
  17. package/.agents/skills/quota-aware/SKILL.md +12 -0
  18. package/.agents/skills/schedule/SKILL.md +13 -0
  19. package/.agents/skills/team-protocol/SKILL.md +20 -0
  20. package/LICENSE +21 -0
  21. package/README.md +146 -0
  22. package/dist/src/audit/run-ledger.d.ts +183 -0
  23. package/dist/src/audit/run-ledger.js +1655 -0
  24. package/dist/src/audit/run-ledger.js.map +1 -0
  25. package/dist/src/cli.d.ts +61 -0
  26. package/dist/src/cli.js +2096 -0
  27. package/dist/src/cli.js.map +1 -0
  28. package/dist/src/commands/github-queue-probe.d.ts +26 -0
  29. package/dist/src/commands/github-queue-probe.js +51 -0
  30. package/dist/src/commands/github-queue-probe.js.map +1 -0
  31. package/dist/src/commands/trace-fixture.d.ts +20 -0
  32. package/dist/src/commands/trace-fixture.js +72 -0
  33. package/dist/src/commands/trace-fixture.js.map +1 -0
  34. package/dist/src/conductor/activity.d.ts +46 -0
  35. package/dist/src/conductor/activity.js +224 -0
  36. package/dist/src/conductor/activity.js.map +1 -0
  37. package/dist/src/conductor/bridge.d.ts +53 -0
  38. package/dist/src/conductor/bridge.js +652 -0
  39. package/dist/src/conductor/bridge.js.map +1 -0
  40. package/dist/src/conductor/notifications.d.ts +59 -0
  41. package/dist/src/conductor/notifications.js +381 -0
  42. package/dist/src/conductor/notifications.js.map +1 -0
  43. package/dist/src/conductor/recovery.d.ts +29 -0
  44. package/dist/src/conductor/recovery.js +198 -0
  45. package/dist/src/conductor/recovery.js.map +1 -0
  46. package/dist/src/conductor/start.d.ts +73 -0
  47. package/dist/src/conductor/start.js +519 -0
  48. package/dist/src/conductor/start.js.map +1 -0
  49. package/dist/src/conductor/waiter.d.ts +88 -0
  50. package/dist/src/conductor/waiter.js +427 -0
  51. package/dist/src/conductor/waiter.js.map +1 -0
  52. package/dist/src/config.d.ts +9 -0
  53. package/dist/src/config.js +40 -0
  54. package/dist/src/config.js.map +1 -0
  55. package/dist/src/dispatch/advice-source.d.ts +61 -0
  56. package/dist/src/dispatch/advice-source.js +198 -0
  57. package/dist/src/dispatch/advice-source.js.map +1 -0
  58. package/dist/src/dispatch/advice-store.d.ts +41 -0
  59. package/dist/src/dispatch/advice-store.js +201 -0
  60. package/dist/src/dispatch/advice-store.js.map +1 -0
  61. package/dist/src/dispatch/advice.d.ts +34 -0
  62. package/dist/src/dispatch/advice.js +371 -0
  63. package/dist/src/dispatch/advice.js.map +1 -0
  64. package/dist/src/dispatch/authority.d.ts +124 -0
  65. package/dist/src/dispatch/authority.js +1202 -0
  66. package/dist/src/dispatch/authority.js.map +1 -0
  67. package/dist/src/dispatch/intent.d.ts +66 -0
  68. package/dist/src/dispatch/intent.js +71 -0
  69. package/dist/src/dispatch/intent.js.map +1 -0
  70. package/dist/src/dispatch/runtime-authority.d.ts +42 -0
  71. package/dist/src/dispatch/runtime-authority.js +52 -0
  72. package/dist/src/dispatch/runtime-authority.js.map +1 -0
  73. package/dist/src/doctor.d.ts +20 -0
  74. package/dist/src/doctor.js +85 -0
  75. package/dist/src/doctor.js.map +1 -0
  76. package/dist/src/domain/records.d.ts +44 -0
  77. package/dist/src/domain/records.js +138 -0
  78. package/dist/src/domain/records.js.map +1 -0
  79. package/dist/src/domain/role-policy.d.ts +67 -0
  80. package/dist/src/domain/role-policy.js +547 -0
  81. package/dist/src/domain/role-policy.js.map +1 -0
  82. package/dist/src/events/bus.d.ts +32 -0
  83. package/dist/src/events/bus.js +115 -0
  84. package/dist/src/events/bus.js.map +1 -0
  85. package/dist/src/events/kinds.d.ts +126 -0
  86. package/dist/src/events/kinds.js +14 -0
  87. package/dist/src/events/kinds.js.map +1 -0
  88. package/dist/src/evidence/immutable-file.d.ts +12 -0
  89. package/dist/src/evidence/immutable-file.js +141 -0
  90. package/dist/src/evidence/immutable-file.js.map +1 -0
  91. package/dist/src/evidence/store.d.ts +125 -0
  92. package/dist/src/evidence/store.js +1189 -0
  93. package/dist/src/evidence/store.js.map +1 -0
  94. package/dist/src/evidence/verdict.d.ts +17 -0
  95. package/dist/src/evidence/verdict.js +23 -0
  96. package/dist/src/evidence/verdict.js.map +1 -0
  97. package/dist/src/generation/agent.d.ts +5 -0
  98. package/dist/src/generation/agent.js +34 -0
  99. package/dist/src/generation/agent.js.map +1 -0
  100. package/dist/src/generation/frontmatter.d.ts +7 -0
  101. package/dist/src/generation/frontmatter.js +33 -0
  102. package/dist/src/generation/frontmatter.js.map +1 -0
  103. package/dist/src/github/adapter.d.ts +44 -0
  104. package/dist/src/github/adapter.js +592 -0
  105. package/dist/src/github/adapter.js.map +1 -0
  106. package/dist/src/github/dispatch-eligibility.d.ts +9 -0
  107. package/dist/src/github/dispatch-eligibility.js +94 -0
  108. package/dist/src/github/dispatch-eligibility.js.map +1 -0
  109. package/dist/src/github/projector.d.ts +23 -0
  110. package/dist/src/github/projector.js +181 -0
  111. package/dist/src/github/projector.js.map +1 -0
  112. package/dist/src/github/review.d.ts +39 -0
  113. package/dist/src/github/review.js +1450 -0
  114. package/dist/src/github/review.js.map +1 -0
  115. package/dist/src/github/sync.d.ts +21 -0
  116. package/dist/src/github/sync.js +518 -0
  117. package/dist/src/github/sync.js.map +1 -0
  118. package/dist/src/github/types.d.ts +134 -0
  119. package/dist/src/github/types.js +11 -0
  120. package/dist/src/github/types.js.map +1 -0
  121. package/dist/src/goals/artifact-store.d.ts +31 -0
  122. package/dist/src/goals/artifact-store.js +241 -0
  123. package/dist/src/goals/artifact-store.js.map +1 -0
  124. package/dist/src/goals/authority.d.ts +112 -0
  125. package/dist/src/goals/authority.js +621 -0
  126. package/dist/src/goals/authority.js.map +1 -0
  127. package/dist/src/goals/native-snapshot.d.ts +12 -0
  128. package/dist/src/goals/native-snapshot.js +53 -0
  129. package/dist/src/goals/native-snapshot.js.map +1 -0
  130. package/dist/src/goals/runtime-authority.d.ts +7 -0
  131. package/dist/src/goals/runtime-authority.js +20 -0
  132. package/dist/src/goals/runtime-authority.js.map +1 -0
  133. package/dist/src/health/release-assessment.d.ts +11 -0
  134. package/dist/src/health/release-assessment.js +83 -0
  135. package/dist/src/health/release-assessment.js.map +1 -0
  136. package/dist/src/health/release-policy.d.ts +16 -0
  137. package/dist/src/health/release-policy.js +40 -0
  138. package/dist/src/health/release-policy.js.map +1 -0
  139. package/dist/src/hooks/native.d.ts +30 -0
  140. package/dist/src/hooks/native.js +495 -0
  141. package/dist/src/hooks/native.js.map +1 -0
  142. package/dist/src/hooks/provider-runtime.d.ts +55 -0
  143. package/dist/src/hooks/provider-runtime.js +479 -0
  144. package/dist/src/hooks/provider-runtime.js.map +1 -0
  145. package/dist/src/hooks/provider.d.ts +102 -0
  146. package/dist/src/hooks/provider.js +358 -0
  147. package/dist/src/hooks/provider.js.map +1 -0
  148. package/dist/src/live/contact-journal.d.ts +73 -0
  149. package/dist/src/live/contact-journal.js +439 -0
  150. package/dist/src/live/contact-journal.js.map +1 -0
  151. package/dist/src/live-probes/gh-adapter.d.ts +28 -0
  152. package/dist/src/live-probes/gh-adapter.js +188 -0
  153. package/dist/src/live-probes/gh-adapter.js.map +1 -0
  154. package/dist/src/live-probes/github-queue.d.ts +1 -0
  155. package/dist/src/live-probes/github-queue.js +2 -0
  156. package/dist/src/live-probes/github-queue.js.map +1 -0
  157. package/dist/src/notifications/slack-request.d.ts +13 -0
  158. package/dist/src/notifications/slack-request.js +40 -0
  159. package/dist/src/notifications/slack-request.js.map +1 -0
  160. package/dist/src/outbox/processor.d.ts +27 -0
  161. package/dist/src/outbox/processor.js +63 -0
  162. package/dist/src/outbox/processor.js.map +1 -0
  163. package/dist/src/outbox/store.d.ts +158 -0
  164. package/dist/src/outbox/store.js +834 -0
  165. package/dist/src/outbox/store.js.map +1 -0
  166. package/dist/src/package-root.d.ts +1 -0
  167. package/dist/src/package-root.js +26 -0
  168. package/dist/src/package-root.js.map +1 -0
  169. package/dist/src/project.d.ts +12 -0
  170. package/dist/src/project.js +60 -0
  171. package/dist/src/project.js.map +1 -0
  172. package/dist/src/projection/generated-file.d.ts +15 -0
  173. package/dist/src/projection/generated-file.js +72 -0
  174. package/dist/src/projection/generated-file.js.map +1 -0
  175. package/dist/src/projection/project-workspace.d.ts +11 -0
  176. package/dist/src/projection/project-workspace.js +94 -0
  177. package/dist/src/projection/project-workspace.js.map +1 -0
  178. package/dist/src/projection/registry.d.ts +15 -0
  179. package/dist/src/projection/registry.js +59 -0
  180. package/dist/src/projection/registry.js.map +1 -0
  181. package/dist/src/projection/safe-path.d.ts +4 -0
  182. package/dist/src/projection/safe-path.js +106 -0
  183. package/dist/src/projection/safe-path.js.map +1 -0
  184. package/dist/src/providers/claude-interactive.d.ts +38 -0
  185. package/dist/src/providers/claude-interactive.js +287 -0
  186. package/dist/src/providers/claude-interactive.js.map +1 -0
  187. package/dist/src/providers/claude-structured-bridge.d.ts +32 -0
  188. package/dist/src/providers/claude-structured-bridge.js +215 -0
  189. package/dist/src/providers/claude-structured-bridge.js.map +1 -0
  190. package/dist/src/providers/claude-structured-completion.d.ts +23 -0
  191. package/dist/src/providers/claude-structured-completion.js +229 -0
  192. package/dist/src/providers/claude-structured-completion.js.map +1 -0
  193. package/dist/src/providers/claude-structured-pane.d.ts +23 -0
  194. package/dist/src/providers/claude-structured-pane.js +156 -0
  195. package/dist/src/providers/claude-structured-pane.js.map +1 -0
  196. package/dist/src/providers/claude-structured-store.d.ts +48 -0
  197. package/dist/src/providers/claude-structured-store.js +212 -0
  198. package/dist/src/providers/claude-structured-store.js.map +1 -0
  199. package/dist/src/providers/claude-structured.d.ts +56 -0
  200. package/dist/src/providers/claude-structured.js +250 -0
  201. package/dist/src/providers/claude-structured.js.map +1 -0
  202. package/dist/src/providers/codex-exec.d.ts +29 -0
  203. package/dist/src/providers/codex-exec.js +127 -0
  204. package/dist/src/providers/codex-exec.js.map +1 -0
  205. package/dist/src/providers/grading.d.ts +2 -0
  206. package/dist/src/providers/grading.js +20 -0
  207. package/dist/src/providers/grading.js.map +1 -0
  208. package/dist/src/providers/native-dispatch.d.ts +24 -0
  209. package/dist/src/providers/native-dispatch.js +34 -0
  210. package/dist/src/providers/native-dispatch.js.map +1 -0
  211. package/dist/src/providers/preflight.d.ts +65 -0
  212. package/dist/src/providers/preflight.js +256 -0
  213. package/dist/src/providers/preflight.js.map +1 -0
  214. package/dist/src/providers/process.d.ts +18 -0
  215. package/dist/src/providers/process.js +21 -0
  216. package/dist/src/providers/process.js.map +1 -0
  217. package/dist/src/queue/model.d.ts +37 -0
  218. package/dist/src/queue/model.js +51 -0
  219. package/dist/src/queue/model.js.map +1 -0
  220. package/dist/src/queue/service.d.ts +1 -0
  221. package/dist/src/queue/service.js +2 -0
  222. package/dist/src/queue/service.js.map +1 -0
  223. package/dist/src/reflections/store.d.ts +21 -0
  224. package/dist/src/reflections/store.js +60 -0
  225. package/dist/src/reflections/store.js.map +1 -0
  226. package/dist/src/reports/daily-trust.d.ts +11 -0
  227. package/dist/src/reports/daily-trust.js +98 -0
  228. package/dist/src/reports/daily-trust.js.map +1 -0
  229. package/dist/src/runs/controller.d.ts +187 -0
  230. package/dist/src/runs/controller.js +1182 -0
  231. package/dist/src/runs/controller.js.map +1 -0
  232. package/dist/src/runtime/composition.d.ts +9 -0
  233. package/dist/src/runtime/composition.js +35 -0
  234. package/dist/src/runtime/composition.js.map +1 -0
  235. package/dist/src/runtime/endurance-authorities.d.ts +44 -0
  236. package/dist/src/runtime/endurance-authorities.js +101 -0
  237. package/dist/src/runtime/endurance-authorities.js.map +1 -0
  238. package/dist/src/runtime/endurance-policy.d.ts +12 -0
  239. package/dist/src/runtime/endurance-policy.js +13 -0
  240. package/dist/src/runtime/endurance-policy.js.map +1 -0
  241. package/dist/src/runtime/lock.d.ts +63 -0
  242. package/dist/src/runtime/lock.js +577 -0
  243. package/dist/src/runtime/lock.js.map +1 -0
  244. package/dist/src/runtime/process-identity.d.ts +10 -0
  245. package/dist/src/runtime/process-identity.js +43 -0
  246. package/dist/src/runtime/process-identity.js.map +1 -0
  247. package/dist/src/runtime/quota.d.ts +130 -0
  248. package/dist/src/runtime/quota.js +590 -0
  249. package/dist/src/runtime/quota.js.map +1 -0
  250. package/dist/src/runtime/record-store.d.ts +45 -0
  251. package/dist/src/runtime/record-store.js +272 -0
  252. package/dist/src/runtime/record-store.js.map +1 -0
  253. package/dist/src/runtime/schema.d.ts +28 -0
  254. package/dist/src/runtime/schema.js +194 -0
  255. package/dist/src/runtime/schema.js.map +1 -0
  256. package/dist/src/runtime/stable-id.d.ts +3 -0
  257. package/dist/src/runtime/stable-id.js +27 -0
  258. package/dist/src/runtime/stable-id.js.map +1 -0
  259. package/dist/src/runtime/system-clock.d.ts +8 -0
  260. package/dist/src/runtime/system-clock.js +35 -0
  261. package/dist/src/runtime/system-clock.js.map +1 -0
  262. package/dist/src/schedule/service-plan.d.ts +58 -0
  263. package/dist/src/schedule/service-plan.js +327 -0
  264. package/dist/src/schedule/service-plan.js.map +1 -0
  265. package/dist/src/schedule/user-installation.d.ts +62 -0
  266. package/dist/src/schedule/user-installation.js +701 -0
  267. package/dist/src/schedule/user-installation.js.map +1 -0
  268. package/dist/src/schedule/user-plan.d.ts +47 -0
  269. package/dist/src/schedule/user-plan.js +286 -0
  270. package/dist/src/schedule/user-plan.js.map +1 -0
  271. package/dist/src/scheduler/minute.d.ts +31 -0
  272. package/dist/src/scheduler/minute.js +441 -0
  273. package/dist/src/scheduler/minute.js.map +1 -0
  274. package/dist/src/schemas/registry.d.ts +10 -0
  275. package/dist/src/schemas/registry.js +36 -0
  276. package/dist/src/schemas/registry.js.map +1 -0
  277. package/dist/src/security/secret-scan.d.ts +50 -0
  278. package/dist/src/security/secret-scan.js +384 -0
  279. package/dist/src/security/secret-scan.js.map +1 -0
  280. package/dist/src/sessions/registry.d.ts +89 -0
  281. package/dist/src/sessions/registry.js +443 -0
  282. package/dist/src/sessions/registry.js.map +1 -0
  283. package/dist/src/state.d.ts +27 -0
  284. package/dist/src/state.js +235 -0
  285. package/dist/src/state.js.map +1 -0
  286. package/dist/src/status/hud.d.ts +37 -0
  287. package/dist/src/status/hud.js +88 -0
  288. package/dist/src/status/hud.js.map +1 -0
  289. package/dist/src/team/plan.d.ts +31 -0
  290. package/dist/src/team/plan.js +184 -0
  291. package/dist/src/team/plan.js.map +1 -0
  292. package/dist/src/team/projection.d.ts +24 -0
  293. package/dist/src/team/projection.js +79 -0
  294. package/dist/src/team/projection.js.map +1 -0
  295. package/dist/src/tickets/admission.d.ts +34 -0
  296. package/dist/src/tickets/admission.js +169 -0
  297. package/dist/src/tickets/admission.js.map +1 -0
  298. package/dist/src/tickets/materializer.d.ts +1 -0
  299. package/dist/src/tickets/materializer.js +2 -0
  300. package/dist/src/tickets/materializer.js.map +1 -0
  301. package/dist/src/tickets/runtime-authority.d.ts +32 -0
  302. package/dist/src/tickets/runtime-authority.js +46 -0
  303. package/dist/src/tickets/runtime-authority.js.map +1 -0
  304. package/dist/src/tickets/store.d.ts +221 -0
  305. package/dist/src/tickets/store.js +2025 -0
  306. package/dist/src/tickets/store.js.map +1 -0
  307. package/dist/src/tracer/one-ticket.d.ts +58 -0
  308. package/dist/src/tracer/one-ticket.js +578 -0
  309. package/dist/src/tracer/one-ticket.js.map +1 -0
  310. package/dist/src/trust/assessment.d.ts +24 -0
  311. package/dist/src/trust/assessment.js +124 -0
  312. package/dist/src/trust/assessment.js.map +1 -0
  313. package/dist/src/trust/runs.d.ts +13 -0
  314. package/dist/src/trust/runs.js +46 -0
  315. package/dist/src/trust/runs.js.map +1 -0
  316. package/dist/src/types.d.ts +6 -0
  317. package/dist/src/types.js +2 -0
  318. package/dist/src/types.js.map +1 -0
  319. package/dist/src/utils/fs.d.ts +13 -0
  320. package/dist/src/utils/fs.js +188 -0
  321. package/dist/src/utils/fs.js.map +1 -0
  322. package/dist/src/verification/authority.d.ts +28 -0
  323. package/dist/src/verification/authority.js +153 -0
  324. package/dist/src/verification/authority.js.map +1 -0
  325. package/dist/src/verification/grade-source.d.ts +17 -0
  326. package/dist/src/verification/grade-source.js +30 -0
  327. package/dist/src/verification/grade-source.js.map +1 -0
  328. package/dist/src/verification/plan.d.ts +20 -0
  329. package/dist/src/verification/plan.js +128 -0
  330. package/dist/src/verification/plan.js.map +1 -0
  331. package/dist/src/verification/protected-runner.d.ts +50 -0
  332. package/dist/src/verification/protected-runner.js +171 -0
  333. package/dist/src/verification/protected-runner.js.map +1 -0
  334. package/dist/src/verification/result-gate-store.d.ts +72 -0
  335. package/dist/src/verification/result-gate-store.js +193 -0
  336. package/dist/src/verification/result-gate-store.js.map +1 -0
  337. package/dist/src/verification/result-gate.d.ts +41 -0
  338. package/dist/src/verification/result-gate.js +731 -0
  339. package/dist/src/verification/result-gate.js.map +1 -0
  340. package/dist/src/verification/runner.d.ts +38 -0
  341. package/dist/src/verification/runner.js +143 -0
  342. package/dist/src/verification/runner.js.map +1 -0
  343. package/dist/src/verification/sandbox.d.ts +16 -0
  344. package/dist/src/verification/sandbox.js +199 -0
  345. package/dist/src/verification/sandbox.js.map +1 -0
  346. package/dist/src/verify.d.ts +8 -0
  347. package/dist/src/verify.js +35 -0
  348. package/dist/src/verify.js.map +1 -0
  349. package/dist/src/watchdog/reconcile.d.ts +42 -0
  350. package/dist/src/watchdog/reconcile.js +440 -0
  351. package/dist/src/watchdog/reconcile.js.map +1 -0
  352. package/dist/src/workers/bridge.d.ts +35 -0
  353. package/dist/src/workers/bridge.js +426 -0
  354. package/dist/src/workers/bridge.js.map +1 -0
  355. package/dist/src/workers/delivery.d.ts +31 -0
  356. package/dist/src/workers/delivery.js +876 -0
  357. package/dist/src/workers/delivery.js.map +1 -0
  358. package/dist/src/workers/panes.d.ts +32 -0
  359. package/dist/src/workers/panes.js +212 -0
  360. package/dist/src/workers/panes.js.map +1 -0
  361. package/dist/src/workers/registry.d.ts +80 -0
  362. package/dist/src/workers/registry.js +351 -0
  363. package/dist/src/workers/registry.js.map +1 -0
  364. package/dist/src/workers/runtime.d.ts +44 -0
  365. package/dist/src/workers/runtime.js +21 -0
  366. package/dist/src/workers/runtime.js.map +1 -0
  367. package/dist/src/worktrees/manager.d.ts +35 -0
  368. package/dist/src/worktrees/manager.js +315 -0
  369. package/dist/src/worktrees/manager.js.map +1 -0
  370. package/docs/ARCHITECTURE.md +323 -0
  371. package/docs/PLAN.md +216 -0
  372. package/docs/REFERENCES.md +42 -0
  373. package/docs/ROADMAP.md +327 -0
  374. package/docs/SECURITY.md +242 -0
  375. package/docs/adr/0001-tracer-first-file-backed-certification.md +41 -0
  376. package/docs/adr/0002-conductor-first-typed-dispatch.md +102 -0
  377. package/docs/adr/0003-mandatory-pre-dispatch-advice.md +59 -0
  378. package/docs/compatibility/claude-code-2.1.207.md +25 -0
  379. package/loop/contract.md +102 -0
  380. package/package.json +54 -0
  381. package/schemas/advisor-evidence.schema.json +54 -0
  382. package/schemas/advisor-output.schema.json +31 -0
  383. package/schemas/conductor-activity-payload.schema.json +38 -0
  384. package/schemas/conductor-decision.schema.json +29 -0
  385. package/schemas/conductor-dispatch-intent.schema.json +71 -0
  386. package/schemas/conductor-dispatch-preparation.schema.json +46 -0
  387. package/schemas/conductor-dispatch-proposal.schema.json +82 -0
  388. package/schemas/conductor-goal-proposal.schema.json +30 -0
  389. package/schemas/conductor-manage-worker.schema.json +17 -0
  390. package/schemas/conductor-notification-payload.schema.json +39 -0
  391. package/schemas/conductor-process-result.schema.json +14 -0
  392. package/schemas/conductor-route.schema.json +51 -0
  393. package/schemas/conductor-start-team.schema.json +16 -0
  394. package/schemas/conductor-waiter-payload.schema.json +68 -0
  395. package/schemas/deterministic-check.schema.json +107 -0
  396. package/schemas/dispatch-acknowledgement.schema.json +15 -0
  397. package/schemas/dispatch-advice-payload.schema.json +64 -0
  398. package/schemas/dispatch-payload.schema.json +131 -0
  399. package/schemas/dispatch-result.schema.json +28 -0
  400. package/schemas/endurance-policy.schema.json +16 -0
  401. package/schemas/events/dispatch-delivery-requested.schema.json +17 -0
  402. package/schemas/events/github-observed.schema.json +28 -0
  403. package/schemas/events/native-hook-observed.schema.json +35 -0
  404. package/schemas/events/provider-observed.schema.json +64 -0
  405. package/schemas/events/run-heartbeat-due.schema.json +10 -0
  406. package/schemas/events/slack-notification-requested.schema.json +14 -0
  407. package/schemas/events/structured-role-completed.schema.json +54 -0
  408. package/schemas/events/ticket-resume-due.schema.json +28 -0
  409. package/schemas/events/watchdog-lease-expired.schema.json +14 -0
  410. package/schemas/events/watchdog-outbox-stalled.schema.json +12 -0
  411. package/schemas/events/watchdog-session-stalled.schema.json +11 -0
  412. package/schemas/evidence-record.schema.json +37 -0
  413. package/schemas/executor-result.schema.json +17 -0
  414. package/schemas/github-observation.schema.json +33 -0
  415. package/schemas/github-watermark.schema.json +66 -0
  416. package/schemas/goal-artifact.schema.json +19 -0
  417. package/schemas/goal-create-input.schema.json +14 -0
  418. package/schemas/goal-executor-result.schema.json +18 -0
  419. package/schemas/goal-payload.schema.json +95 -0
  420. package/schemas/grader-output.schema.json +33 -0
  421. package/schemas/lease-expiry.schema.json +19 -0
  422. package/schemas/live-disclosure.schema.json +16 -0
  423. package/schemas/live-outcome.schema.json +52 -0
  424. package/schemas/native-goal-snapshot.schema.json +27 -0
  425. package/schemas/provider-observed.schema.json +64 -0
  426. package/schemas/quota-observation.schema.json +72 -0
  427. package/schemas/reflection-evidence.schema.json +61 -0
  428. package/schemas/reflection.schema.json +13 -0
  429. package/schemas/regression-request.schema.json +54 -0
  430. package/schemas/release-assessment.schema.json +34 -0
  431. package/schemas/release-policy.schema.json +30 -0
  432. package/schemas/result-gate-payload.schema.json +244 -0
  433. package/schemas/review-delivery-payload.schema.json +42 -0
  434. package/schemas/role-policy.schema.json +111 -0
  435. package/schemas/run-abort-input.schema.json +11 -0
  436. package/schemas/run-completion-proof.schema.json +62 -0
  437. package/schemas/run-ledger-entry.schema.json +78 -0
  438. package/schemas/run-manifest.schema.json +74 -0
  439. package/schemas/run-start-intent.schema.json +74 -0
  440. package/schemas/runtime-record.schema.json +111 -0
  441. package/schemas/service-plan.schema.json +35 -0
  442. package/schemas/session-payload.schema.json +80 -0
  443. package/schemas/structured-role-read-request.schema.json +14 -0
  444. package/schemas/structured-role-request.schema.json +44 -0
  445. package/schemas/structured-role-result.schema.json +38 -0
  446. package/schemas/structured-role-submit-result.schema.json +15 -0
  447. package/schemas/team-checkpoint.schema.json +42 -0
  448. package/schemas/team-plan.schema.json +30 -0
  449. package/schemas/ticket-content.schema.json +38 -0
  450. package/schemas/ticket-queue-payload.schema.json +191 -0
  451. package/schemas/trust-report.schema.json +68 -0
  452. package/schemas/trust-run.schema.json +47 -0
  453. package/schemas/ultragoal-checkpoint.schema.json +49 -0
  454. package/schemas/user-schedule-installation-v1.schema.json +32 -0
  455. package/schemas/user-schedule-installation.schema.json +38 -0
  456. package/schemas/user-schedule-plan.schema.json +39 -0
  457. package/schemas/verification-plan-evidence.schema.json +37 -0
  458. package/schemas/worker-acknowledge-dispatch.schema.json +12 -0
  459. package/schemas/worker-payload.schema.json +47 -0
  460. package/schemas/worker-read-dispatch.schema.json +11 -0
  461. package/schemas/worker-record-dispatch-result.schema.json +14 -0
@@ -0,0 +1,731 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { readOmsConfig } from "../config.js";
4
+ import { deriveWorktreeId } from "../dispatch/authority.js";
5
+ import { readGoal } from "../goals/authority.js";
6
+ import { discloseLiveContact, readLiveDeliveryAuthorization } from "../live/contact-journal.js";
7
+ import { selectGrader } from "../providers/grading.js";
8
+ import { createClaudeStructuredRoleTransport, } from "../providers/claude-structured.js";
9
+ import { runCodexStructured } from "../providers/codex-exec.js";
10
+ import { runProcess } from "../providers/process.js";
11
+ import { canonicalTimestamp } from "../queue/model.js";
12
+ import { recordFailureReflection } from "../reflections/store.js";
13
+ import { acquireDirectoryLock } from "../runtime/lock.js";
14
+ import { createStableId } from "../runtime/stable-id.js";
15
+ import { recordTrustRun } from "../trust/runs.js";
16
+ import { readJsonFileNoFollow, validateExistingDirectory, } from "../utils/fs.js";
17
+ import { createRuntimeWorkerAuthorities } from "../workers/runtime.js";
18
+ import { parseTicketWorktreeRecord } from "../worktrees/manager.js";
19
+ import { createProtectedVerificationAuthority, } from "./authority.js";
20
+ import { createResultGateStore, } from "./result-gate-store.js";
21
+ const MAX_GATE_STEPS = 12;
22
+ const MAX_DIFF_BYTES = 256 * 1024;
23
+ const RESULT_GATE_SERVICES = new WeakSet();
24
+ export function createResultGateService(options) {
25
+ const packageRoot = validateExistingDirectory(options.packageRoot, "result-gate package root");
26
+ const configRoot = validateExistingDirectory(options.configRoot ?? packageRoot, "result-gate configuration root");
27
+ const workspaceRoot = validateExistingDirectory(options.workspaceRoot, "result-gate workspace root");
28
+ const stateRoot = validateExistingDirectory(options.stateRoot, "result-gate state root");
29
+ const clock = options.clock ?? (() => new Date().toISOString());
30
+ const env = options.env ?? globalThis.process.env;
31
+ const runtime = options.runtime ?? createRuntimeWorkerAuthorities({
32
+ packageRoot,
33
+ configRoot,
34
+ workspaceRoot,
35
+ stateRoot,
36
+ actorId: "oms-conductor",
37
+ clock,
38
+ });
39
+ const verification = options.verification ?? createProtectedVerificationAuthority({
40
+ packageRoot,
41
+ configRoot,
42
+ evidenceStore: runtime.tickets.evidenceStore,
43
+ });
44
+ const claudeStructured = options.claudeStructured ?? createClaudeStructuredRoleTransport({
45
+ packageRoot,
46
+ configRoot,
47
+ workspaceRoot,
48
+ stateRoot,
49
+ executablePath: options.executablePath,
50
+ env,
51
+ clock,
52
+ });
53
+ const codexStructured = options.codexStructured ?? runCodexStructured;
54
+ const gitRunner = options.gitRunner ?? runProcess;
55
+ const gates = createResultGateStore({ packageRoot, stateRoot });
56
+ const nextGateTimestamp = (gate) => nextTimestamp(gate.payload.updated_at, clock);
57
+ function process(dispatchId) {
58
+ const dispatch = runtime.dispatch.read(dispatchId);
59
+ const gateId = gateIdForDispatch(dispatch);
60
+ const lock = acquireDirectoryLock({
61
+ locksRoot: join(stateRoot, "locks"),
62
+ lockId: createStableId("rgate-lock", gateId),
63
+ ownerId: "oms-system",
64
+ note: gateId,
65
+ });
66
+ try {
67
+ let gate = gates.readIfExists(gateId) ?? createGate(dispatch, gateId);
68
+ for (let step = 0; step < MAX_GATE_STEPS; step += 1) {
69
+ if (gate.state === "finalized" || gate.state === "blocked")
70
+ return progress(gate);
71
+ if (gate.state === "checking")
72
+ gate = check(gate);
73
+ else if (gate.state === "checked" || gate.state === "grading") {
74
+ const advanced = grade(gate);
75
+ gate = advanced.gate;
76
+ if (advanced.waiting)
77
+ return progress(gate);
78
+ }
79
+ else {
80
+ const advanced = decide(gate);
81
+ gate = advanced.gate;
82
+ if (advanced.waiting)
83
+ return progress(gate);
84
+ }
85
+ }
86
+ return progress(block(gate, "result gate exceeded its bounded transition budget"));
87
+ }
88
+ finally {
89
+ lock.release();
90
+ }
91
+ }
92
+ function createGate(dispatch, gateId) {
93
+ const subject = captureSubject(dispatch);
94
+ return gates.create(gateId, subject, nextTimestamp(runtime.tickets.lifecycle.read(subject.ticket_id).payload.lifecycle_updated_at, clock));
95
+ }
96
+ function captureSubject(dispatch) {
97
+ const result = dispatch.payload.result;
98
+ if (dispatch.state !== "resolved"
99
+ || dispatch.payload.resolution !== "done"
100
+ || result?.status !== "done"
101
+ || dispatch.payload.executor_evidence === null)
102
+ throw new Error("result gate requires one resolved successful dispatch result");
103
+ const goal = readGoal(runtime.goals.authority, dispatch.payload.goal_id);
104
+ const ticket = runtime.tickets.lifecycle.read(dispatch.payload.ticket_id);
105
+ const worker = runtime.workers.read(dispatch.record_id);
106
+ const session = runtime.sessions.read(dispatch.payload.session_id);
107
+ const worktree = parseTicketWorktreeRecord(readJsonFileNoFollow(join(stateRoot, "worktree-records", `${dispatch.payload.ticket_id}.json`), 64 * 1024), "result-gate worktree record");
108
+ if (goal.state !== "active"
109
+ || goal.version !== dispatch.payload.goal_version
110
+ || goal.payload.repository_scope !== workspaceRoot
111
+ || result.goal_id !== goal.record_id
112
+ || result.goal_version !== goal.version
113
+ || ticket.state !== "verifying"
114
+ || ticket.attempt !== dispatch.payload.attempt
115
+ || ticket.actor !== dispatch.payload.worker_id
116
+ || ticket.lease_token === null
117
+ || String(ticket.lease_token) !== dispatch.payload.lease_token
118
+ || ticket.payload.session_id !== dispatch.payload.session_id
119
+ || !sameEvidenceReference(ticket.payload.executor_evidence, dispatch.payload.executor_evidence)
120
+ || ticket.payload.verification_plan_ref === null
121
+ || ticket.payload.gate_digest !== verification.planDigest
122
+ || ticket.payload.policy_version !== verification.policyVersion
123
+ || ticket.payload.policy_digest !== verification.policyDigest
124
+ || worker.state !== "done"
125
+ || worker.payload.session_id !== dispatch.payload.session_id
126
+ || worker.payload.ticket_id !== dispatch.payload.ticket_id
127
+ || session.payload.ticket_id !== dispatch.payload.ticket_id
128
+ || session.payload.role_id !== dispatch.payload.role_id
129
+ || session.payload.engine !== dispatch.payload.engine
130
+ || session.payload.native_session_ref !== dispatch.payload.session_id
131
+ || worktree.ticket_id !== dispatch.payload.ticket_id
132
+ || worktree.repository_root !== workspaceRoot
133
+ || worktree.worktree_root !== dispatch.payload.worktree_path
134
+ || worktree.branch !== dispatch.payload.worktree_branch
135
+ || worktree.base_commit !== dispatch.payload.worktree_base_commit
136
+ || deriveWorktreeId(worktree) !== dispatch.payload.worktree_id)
137
+ throw new Error("result gate subject no longer matches goal, ticket, session, worker, or worktree authority");
138
+ const plan = runtime.tickets.evidenceStore.read(ticket.payload.verification_plan_ref);
139
+ if (plan.evidence_kind !== "verification-plan"
140
+ || plan.ticket_id !== ticket.record_id
141
+ || plan.payload.digest !== verification.planDigest)
142
+ throw new Error("result gate verification plan binding changed");
143
+ return Object.freeze({
144
+ goal_id: goal.record_id,
145
+ goal_version: goal.version,
146
+ dispatch_id: dispatch.record_id,
147
+ dispatch_version: dispatch.version,
148
+ ticket_id: ticket.record_id,
149
+ verifying_ticket_version: ticket.version,
150
+ attempt: ticket.attempt,
151
+ max_attempts: ticket.max_attempts,
152
+ lease_token: dispatch.payload.lease_token,
153
+ worker_record_id: dispatch.payload.worker_record_id,
154
+ worker_id: dispatch.payload.worker_id,
155
+ session_id: dispatch.payload.session_id,
156
+ executor_role: dispatch.payload.role_id,
157
+ executor_engine: dispatch.payload.engine,
158
+ worktree_id: dispatch.payload.worktree_id,
159
+ worktree_root: dispatch.payload.worktree_path,
160
+ worktree_branch: dispatch.payload.worktree_branch,
161
+ worktree_base_commit: dispatch.payload.worktree_base_commit,
162
+ expected_commit: result.worktree_commit,
163
+ policy_version: verification.policyVersion,
164
+ policy_digest: verification.policyDigest,
165
+ plan_digest: verification.planDigest,
166
+ verification_plan_ref: ticket.payload.verification_plan_ref,
167
+ executor_evidence: dispatch.payload.executor_evidence,
168
+ });
169
+ }
170
+ function check(gate) {
171
+ try {
172
+ const result = verification.verify(gate.payload.subject);
173
+ return gates.transition({
174
+ record: gate,
175
+ step: "checked",
176
+ toState: "checked",
177
+ at: nextGateTimestamp(gate),
178
+ update: (payload) => ({ ...payload, deterministic_evidence: result.ref }),
179
+ });
180
+ }
181
+ catch (error) {
182
+ return block(gate, boundedReason(error));
183
+ }
184
+ }
185
+ function grade(gate) {
186
+ let current = gate;
187
+ try {
188
+ verification.verify(current.payload.subject);
189
+ if (current.payload.deterministic_evidence === null)
190
+ throw new Error("grade requires deterministic evidence");
191
+ if (current.payload.grade_request === null) {
192
+ const request = gradeRequest(current);
193
+ current = gates.transition({
194
+ record: current,
195
+ step: "grade-prepared",
196
+ toState: "grading",
197
+ at: nextGateTimestamp(current),
198
+ update: (payload) => ({ ...payload, grade_request: request }),
199
+ });
200
+ }
201
+ const request = current.payload.grade_request;
202
+ if (!request)
203
+ throw new Error("grade request disappeared");
204
+ discloseRoleRequest(current, request, "opposite-engine-grade");
205
+ const output = request.engine === "codex"
206
+ ? advanceCodexGrade(current, request)
207
+ : advanceClaudeRequest(current, request);
208
+ current = output.gate;
209
+ if (output.waiting)
210
+ return { gate: current, waiting: true };
211
+ if (!output.value)
212
+ throw new Error("grader completed without schema output");
213
+ if (!output.source)
214
+ throw new Error("grader completed without a protected fresh-provider source");
215
+ const gradeEvidence = writeGrade(current, request, output.value, output.submittedAt, output.source);
216
+ current = gates.transition({
217
+ record: current,
218
+ step: "grade-recorded",
219
+ toState: "graded",
220
+ at: nextGateTimestamp(current),
221
+ update: (payload) => ({ ...payload, grade_evidence: gradeEvidence }),
222
+ });
223
+ return { gate: current, waiting: false };
224
+ }
225
+ catch (error) {
226
+ return { gate: block(gates.read(current.record_id), boundedReason(error)), waiting: false };
227
+ }
228
+ }
229
+ function gradeRequest(gate) {
230
+ const dispatch = runtime.dispatch.read(gate.payload.subject.dispatch_id);
231
+ const config = readOmsConfig(configRoot);
232
+ const role = selectGrader(config, dispatch.payload.role_id);
233
+ const deterministicEvidence = gate.payload.deterministic_evidence;
234
+ if (deterministicEvidence === null)
235
+ throw new Error("grade request lacks deterministic evidence");
236
+ const input = Object.freeze({
237
+ schema_version: 1,
238
+ ticket_id: dispatch.payload.ticket_id,
239
+ goal_id: dispatch.payload.goal_id,
240
+ dispatch_id: dispatch.record_id,
241
+ attempt: dispatch.payload.attempt,
242
+ lease_token: dispatch.payload.lease_token,
243
+ executor_engine: dispatch.payload.engine,
244
+ grader_engine: role.engine,
245
+ task_body: dispatch.payload.task_body,
246
+ acceptance_criteria: [...dispatch.payload.acceptance_criteria],
247
+ deterministic_evidence: deterministicEvidence,
248
+ deterministic_check: runtime.tickets.evidenceStore.read(deterministicEvidence).payload,
249
+ diff: readProtectedDiff(gate.payload.subject, env, gitRunner),
250
+ });
251
+ return Object.freeze({
252
+ request_id: createStableId("grade-request", deterministicEvidence.evidence_id, deterministicEvidence.sha256),
253
+ role_id: role.role_id,
254
+ engine: role.engine,
255
+ evidence_schema: "grader-output.v1",
256
+ input,
257
+ started_at: null,
258
+ session_id: null,
259
+ });
260
+ }
261
+ function advanceCodexGrade(gate, request) {
262
+ const outputPath = join(stateRoot, "codex-structured-results", `${request.request_id}.final.json`);
263
+ if (existsSync(outputPath)) {
264
+ throw new Error("Codex grade output exists without an in-process fresh-provider receipt; duplicate launch is forbidden");
265
+ }
266
+ if (request.started_at !== null) {
267
+ throw new Error("Codex grade invocation is ambiguous after restart; same-engine fallback and duplicate launch are forbidden");
268
+ }
269
+ const startedAt = nextGateTimestamp(gate);
270
+ const started = gates.transition({
271
+ record: gate,
272
+ step: "grade-codex-started",
273
+ toState: "grading",
274
+ at: startedAt,
275
+ update: (payload) => ({
276
+ ...payload,
277
+ grade_request: { ...request, started_at: startedAt, session_id: request.request_id },
278
+ }),
279
+ });
280
+ let result;
281
+ try {
282
+ result = codexStructured({
283
+ config: readOmsConfig(configRoot),
284
+ roleId: "oms.grader.codex",
285
+ prompt: gradePrompt(request.input),
286
+ requestId: request.request_id,
287
+ cwd: gate.payload.subject.worktree_root,
288
+ temporaryRoot: join(stateRoot, "codex-structured-results"),
289
+ packageRoot,
290
+ env,
291
+ });
292
+ }
293
+ catch (error) {
294
+ if (existsSync(outputPath)) {
295
+ throw new Error("Codex grade ended ambiguously after creating output; duplicate launch is forbidden");
296
+ }
297
+ throw error;
298
+ }
299
+ return {
300
+ gate: started,
301
+ waiting: false,
302
+ value: result.value,
303
+ submittedAt: nextGateTimestamp(started),
304
+ source: { engine: "codex", result },
305
+ };
306
+ }
307
+ function advanceClaudeRequest(gate, request) {
308
+ let current = gate;
309
+ if (request.role_id !== "oms.grader.claude" && request.role_id !== "oms.bounded-dreamer") {
310
+ throw new Error("Claude structured request has an ineligible role");
311
+ }
312
+ if (request.started_at === null) {
313
+ const prepared = claudeStructured.prepare({
314
+ requestId: request.request_id,
315
+ roleId: request.role_id,
316
+ evidenceSchema: request.evidence_schema,
317
+ input: request.input,
318
+ });
319
+ const startedAt = nextGateTimestamp(current);
320
+ current = gates.transition({
321
+ record: current,
322
+ step: `${request.evidence_schema}-claude-started`,
323
+ toState: current.state,
324
+ at: startedAt,
325
+ update: (payload) => updateRoleRequest(payload, request, {
326
+ ...request,
327
+ started_at: startedAt,
328
+ session_id: prepared.request.claude_session_id,
329
+ }),
330
+ });
331
+ const progress = claudeStructured.advance(prepared);
332
+ if (progress.status === "blocked")
333
+ throw new Error(progress.reason);
334
+ if (progress.status !== "complete")
335
+ return { gate: current, waiting: true, submittedAt: startedAt };
336
+ return {
337
+ gate: current,
338
+ waiting: false,
339
+ value: progress.result.result,
340
+ submittedAt: progress.result.submitted_at,
341
+ ...(request.role_id === "oms.grader.claude"
342
+ ? { source: { engine: "claude", result: progress.result } }
343
+ : {}),
344
+ };
345
+ }
346
+ const progress = claudeStructured.read(request.request_id);
347
+ if (progress.status === "blocked")
348
+ throw new Error(progress.reason);
349
+ if (progress.status !== "complete")
350
+ return { gate: current, waiting: true, submittedAt: nextGateTimestamp(current) };
351
+ if (request.session_id !== progress.result.claude_session_id) {
352
+ throw new Error("Claude structured result changed its fresh session binding");
353
+ }
354
+ return {
355
+ gate: current,
356
+ waiting: false,
357
+ value: progress.result.result,
358
+ submittedAt: progress.result.submitted_at,
359
+ ...(request.role_id === "oms.grader.claude"
360
+ ? { source: { engine: "claude", result: progress.result } }
361
+ : {}),
362
+ };
363
+ }
364
+ function writeGrade(gate, request, value, createdAt, source) {
365
+ const deterministicEvidence = gate.payload.deterministic_evidence;
366
+ if (deterministicEvidence === null)
367
+ throw new Error("grade evidence lacks deterministic evidence");
368
+ if (!sameEvidenceReference(value.deterministic_evidence, deterministicEvidence)) {
369
+ throw new Error("grader returned another deterministic evidence reference");
370
+ }
371
+ const written = verification.writeGrade({
372
+ schema_version: 1,
373
+ evidence_id: createStableId("grade", deterministicEvidence.evidence_id, request.request_id),
374
+ evidence_kind: "grader-output",
375
+ ticket_id: gate.payload.subject.ticket_id,
376
+ producer_role: request.role_id,
377
+ created_at: canonicalTimestamp(createdAt, "grade evidence timestamp"),
378
+ payload: value,
379
+ }, source);
380
+ return written.ref;
381
+ }
382
+ function decide(gate) {
383
+ let current = gate;
384
+ try {
385
+ verification.verify(current.payload.subject);
386
+ const deterministic = requiredEvidence(current.payload.deterministic_evidence, "deterministic");
387
+ const gradeEvidence = requiredEvidence(current.payload.grade_evidence, "grade");
388
+ const check = runtime.tickets.evidenceStore.read(deterministic);
389
+ const gradeRecord = runtime.tickets.evidenceStore.read(gradeEvidence);
390
+ if (check.payload.passed === true && gradeRecord.payload.verdict === "pass") {
391
+ return { gate: complete(current, deterministic, gradeEvidence), waiting: false };
392
+ }
393
+ if (current.payload.reflection_request === null) {
394
+ const failureEvidence = check.payload.passed === true ? gradeEvidence : deterministic;
395
+ const request = reflectionRequest(current, failureEvidence, check, gradeRecord);
396
+ current = gates.transition({
397
+ record: current,
398
+ step: "reflection-prepared",
399
+ toState: "reflecting",
400
+ at: nextGateTimestamp(current),
401
+ update: (payload) => ({ ...payload, reflection_request: request }),
402
+ });
403
+ }
404
+ const request = current.payload.reflection_request;
405
+ if (!request)
406
+ throw new Error("reflection request disappeared");
407
+ discloseRoleRequest(current, request, "bounded-reflection");
408
+ const reflected = advanceClaudeRequest(current, request);
409
+ current = reflected.gate;
410
+ if (reflected.waiting)
411
+ return { gate: current, waiting: true };
412
+ if (!reflected.value)
413
+ throw new Error("reflection completed without schema output");
414
+ return { gate: failAttempt(current, reflected.value), waiting: false };
415
+ }
416
+ catch (error) {
417
+ return { gate: block(gates.read(current.record_id), boundedReason(error)), waiting: false };
418
+ }
419
+ }
420
+ function reflectionRequest(gate, failureEvidence, deterministic, grade) {
421
+ return Object.freeze({
422
+ request_id: createStableId("dream-request", failureEvidence.evidence_id, failureEvidence.sha256),
423
+ role_id: "oms.bounded-dreamer",
424
+ engine: "claude",
425
+ evidence_schema: "reflection.v1",
426
+ input: Object.freeze({
427
+ schema_version: 1,
428
+ ticket_id: gate.payload.subject.ticket_id,
429
+ attempt: gate.payload.subject.attempt,
430
+ failure_evidence: failureEvidence,
431
+ deterministic_evidence: gate.payload.deterministic_evidence,
432
+ deterministic_check: deterministic.payload,
433
+ grade_evidence: gate.payload.grade_evidence,
434
+ grade: grade.payload,
435
+ }),
436
+ started_at: null,
437
+ session_id: null,
438
+ });
439
+ }
440
+ function complete(gate, deterministicEvidence, gradeEvidence) {
441
+ let ticket = runtime.tickets.lifecycle.read(gate.payload.subject.ticket_id);
442
+ if (ticket.state === "verifying") {
443
+ ticket = runtime.tickets.lifecycle.complete({
444
+ ticketId: ticket.record_id,
445
+ operationId: createStableId("gate-complete", gate.record_id),
446
+ ownerId: gate.payload.subject.worker_id,
447
+ expectedVersion: ticket.version,
448
+ expectedAttempt: ticket.attempt,
449
+ expectedActor: ticket.actor,
450
+ expectedLeaseToken: ticket.lease_token,
451
+ at: nextTimestamp(ticket.payload.lifecycle_updated_at, clock),
452
+ verificationEvidence: deterministicEvidence,
453
+ gradeEvidence,
454
+ }).record;
455
+ }
456
+ if (ticket.state !== "completed")
457
+ throw new Error(`passing result gate found ticket in ${ticket.state}`);
458
+ const trust = recordTrustRun({
459
+ evidenceStore: runtime.tickets.evidenceStore,
460
+ deterministicEvidence,
461
+ ticketMaterializer: runtime.tickets.materializer,
462
+ });
463
+ return gates.transition({
464
+ record: gate,
465
+ step: "final-completed",
466
+ toState: "finalized",
467
+ at: nextGateTimestamp(gate),
468
+ update: (payload) => ({ ...payload, outcome: "completed", trust_evidence: trust.ref }),
469
+ });
470
+ }
471
+ function failAttempt(gate, advice) {
472
+ const deterministicEvidence = requiredEvidence(gate.payload.deterministic_evidence, "deterministic");
473
+ const gradeEvidence = requiredEvidence(gate.payload.grade_evidence, "grade");
474
+ const deterministic = runtime.tickets.evidenceStore.read(deterministicEvidence);
475
+ const failureEvidence = deterministic.payload.passed === true ? gradeEvidence : deterministicEvidence;
476
+ let ticket = runtime.tickets.lifecycle.read(gate.payload.subject.ticket_id);
477
+ if (ticket.state === "verifying") {
478
+ ticket = runtime.tickets.lifecycle.failAttempt({
479
+ ticketId: ticket.record_id,
480
+ operationId: createStableId("gate-fail", gate.record_id),
481
+ ownerId: gate.payload.subject.worker_id,
482
+ expectedVersion: ticket.version,
483
+ expectedAttempt: ticket.attempt,
484
+ expectedActor: ticket.actor,
485
+ expectedLeaseToken: ticket.lease_token,
486
+ at: nextTimestamp(ticket.payload.lifecycle_updated_at, clock),
487
+ error: deterministic.payload.passed === true
488
+ ? "fresh opposite-engine grader rejected the attempt"
489
+ : `deterministic verification failed at ${String(deterministic.payload.failed_step ?? "unknown")}`,
490
+ executorEvidence: gate.payload.subject.executor_evidence,
491
+ verificationEvidence: deterministicEvidence,
492
+ gradeEvidence,
493
+ failureEvidence,
494
+ }).record;
495
+ }
496
+ if (ticket.state !== "retryable" && ticket.state !== "blocked") {
497
+ throw new Error(`failed result gate found ticket in ${ticket.state}`);
498
+ }
499
+ const reflection = recordFailureReflection({
500
+ evidenceStore: runtime.tickets.evidenceStore,
501
+ failureEvidence,
502
+ ticketMaterializer: runtime.tickets.materializer,
503
+ advice: {
504
+ failure: String(advice.failure),
505
+ lesson: String(advice.lesson),
506
+ next_attempt: String(advice.next_attempt),
507
+ },
508
+ });
509
+ if (ticket.state === "retryable" && !sameEvidenceReference(ticket.payload.prior_reflection_evidence, reflection.ref)) {
510
+ ticket = runtime.tickets.lifecycle.attachRetryReflection({
511
+ ticketId: ticket.record_id,
512
+ operationId: createStableId("gate-reflect", gate.record_id),
513
+ ownerId: "oms-system",
514
+ expectedVersion: ticket.version,
515
+ expectedAttempt: ticket.attempt,
516
+ expectedActor: ticket.actor,
517
+ expectedLeaseToken: ticket.lease_token,
518
+ at: nextTimestamp(ticket.payload.lifecycle_updated_at, clock),
519
+ reflectionEvidence: reflection.ref,
520
+ }).record;
521
+ }
522
+ const trust = deterministic.payload.passed === false
523
+ ? recordTrustRun({
524
+ evidenceStore: runtime.tickets.evidenceStore,
525
+ deterministicEvidence,
526
+ ticketMaterializer: runtime.tickets.materializer,
527
+ })
528
+ : undefined;
529
+ return gates.transition({
530
+ record: gate,
531
+ step: `final-${ticket.state}`,
532
+ toState: "finalized",
533
+ at: nextGateTimestamp(gate),
534
+ update: (payload) => ({
535
+ ...payload,
536
+ reflection_evidence: reflection.ref,
537
+ trust_evidence: trust?.ref ?? payload.trust_evidence,
538
+ outcome: ticket.state,
539
+ }),
540
+ });
541
+ }
542
+ function block(gate, rawReason) {
543
+ if (gate.state === "blocked")
544
+ return gate;
545
+ const reason = boundedReason(rawReason);
546
+ let ticket = runtime.tickets.lifecycle.read(gate.payload.subject.ticket_id);
547
+ if (ticket.state === "verifying") {
548
+ ticket = runtime.tickets.lifecycle.blockVerification({
549
+ ticketId: ticket.record_id,
550
+ operationId: createStableId("gate-block", gate.record_id, reason),
551
+ ownerId: "oms-system",
552
+ expectedVersion: ticket.version,
553
+ expectedAttempt: ticket.attempt,
554
+ expectedActor: ticket.actor,
555
+ expectedLeaseToken: ticket.lease_token,
556
+ at: nextTimestamp(ticket.payload.lifecycle_updated_at, clock),
557
+ error: reason,
558
+ ...(gate.payload.deterministic_evidence ? { verificationEvidence: gate.payload.deterministic_evidence } : {}),
559
+ ...(gate.payload.grade_evidence ? { gradeEvidence: gate.payload.grade_evidence } : {}),
560
+ }).record;
561
+ }
562
+ else if (ticket.state !== "blocked") {
563
+ throw new Error(`cannot block result gate after ticket reached ${ticket.state}`);
564
+ }
565
+ const deterministic = gate.payload.deterministic_evidence === null
566
+ ? undefined
567
+ : runtime.tickets.evidenceStore.read(gate.payload.deterministic_evidence);
568
+ const trust = deterministic?.payload.passed === false
569
+ ? recordTrustRun({
570
+ evidenceStore: runtime.tickets.evidenceStore,
571
+ deterministicEvidence: gate.payload.deterministic_evidence,
572
+ ticketMaterializer: runtime.tickets.materializer,
573
+ })
574
+ : undefined;
575
+ return gates.transition({
576
+ record: gate,
577
+ step: "final-blocked",
578
+ toState: "blocked",
579
+ at: nextGateTimestamp(gate),
580
+ update: (payload) => ({
581
+ ...payload,
582
+ outcome: "blocked",
583
+ blocked_reason: reason,
584
+ trust_evidence: trust?.ref ?? payload.trust_evidence,
585
+ }),
586
+ });
587
+ }
588
+ function progress(gate) {
589
+ const ticket = runtime.tickets.lifecycle.read(gate.payload.subject.ticket_id);
590
+ const status = gate.state === "blocked"
591
+ ? "blocked"
592
+ : gate.state === "finalized"
593
+ ? gate.payload.outcome
594
+ : gate.state === "grading" || gate.state === "reflecting"
595
+ ? "waiting"
596
+ : "checking";
597
+ return Object.freeze({
598
+ status,
599
+ gate_id: gate.record_id,
600
+ gate_state: gate.state,
601
+ ticket_id: ticket.record_id,
602
+ ticket_state: ticket.state,
603
+ deterministic_evidence: gate.payload.deterministic_evidence,
604
+ grade_evidence: gate.payload.grade_evidence,
605
+ reflection_evidence: gate.payload.reflection_evidence,
606
+ trust_evidence: gate.payload.trust_evidence,
607
+ reason: gate.payload.blocked_reason,
608
+ });
609
+ }
610
+ function discloseRoleRequest(gate, request, operation) {
611
+ const ticket = runtime.tickets.lifecycle.read(gate.payload.subject.ticket_id);
612
+ if (ticket.payload.source !== "github")
613
+ return;
614
+ const content = runtime.tickets.materializer.readContent({
615
+ ticket_id: ticket.record_id,
616
+ sha256: ticket.payload.content_sha256,
617
+ file_name: ticket.payload.content_file,
618
+ });
619
+ if (content.repository === null)
620
+ throw new Error("GitHub result gate ticket lacks its repository");
621
+ const authorization = readLiveDeliveryAuthorization(stateRoot);
622
+ if (!authorization || authorization.repository !== content.repository.toLowerCase()) {
623
+ throw new Error("provider role contact lacks matching human-started live authorization");
624
+ }
625
+ discloseLiveContact({
626
+ stateRoot,
627
+ authorization,
628
+ operation,
629
+ contactSurface: request.engine === "codex" ? "codex-exec" : "claude-interactive",
630
+ subjectId: request.request_id,
631
+ request: {
632
+ request_id: request.request_id,
633
+ role_id: request.role_id,
634
+ engine: request.engine,
635
+ evidence_schema: request.evidence_schema,
636
+ input: request.input,
637
+ },
638
+ disclosedAt: gate.payload.updated_at,
639
+ });
640
+ }
641
+ const serviceValue = {
642
+ process,
643
+ read(dispatchId) {
644
+ const dispatch = runtime.dispatch.read(dispatchId);
645
+ const gate = gates.readIfExists(gateIdForDispatch(dispatch));
646
+ return gate ? progress(gate) : undefined;
647
+ },
648
+ list() {
649
+ return Object.freeze(gates.list().map(progress));
650
+ },
651
+ };
652
+ const service = Object.freeze(serviceValue);
653
+ RESULT_GATE_SERVICES.add(service);
654
+ return service;
655
+ }
656
+ function gateIdForDispatch(dispatch) {
657
+ const result = dispatch.payload.result;
658
+ if (!result)
659
+ throw new Error("dispatch has no result receipt");
660
+ return createStableId("rgate", dispatch.record_id, result.operation_nonce);
661
+ }
662
+ function updateRoleRequest(payload, current, next) {
663
+ return current.evidence_schema === "grader-output.v1"
664
+ ? { ...payload, grade_request: next }
665
+ : { ...payload, reflection_request: next };
666
+ }
667
+ function gradePrompt(input) {
668
+ return [
669
+ "Act as the fresh read-only OMS cross-engine grader.",
670
+ "Use the raw deterministic evidence and diff below. A failed deterministic check is final.",
671
+ "Return only the configured grader-output schema and repeat the exact deterministic_evidence reference.",
672
+ JSON.stringify(input),
673
+ ].join("\n\n");
674
+ }
675
+ function readProtectedDiff(subject, sourceEnv, runner) {
676
+ const result = runner({
677
+ command: "git",
678
+ args: [
679
+ "-c", "core.attributesfile=/dev/null",
680
+ "diff", "--no-ext-diff", "--no-textconv", "--unified=80",
681
+ subject.worktree_base_commit, subject.expected_commit, "--", ".",
682
+ ],
683
+ cwd: subject.worktree_root,
684
+ env: protectedGitEnvironment(sourceEnv),
685
+ timeoutMs: 30_000,
686
+ maxBufferBytes: MAX_DIFF_BYTES,
687
+ });
688
+ if (result.error || result.status !== 0 || result.signal !== null) {
689
+ throw new Error("protected grader diff could not be captured");
690
+ }
691
+ return Object.freeze({
692
+ base_commit: subject.worktree_base_commit,
693
+ head_commit: subject.expected_commit,
694
+ patch: result.stdout,
695
+ });
696
+ }
697
+ function protectedGitEnvironment(source) {
698
+ const env = {};
699
+ for (const key of ["PATH", "HOME", "TMPDIR", "TMP", "TEMP", "LANG", "LC_ALL", "SYSTEMROOT"]) {
700
+ if (source[key] !== undefined)
701
+ env[key] = source[key];
702
+ }
703
+ env.GIT_TERMINAL_PROMPT = "0";
704
+ env.GIT_CONFIG_NOSYSTEM = "1";
705
+ env.GIT_CONFIG_GLOBAL = "/dev/null";
706
+ return env;
707
+ }
708
+ function requiredEvidence(reference, label) {
709
+ if (reference === null)
710
+ throw new Error(`result gate lacks ${label} evidence`);
711
+ return reference;
712
+ }
713
+ function sameEvidenceReference(left, right) {
714
+ return left !== null
715
+ && left !== undefined
716
+ && right !== null
717
+ && right !== undefined
718
+ && left.evidence_id === right.evidence_id
719
+ && left.sha256 === right.sha256
720
+ && left.file_name === right.file_name;
721
+ }
722
+ function nextTimestamp(after, clock) {
723
+ const floor = Date.parse(canonicalTimestamp(after, "previous timestamp"));
724
+ const sampled = Date.parse(canonicalTimestamp(clock(), "result-gate timestamp"));
725
+ return new Date(Math.max(sampled, floor + 1)).toISOString();
726
+ }
727
+ function boundedReason(error) {
728
+ const value = error instanceof Error ? error.message : String(error);
729
+ return (value.trim().replace(/[\0\r\n]+/gu, " ") || "result gate blocked").slice(0, 2048);
730
+ }
731
+ //# sourceMappingURL=result-gate.js.map