@openrig/cli 0.4.3 → 0.4.6

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 (634) hide show
  1. package/daemon/assets/guidance/openrig-start.md +6 -0
  2. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +47 -21
  3. package/daemon/assets/plugins/openrig-core/skills/openrig-cmux/SKILL.md +86 -0
  4. package/daemon/assets/plugins/openrig-core/skills/openrig-herdr/SKILL.md +158 -0
  5. package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +742 -94
  6. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  7. package/daemon/dist/adapters/codex-runtime-adapter.js +12 -8
  8. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  9. package/daemon/dist/adapters/pi-resume.d.ts +32 -0
  10. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -0
  11. package/daemon/dist/adapters/pi-resume.js +125 -0
  12. package/daemon/dist/adapters/pi-resume.js.map +1 -0
  13. package/daemon/dist/adapters/pi-runner-protocol.d.ts +88 -0
  14. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -0
  15. package/daemon/dist/adapters/pi-runner-protocol.js +153 -0
  16. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -0
  17. package/daemon/dist/adapters/pi-runner.d.ts +99 -0
  18. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -0
  19. package/daemon/dist/adapters/pi-runner.js +519 -0
  20. package/daemon/dist/adapters/pi-runner.js.map +1 -0
  21. package/daemon/dist/adapters/pi-runtime-adapter.d.ts +61 -0
  22. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -0
  23. package/daemon/dist/adapters/pi-runtime-adapter.js +356 -0
  24. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -0
  25. package/daemon/dist/adapters/tmux.d.ts +22 -1
  26. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  27. package/daemon/dist/adapters/tmux.js +40 -1
  28. package/daemon/dist/adapters/tmux.js.map +1 -1
  29. package/daemon/dist/build-info.d.ts +12 -0
  30. package/daemon/dist/build-info.d.ts.map +1 -0
  31. package/daemon/dist/build-info.js +11 -0
  32. package/daemon/dist/build-info.js.map +1 -0
  33. package/daemon/dist/builtins/workflow-specs/branched-remediation.yaml +31 -0
  34. package/daemon/dist/builtins/workflow-specs/factory-rsi.yaml +152 -0
  35. package/daemon/dist/builtins/workflow-specs/gated-release.yaml +26 -0
  36. package/daemon/dist/builtins/workflow-specs/linear-build.yaml +21 -0
  37. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts +18 -0
  38. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.d.ts.map +1 -0
  39. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js +22 -0
  40. package/daemon/dist/db/migrations/048_queue_item_evidence_ref.js.map +1 -0
  41. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts +20 -0
  42. package/daemon/dist/db/migrations/049_workflow_instance_version.d.ts.map +1 -0
  43. package/daemon/dist/db/migrations/049_workflow_instance_version.js +24 -0
  44. package/daemon/dist/db/migrations/049_workflow_instance_version.js.map +1 -0
  45. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts +22 -0
  46. package/daemon/dist/db/migrations/050_workflow_spec_json.d.ts.map +1 -0
  47. package/daemon/dist/db/migrations/050_workflow_spec_json.js +26 -0
  48. package/daemon/dist/db/migrations/050_workflow_spec_json.js.map +1 -0
  49. package/daemon/dist/db/migrations/051_workflow_resume.d.ts +22 -0
  50. package/daemon/dist/db/migrations/051_workflow_resume.d.ts.map +1 -0
  51. package/daemon/dist/db/migrations/051_workflow_resume.js +27 -0
  52. package/daemon/dist/db/migrations/051_workflow_resume.js.map +1 -0
  53. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts +26 -0
  54. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.d.ts.map +1 -0
  55. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js +30 -0
  56. package/daemon/dist/db/migrations/052_workflow_instance_bound_rig.js.map +1 -0
  57. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts +48 -0
  58. package/daemon/dist/db/migrations/053_sessions_node_id_index.d.ts.map +1 -0
  59. package/daemon/dist/db/migrations/053_sessions_node_id_index.js +53 -0
  60. package/daemon/dist/db/migrations/053_sessions_node_id_index.js.map +1 -0
  61. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts +34 -0
  62. package/daemon/dist/db/migrations/054_queue_transitions_archive.d.ts.map +1 -0
  63. package/daemon/dist/db/migrations/054_queue_transitions_archive.js +49 -0
  64. package/daemon/dist/db/migrations/054_queue_transitions_archive.js.map +1 -0
  65. package/daemon/dist/domain/claim-service.d.ts +11 -0
  66. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  67. package/daemon/dist/domain/claim-service.js +3 -1
  68. package/daemon/dist/domain/claim-service.js.map +1 -1
  69. package/daemon/dist/domain/discovery-types.d.ts +1 -1
  70. package/daemon/dist/domain/discovery-types.d.ts.map +1 -1
  71. package/daemon/dist/domain/feed/attention-aggregator.d.ts +31 -0
  72. package/daemon/dist/domain/feed/attention-aggregator.d.ts.map +1 -0
  73. package/daemon/dist/domain/feed/attention-aggregator.js +119 -0
  74. package/daemon/dist/domain/feed/attention-aggregator.js.map +1 -0
  75. package/daemon/dist/domain/files/file-write-service.d.ts +11 -2
  76. package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -1
  77. package/daemon/dist/domain/files/file-write-service.js +77 -0
  78. package/daemon/dist/domain/files/file-write-service.js.map +1 -1
  79. package/daemon/dist/domain/hosts/fanout-contract.d.ts +33 -0
  80. package/daemon/dist/domain/hosts/fanout-contract.d.ts.map +1 -0
  81. package/daemon/dist/domain/hosts/fanout-contract.js +23 -0
  82. package/daemon/dist/domain/hosts/fanout-contract.js.map +1 -0
  83. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts +50 -0
  84. package/daemon/dist/domain/hosts/hosts-registry-reader.d.ts.map +1 -0
  85. package/daemon/dist/domain/hosts/hosts-registry-reader.js +184 -0
  86. package/daemon/dist/domain/hosts/hosts-registry-reader.js.map +1 -0
  87. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts +11 -0
  88. package/daemon/dist/domain/hosts/hosts-registry-writer.d.ts.map +1 -0
  89. package/daemon/dist/domain/hosts/hosts-registry-writer.js +54 -0
  90. package/daemon/dist/domain/hosts/hosts-registry-writer.js.map +1 -0
  91. package/daemon/dist/domain/hosts/read-through.d.ts +28 -0
  92. package/daemon/dist/domain/hosts/read-through.d.ts.map +1 -0
  93. package/daemon/dist/domain/hosts/read-through.js +139 -0
  94. package/daemon/dist/domain/hosts/read-through.js.map +1 -0
  95. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts +56 -0
  96. package/daemon/dist/domain/hosts/remote-daemon-http.d.ts.map +1 -0
  97. package/daemon/dist/domain/hosts/remote-daemon-http.js +154 -0
  98. package/daemon/dist/domain/hosts/remote-daemon-http.js.map +1 -0
  99. package/daemon/dist/domain/human-route-enforcer.d.ts +71 -0
  100. package/daemon/dist/domain/human-route-enforcer.d.ts.map +1 -0
  101. package/daemon/dist/domain/human-route-enforcer.js +80 -0
  102. package/daemon/dist/domain/human-route-enforcer.js.map +1 -0
  103. package/daemon/dist/domain/mission-control/audit-browse.d.ts +8 -0
  104. package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -1
  105. package/daemon/dist/domain/mission-control/audit-browse.js +19 -0
  106. package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -1
  107. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
  108. package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
  109. package/daemon/dist/domain/mission-control/mission-control-action-log.js +4 -0
  110. package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
  111. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +1 -1
  112. package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -1
  113. package/daemon/dist/domain/mission-control/mission-control-read-layer.js +1 -1
  114. package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
  115. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +28 -0
  116. package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
  117. package/daemon/dist/domain/mission-control/mission-control-write-contract.js +125 -0
  118. package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
  119. package/daemon/dist/domain/node-inventory.d.ts +18 -0
  120. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  121. package/daemon/dist/domain/node-inventory.js +206 -95
  122. package/daemon/dist/domain/node-inventory.js.map +1 -1
  123. package/daemon/dist/domain/node-launcher.d.ts +11 -0
  124. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  125. package/daemon/dist/domain/node-launcher.js +10 -0
  126. package/daemon/dist/domain/node-launcher.js.map +1 -1
  127. package/daemon/dist/domain/policies/workflow-keepalive.d.ts +7 -0
  128. package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
  129. package/daemon/dist/domain/policies/workflow-keepalive.js +93 -13
  130. package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
  131. package/daemon/dist/domain/ps-projection.d.ts +28 -1
  132. package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
  133. package/daemon/dist/domain/ps-projection.js +76 -26
  134. package/daemon/dist/domain/ps-projection.js.map +1 -1
  135. package/daemon/dist/domain/queue-repository.d.ts +130 -1
  136. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  137. package/daemon/dist/domain/queue-repository.js +304 -11
  138. package/daemon/dist/domain/queue-repository.js.map +1 -1
  139. package/daemon/dist/domain/queue-retention.d.ts +130 -0
  140. package/daemon/dist/domain/queue-retention.d.ts.map +1 -0
  141. package/daemon/dist/domain/queue-retention.js +224 -0
  142. package/daemon/dist/domain/queue-retention.js.map +1 -0
  143. package/daemon/dist/domain/restore-orchestrator.d.ts +5 -0
  144. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  145. package/daemon/dist/domain/restore-orchestrator.js +29 -2
  146. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  147. package/daemon/dist/domain/resume-token-capture.d.ts +13 -0
  148. package/daemon/dist/domain/resume-token-capture.d.ts.map +1 -1
  149. package/daemon/dist/domain/resume-token-capture.js +14 -1
  150. package/daemon/dist/domain/resume-token-capture.js.map +1 -1
  151. package/daemon/dist/domain/resume-token-validation.d.ts +1 -1
  152. package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -1
  153. package/daemon/dist/domain/resume-token-validation.js +58 -10
  154. package/daemon/dist/domain/resume-token-validation.js.map +1 -1
  155. package/daemon/dist/domain/review/brief-spine.d.ts +19 -0
  156. package/daemon/dist/domain/review/brief-spine.d.ts.map +1 -0
  157. package/daemon/dist/domain/review/brief-spine.js +86 -0
  158. package/daemon/dist/domain/review/brief-spine.js.map +1 -0
  159. package/daemon/dist/domain/review/compose.d.ts +277 -0
  160. package/daemon/dist/domain/review/compose.d.ts.map +1 -0
  161. package/daemon/dist/domain/review/compose.js +862 -0
  162. package/daemon/dist/domain/review/compose.js.map +1 -0
  163. package/daemon/dist/domain/review/fleet-compose.d.ts +52 -0
  164. package/daemon/dist/domain/review/fleet-compose.d.ts.map +1 -0
  165. package/daemon/dist/domain/review/fleet-compose.js +294 -0
  166. package/daemon/dist/domain/review/fleet-compose.js.map +1 -0
  167. package/daemon/dist/domain/review/freeze.d.ts +31 -0
  168. package/daemon/dist/domain/review/freeze.d.ts.map +1 -0
  169. package/daemon/dist/domain/review/freeze.js +257 -0
  170. package/daemon/dist/domain/review/freeze.js.map +1 -0
  171. package/daemon/dist/domain/review/gather.d.ts +115 -0
  172. package/daemon/dist/domain/review/gather.d.ts.map +1 -0
  173. package/daemon/dist/domain/review/gather.js +812 -0
  174. package/daemon/dist/domain/review/gather.js.map +1 -0
  175. package/daemon/dist/domain/review/types.d.ts +361 -0
  176. package/daemon/dist/domain/review/types.d.ts.map +1 -0
  177. package/daemon/dist/domain/review/types.js +35 -0
  178. package/daemon/dist/domain/review/types.js.map +1 -0
  179. package/daemon/dist/domain/rig-expansion-service.d.ts.map +1 -1
  180. package/daemon/dist/domain/rig-expansion-service.js +3 -0
  181. package/daemon/dist/domain/rig-expansion-service.js.map +1 -1
  182. package/daemon/dist/domain/rig-repository.d.ts +7 -6
  183. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  184. package/daemon/dist/domain/rig-repository.js +33 -11
  185. package/daemon/dist/domain/rig-repository.js.map +1 -1
  186. package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
  187. package/daemon/dist/domain/rigspec-codec.js +3 -0
  188. package/daemon/dist/domain/rigspec-codec.js.map +1 -1
  189. package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
  190. package/daemon/dist/domain/rigspec-exporter.js +4 -0
  191. package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
  192. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  193. package/daemon/dist/domain/rigspec-instantiator.js +11 -0
  194. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  195. package/daemon/dist/domain/rigspec-preflight.d.ts +6 -0
  196. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  197. package/daemon/dist/domain/rigspec-preflight.js +26 -1
  198. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  199. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  200. package/daemon/dist/domain/rigspec-schema.js +20 -1
  201. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  202. package/daemon/dist/domain/runtime-verifier.d.ts +7 -1
  203. package/daemon/dist/domain/runtime-verifier.d.ts.map +1 -1
  204. package/daemon/dist/domain/runtime-verifier.js +39 -1
  205. package/daemon/dist/domain/runtime-verifier.js.map +1 -1
  206. package/daemon/dist/domain/scope/scope-approve.d.ts +64 -0
  207. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -0
  208. package/daemon/dist/domain/scope/scope-approve.js +153 -0
  209. package/daemon/dist/domain/scope/scope-approve.js.map +1 -0
  210. package/daemon/dist/domain/scope/scope-audit.d.ts +9 -1
  211. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -1
  212. package/daemon/dist/domain/scope/scope-audit.js +173 -1
  213. package/daemon/dist/domain/scope/scope-audit.js.map +1 -1
  214. package/daemon/dist/domain/seat-handover-service.d.ts +9 -0
  215. package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
  216. package/daemon/dist/domain/seat-handover-service.js +2 -0
  217. package/daemon/dist/domain/seat-handover-service.js.map +1 -1
  218. package/daemon/dist/domain/seat-identity-store.d.ts +7 -0
  219. package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
  220. package/daemon/dist/domain/seat-identity-store.js +27 -0
  221. package/daemon/dist/domain/seat-identity-store.js.map +1 -1
  222. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  223. package/daemon/dist/domain/seat-status-service.js +6 -4
  224. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  225. package/daemon/dist/domain/session-name.d.ts +22 -0
  226. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  227. package/daemon/dist/domain/session-name.js +29 -0
  228. package/daemon/dist/domain/session-name.js.map +1 -1
  229. package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -1
  230. package/daemon/dist/domain/slices/slice-detail-projector.js +4 -5
  231. package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -1
  232. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +18 -2
  233. package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
  234. package/daemon/dist/domain/spec-library-workflow-scanner.js +23 -1
  235. package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
  236. package/daemon/dist/domain/startup-proof.d.ts +10 -6
  237. package/daemon/dist/domain/startup-proof.d.ts.map +1 -1
  238. package/daemon/dist/domain/startup-proof.js +35 -7
  239. package/daemon/dist/domain/startup-proof.js.map +1 -1
  240. package/daemon/dist/domain/successor-session-launcher.d.ts +16 -0
  241. package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
  242. package/daemon/dist/domain/successor-session-launcher.js +13 -0
  243. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  244. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts +27 -0
  245. package/daemon/dist/domain/terminal/cmux-provider-adapter.d.ts.map +1 -0
  246. package/daemon/dist/domain/terminal/cmux-provider-adapter.js +67 -0
  247. package/daemon/dist/domain/terminal/cmux-provider-adapter.js.map +1 -0
  248. package/daemon/dist/domain/terminal/herdr-adapter.d.ts +77 -0
  249. package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -0
  250. package/daemon/dist/domain/terminal/herdr-adapter.js +266 -0
  251. package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -0
  252. package/daemon/dist/domain/terminal/herdr-transport.d.ts +50 -0
  253. package/daemon/dist/domain/terminal/herdr-transport.d.ts.map +1 -0
  254. package/daemon/dist/domain/terminal/herdr-transport.js +145 -0
  255. package/daemon/dist/domain/terminal/herdr-transport.js.map +1 -0
  256. package/daemon/dist/domain/terminal/terminal-provider.d.ts +88 -0
  257. package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -0
  258. package/daemon/dist/domain/terminal/terminal-provider.js +17 -0
  259. package/daemon/dist/domain/terminal/terminal-provider.js.map +1 -0
  260. package/daemon/dist/domain/terminal/terminal-service.d.ts +60 -0
  261. package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -0
  262. package/daemon/dist/domain/terminal/terminal-service.js +174 -0
  263. package/daemon/dist/domain/terminal/terminal-service.js.map +1 -0
  264. package/daemon/dist/domain/terminal/terminal-views-store.d.ts +77 -0
  265. package/daemon/dist/domain/terminal/terminal-views-store.d.ts.map +1 -0
  266. package/daemon/dist/domain/terminal/terminal-views-store.js +146 -0
  267. package/daemon/dist/domain/terminal/terminal-views-store.js.map +1 -0
  268. package/daemon/dist/domain/terminal/view-composer.d.ts +42 -0
  269. package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -0
  270. package/daemon/dist/domain/terminal/view-composer.js +137 -0
  271. package/daemon/dist/domain/terminal/view-composer.js.map +1 -0
  272. package/daemon/dist/domain/tmux-option-defaults.d.ts +89 -0
  273. package/daemon/dist/domain/tmux-option-defaults.d.ts.map +1 -0
  274. package/daemon/dist/domain/tmux-option-defaults.js +132 -0
  275. package/daemon/dist/domain/tmux-option-defaults.js.map +1 -0
  276. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts +49 -0
  277. package/daemon/dist/domain/topology/multi-rig-launcher.d.ts.map +1 -0
  278. package/daemon/dist/domain/topology/multi-rig-launcher.js +132 -0
  279. package/daemon/dist/domain/topology/multi-rig-launcher.js.map +1 -0
  280. package/daemon/dist/domain/topology/remote-up-leaf.d.ts +29 -0
  281. package/daemon/dist/domain/topology/remote-up-leaf.d.ts.map +1 -0
  282. package/daemon/dist/domain/topology/remote-up-leaf.js +60 -0
  283. package/daemon/dist/domain/topology/remote-up-leaf.js.map +1 -0
  284. package/daemon/dist/domain/topology/topology-manifest.d.ts +34 -0
  285. package/daemon/dist/domain/topology/topology-manifest.d.ts.map +1 -0
  286. package/daemon/dist/domain/topology/topology-manifest.js +195 -0
  287. package/daemon/dist/domain/topology/topology-manifest.js.map +1 -0
  288. package/daemon/dist/domain/types.d.ts +39 -1
  289. package/daemon/dist/domain/types.d.ts.map +1 -1
  290. package/daemon/dist/domain/types.js.map +1 -1
  291. package/daemon/dist/domain/up-command-router.d.ts +1 -1
  292. package/daemon/dist/domain/up-command-router.d.ts.map +1 -1
  293. package/daemon/dist/domain/up-command-router.js +34 -2
  294. package/daemon/dist/domain/up-command-router.js.map +1 -1
  295. package/daemon/dist/domain/user-settings/settings-store.d.ts +18 -1
  296. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  297. package/daemon/dist/domain/user-settings/settings-store.js +201 -0
  298. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  299. package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -1
  300. package/daemon/dist/domain/workflow/slice-workflow-projection.js +6 -2
  301. package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -1
  302. package/daemon/dist/domain/workflow-boot-sweep.d.ts +28 -0
  303. package/daemon/dist/domain/workflow-boot-sweep.d.ts.map +1 -0
  304. package/daemon/dist/domain/workflow-boot-sweep.js +102 -0
  305. package/daemon/dist/domain/workflow-boot-sweep.js.map +1 -0
  306. package/daemon/dist/domain/workflow-deadline.d.ts +74 -0
  307. package/daemon/dist/domain/workflow-deadline.d.ts.map +1 -0
  308. package/daemon/dist/domain/workflow-deadline.js +165 -0
  309. package/daemon/dist/domain/workflow-deadline.js.map +1 -0
  310. package/daemon/dist/domain/workflow-exception-escalation.d.ts +33 -0
  311. package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -0
  312. package/daemon/dist/domain/workflow-exception-escalation.js +104 -0
  313. package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -0
  314. package/daemon/dist/domain/workflow-exception-router.d.ts +33 -0
  315. package/daemon/dist/domain/workflow-exception-router.d.ts.map +1 -0
  316. package/daemon/dist/domain/workflow-exception-router.js +96 -0
  317. package/daemon/dist/domain/workflow-exception-router.js.map +1 -0
  318. package/daemon/dist/domain/workflow-exception.d.ts +90 -0
  319. package/daemon/dist/domain/workflow-exception.d.ts.map +1 -0
  320. package/daemon/dist/domain/workflow-exception.js +122 -0
  321. package/daemon/dist/domain/workflow-exception.js.map +1 -0
  322. package/daemon/dist/domain/workflow-frontier-guard.d.ts +24 -0
  323. package/daemon/dist/domain/workflow-frontier-guard.d.ts.map +1 -0
  324. package/daemon/dist/domain/workflow-frontier-guard.js +30 -0
  325. package/daemon/dist/domain/workflow-frontier-guard.js.map +1 -0
  326. package/daemon/dist/domain/workflow-instance-store.d.ts +28 -0
  327. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  328. package/daemon/dist/domain/workflow-instance-store.js +66 -10
  329. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  330. package/daemon/dist/domain/workflow-keepalive-arming.d.ts +35 -0
  331. package/daemon/dist/domain/workflow-keepalive-arming.d.ts.map +1 -0
  332. package/daemon/dist/domain/workflow-keepalive-arming.js +87 -0
  333. package/daemon/dist/domain/workflow-keepalive-arming.js.map +1 -0
  334. package/daemon/dist/domain/workflow-projector.d.ts +117 -2
  335. package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
  336. package/daemon/dist/domain/workflow-projector.js +672 -41
  337. package/daemon/dist/domain/workflow-projector.js.map +1 -1
  338. package/daemon/dist/domain/workflow-role-context.d.ts +57 -0
  339. package/daemon/dist/domain/workflow-role-context.d.ts.map +1 -0
  340. package/daemon/dist/domain/workflow-role-context.js +120 -0
  341. package/daemon/dist/domain/workflow-role-context.js.map +1 -0
  342. package/daemon/dist/domain/workflow-role-resolver.d.ts +65 -0
  343. package/daemon/dist/domain/workflow-role-resolver.d.ts.map +1 -0
  344. package/daemon/dist/domain/workflow-role-resolver.js +108 -0
  345. package/daemon/dist/domain/workflow-role-resolver.js.map +1 -0
  346. package/daemon/dist/domain/workflow-runtime.d.ts +157 -1
  347. package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
  348. package/daemon/dist/domain/workflow-runtime.js +718 -11
  349. package/daemon/dist/domain/workflow-runtime.js.map +1 -1
  350. package/daemon/dist/domain/workflow-spec-cache.d.ts +26 -1
  351. package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
  352. package/daemon/dist/domain/workflow-spec-cache.js +327 -13
  353. package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
  354. package/daemon/dist/domain/workflow-types.d.ts +143 -8
  355. package/daemon/dist/domain/workflow-types.d.ts.map +1 -1
  356. package/daemon/dist/domain/workflow-types.js +14 -1
  357. package/daemon/dist/domain/workflow-types.js.map +1 -1
  358. package/daemon/dist/domain/workflow-validator.d.ts +11 -1
  359. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  360. package/daemon/dist/domain/workflow-validator.js +246 -1
  361. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  362. package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
  363. package/daemon/dist/domain/workspace/default-workspace-scaffold.js +51 -6
  364. package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
  365. package/daemon/dist/domain/workspace/workspace-doctor.d.ts +11 -0
  366. package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -1
  367. package/daemon/dist/domain/workspace/workspace-doctor.js +82 -0
  368. package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -1
  369. package/daemon/dist/index.d.ts +17 -0
  370. package/daemon/dist/index.d.ts.map +1 -1
  371. package/daemon/dist/index.js +44 -0
  372. package/daemon/dist/index.js.map +1 -1
  373. package/daemon/dist/routes/activity.js +22 -0
  374. package/daemon/dist/routes/activity.js.map +1 -1
  375. package/daemon/dist/routes/config.d.ts.map +1 -1
  376. package/daemon/dist/routes/config.js +15 -6
  377. package/daemon/dist/routes/config.js.map +1 -1
  378. package/daemon/dist/routes/files.d.ts.map +1 -1
  379. package/daemon/dist/routes/files.js +45 -1
  380. package/daemon/dist/routes/files.js.map +1 -1
  381. package/daemon/dist/routes/hosts.d.ts +5 -0
  382. package/daemon/dist/routes/hosts.d.ts.map +1 -0
  383. package/daemon/dist/routes/hosts.js +346 -0
  384. package/daemon/dist/routes/hosts.js.map +1 -0
  385. package/daemon/dist/routes/mission-control.d.ts.map +1 -1
  386. package/daemon/dist/routes/mission-control.js +67 -2
  387. package/daemon/dist/routes/mission-control.js.map +1 -1
  388. package/daemon/dist/routes/queue.d.ts +10 -9
  389. package/daemon/dist/routes/queue.d.ts.map +1 -1
  390. package/daemon/dist/routes/queue.js +305 -10
  391. package/daemon/dist/routes/queue.js.map +1 -1
  392. package/daemon/dist/routes/review.d.ts +3 -0
  393. package/daemon/dist/routes/review.d.ts.map +1 -0
  394. package/daemon/dist/routes/review.js +195 -0
  395. package/daemon/dist/routes/review.js.map +1 -0
  396. package/daemon/dist/routes/scope-approve.d.ts +3 -0
  397. package/daemon/dist/routes/scope-approve.d.ts.map +1 -0
  398. package/daemon/dist/routes/scope-approve.js +55 -0
  399. package/daemon/dist/routes/scope-approve.js.map +1 -0
  400. package/daemon/dist/routes/scope-audit.d.ts.map +1 -1
  401. package/daemon/dist/routes/scope-audit.js +28 -1
  402. package/daemon/dist/routes/scope-audit.js.map +1 -1
  403. package/daemon/dist/routes/seat.js +13 -0
  404. package/daemon/dist/routes/seat.js.map +1 -1
  405. package/daemon/dist/routes/slices.d.ts.map +1 -1
  406. package/daemon/dist/routes/slices.js +49 -9
  407. package/daemon/dist/routes/slices.js.map +1 -1
  408. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -1
  409. package/daemon/dist/routes/terminal-ws.js +58 -21
  410. package/daemon/dist/routes/terminal-ws.js.map +1 -1
  411. package/daemon/dist/routes/terminal.d.ts +11 -0
  412. package/daemon/dist/routes/terminal.d.ts.map +1 -0
  413. package/daemon/dist/routes/terminal.js +104 -0
  414. package/daemon/dist/routes/terminal.js.map +1 -0
  415. package/daemon/dist/routes/up.d.ts.map +1 -1
  416. package/daemon/dist/routes/up.js +84 -0
  417. package/daemon/dist/routes/up.js.map +1 -1
  418. package/daemon/dist/routes/workflow.d.ts.map +1 -1
  419. package/daemon/dist/routes/workflow.js +102 -10
  420. package/daemon/dist/routes/workflow.js.map +1 -1
  421. package/daemon/dist/routes/workspace.js +2 -2
  422. package/daemon/dist/server.d.ts +6 -0
  423. package/daemon/dist/server.d.ts.map +1 -1
  424. package/daemon/dist/server.js +36 -1
  425. package/daemon/dist/server.js.map +1 -1
  426. package/daemon/dist/startup.d.ts.map +1 -1
  427. package/daemon/dist/startup.js +238 -14
  428. package/daemon/dist/startup.js.map +1 -1
  429. package/daemon/docs/reference/agent-startup-guide.md +1 -1
  430. package/daemon/docs/reference/product-factory-vps-runbook.md +132 -0
  431. package/daemon/docs/reference/sdlc-conventions.md +187 -0
  432. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -1
  433. package/daemon/specs/agents/conveyor/builder/guidance/role.md +1 -0
  434. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -1
  435. package/daemon/specs/agents/conveyor/lead/guidance/role.md +1 -0
  436. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -1
  437. package/daemon/specs/agents/conveyor/planner/guidance/role.md +1 -0
  438. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -1
  439. package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +1 -0
  440. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -1
  441. package/daemon/specs/agents/design/product-designer/guidance/role.md +1 -0
  442. package/daemon/specs/agents/development/implementer/agent.yaml +1 -1
  443. package/daemon/specs/agents/development/implementer/guidance/role.md +1 -0
  444. package/daemon/specs/agents/development/qa/agent.yaml +1 -1
  445. package/daemon/specs/agents/development/qa/guidance/role.md +1 -0
  446. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +29 -0
  447. package/daemon/specs/agents/factory-rsi/dogfood/guidance/role.md +37 -0
  448. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +29 -0
  449. package/daemon/specs/agents/factory-rsi/release-manager/guidance/role.md +40 -0
  450. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
  451. package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +1 -0
  452. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  453. package/daemon/specs/agents/product-management/pm/guidance/role.md +13 -0
  454. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -1
  455. package/daemon/specs/agents/review/independent-reviewer/guidance/role.md +1 -0
  456. package/daemon/specs/agents/shared/agent.yaml +2 -0
  457. package/daemon/specs/agents/shared/skills/core/mission-slice-sop/SKILL.md +113 -0
  458. package/daemon/specs/agents/shared/skills/core/openrig-cmux/SKILL.md +86 -0
  459. package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +158 -0
  460. package/daemon/specs/agents/shared/skills/core/openrig-operator/SKILL.md +4 -4
  461. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +75 -29
  462. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +2 -2
  463. package/daemon/specs/rigs/focused/pm-team/CULTURE.md +4 -0
  464. package/daemon/specs/rigs/launch/factory-rsi/CULTURE.md +47 -0
  465. package/daemon/specs/rigs/launch/factory-rsi/rig.yaml +115 -0
  466. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +1 -1
  467. package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +1 -1
  468. package/daemon/specs/rigs/preview/product-team/CULTURE.md +4 -0
  469. package/dist/build-info.d.ts +8 -0
  470. package/dist/build-info.d.ts.map +1 -0
  471. package/dist/build-info.js +11 -0
  472. package/dist/build-info.js.map +1 -0
  473. package/dist/commands/broadcast.d.ts +6 -1
  474. package/dist/commands/broadcast.d.ts.map +1 -1
  475. package/dist/commands/broadcast.js +101 -15
  476. package/dist/commands/broadcast.js.map +1 -1
  477. package/dist/commands/capture.d.ts.map +1 -1
  478. package/dist/commands/capture.js +99 -8
  479. package/dist/commands/capture.js.map +1 -1
  480. package/dist/commands/config-init-workspace.d.ts.map +1 -1
  481. package/dist/commands/config-init-workspace.js +20 -4
  482. package/dist/commands/config-init-workspace.js.map +1 -1
  483. package/dist/commands/config.d.ts.map +1 -1
  484. package/dist/commands/config.js +4 -0
  485. package/dist/commands/config.js.map +1 -1
  486. package/dist/commands/doctor.js +2 -2
  487. package/dist/commands/doctor.js.map +1 -1
  488. package/dist/commands/down.d.ts.map +1 -1
  489. package/dist/commands/down.js +5 -0
  490. package/dist/commands/down.js.map +1 -1
  491. package/dist/commands/expand.js +1 -1
  492. package/dist/commands/expand.js.map +1 -1
  493. package/dist/commands/file.d.ts +7 -0
  494. package/dist/commands/file.d.ts.map +1 -0
  495. package/dist/commands/file.js +77 -0
  496. package/dist/commands/file.js.map +1 -0
  497. package/dist/commands/host.d.ts +48 -0
  498. package/dist/commands/host.d.ts.map +1 -0
  499. package/dist/commands/host.js +772 -0
  500. package/dist/commands/host.js.map +1 -0
  501. package/dist/commands/launch.d.ts.map +1 -1
  502. package/dist/commands/launch.js +5 -0
  503. package/dist/commands/launch.js.map +1 -1
  504. package/dist/commands/proof.d.ts +54 -0
  505. package/dist/commands/proof.d.ts.map +1 -0
  506. package/dist/commands/proof.js +311 -0
  507. package/dist/commands/proof.js.map +1 -0
  508. package/dist/commands/ps.d.ts +41 -7
  509. package/dist/commands/ps.d.ts.map +1 -1
  510. package/dist/commands/ps.js +353 -135
  511. package/dist/commands/ps.js.map +1 -1
  512. package/dist/commands/queue.d.ts +36 -0
  513. package/dist/commands/queue.d.ts.map +1 -1
  514. package/dist/commands/queue.js +149 -7
  515. package/dist/commands/queue.js.map +1 -1
  516. package/dist/commands/restore-packet.d.ts.map +1 -1
  517. package/dist/commands/restore-packet.js +13 -2
  518. package/dist/commands/restore-packet.js.map +1 -1
  519. package/dist/commands/scope.d.ts.map +1 -1
  520. package/dist/commands/scope.js +140 -3
  521. package/dist/commands/scope.js.map +1 -1
  522. package/dist/commands/send.d.ts.map +1 -1
  523. package/dist/commands/send.js +127 -13
  524. package/dist/commands/send.js.map +1 -1
  525. package/dist/commands/terminal.d.ts +6 -0
  526. package/dist/commands/terminal.d.ts.map +1 -0
  527. package/dist/commands/terminal.js +116 -0
  528. package/dist/commands/terminal.js.map +1 -0
  529. package/dist/commands/transcript.d.ts +6 -1
  530. package/dist/commands/transcript.d.ts.map +1 -1
  531. package/dist/commands/transcript.js +113 -30
  532. package/dist/commands/transcript.js.map +1 -1
  533. package/dist/commands/up.d.ts +2 -0
  534. package/dist/commands/up.d.ts.map +1 -1
  535. package/dist/commands/up.js +78 -2
  536. package/dist/commands/up.js.map +1 -1
  537. package/dist/commands/whoami.d.ts.map +1 -1
  538. package/dist/commands/whoami.js +11 -0
  539. package/dist/commands/whoami.js.map +1 -1
  540. package/dist/commands/workflow-errors.d.ts +23 -0
  541. package/dist/commands/workflow-errors.d.ts.map +1 -0
  542. package/dist/commands/workflow-errors.js +100 -0
  543. package/dist/commands/workflow-errors.js.map +1 -0
  544. package/dist/commands/workflow-follow.d.ts +71 -0
  545. package/dist/commands/workflow-follow.d.ts.map +1 -0
  546. package/dist/commands/workflow-follow.js +259 -0
  547. package/dist/commands/workflow-follow.js.map +1 -0
  548. package/dist/commands/workflow-render.d.ts +114 -0
  549. package/dist/commands/workflow-render.d.ts.map +1 -0
  550. package/dist/commands/workflow-render.js +223 -0
  551. package/dist/commands/workflow-render.js.map +1 -0
  552. package/dist/commands/workflow.d.ts +1 -0
  553. package/dist/commands/workflow.d.ts.map +1 -1
  554. package/dist/commands/workflow.js +278 -14
  555. package/dist/commands/workflow.js.map +1 -1
  556. package/dist/commands/workspace.js +6 -6
  557. package/dist/commands/workspace.js.map +1 -1
  558. package/dist/config-store.d.ts +19 -1
  559. package/dist/config-store.d.ts.map +1 -1
  560. package/dist/config-store.js +171 -0
  561. package/dist/config-store.js.map +1 -1
  562. package/dist/cross-host-cli-helpers.d.ts +13 -0
  563. package/dist/cross-host-cli-helpers.d.ts.map +1 -1
  564. package/dist/cross-host-cli-helpers.js +27 -0
  565. package/dist/cross-host-cli-helpers.js.map +1 -1
  566. package/dist/cross-host-executor.d.ts +1 -0
  567. package/dist/cross-host-executor.d.ts.map +1 -1
  568. package/dist/cross-host-executor.js +4 -1
  569. package/dist/cross-host-executor.js.map +1 -1
  570. package/dist/cross-host-target.d.ts +49 -0
  571. package/dist/cross-host-target.d.ts.map +1 -0
  572. package/dist/cross-host-target.js +35 -0
  573. package/dist/cross-host-target.js.map +1 -0
  574. package/dist/daemon-lifecycle.d.ts.map +1 -1
  575. package/dist/daemon-lifecycle.js +4 -1
  576. package/dist/daemon-lifecycle.js.map +1 -1
  577. package/dist/host-registry.d.ts +17 -0
  578. package/dist/host-registry.d.ts.map +1 -1
  579. package/dist/host-registry.js +64 -2
  580. package/dist/host-registry.js.map +1 -1
  581. package/dist/host-selection.d.ts +13 -0
  582. package/dist/host-selection.d.ts.map +1 -0
  583. package/dist/host-selection.js +54 -0
  584. package/dist/host-selection.js.map +1 -0
  585. package/dist/index.d.ts +2 -0
  586. package/dist/index.d.ts.map +1 -1
  587. package/dist/index.js +9 -0
  588. package/dist/index.js.map +1 -1
  589. package/dist/lib/file-transfer.d.ts +89 -0
  590. package/dist/lib/file-transfer.d.ts.map +1 -0
  591. package/dist/lib/file-transfer.js +300 -0
  592. package/dist/lib/file-transfer.js.map +1 -0
  593. package/dist/lib/hosts/fanout-contract.d.ts +33 -0
  594. package/dist/lib/hosts/fanout-contract.d.ts.map +1 -0
  595. package/dist/lib/hosts/fanout-contract.js +23 -0
  596. package/dist/lib/hosts/fanout-contract.js.map +1 -0
  597. package/dist/lib/scope/scope-audit.d.ts +9 -1
  598. package/dist/lib/scope/scope-audit.d.ts.map +1 -1
  599. package/dist/lib/scope/scope-audit.js +173 -1
  600. package/dist/lib/scope/scope-audit.js.map +1 -1
  601. package/dist/lib/scope/templates.d.ts +1 -0
  602. package/dist/lib/scope/templates.d.ts.map +1 -1
  603. package/dist/lib/scope/templates.js +9 -0
  604. package/dist/lib/scope/templates.js.map +1 -1
  605. package/dist/lib/scope-templates/backlog-deprecation.md +16 -0
  606. package/dist/lib/scope-templates/backlog-tech-debt.md +16 -0
  607. package/dist/lib/scope-templates/bug-fix.md +16 -0
  608. package/dist/lib/scope-templates/implementation-prd.md +33 -0
  609. package/dist/lib/scope-templates/mission-placeholder.md +1 -1
  610. package/dist/lib/scope-templates/mission-progress.md +1 -1
  611. package/dist/lib/scope-templates/mission-release.md +1 -1
  612. package/dist/lib/scope-templates/placeholder.md +11 -7
  613. package/dist/lib/scope-templates/proof.md +5 -1
  614. package/dist/lib/scope-templates/release-feature.md +14 -6
  615. package/dist/lib/scope-templates/research.md +16 -0
  616. package/dist/lib/scope-templates/slice-progress.md +1 -1
  617. package/dist/remote-host-ops.d.ts +1 -0
  618. package/dist/remote-host-ops.d.ts.map +1 -1
  619. package/dist/remote-host-ops.js +11 -4
  620. package/dist/remote-host-ops.js.map +1 -1
  621. package/dist/session-name.d.ts +23 -0
  622. package/dist/session-name.d.ts.map +1 -0
  623. package/dist/session-name.js +61 -0
  624. package/dist/session-name.js.map +1 -0
  625. package/dist/version.d.ts +5 -0
  626. package/dist/version.d.ts.map +1 -1
  627. package/dist/version.js +11 -1
  628. package/dist/version.js.map +1 -1
  629. package/package.json +1 -1
  630. package/ui/dist/assets/index-CFqxa0zW.css +32 -0
  631. package/ui/dist/assets/index-zrFqS7gL.js +623 -0
  632. package/ui/dist/index.html +2 -2
  633. package/ui/dist/assets/index-DYZniQcc.js +0 -597
  634. package/ui/dist/assets/index-trcb4Yf_.css +0 -32
@@ -0,0 +1,122 @@
1
+ // OPR.0.4.6.WF5 FR-1: the closed exception taxonomy.
2
+ //
3
+ // An EXCEPTION is one of exactly three classes, each a PURE PREDICATE over
4
+ // recorded state (BR-1: never ambient probing, never judgment in the engine —
5
+ // agent judgment lives in RESOLVING, not detecting). Extending this taxonomy
6
+ // is a convention change, not driver discretion.
7
+ //
8
+ // (a) unmapped_failed — an instance entered status=failed. A MAPPED
9
+ // `failed` exit routes to its WF-2 remediation branch inside the same
10
+ // transaction (instance stays active) and is NOT an exception; only an
11
+ // unrouted failed close — including the engine-authored max_hops
12
+ // conversion — lands the instance in `failed`, so the recorded status
13
+ // IS the predicate.
14
+ // (b) stuck_overdue — a frontier packet past its deadline AS CLASSIFIED BY
15
+ // WF-1 FR-2's evaluator (workflow-deadline.ts, the single threshold
16
+ // home). This module consumes the verdict verbatim and never
17
+ // recomputes an anchor or threshold.
18
+ // (c) human_gate_trip — a WF-2 gate with a HUMAN target reached. The
19
+ // WF-2-compiled park IS the attention item (FR-2 mints no second one);
20
+ // this class exists so the item carries the exception identity.
21
+ //
22
+ // THE HANDLER-ROLE SPLIT (spec-guard blocker 2, ratified): a handler-role
23
+ // gate-trip is NOT an exception — it is a deterministic agent handoff by
24
+ // design. The escalation leg is the backstop BEHIND the handler: if the
25
+ // handler's own step fails or goes stuck, classes (a)/(b) fire on it.
26
+ //
27
+ // v1.3: CLASSIFICATION ≠ ROUTING. The maturity dial (workflow-exception-
28
+ // router.ts) maps class → target; nothing here knows about destinations.
29
+ export const WORKFLOW_EXCEPTION_CLASSES = [
30
+ "unmapped_failed",
31
+ "stuck_overdue",
32
+ "human_gate_trip",
33
+ ];
34
+ /**
35
+ * Class (a): unmapped_failed. Pure: same view → same classification,
36
+ * replayed N times. A non-failed instance NEVER classifies (the mapped-
37
+ * failed negative: branch-routed failures keep status=active and are
38
+ * deterministic remediation, not exceptions).
39
+ */
40
+ export function classifyFailedInstance(view) {
41
+ if (view.instance.status !== "failed")
42
+ return null;
43
+ return {
44
+ identity: {
45
+ workflowName: view.instance.workflowName,
46
+ instanceId: view.instance.instanceId,
47
+ stepId: view.failedStepId,
48
+ exceptionClass: "unmapped_failed",
49
+ occurrenceKey: view.failedPacketId,
50
+ },
51
+ reason: view.failureReason
52
+ ? `workflow step failed with no remediation branch: ${view.failureReason}`
53
+ : "workflow step failed with no remediation branch",
54
+ deadlineEvidence: null,
55
+ };
56
+ }
57
+ /**
58
+ * Class (b): stuck_overdue. CONSUMES the WF-1 evaluator's verdict verbatim
59
+ * (rail: the single threshold home classifies; this function only lifts a
60
+ * non-healthy verdict into the exception shape). Healthy → null.
61
+ */
62
+ export function classifyDeadlineVerdict(workflowName, verdict) {
63
+ if (verdict.state === "healthy" || !verdict.evidence)
64
+ return null;
65
+ const e = verdict.evidence;
66
+ return {
67
+ identity: {
68
+ workflowName,
69
+ instanceId: e.instanceId,
70
+ stepId: e.stepId,
71
+ exceptionClass: "stuck_overdue",
72
+ occurrenceKey: e.packetId,
73
+ },
74
+ reason: `workflow step ${e.stepId ?? "(unbound)"} is ${verdict.state} — packet ${e.packetId} ` +
75
+ `held by ${e.ownerSession}, ${e.overdueBySeconds}s past its ${e.anchor} anchor`,
76
+ deadlineEvidence: e,
77
+ };
78
+ }
79
+ /**
80
+ * Class (c): human_gate_trip — HUMAN-target gates only. THE HANDLER-ROLE
81
+ * NEGATIVE lives here: a handler-role gate returns null (a deterministic
82
+ * handoff, not an exception; the (a)/(b) backstop covers the handler's own
83
+ * step). Class (c) is intrinsically human-only at the dial.
84
+ */
85
+ export function classifyGateTrip(view) {
86
+ if (view.gateKind !== "human")
87
+ return null;
88
+ return {
89
+ identity: {
90
+ workflowName: view.workflowName,
91
+ instanceId: view.instanceId,
92
+ stepId: view.gatedStepId,
93
+ exceptionClass: "human_gate_trip",
94
+ occurrenceKey: view.gatePacketId,
95
+ },
96
+ reason: `human decision required at gated step ${view.gatedStepId}` +
97
+ (view.parkOn ? ` (parked on ${view.parkOn})` : ""),
98
+ deadlineEvidence: null,
99
+ };
100
+ }
101
+ /** Tag prefixes: `workflow:`/`instance:` extend the SHIPPED stamp
102
+ * (workflow-runtime.ts / workflow-projector.ts already emit them);
103
+ * `step:`/`exception:`/`occurrence:` are WF-5's additions (arch cell 2).
104
+ * FR-2 dedup and FR-3 cross-channel one-count JOIN on these BY QUERY —
105
+ * never by summary parsing. */
106
+ export function workflowExceptionTags(identity) {
107
+ const tags = [
108
+ "workflow-exception",
109
+ `workflow:${identity.workflowName}`,
110
+ `instance:${identity.instanceId}`,
111
+ `exception:${identity.exceptionClass}`,
112
+ `occurrence:${identity.occurrenceKey}`,
113
+ ];
114
+ if (identity.stepId)
115
+ tags.splice(3, 0, `step:${identity.stepId}`);
116
+ return tags;
117
+ }
118
+ /** The query key for within-occurrence dedup: one item per this tuple. */
119
+ export function occurrenceDedupKey(identity) {
120
+ return `${identity.instanceId}|${identity.stepId ?? ""}|${identity.exceptionClass}|${identity.occurrenceKey}`;
121
+ }
122
+ //# sourceMappingURL=workflow-exception.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-exception.js","sourceRoot":"","sources":["../../src/domain/workflow-exception.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * OPR.0.4.6.WF3 FR-6 — the frontier close-path guard's PREDICATE (pm
4
+ * convention ruling: prevention over detection).
5
+ *
6
+ * THE LAYERING PIN (arch, binding, Rev-1): the queue is the lower
7
+ * primitive and NEVER imports the workflow domain. This module is the
8
+ * workflow domain's export; startup INJECTS the predicate into
9
+ * QueueRepository (the `validateRig` injection precedent exactly).
10
+ * Same functional behavior as a direct import, without the module
11
+ * cycle the next refactor would strangle on.
12
+ *
13
+ * The predicate answers: is this qitem a LIVE workflow-frontier
14
+ * packet? Null for every non-workflow qitem — the zero-friction
15
+ * negative (non-workflow closure behavior stays byte-identical; no
16
+ * new rejections ride this predicate for ordinary traffic).
17
+ */
18
+ export interface WorkflowFrontierBinding {
19
+ instanceId: string;
20
+ workflowName: string;
21
+ }
22
+ export type WorkflowFrontierPredicate = (qitemId: string) => WorkflowFrontierBinding | null;
23
+ export declare function createWorkflowFrontierPredicate(db: Database.Database): WorkflowFrontierPredicate;
24
+ //# sourceMappingURL=workflow-frontier-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-frontier-guard.d.ts","sourceRoot":"","sources":["../../src/domain/workflow-frontier-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,uBAAuB,GAAG,IAAI,CAAC;AAE5F,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,yBAAyB,CA2BhG"}
@@ -0,0 +1,30 @@
1
+ export function createWorkflowFrontierPredicate(db) {
2
+ return (qitemId) => {
3
+ // current_frontier is a JSON array column; a frontier membership
4
+ // check is a containment probe on the serialized id. Scoped to
5
+ // LIVE instances only — terminal instances hold no frontier.
6
+ let row;
7
+ try {
8
+ row = db
9
+ .prepare(`SELECT instance_id, workflow_name FROM workflow_instances
10
+ WHERE status IN ('active','waiting') AND current_frontier_json LIKE ?
11
+ LIMIT 1`)
12
+ .get(`%"${qitemId}"%`);
13
+ }
14
+ catch (err) {
15
+ // Pre-workflow schemas (no workflow_instances table): nothing to
16
+ // guard — identical to the predicate-absent posture. ONLY that
17
+ // case is tolerated: any other SQL error (e.g. a renamed column)
18
+ // must fail LOUD — a swallowed error here silently disables a
19
+ // correctness guard (VM-caught: the first draft ate its own
20
+ // wrong-column error and the guard never fired).
21
+ if (err instanceof Error && /no such table/i.test(err.message))
22
+ return null;
23
+ throw err;
24
+ }
25
+ if (!row?.instance_id)
26
+ return null;
27
+ return { instanceId: row.instance_id, workflowName: row.workflow_name ?? "(unknown)" };
28
+ };
29
+ }
30
+ //# sourceMappingURL=workflow-frontier-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-frontier-guard.js","sourceRoot":"","sources":["../../src/domain/workflow-frontier-guard.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,+BAA+B,CAAC,EAAqB;IACnE,OAAO,CAAC,OAAe,EAAkC,EAAE;QACzD,iEAAiE;QACjE,+DAA+D;QAC/D,6DAA6D;QAC7D,IAAI,GAAiE,CAAC;QACtE,IAAI,CAAC;YACH,GAAG,GAAG,EAAE;iBACL,OAAO,CACN;;mBAES,CACV;iBACA,GAAG,CAAC,KAAK,OAAO,IAAI,CAAe,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,iEAAiE;YACjE,+DAA+D;YAC/D,iEAAiE;YACjE,8DAA8D;YAC9D,4DAA4D;YAC5D,iDAAiD;YACjD,IAAI,GAAG,YAAY,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC5E,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,WAAW;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;IACzF,CAAC,CAAC;AACJ,CAAC"}
@@ -7,6 +7,12 @@ export interface CreateWorkflowInstanceInput {
7
7
  initialFrontier?: string[];
8
8
  /** R2: durable current-step binding set at instantiate time. */
9
9
  currentStepId?: string;
10
+ /**
11
+ * OPR.0.4.6.FAC1: the rig NAME this instance binds to (already
12
+ * resolved by the runtime: targetRig override ?? spec.target.rig).
13
+ * null/absent = unbound (today's behavior byte-identical).
14
+ */
15
+ boundRig?: string | null;
10
16
  }
11
17
  export declare class WorkflowInstanceError extends Error {
12
18
  readonly code: string;
@@ -16,6 +22,9 @@ export declare class WorkflowInstanceError extends Error {
16
22
  export declare class WorkflowInstanceStore {
17
23
  private readonly db;
18
24
  private readonly now;
25
+ private readonly hasVersionColumn;
26
+ private readonly hasResumeColumns;
27
+ private readonly hasBoundRigColumn;
19
28
  constructor(db: Database.Database, now?: () => Date);
20
29
  create(input: CreateWorkflowInstanceInput): WorkflowInstance;
21
30
  getById(instanceId: string): WorkflowInstance | null;
@@ -41,6 +50,25 @@ export declare class WorkflowInstanceStore {
41
50
  * the symbol "clear-current-step" (typed as the literal below).
42
51
  */
43
52
  currentStepId?: string | "preserve" | "clear";
53
+ /**
54
+ * OPR.0.4.6.WF1 FR-5 — the optimistic-concurrency guard. When
55
+ * provided, the UPDATE is qualified `WHERE version = ?` and bumps
56
+ * `version = version + 1`; zero rows changed throws the
57
+ * structured `instance_version_conflict` naming expected/actual
58
+ * (the caller's transaction rolls back whole). When omitted,
59
+ * legacy unguarded behavior (no version read, no bump) — the
60
+ * projector ALWAYS provides it.
61
+ */
62
+ expectedVersion?: number;
63
+ /**
64
+ * OPR.0.4.6.WF5 FR-4 — the resume stamp: sets the recorded
65
+ * redrive count AND the livelock-rail hops baseline atomically
66
+ * with the frontier rebind. Only resume() passes it.
67
+ */
68
+ resumeStamp?: {
69
+ resumeCount: number;
70
+ hopsBaseline: number;
71
+ };
44
72
  }): void;
45
73
  }
46
74
  //# sourceMappingURL=workflow-instance-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-instance-store.d.ts","sourceRoot":"","sources":["../../src/domain/workflow-instance-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAiB7B,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,GAAE,MAAM,IAAuB;IAGrD,MAAM,CAAC,KAAK,EAAE,2BAA2B,GAAG,gBAAgB;IAuB5D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAOpD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB;IAYpD,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,EAAE;IAShE,OAAO,IAAI,gBAAgB,EAAE;IAO7B;;;;;OAKG;IACH,cAAc,CACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,sBAAsB,EAClC,IAAI,GAAE;QACJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QAC1D,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B;;;;;;WAMG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;KAC1C,GACL,IAAI;CAyCR"}
1
+ {"version":3,"file":"workflow-instance-store.d.ts","sourceRoot":"","sources":["../../src/domain/workflow-instance-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AA2C7B,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;aAE5B,IAAI,EAAE,MAAM;aAEZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,qBAAa,qBAAqB;IAM9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;gBAGzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,GAAE,MAAM,IAAuB;IAOrD,MAAM,CAAC,KAAK,EAAE,2BAA2B,GAAG,gBAAgB;IA8B5D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAOpD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB;IAYpD,YAAY,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,EAAE;IAShE,OAAO,IAAI,gBAAgB,EAAE;IAO7B;;;;;OAKG;IACH,cAAc,CACZ,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,sBAAsB,EAClC,IAAI,GAAE;QACJ,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QAC1D,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B;;;;;;WAMG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;QAC9C;;;;;;;;WAQG;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,WAAW,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;KACxD,GACL,IAAI;CAoDR"}
@@ -5,6 +5,21 @@
5
5
  // daemon restart without filesystem reconciliation: list/getById query
6
6
  // SQLite directly.
7
7
  import { ulid } from "ulid";
8
+ /** Defensive column probe (the detectQueueColumn house pattern) —
9
+ * older test fixtures bypass the canonical migration list, so the
10
+ * version column (migration 049) may be absent; the guard degrades
11
+ * to legacy unguarded updates there. Production always migrates. */
12
+ function detectInstanceColumn(db, columnName) {
13
+ try {
14
+ return db
15
+ .prepare("PRAGMA table_info(workflow_instances)")
16
+ .all()
17
+ .some((row) => row.name === columnName);
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
8
23
  export class WorkflowInstanceError extends Error {
9
24
  code;
10
25
  details;
@@ -18,20 +33,42 @@ export class WorkflowInstanceError extends Error {
18
33
  export class WorkflowInstanceStore {
19
34
  db;
20
35
  now;
36
+ hasVersionColumn;
37
+ hasResumeColumns;
38
+ hasBoundRigColumn;
21
39
  constructor(db, now = () => new Date()) {
22
40
  this.db = db;
23
41
  this.now = now;
42
+ this.hasVersionColumn = detectInstanceColumn(db, "version");
43
+ this.hasResumeColumns = detectInstanceColumn(db, "resume_count");
44
+ this.hasBoundRigColumn = detectInstanceColumn(db, "bound_rig");
24
45
  }
25
46
  create(input) {
26
47
  const instanceId = ulid();
27
48
  const createdAt = this.now().toISOString();
28
49
  const frontier = input.initialFrontier ?? [];
50
+ // OPR.0.4.6.FAC1: bound_rig rides the same defensive column probe
51
+ // as version/resume (legacy fixtures without migration 052 keep the
52
+ // legacy INSERT; production always migrates).
53
+ const boundRigCol = this.hasBoundRigColumn ? ", bound_rig" : "";
54
+ const boundRigVal = this.hasBoundRigColumn ? ", ?" : "";
55
+ const params = [
56
+ instanceId,
57
+ input.workflowName,
58
+ input.workflowVersion,
59
+ input.createdBySession,
60
+ createdAt,
61
+ JSON.stringify(frontier),
62
+ input.currentStepId ?? null,
63
+ ];
64
+ if (this.hasBoundRigColumn)
65
+ params.push(input.boundRig ?? null);
29
66
  this.db
30
67
  .prepare(`INSERT INTO workflow_instances (
31
68
  instance_id, workflow_name, workflow_version, created_by_session,
32
- created_at, status, current_frontier_json, current_step_id, hop_count
33
- ) VALUES (?, ?, ?, ?, ?, 'active', ?, ?, 0)`)
34
- .run(instanceId, input.workflowName, input.workflowVersion, input.createdBySession, createdAt, JSON.stringify(frontier), input.currentStepId ?? null);
69
+ created_at, status, current_frontier_json, current_step_id, hop_count${boundRigCol}
70
+ ) VALUES (?, ?, ?, ?, ?, 'active', ?, ?, 0${boundRigVal})`)
71
+ .run(...params);
35
72
  return this.getByIdOrThrow(instanceId);
36
73
  }
37
74
  getById(instanceId) {
@@ -67,6 +104,12 @@ export class WorkflowInstanceStore {
67
104
  */
68
105
  updateFrontier(instanceId, nextFrontier, nextStatus, opts = {}) {
69
106
  const setHop = opts.bumpHopCount ? "hop_count = hop_count + 1, " : "";
107
+ const setResume = opts.resumeStamp && this.hasResumeColumns
108
+ ? `resume_count = ${Number(opts.resumeStamp.resumeCount)}, hops_baseline = ${Number(opts.resumeStamp.hopsBaseline)}, `
109
+ : "";
110
+ const guardVersion = opts.expectedVersion !== undefined && this.hasVersionColumn;
111
+ const setVersion = guardVersion ? "version = version + 1, " : "";
112
+ const versionWhere = guardVersion ? " AND version = ?" : "";
70
113
  let currentStepClause = "";
71
114
  let currentStepValue;
72
115
  if (opts.currentStepId === "preserve" || opts.currentStepId === undefined) {
@@ -81,17 +124,26 @@ export class WorkflowInstanceStore {
81
124
  currentStepValue = opts.currentStepId;
82
125
  }
83
126
  const sql = `UPDATE workflow_instances SET
84
- ${setHop}${currentStepClause}status = ?, current_frontier_json = ?,
127
+ ${setVersion}${setHop}${setResume}${currentStepClause}status = ?, current_frontier_json = ?,
85
128
  last_continuation_decision_json = COALESCE(?, last_continuation_decision_json),
86
129
  fallback_synthesis = COALESCE(?, fallback_synthesis),
87
130
  completed_at = COALESCE(?, completed_at)
88
- WHERE instance_id = ?`;
131
+ WHERE instance_id = ?${versionWhere}`;
89
132
  const stmt = this.db.prepare(sql);
90
- if (currentStepValue !== undefined) {
91
- stmt.run(currentStepValue, nextStatus, JSON.stringify(nextFrontier), opts.lastContinuationDecision ? JSON.stringify(opts.lastContinuationDecision) : null, opts.fallbackSynthesis ?? null, opts.completedAt ?? null, instanceId);
92
- }
93
- else {
94
- stmt.run(nextStatus, JSON.stringify(nextFrontier), opts.lastContinuationDecision ? JSON.stringify(opts.lastContinuationDecision) : null, opts.fallbackSynthesis ?? null, opts.completedAt ?? null, instanceId);
133
+ const params = [];
134
+ if (currentStepValue !== undefined)
135
+ params.push(currentStepValue);
136
+ params.push(nextStatus, JSON.stringify(nextFrontier), opts.lastContinuationDecision ? JSON.stringify(opts.lastContinuationDecision) : null, opts.fallbackSynthesis ?? null, opts.completedAt ?? null, instanceId);
137
+ if (guardVersion)
138
+ params.push(opts.expectedVersion);
139
+ const info = stmt.run(...params);
140
+ if (guardVersion && info.changes === 0) {
141
+ const current = this.getById(instanceId);
142
+ throw new WorkflowInstanceError("instance_version_conflict", `workflow instance ${instanceId} advanced concurrently: expected version ${opts.expectedVersion}, actual ${current ? current.version : "(instance missing)"} — the losing writer's transaction rolls back whole; re-read and re-project against current state`, {
143
+ instanceId,
144
+ expectedVersion: opts.expectedVersion,
145
+ actualVersion: current?.version ?? null,
146
+ });
95
147
  }
96
148
  }
97
149
  }
@@ -111,6 +163,10 @@ function rowToInstance(row) {
111
163
  ? JSON.parse(row.last_continuation_decision_json)
112
164
  : null,
113
165
  completedAt: row.completed_at,
166
+ version: row.version ?? 0,
167
+ resumeCount: row.resume_count ?? 0,
168
+ hopsBaseline: row.hops_baseline ?? 0,
169
+ boundRig: row.bound_rig ?? null,
114
170
  };
115
171
  }
116
172
  //# sourceMappingURL=workflow-instance-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-instance-store.js","sourceRoot":"","sources":["../../src/domain/workflow-instance-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-instance-store.js","sourceRoot":"","sources":["../../src/domain/workflow-instance-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { WatchdogJob, WatchdogJobsRepository } from "./watchdog-jobs-repository.js";
2
+ /**
3
+ * Evaluation cadence for auto-armed keepalive jobs. Deadline-gated
4
+ * evaluations are quiet skips until overdue, so this interval costs
5
+ * nothing on the happy path (quiet skips are not even recorded in
6
+ * watchdog history).
7
+ */
8
+ export declare const WORKFLOW_KEEPALIVE_AUTO_INTERVAL_SECONDS: number;
9
+ export declare function buildKeepaliveSpecYaml(instanceId: string, targetSession: string): string;
10
+ /**
11
+ * Find the active auto/manual keepalive job carrying this instance id.
12
+ * Jobs carry context only inside spec_yaml (no context column); ULIDs
13
+ * are 26-char unique so a containment check is exact in practice.
14
+ */
15
+ export declare function findArmedKeepaliveJob(repo: WatchdogJobsRepository, instanceId: string): WatchdogJob | null;
16
+ /**
17
+ * Idempotent in-transaction arm: registers the per-instance keepalive
18
+ * job if no active one exists. Composable inside the scribe txn
19
+ * (register is a plain INSERT).
20
+ */
21
+ export declare function ensureWorkflowKeepaliveArmed(repo: WatchdogJobsRepository, input: {
22
+ instanceId: string;
23
+ targetSession: string;
24
+ registeredBySession: string;
25
+ }): {
26
+ jobId: string;
27
+ newlyArmed: boolean;
28
+ };
29
+ /**
30
+ * In-transaction disarm on terminal instance state (completed/failed):
31
+ * the job goes terminal so no orphaned watchdog noise survives the
32
+ * instance (FR-3 AC). No-op when nothing is armed.
33
+ */
34
+ export declare function disarmWorkflowKeepalive(repo: WatchdogJobsRepository, instanceId: string, reason: string): string | null;
35
+ //# sourceMappingURL=workflow-keepalive-arming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-keepalive-arming.d.ts","sourceRoot":"","sources":["../../src/domain/workflow-keepalive-arming.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,WAAW,EACX,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,QAAU,CAAC;AAEhE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAUxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,sBAAsB,EAC5B,UAAU,EAAE,MAAM,GACjB,WAAW,GAAG,IAAI,CAQpB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,sBAAsB,EAC5B,KAAK,EAAE;IACL,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GACA;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAWxC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,sBAAsB,EAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAKf"}
@@ -0,0 +1,87 @@
1
+ // OPR.0.4.6.WF1 FR-3 (G2): auto-arm the shipped workflow-keepalive
2
+ // policy — the policy registered at startup but NOTHING created a
3
+ // watchdog job carrying context.workflow_instance_id, so the keepalive
4
+ // never fired for any instance.
5
+ //
6
+ // Arming rides the transactional scribe: instantiate and every handoff
7
+ // projection call ensureWorkflowKeepaliveArmed INSIDE the same
8
+ // db.transaction that routes the step (watchdog register/markTerminal
9
+ // are plain INSERT/UPDATE on the same handle — verified composable).
10
+ // This closes the commit-then-crash-before-nudge window: the armed job
11
+ // exists the instant the routed frontier packet exists, so a lost
12
+ // post-commit nudge is re-issued by the keepalive even when the daemon
13
+ // died before nudging (FR-3 AC; the boot sweep — FR-4 — is the
14
+ // immediate-on-restart leg of the same closure).
15
+ //
16
+ // ONE JOB PER INSTANCE (arch-blessed: bounded watchdog rows; the
17
+ // single-frontier model has one owner at a time). The policy resolves
18
+ // the CURRENT frontier owner live from SQLite at every evaluation, so
19
+ // no per-handoff re-target is needed — the job's target_session is only
20
+ // the registered fallback. WF-6/parallel-frontier will revisit with
21
+ // per-packet jobs when multiple frontier packets exist (marked, not
22
+ // built).
23
+ //
24
+ // AUTO-ARMED JOBS ARE DEADLINE-GATED (context.deadline_gated: true):
25
+ // the policy stays QUIET while the instance is healthy and sends only
26
+ // when the FR-2 evaluator reports overdue — preserving the FR-2
27
+ // zero-noise-on-the-happy-path AC. Operator-registered keepalive jobs
28
+ // (no flag) keep the shipped POC always-send parity unchanged.
29
+ /**
30
+ * Evaluation cadence for auto-armed keepalive jobs. Deadline-gated
31
+ * evaluations are quiet skips until overdue, so this interval costs
32
+ * nothing on the happy path (quiet skips are not even recorded in
33
+ * watchdog history).
34
+ */
35
+ export const WORKFLOW_KEEPALIVE_AUTO_INTERVAL_SECONDS = 15 * 60;
36
+ export function buildKeepaliveSpecYaml(instanceId, targetSession) {
37
+ return [
38
+ "policy: workflow-keepalive",
39
+ "target:",
40
+ ` session: ${targetSession}`,
41
+ "context:",
42
+ ` workflow_instance_id: ${instanceId}`,
43
+ " deadline_gated: true",
44
+ "",
45
+ ].join("\n");
46
+ }
47
+ /**
48
+ * Find the active auto/manual keepalive job carrying this instance id.
49
+ * Jobs carry context only inside spec_yaml (no context column); ULIDs
50
+ * are 26-char unique so a containment check is exact in practice.
51
+ */
52
+ export function findArmedKeepaliveJob(repo, instanceId) {
53
+ return (repo
54
+ .listActive()
55
+ .find((j) => j.policy === "workflow-keepalive" && j.specYaml.includes(instanceId)) ?? null);
56
+ }
57
+ /**
58
+ * Idempotent in-transaction arm: registers the per-instance keepalive
59
+ * job if no active one exists. Composable inside the scribe txn
60
+ * (register is a plain INSERT).
61
+ */
62
+ export function ensureWorkflowKeepaliveArmed(repo, input) {
63
+ const existing = findArmedKeepaliveJob(repo, input.instanceId);
64
+ if (existing)
65
+ return { jobId: existing.jobId, newlyArmed: false };
66
+ const job = repo.register({
67
+ policy: "workflow-keepalive",
68
+ specYaml: buildKeepaliveSpecYaml(input.instanceId, input.targetSession),
69
+ targetSession: input.targetSession,
70
+ intervalSeconds: WORKFLOW_KEEPALIVE_AUTO_INTERVAL_SECONDS,
71
+ registeredBySession: input.registeredBySession,
72
+ });
73
+ return { jobId: job.jobId, newlyArmed: true };
74
+ }
75
+ /**
76
+ * In-transaction disarm on terminal instance state (completed/failed):
77
+ * the job goes terminal so no orphaned watchdog noise survives the
78
+ * instance (FR-3 AC). No-op when nothing is armed.
79
+ */
80
+ export function disarmWorkflowKeepalive(repo, instanceId, reason) {
81
+ const existing = findArmedKeepaliveJob(repo, instanceId);
82
+ if (!existing)
83
+ return null;
84
+ repo.markTerminal(existing.jobId, reason);
85
+ return existing.jobId;
86
+ }
87
+ //# sourceMappingURL=workflow-keepalive-arming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-keepalive-arming.js","sourceRoot":"","sources":["../../src/domain/workflow-keepalive-arming.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,kEAAkE;AAClE,uEAAuE;AACvE,gCAAgC;AAChC,EAAE;AACF,uEAAuE;AACvE,+DAA+D;AAC/D,sEAAsE;AACtE,qEAAqE;AACrE,uEAAuE;AACvE,kEAAkE;AAClE,uEAAuE;AACvE,+DAA+D;AAC/D,iDAAiD;AACjD,EAAE;AACF,iEAAiE;AACjE,sEAAsE;AACtE,sEAAsE;AACtE,wEAAwE;AACxE,oEAAoE;AACpE,oEAAoE;AACpE,UAAU;AACV,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,gEAAgE;AAChE,sEAAsE;AACtE,+DAA+D;AAO/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wCAAwC,GAAG,EAAE,GAAG,EAAE,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,aAAqB;IAC9E,OAAO;QACL,4BAA4B;QAC5B,SAAS;QACT,cAAc,aAAa,EAAE;QAC7B,UAAU;QACV,2BAA2B,UAAU,EAAE;QACvC,wBAAwB;QACxB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA4B,EAC5B,UAAkB;IAElB,OAAO,CACL,IAAI;SACD,UAAU,EAAE;SACZ,IAAI,CACH,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,oBAAoB,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC5E,IAAI,IAAI,CACZ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAA4B,EAC5B,KAIC;IAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,MAAM,EAAE,oBAAoB;QAC5B,QAAQ,EAAE,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;QACvE,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,eAAe,EAAE,wCAAwC;QACzD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAA4B,EAC5B,UAAkB,EAClB,MAAc;IAEd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC"}