@urateam/core 0.1.55 → 0.1.57

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 (332) hide show
  1. package/dist/__tests__/audit-immutability.test.js +8 -0
  2. package/dist/__tests__/audit-immutability.test.js.map +1 -1
  3. package/dist/__tests__/auth-check.test.js +130 -16
  4. package/dist/__tests__/auth-check.test.js.map +1 -1
  5. package/dist/__tests__/auth-monitor.test.js +210 -87
  6. package/dist/__tests__/auth-monitor.test.js.map +1 -1
  7. package/dist/__tests__/bec-238-repro.test.d.ts +2 -0
  8. package/dist/__tests__/bec-238-repro.test.d.ts.map +1 -0
  9. package/dist/__tests__/bec-238-repro.test.js +116 -0
  10. package/dist/__tests__/bec-238-repro.test.js.map +1 -0
  11. package/dist/__tests__/bec146-repro.test.d.ts +2 -0
  12. package/dist/__tests__/bec146-repro.test.d.ts.map +1 -0
  13. package/dist/__tests__/bec146-repro.test.js +153 -0
  14. package/dist/__tests__/bec146-repro.test.js.map +1 -0
  15. package/dist/__tests__/circuit-breaker-config.test.d.ts +2 -0
  16. package/dist/__tests__/circuit-breaker-config.test.d.ts.map +1 -0
  17. package/dist/__tests__/circuit-breaker-config.test.js +32 -0
  18. package/dist/__tests__/circuit-breaker-config.test.js.map +1 -0
  19. package/dist/__tests__/circuit-breaker-events.test.d.ts +2 -0
  20. package/dist/__tests__/circuit-breaker-events.test.d.ts.map +1 -0
  21. package/dist/__tests__/circuit-breaker-events.test.js +53 -0
  22. package/dist/__tests__/circuit-breaker-events.test.js.map +1 -0
  23. package/dist/__tests__/circuit-breaker-integration.test.d.ts +2 -0
  24. package/dist/__tests__/circuit-breaker-integration.test.d.ts.map +1 -0
  25. package/dist/__tests__/circuit-breaker-integration.test.js +192 -0
  26. package/dist/__tests__/circuit-breaker-integration.test.js.map +1 -0
  27. package/dist/__tests__/circuit-breaker-probe.test.d.ts +2 -0
  28. package/dist/__tests__/circuit-breaker-probe.test.d.ts.map +1 -0
  29. package/dist/__tests__/circuit-breaker-probe.test.js +124 -0
  30. package/dist/__tests__/circuit-breaker-probe.test.js.map +1 -0
  31. package/dist/__tests__/circuit-breaker-recover.test.d.ts +2 -0
  32. package/dist/__tests__/circuit-breaker-recover.test.d.ts.map +1 -0
  33. package/dist/__tests__/circuit-breaker-recover.test.js +52 -0
  34. package/dist/__tests__/circuit-breaker-recover.test.js.map +1 -0
  35. package/dist/__tests__/circuit-breaker-sweep.test.d.ts +2 -0
  36. package/dist/__tests__/circuit-breaker-sweep.test.d.ts.map +1 -0
  37. package/dist/__tests__/circuit-breaker-sweep.test.js +118 -0
  38. package/dist/__tests__/circuit-breaker-sweep.test.js.map +1 -0
  39. package/dist/__tests__/db-migrations.test.js +7 -3
  40. package/dist/__tests__/db-migrations.test.js.map +1 -1
  41. package/dist/__tests__/decision-artifact-schema.test.d.ts +2 -0
  42. package/dist/__tests__/decision-artifact-schema.test.d.ts.map +1 -0
  43. package/dist/__tests__/decision-artifact-schema.test.js +45 -0
  44. package/dist/__tests__/decision-artifact-schema.test.js.map +1 -0
  45. package/dist/__tests__/decisions-parser.test.d.ts +2 -0
  46. package/dist/__tests__/decisions-parser.test.d.ts.map +1 -0
  47. package/dist/__tests__/decisions-parser.test.js +59 -0
  48. package/dist/__tests__/decisions-parser.test.js.map +1 -0
  49. package/dist/__tests__/decisions-store.test.d.ts +2 -0
  50. package/dist/__tests__/decisions-store.test.d.ts.map +1 -0
  51. package/dist/__tests__/decisions-store.test.js +68 -0
  52. package/dist/__tests__/decisions-store.test.js.map +1 -0
  53. package/dist/__tests__/decisions-table-migration.test.d.ts +2 -0
  54. package/dist/__tests__/decisions-table-migration.test.d.ts.map +1 -0
  55. package/dist/__tests__/decisions-table-migration.test.js +56 -0
  56. package/dist/__tests__/decisions-table-migration.test.js.map +1 -0
  57. package/dist/__tests__/execute-stage-session-opts.test.js +2 -1
  58. package/dist/__tests__/execute-stage-session-opts.test.js.map +1 -1
  59. package/dist/__tests__/executor-issue-id.test.js +2 -1
  60. package/dist/__tests__/executor-issue-id.test.js.map +1 -1
  61. package/dist/__tests__/extract-handoff-decisions.test.d.ts +2 -0
  62. package/dist/__tests__/extract-handoff-decisions.test.d.ts.map +1 -0
  63. package/dist/__tests__/extract-handoff-decisions.test.js +26 -0
  64. package/dist/__tests__/extract-handoff-decisions.test.js.map +1 -0
  65. package/dist/__tests__/force-push-agent-branches.test.js +38 -15
  66. package/dist/__tests__/force-push-agent-branches.test.js.map +1 -1
  67. package/dist/__tests__/github-webhook.test.js +117 -0
  68. package/dist/__tests__/github-webhook.test.js.map +1 -1
  69. package/dist/__tests__/implement-template-decisions.test.d.ts +2 -0
  70. package/dist/__tests__/implement-template-decisions.test.d.ts.map +1 -0
  71. package/dist/__tests__/implement-template-decisions.test.js +41 -0
  72. package/dist/__tests__/implement-template-decisions.test.js.map +1 -0
  73. package/dist/__tests__/migrator.test.js +137 -39
  74. package/dist/__tests__/migrator.test.js.map +1 -1
  75. package/dist/__tests__/pipeline-runner.test.js +118 -0
  76. package/dist/__tests__/pipeline-runner.test.js.map +1 -1
  77. package/dist/__tests__/pm-audit-retention-step.test.js +3 -0
  78. package/dist/__tests__/pm-audit-retention-step.test.js.map +1 -1
  79. package/dist/__tests__/pm-budget-alerts.test.d.ts +14 -0
  80. package/dist/__tests__/pm-budget-alerts.test.d.ts.map +1 -1
  81. package/dist/__tests__/pm-budget-alerts.test.js +90 -18
  82. package/dist/__tests__/pm-budget-alerts.test.js.map +1 -1
  83. package/dist/__tests__/pm-budget-refused-event.test.js +2 -0
  84. package/dist/__tests__/pm-budget-refused-event.test.js.map +1 -1
  85. package/dist/__tests__/pm-budget-utc-boundary.test.d.ts +2 -0
  86. package/dist/__tests__/pm-budget-utc-boundary.test.d.ts.map +1 -0
  87. package/dist/__tests__/pm-budget-utc-boundary.test.js +128 -0
  88. package/dist/__tests__/pm-budget-utc-boundary.test.js.map +1 -0
  89. package/dist/__tests__/pm-conflict.test.js +145 -5
  90. package/dist/__tests__/pm-conflict.test.js.map +1 -1
  91. package/dist/__tests__/pm-cost-rollup-step.test.js +2 -0
  92. package/dist/__tests__/pm-cost-rollup-step.test.js.map +1 -1
  93. package/dist/__tests__/pm-promote.test.js +111 -0
  94. package/dist/__tests__/pm-promote.test.js.map +1 -1
  95. package/dist/__tests__/pm-scheduler.test.js +1 -0
  96. package/dist/__tests__/pm-scheduler.test.js.map +1 -1
  97. package/dist/__tests__/pm-sso-prune-step.test.js +2 -0
  98. package/dist/__tests__/pm-sso-prune-step.test.js.map +1 -1
  99. package/dist/__tests__/preflight-claude-auth.test.js +3 -2
  100. package/dist/__tests__/preflight-claude-auth.test.js.map +1 -1
  101. package/dist/__tests__/ralph-review-fix-regression.test.js +1 -0
  102. package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -1
  103. package/dist/__tests__/ralph.test.js +1 -0
  104. package/dist/__tests__/ralph.test.js.map +1 -1
  105. package/dist/__tests__/release-manager-qarun-query.test.d.ts +2 -0
  106. package/dist/__tests__/release-manager-qarun-query.test.d.ts.map +1 -0
  107. package/dist/__tests__/release-manager-qarun-query.test.js +233 -0
  108. package/dist/__tests__/release-manager-qarun-query.test.js.map +1 -0
  109. package/dist/__tests__/release-manager-scheduler.test.js +62 -0
  110. package/dist/__tests__/release-manager-scheduler.test.js.map +1 -1
  111. package/dist/__tests__/release-manager-slack-handler.test.js +66 -0
  112. package/dist/__tests__/release-manager-slack-handler.test.js.map +1 -1
  113. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +1 -0
  114. package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -1
  115. package/dist/__tests__/reproduce-bec62.test.js +1 -0
  116. package/dist/__tests__/reproduce-bec62.test.js.map +1 -1
  117. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +2 -0
  118. package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -1
  119. package/dist/__tests__/resolve-claude-auth.test.js +10 -8
  120. package/dist/__tests__/resolve-claude-auth.test.js.map +1 -1
  121. package/dist/__tests__/session-lazy-creation.test.js +2 -1
  122. package/dist/__tests__/session-lazy-creation.test.js.map +1 -1
  123. package/dist/__tests__/session-resolver.test.d.ts +13 -0
  124. package/dist/__tests__/session-resolver.test.d.ts.map +1 -0
  125. package/dist/__tests__/session-resolver.test.js +152 -0
  126. package/dist/__tests__/session-resolver.test.js.map +1 -0
  127. package/dist/__tests__/session-resume-fallback.test.js +2 -1
  128. package/dist/__tests__/session-resume-fallback.test.js.map +1 -1
  129. package/dist/__tests__/stage-models.test.js +3 -2
  130. package/dist/__tests__/stage-models.test.js.map +1 -1
  131. package/dist/__tests__/start-todo.test.js +29 -0
  132. package/dist/__tests__/start-todo.test.js.map +1 -1
  133. package/dist/__tests__/surgical-review-fix-prompt.test.d.ts +2 -0
  134. package/dist/__tests__/surgical-review-fix-prompt.test.d.ts.map +1 -0
  135. package/dist/__tests__/surgical-review-fix-prompt.test.js +71 -0
  136. package/dist/__tests__/surgical-review-fix-prompt.test.js.map +1 -0
  137. package/dist/__tests__/surgical-review-fix-runner.test.d.ts +2 -0
  138. package/dist/__tests__/surgical-review-fix-runner.test.d.ts.map +1 -0
  139. package/dist/__tests__/surgical-review-fix-runner.test.js +171 -0
  140. package/dist/__tests__/surgical-review-fix-runner.test.js.map +1 -0
  141. package/dist/__tests__/triage-preserve-acs.test.d.ts +2 -0
  142. package/dist/__tests__/triage-preserve-acs.test.d.ts.map +1 -0
  143. package/dist/__tests__/triage-preserve-acs.test.js +240 -0
  144. package/dist/__tests__/triage-preserve-acs.test.js.map +1 -0
  145. package/dist/__tests__/validate-run-mode.test.js +1 -0
  146. package/dist/__tests__/validate-run-mode.test.js.map +1 -1
  147. package/dist/__tests__/validate.test.js +1 -0
  148. package/dist/__tests__/validate.test.js.map +1 -1
  149. package/dist/audit/auth-error-messages.d.ts +6 -0
  150. package/dist/audit/auth-error-messages.d.ts.map +1 -0
  151. package/dist/audit/auth-error-messages.js +18 -0
  152. package/dist/audit/auth-error-messages.js.map +1 -0
  153. package/dist/audit/events.d.ts +51 -4
  154. package/dist/audit/events.d.ts.map +1 -1
  155. package/dist/audit/events.js +78 -5
  156. package/dist/audit/events.js.map +1 -1
  157. package/dist/audit/index.d.ts +1 -0
  158. package/dist/audit/index.d.ts.map +1 -1
  159. package/dist/audit/index.js +1 -0
  160. package/dist/audit/index.js.map +1 -1
  161. package/dist/db/client.d.ts.map +1 -1
  162. package/dist/db/client.js +20 -0
  163. package/dist/db/client.js.map +1 -1
  164. package/dist/db/decisions-store.d.ts +25 -0
  165. package/dist/db/decisions-store.d.ts.map +1 -0
  166. package/dist/db/decisions-store.js +56 -0
  167. package/dist/db/decisions-store.js.map +1 -0
  168. package/dist/db/index.d.ts +2 -2
  169. package/dist/db/index.d.ts.map +1 -1
  170. package/dist/db/index.js +2 -2
  171. package/dist/db/index.js.map +1 -1
  172. package/dist/db/migrations/postgres/008_sso.sql +9 -20
  173. package/dist/db/migrations/postgres/009_review_model_runs.sql +9 -18
  174. package/dist/db/migrations/postgres/009_sso.sql +20 -0
  175. package/dist/db/migrations/postgres/010_release_manager.sql +9 -38
  176. package/dist/db/migrations/postgres/010_review_model_runs.sql +18 -0
  177. package/dist/db/migrations/postgres/011_qa_run_columns.sql +9 -8
  178. package/dist/db/migrations/postgres/011_release_manager.sql +38 -0
  179. package/dist/db/migrations/postgres/012_qa_gap_issues.sql +9 -18
  180. package/dist/db/migrations/postgres/012_qa_run_columns.sql +8 -0
  181. package/dist/db/migrations/postgres/013_qa_gap_issues.sql +18 -0
  182. package/dist/db/migrations/postgres/013_stage_runs_cache_tokens.sql +11 -6
  183. package/dist/db/migrations/postgres/014_missing_indexes.sql +9 -28
  184. package/dist/db/migrations/postgres/014_stage_runs_cache_tokens.sql +6 -0
  185. package/dist/db/migrations/postgres/015_missing_indexes.sql +28 -0
  186. package/dist/db/migrations/postgres/015_triage_results.sql +9 -11
  187. package/dist/db/migrations/postgres/016_triage_results.sql +11 -0
  188. package/dist/db/migrations/sqlite/007_sso.sql +9 -20
  189. package/dist/db/migrations/sqlite/008_review_model_runs.sql +9 -18
  190. package/dist/db/migrations/sqlite/008_sso.sql +20 -0
  191. package/dist/db/migrations/sqlite/009_release_manager.sql +9 -43
  192. package/dist/db/migrations/sqlite/009_review_model_runs.sql +18 -0
  193. package/dist/db/migrations/sqlite/010_qa_run_columns.sql +9 -9
  194. package/dist/db/migrations/sqlite/010_release_manager.sql +43 -0
  195. package/dist/db/migrations/sqlite/011_qa_gap_issues.sql +9 -22
  196. package/dist/db/migrations/sqlite/011_qa_run_columns.sql +9 -0
  197. package/dist/db/migrations/sqlite/012_qa_gap_issues.sql +22 -0
  198. package/dist/db/migrations/sqlite/012_stage_runs_cache_tokens.sql +11 -6
  199. package/dist/db/migrations/sqlite/013_missing_indexes.sql +10 -28
  200. package/dist/db/migrations/sqlite/013_stage_runs_cache_tokens.sql +6 -0
  201. package/dist/db/migrations/sqlite/013_triage_results.sql +10 -11
  202. package/dist/db/migrations/sqlite/014_missing_indexes.sql +28 -0
  203. package/dist/db/migrations/sqlite/015_triage_results.sql +11 -0
  204. package/dist/db/migrator.d.ts +45 -2
  205. package/dist/db/migrator.d.ts.map +1 -1
  206. package/dist/db/migrator.js +113 -29
  207. package/dist/db/migrator.js.map +1 -1
  208. package/dist/db/schema.d.ts +213 -0
  209. package/dist/db/schema.d.ts.map +1 -1
  210. package/dist/db/schema.js +28 -0
  211. package/dist/db/schema.js.map +1 -1
  212. package/dist/executor/auth-check.d.ts +30 -7
  213. package/dist/executor/auth-check.d.ts.map +1 -1
  214. package/dist/executor/auth-check.js +66 -16
  215. package/dist/executor/auth-check.js.map +1 -1
  216. package/dist/executor/auth-monitor.d.ts.map +1 -1
  217. package/dist/executor/auth-monitor.js +48 -39
  218. package/dist/executor/auth-monitor.js.map +1 -1
  219. package/dist/executor/deep-review.d.ts.map +1 -1
  220. package/dist/executor/deep-review.js +14 -79
  221. package/dist/executor/deep-review.js.map +1 -1
  222. package/dist/executor/executor.d.ts +21 -0
  223. package/dist/executor/executor.d.ts.map +1 -1
  224. package/dist/executor/executor.js +42 -91
  225. package/dist/executor/executor.js.map +1 -1
  226. package/dist/executor/extract-handoff.d.ts +9 -0
  227. package/dist/executor/extract-handoff.d.ts.map +1 -1
  228. package/dist/executor/extract-handoff.js +48 -0
  229. package/dist/executor/extract-handoff.js.map +1 -1
  230. package/dist/executor/handoff.d.ts +10 -1
  231. package/dist/executor/handoff.d.ts.map +1 -1
  232. package/dist/executor/handoff.js +7 -1
  233. package/dist/executor/handoff.js.map +1 -1
  234. package/dist/executor/index.d.ts +1 -0
  235. package/dist/executor/index.d.ts.map +1 -1
  236. package/dist/executor/index.js +1 -0
  237. package/dist/executor/index.js.map +1 -1
  238. package/dist/executor/prompt/templates.d.ts +12 -1
  239. package/dist/executor/prompt/templates.d.ts.map +1 -1
  240. package/dist/executor/prompt/templates.js +64 -0
  241. package/dist/executor/prompt/templates.js.map +1 -1
  242. package/dist/executor/session-resolver.d.ts +51 -0
  243. package/dist/executor/session-resolver.d.ts.map +1 -0
  244. package/dist/executor/session-resolver.js +83 -0
  245. package/dist/executor/session-resolver.js.map +1 -0
  246. package/dist/index.d.ts +3 -2
  247. package/dist/index.d.ts.map +1 -1
  248. package/dist/index.js +3 -2
  249. package/dist/index.js.map +1 -1
  250. package/dist/notifier/composite.js +1 -1
  251. package/dist/notifier/composite.js.map +1 -1
  252. package/dist/notifier/linear.d.ts +1 -1
  253. package/dist/notifier/linear.d.ts.map +1 -1
  254. package/dist/notifier/linear.js +49 -9
  255. package/dist/notifier/linear.js.map +1 -1
  256. package/dist/pipeline/run-surgical-review-fix.d.ts +29 -0
  257. package/dist/pipeline/run-surgical-review-fix.d.ts.map +1 -0
  258. package/dist/pipeline/run-surgical-review-fix.js +48 -0
  259. package/dist/pipeline/run-surgical-review-fix.js.map +1 -0
  260. package/dist/pipeline/runner.d.ts.map +1 -1
  261. package/dist/pipeline/runner.js +132 -36
  262. package/dist/pipeline/runner.js.map +1 -1
  263. package/dist/pm/actions/circuit-breaker-config.d.ts +13 -0
  264. package/dist/pm/actions/circuit-breaker-config.d.ts.map +1 -0
  265. package/dist/pm/actions/circuit-breaker-config.js +23 -0
  266. package/dist/pm/actions/circuit-breaker-config.js.map +1 -0
  267. package/dist/pm/actions/db-queries.d.ts +18 -0
  268. package/dist/pm/actions/db-queries.d.ts.map +1 -1
  269. package/dist/pm/actions/db-queries.js +75 -2
  270. package/dist/pm/actions/db-queries.js.map +1 -1
  271. package/dist/pm/actions/promote.d.ts +7 -0
  272. package/dist/pm/actions/promote.d.ts.map +1 -1
  273. package/dist/pm/actions/promote.js +17 -1
  274. package/dist/pm/actions/promote.js.map +1 -1
  275. package/dist/pm/actions/recover-circuit-breaker.d.ts +21 -0
  276. package/dist/pm/actions/recover-circuit-breaker.d.ts.map +1 -0
  277. package/dist/pm/actions/recover-circuit-breaker.js +47 -0
  278. package/dist/pm/actions/recover-circuit-breaker.js.map +1 -0
  279. package/dist/pm/actions/select-probe-candidates.d.ts +21 -0
  280. package/dist/pm/actions/select-probe-candidates.d.ts.map +1 -0
  281. package/dist/pm/actions/select-probe-candidates.js +81 -0
  282. package/dist/pm/actions/select-probe-candidates.js.map +1 -0
  283. package/dist/pm/actions/start-todo.d.ts +7 -0
  284. package/dist/pm/actions/start-todo.d.ts.map +1 -1
  285. package/dist/pm/actions/start-todo.js +2 -1
  286. package/dist/pm/actions/start-todo.js.map +1 -1
  287. package/dist/pm/actions/sweep-recovered-circuit-breakers.d.ts +28 -0
  288. package/dist/pm/actions/sweep-recovered-circuit-breakers.d.ts.map +1 -0
  289. package/dist/pm/actions/sweep-recovered-circuit-breakers.js +47 -0
  290. package/dist/pm/actions/sweep-recovered-circuit-breakers.js.map +1 -0
  291. package/dist/pm/actions/triage-prompt.d.ts +14 -0
  292. package/dist/pm/actions/triage-prompt.d.ts.map +1 -1
  293. package/dist/pm/actions/triage-prompt.js +52 -9
  294. package/dist/pm/actions/triage-prompt.js.map +1 -1
  295. package/dist/pm/actions/triage.d.ts.map +1 -1
  296. package/dist/pm/actions/triage.js +37 -24
  297. package/dist/pm/actions/triage.js.map +1 -1
  298. package/dist/pm/conflict.d.ts +2 -0
  299. package/dist/pm/conflict.d.ts.map +1 -1
  300. package/dist/pm/conflict.js +59 -9
  301. package/dist/pm/conflict.js.map +1 -1
  302. package/dist/pm/scheduler.d.ts +5 -0
  303. package/dist/pm/scheduler.d.ts.map +1 -1
  304. package/dist/pm/scheduler.js +91 -44
  305. package/dist/pm/scheduler.js.map +1 -1
  306. package/dist/pm/slack.d.ts +11 -0
  307. package/dist/pm/slack.d.ts.map +1 -1
  308. package/dist/pm/slack.js +48 -5
  309. package/dist/pm/slack.js.map +1 -1
  310. package/dist/release-manager/release-helpers.d.ts +19 -2
  311. package/dist/release-manager/release-helpers.d.ts.map +1 -1
  312. package/dist/release-manager/release-helpers.js +22 -3
  313. package/dist/release-manager/release-helpers.js.map +1 -1
  314. package/dist/release-manager/release-tick.d.ts.map +1 -1
  315. package/dist/release-manager/release-tick.js +20 -8
  316. package/dist/release-manager/release-tick.js.map +1 -1
  317. package/dist/release-manager/slack-handler.d.ts +6 -0
  318. package/dist/release-manager/slack-handler.d.ts.map +1 -1
  319. package/dist/release-manager/slack-handler.js +76 -1
  320. package/dist/release-manager/slack-handler.js.map +1 -1
  321. package/dist/release-manager/state.d.ts.map +1 -1
  322. package/dist/release-manager/state.js +25 -18
  323. package/dist/release-manager/state.js.map +1 -1
  324. package/dist/types.d.ts +238 -13
  325. package/dist/types.d.ts.map +1 -1
  326. package/dist/types.js +67 -0
  327. package/dist/types.js.map +1 -1
  328. package/dist/webhook/github-handler.d.ts +2 -2
  329. package/dist/webhook/github-handler.d.ts.map +1 -1
  330. package/dist/webhook/github-handler.js +18 -6
  331. package/dist/webhook/github-handler.js.map +1 -1
  332. package/package.json +1 -1
@@ -5,7 +5,7 @@ import { resolveIssueRelations } from "../../util/linear.js";
5
5
  import { createLogger } from "../../logger.js";
6
6
  import { logAuditEventUnchecked, pmTriageClassifiedEvent } from "../../audit/index.js";
7
7
  import { upsertTriageResult } from "../triage-results-store.js";
8
- import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, } from "./triage-prompt.js";
8
+ import { buildTriageV1Prompt, buildTriageV2Prompt, isV2Disabled, parseHandWrittenACs, } from "./triage-prompt.js";
9
9
  import { renderTriageComment, appendTriageSectionsToDescription, } from "./triage-render.js";
10
10
  const log = createLogger({ component: "PmAgent:triage" });
11
11
  const MAX_ISSUES_PER_TICK = 10;
@@ -27,9 +27,13 @@ const OBSERVER_BODY_MARKER = "<!-- urateam-qo-observer:";
27
27
  * diagnostic. See CLAUDE.md "Quality Observer" for the rationale.
28
28
  */
29
29
  const OBSERVER_PIPELINE_LABEL = "needs-design";
30
+ const BUG_LABEL = "bug";
30
31
  function isObserverOriginIssue(description) {
31
32
  return typeof description === "string" && description.includes(OBSERVER_BODY_MARKER);
32
33
  }
34
+ function warnMissingPipelineLabel(issueId, label, context) {
35
+ log.warn({ issueId, label }, `${context}: '${label}' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote`);
36
+ }
33
37
  /**
34
38
  * Process an array of items in batches of `size`, awaiting each batch before
35
39
  * starting the next. Returns a flat array of results (preserving order).
@@ -72,8 +76,7 @@ export async function triageNewIssues(input) {
72
76
  .map((l) => labelMap.get(l.toLowerCase()))
73
77
  .filter(Boolean);
74
78
  if (labelIds.length === 0) {
75
- log.warn({ issueId: issue.identifier, label: OBSERVER_PIPELINE_LABEL }, "observer-origin gate: '" + OBSERVER_PIPELINE_LABEL +
76
- "' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote");
79
+ warnMissingPipelineLabel(issue.identifier, OBSERVER_PIPELINE_LABEL, "observer-origin gate");
77
80
  }
78
81
  const rationale = "Observer-origin finding (body marker detected) — routed to needs-design so the await-approval stage gates a human before any implement-stage work runs.";
79
82
  const updatePayload = { priority: 3 };
@@ -81,13 +84,13 @@ export async function triageNewIssues(input) {
81
84
  updatePayload.labelIds = labelIds;
82
85
  if (backlogStateId)
83
86
  updatePayload.stateId = backlogStateId;
84
- await linearClient.updateIssue(issue.id, updatePayload);
85
- await linearClient.createComment({
86
- issueId: issue.id,
87
- body: `🤖 **PM Agent — Triaged (Quality Observer finding)**\n\n` +
88
- `**Pipeline:** ${OBSERVER_PIPELINE_LABEL}\n` +
89
- `**Rationale:** ${rationale}`,
90
- });
87
+ await Promise.all([
88
+ linearClient.updateIssue(issue.id, updatePayload),
89
+ linearClient.createComment({
90
+ issueId: issue.id,
91
+ body: `🤖 **PM Agent — Triaged (Quality Observer finding)**\n\n**Pipeline:** ${OBSERVER_PIPELINE_LABEL}\n**Rationale:** ${rationale}`,
92
+ }),
93
+ ]);
91
94
  const result = {
92
95
  issueId: issue.identifier,
93
96
  priority: 3,
@@ -106,6 +109,13 @@ export async function triageNewIssues(input) {
106
109
  log.info({ issueId: issue.identifier, pipelineLabel: OBSERVER_PIPELINE_LABEL }, "triaged observer-origin issue (skipped Claude classification)");
107
110
  return result;
108
111
  }
112
+ // Pre-parse hand-written ACs from the issue description. When the
113
+ // operator has already written a `**Acceptance Criteria:**` section,
114
+ // we use those items verbatim so the triage result stays in sync with
115
+ // the description text that the implement-stage prompt also sees.
116
+ // When no pre-written ACs are found, fall back to Haiku generation.
117
+ const preSuppliedACs = parseHandWrittenACs(issue.description);
118
+ const hasPreSuppliedACs = preSuppliedACs.length > 0;
109
119
  // Tier 6a — pick v2 prompt by default; fall back to v1 when the
110
120
  // operator has set URATEAM_DISABLE_TRIAGE_V2=true. Reads env at
111
121
  // call time so flipping the var takes effect on the next PM tick
@@ -115,6 +125,7 @@ export async function triageNewIssues(input) {
115
125
  identifier: issue.identifier,
116
126
  title: issue.title,
117
127
  description: issue.description ?? "",
128
+ hasPreSuppliedACs,
118
129
  };
119
130
  const prompt = useV2
120
131
  ? buildTriageV2Prompt(promptInput, sanitize)
@@ -158,9 +169,9 @@ export async function triageNewIssues(input) {
158
169
  // bug-severity gate). Treat the model's `pipelineLabel` as
159
170
  // telemetry only.
160
171
  const forceNeedsDesign = openQuestions.length > 0;
161
- const hasBug = labels.some((l) => l.toLowerCase() === "bug");
172
+ const hasBug = labels.some((l) => l.toLowerCase() === BUG_LABEL);
162
173
  const pipelineLabel = forceNeedsDesign
163
- ? OBSERVER_PIPELINE_LABEL // "needs-design" — same routing as observer-origin gate
174
+ ? OBSERVER_PIPELINE_LABEL // same routing as observer-origin gate
164
175
  : hasBug
165
176
  ? "bug"
166
177
  : complexity === "trivial"
@@ -175,8 +186,7 @@ export async function triageNewIssues(input) {
175
186
  // routing label is dropped silently. Surface this so operators can
176
187
  // diagnose why a ticket isn't being picked up by promote.
177
188
  if (!labelMap.get(OBSERVER_PIPELINE_LABEL.toLowerCase())) {
178
- log.warn({ issueId: issue.identifier, label: OBSERVER_PIPELINE_LABEL }, "Tier 4 routing: '" + OBSERVER_PIPELINE_LABEL +
179
- "' label not found in Linear — issue will move to Backlog without pipeline label and won't be routed by promote");
189
+ warnMissingPipelineLabel(issue.identifier, OBSERVER_PIPELINE_LABEL, "Tier 4 routing");
180
190
  }
181
191
  }
182
192
  const labelIds = issueLabels
@@ -187,9 +197,13 @@ export async function triageNewIssues(input) {
187
197
  const { team } = await resolveIssueRelations(issue);
188
198
  const teamId = team?.id;
189
199
  const backlogStateId = teamId ? stateMap.get(`${teamId}:Backlog`) : undefined;
190
- const acceptanceCriteria = Array.isArray(parsed.acceptanceCriteria)
191
- ? parsed.acceptanceCriteria.filter((c) => typeof c === "string" && c.length > 0)
192
- : [];
200
+ // Use pre-supplied ACs when the operator wrote them in the description;
201
+ // fall back to Haiku's generated list for fresh (no-AC) tickets.
202
+ const acceptanceCriteria = hasPreSuppliedACs
203
+ ? preSuppliedACs
204
+ : Array.isArray(parsed.acceptanceCriteria)
205
+ ? parsed.acceptanceCriteria.filter((c) => typeof c === "string" && c.length > 0)
206
+ : [];
193
207
  // Tier 6b — extract optional v2 fields when v2 is active. When v1
194
208
  // is forced (env var), skip the extraction so the result shape
195
209
  // stays bit-compatible with v1.
@@ -221,14 +235,13 @@ export async function triageNewIssues(input) {
221
235
  if (updatedDesc !== existingDesc) {
222
236
  updatePayload.description = updatedDesc;
223
237
  }
224
- await linearClient.updateIssue(issue.id, updatePayload);
225
- await linearClient.createComment({
226
- issueId: issue.id,
227
- body: renderTriageComment(result, {
228
- forceNeedsDesign,
229
- pipelineLabel,
238
+ await Promise.all([
239
+ linearClient.updateIssue(issue.id, updatePayload),
240
+ linearClient.createComment({
241
+ issueId: issue.id,
242
+ body: renderTriageComment(result, { forceNeedsDesign, pipelineLabel }),
230
243
  }),
231
- });
244
+ ]);
232
245
  if (input.db) {
233
246
  void logAuditEventUnchecked(input.db, pmTriageClassifiedEvent({
234
247
  issueId: issue.identifier,
@@ -1 +1 @@
1
- {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/pm/actions/triage.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import type { ConflictCheckResult } from "./types.js";
2
2
  export interface ActiveRun {
3
3
  issueId: string;
4
4
  branch: string;
5
+ /** Local worktree path for this run. Used as fallback when the branch has not yet been pushed to origin. */
6
+ worktreePath?: string;
5
7
  }
6
8
  export interface GetActiveFileMapsInput {
7
9
  activeRuns: ActiveRun[];
@@ -1 +1 @@
1
- {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CA8BnC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
1
+ {"version":3,"file":"conflict.d.ts","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUtD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CA4CnC;AAwCD,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAqC9B"}
@@ -1,6 +1,9 @@
1
1
  import { parseJsonObject } from "../executor/agent-stream.js";
2
2
  import { createLogger } from "../logger.js";
3
3
  const log = createLogger({ component: "PmAgent:conflict" });
4
+ function parseGitLines(output) {
5
+ return output.split("\n").map((f) => f.trim()).filter(Boolean);
6
+ }
4
7
  export async function getActiveFileMaps(input) {
5
8
  const { activeRuns, defaultBranch, repoDir, execGit } = input;
6
9
  const fileMaps = new Map();
@@ -13,21 +16,68 @@ export async function getActiveFileMaps(input) {
13
16
  log.warn("git fetch failed, proceeding with local refs");
14
17
  }
15
18
  for (const run of activeRuns) {
19
+ // Deterministically check whether the branch exists on origin before diffing.
20
+ // This avoids conflating "branch not yet pushed" with genuine git failures.
21
+ let branchOnOrigin = false;
16
22
  try {
17
- const output = await execGit(["diff", "--name-only", `origin/${defaultBranch}..origin/${run.branch}`], repoDir);
18
- const files = output
19
- .split("\n")
20
- .map((f) => f.trim())
21
- .filter(Boolean);
22
- fileMaps.set(run.issueId, new Set(files));
23
+ await execGit(["rev-parse", "--verify", "--quiet", `origin/${run.branch}`], repoDir);
24
+ branchOnOrigin = true;
25
+ }
26
+ catch {
27
+ // Branch not on origin yet — expected for in-flight runs that haven't pushed.
28
+ }
29
+ if (branchOnOrigin) {
30
+ // Branch already pushed — use the standard origin-diff path.
31
+ try {
32
+ const output = await execGit(["diff", "--name-only", `origin/${defaultBranch}..origin/${run.branch}`], repoDir);
33
+ fileMaps.set(run.issueId, new Set(parseGitLines(output)));
34
+ }
35
+ catch (err) {
36
+ log.warn({ issueId: run.issueId, branch: run.branch, err }, "git diff failed, treating as empty");
37
+ fileMaps.set(run.issueId, new Set());
38
+ }
23
39
  }
24
- catch (err) {
25
- log.warn({ issueId: run.issueId, branch: run.branch, err }, "git diff failed, treating as empty");
26
- fileMaps.set(run.issueId, new Set());
40
+ else {
41
+ // Branch not yet on origin read in-progress files from the local worktree.
42
+ // This is the normal state for runs that are still executing stages.
43
+ log.debug({ issueId: run.issueId, branch: run.branch }, "branch not yet on origin, reading worktree for conflict detection");
44
+ fileMaps.set(run.issueId, await getWorktreeFiles(run, defaultBranch, execGit));
27
45
  }
28
46
  }
29
47
  return fileMaps;
30
48
  }
49
+ async function getWorktreeFiles(run, defaultBranch, execGit) {
50
+ if (!run.worktreePath)
51
+ return new Set();
52
+ const files = new Set();
53
+ // Run both git operations in parallel — they are independent reads.
54
+ const [diffResult, statusResult] = await Promise.allSettled([
55
+ execGit(["diff", "--name-only", `origin/${defaultBranch}...HEAD`], run.worktreePath),
56
+ execGit(["status", "--porcelain"], run.worktreePath),
57
+ ]);
58
+ if (diffResult.status === "fulfilled") {
59
+ for (const f of parseGitLines(diffResult.value)) {
60
+ files.add(f);
61
+ }
62
+ }
63
+ else {
64
+ log.warn({ issueId: run.issueId, worktreePath: run.worktreePath, err: diffResult.reason }, "worktree diff failed, skipping committed files");
65
+ }
66
+ if (statusResult.status === "fulfilled") {
67
+ for (const line of statusResult.value.split("\n")) {
68
+ if (line.length < 4)
69
+ continue;
70
+ const path = line.slice(3).trim();
71
+ // Renamed files appear as "old -> new"; take the destination name.
72
+ const parts = path.split(" -> ");
73
+ files.add(parts[parts.length - 1]);
74
+ }
75
+ }
76
+ else {
77
+ log.warn({ issueId: run.issueId, worktreePath: run.worktreePath, err: statusResult.reason }, "worktree status failed, skipping uncommitted files");
78
+ }
79
+ return files;
80
+ }
31
81
  export async function predictConflict(input) {
32
82
  const { candidateDescription, activeFileMaps, callClaude, sanitize } = input;
33
83
  const allActiveFiles = [];
@@ -1 +1 @@
1
- {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conflict.js","sourceRoot":"","sources":["../../src/pm/conflict.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import { type StuckIssueResult } from "./actions/recover-stuck.js";
10
10
  import { type StartTodoInput, type StartTodoResult } from "./actions/start-todo.js";
11
11
  import { getActiveFileMaps, predictConflict } from "./conflict.js";
12
12
  import type { Db, AnyDb } from "../db/client.js";
13
+ import { type AuthMonitor } from "../executor/auth-monitor.js";
13
14
  /**
14
15
  * BEC-184 / BEC-227: parse the PM_AGENT_STUCK_RUN_AGE_MIN env var (default 120 min).
15
16
  * Controls how long a 'running' run must be active before it's treated as a
@@ -31,6 +32,8 @@ export interface PmSchedulerDeps {
31
32
  slackBotToken: string;
32
33
  repoCloneDir?: string;
33
34
  defaultBranch?: string;
35
+ /** Base directory where per-run worktrees are created. Defaults to $HOME/data/runs (matching runner default). */
36
+ agentRunDir?: string;
34
37
  runner?: {
35
38
  resume: (issueId: string) => Promise<void>;
36
39
  start: (issue: any, pipelineKey: string, pipelineConfig: any, repoConfig: any, sanitizedIssue: any) => Promise<void>;
@@ -38,6 +41,8 @@ export interface PmSchedulerDeps {
38
41
  pipelineConfigs?: Record<string, any>;
39
42
  repoConfigs?: Record<string, any>;
40
43
  actions?: Partial<PmSchedulerActions>;
44
+ /** Injectable auth monitor — defaults to the real createAuthMonitor. Used by tests to avoid slow real API calls. */
45
+ authMonitor?: AuthMonitor;
41
46
  }
42
47
  interface PmSchedulerActions {
43
48
  evaluateBudget: (input: {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/pm/scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/pm/scheduler.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,9 @@ import { resolveApprovals } from "./actions/resolve-approvals.js";
11
11
  import { recoverRetriableRuns } from "./actions/recover.js";
12
12
  import { recoverStuckInProgressIssues } from "./actions/recover-stuck.js";
13
13
  import { startTodoIssues } from "./actions/start-todo.js";
14
+ import { getCircuitBreakerProbeConfig } from "./actions/circuit-breaker-config.js";
15
+ import { selectProbeCandidates } from "./actions/select-probe-candidates.js";
16
+ import { sweepRecoveredCircuitBreakers } from "./actions/sweep-recovered-circuit-breakers.js";
14
17
  import { getActiveFileMaps, predictConflict } from "./conflict.js";
15
18
  import { fetchCircuitBrokenIssues, ACTIVE_STATUSES } from "./actions/db-queries.js";
16
19
  import { PmSlackNotifier } from "./slack.js";
@@ -28,6 +31,10 @@ import { pruneExpiredSessions } from "../auth/index.js";
28
31
  import { recomputeCostRollups } from "../cost/index.js";
29
32
  import { createAuthMonitor } from "../executor/auth-monitor.js";
30
33
  const log = createLogger({ component: "PmAgent:scheduler" });
34
+ function captureTickError(tick, key, err, msg) {
35
+ log.error({ err }, msg);
36
+ tick.errors.push(`${key}: ${err.message}`);
37
+ }
31
38
  /**
32
39
  * BEC-184 / BEC-227: parse the PM_AGENT_STUCK_RUN_AGE_MIN env var (default 120 min).
33
40
  * Controls how long a 'running' run must be active before it's treated as a
@@ -53,7 +60,7 @@ export function createPmScheduler(deps) {
53
60
  // BEC-207: AuthMonitor — periodic Claude session health-check (every 6h).
54
61
  // Alerts to the PM agent's Slack channel when SLACK_ERROR_ALERTS=true.
55
62
  // No-ops when CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY is set.
56
- const authMonitor = createAuthMonitor({
63
+ const authMonitor = deps.authMonitor ?? createAuthMonitor({
57
64
  slackBotToken: deps.slackBotToken || undefined,
58
65
  slackErrorChannel: process.env.SLACK_ERROR_ALERTS === "true"
59
66
  ? deps.config.slackChannelId
@@ -69,6 +76,12 @@ export function createPmScheduler(deps) {
69
76
  }
70
77
  return slackNotifier;
71
78
  }
79
+ // BEC-238: fire the reactions:read scope probe once at scheduler creation.
80
+ // Non-blocking — failure is caught inside probeReactionsScope and logged warn.
81
+ // Guard on slackBotToken so tests that pass an empty string skip the probe.
82
+ if (deps.slackBotToken && deps.config.slackChannelId) {
83
+ void getSlackNotifier().probeReactionsScope();
84
+ }
72
85
  async function tryAcquireLock() {
73
86
  if (!isPostgres(deps.db))
74
87
  return true;
@@ -118,8 +131,7 @@ export function createPmScheduler(deps) {
118
131
  : await evaluateBudget({ db, config });
119
132
  }
120
133
  catch (err) {
121
- log.error({ err }, "budget evaluation failed");
122
- tick.errors.push(`budget: ${err.message}`);
134
+ captureTickError(tick, "budget", err, "budget evaluation failed");
123
135
  evaluation = {
124
136
  scopes: [],
125
137
  worstTier: "ok",
@@ -216,8 +228,7 @@ export function createPmScheduler(deps) {
216
228
  }
217
229
  }
218
230
  catch (err) {
219
- log.error({ err }, "recovery sweep failed");
220
- tick.errors.push(`recover: ${err.message}`);
231
+ captureTickError(tick, "recover", err, "recovery sweep failed");
221
232
  }
222
233
  // Fetch workflow states once per tick to avoid redundant Linear API round-trips
223
234
  let stateMap = new Map();
@@ -226,8 +237,7 @@ export function createPmScheduler(deps) {
226
237
  stateMap = await resolveWorkflowStates(await getLinearClient(), config.teamIds);
227
238
  }
228
239
  catch (err) {
229
- log.error({ err }, "resolveWorkflowStates failed");
230
- tick.errors.push(`resolveWorkflowStates: ${err.message}`);
240
+ captureTickError(tick, "resolveWorkflowStates", err, "resolveWorkflowStates failed");
231
241
  }
232
242
  }
233
243
  // --- Stuck In Progress issue recovery sweep ---
@@ -252,12 +262,45 @@ export function createPmScheduler(deps) {
252
262
  }
253
263
  }
254
264
  catch (err) {
255
- log.error({ err }, "stuck issue recovery sweep failed");
256
- tick.errors.push(`recoverStuck: ${err.message}`);
265
+ captureTickError(tick, "recoverStuck", err, "stuck issue recovery sweep failed");
257
266
  }
258
267
  }
259
268
  // Compute available slots once for both startTodo and promote
260
269
  const slotsAvailable = config.maxInFlight - (tick.budgetGuard.activeCount ?? 0);
270
+ // BEC-236 — half-open circuit-breaker probe. Picks at most `cap` issues
271
+ // per tick that the breaker would normally skip; promote + startTodo
272
+ // receive this Set as probeOverrideIds and bypass the skip for them.
273
+ const probeConfig = getCircuitBreakerProbeConfig();
274
+ const breakerThreshold = config.maxConsecutiveFailures > 0
275
+ ? config.maxConsecutiveFailures
276
+ : 3;
277
+ let probeOverrideIds = new Set();
278
+ if (db && !probeConfig.disabled) {
279
+ try {
280
+ probeOverrideIds = await selectProbeCandidates(db, {
281
+ cap: probeConfig.maxProbesPerTick,
282
+ cooldownMs: probeConfig.cooldownMs,
283
+ maxConsecutiveFailures: breakerThreshold,
284
+ now: Date.now(),
285
+ });
286
+ }
287
+ catch (err) {
288
+ captureTickError(tick, "probe", err, "selectProbeCandidates failed");
289
+ }
290
+ // BEC-236 — sweep recovered issues. The runner can't drive recovery
291
+ // itself (no `linearClient` in its scope), so each tick scans for
292
+ // state rows whose consecutive-failure count has dropped (= a
293
+ // `completed` run landed). Recovery deletes the state row and
294
+ // strips the Tier-5-added `needs-design` label.
295
+ try {
296
+ await sweepRecoveredCircuitBreakers(db, await getLinearClient(), {
297
+ maxConsecutiveFailures: breakerThreshold,
298
+ });
299
+ }
300
+ catch (err) {
301
+ captureTickError(tick, "sweepRecovered", err, "sweepRecoveredCircuitBreakers failed");
302
+ }
303
+ }
261
304
  // --- Start pipelines for orphaned Todo issues ---
262
305
  if (deps.runner?.start && deps.pipelineConfigs && deps.repoConfigs) {
263
306
  try {
@@ -279,6 +322,7 @@ export function createPmScheduler(deps) {
279
322
  // BEC-181: omit getFailureCount so startTodoIssues uses the batch
280
323
  // batchCountConsecutiveFailures path (single DB round-trip for all
281
324
  // candidates) instead of per-issue N+1 queries.
325
+ probeOverrideIds,
282
326
  });
283
327
  const started = todoResults.filter((r) => r.started);
284
328
  if (started.length > 0) {
@@ -288,8 +332,7 @@ export function createPmScheduler(deps) {
288
332
  }
289
333
  }
290
334
  catch (err) {
291
- log.error({ err }, "startTodoIssues failed");
292
- tick.errors.push(`startTodo: ${err.message}`);
335
+ captureTickError(tick, "startTodo", err, "startTodoIssues failed");
293
336
  }
294
337
  }
295
338
  try {
@@ -306,8 +349,7 @@ export function createPmScheduler(deps) {
306
349
  });
307
350
  }
308
351
  catch (err) {
309
- log.error({ err }, "triage failed");
310
- tick.errors.push(`triage: ${err.message}`);
352
+ captureTickError(tick, "triage", err, "triage failed");
311
353
  }
312
354
  try {
313
355
  const approvalResult = actions
@@ -323,8 +365,7 @@ export function createPmScheduler(deps) {
323
365
  tick.approvalsPending = approvalResult.stillPending;
324
366
  }
325
367
  catch (err) {
326
- log.error({ err }, "resolve approvals failed");
327
- tick.errors.push(`resolveApprovals: ${err.message}`);
368
+ captureTickError(tick, "resolveApprovals", err, "resolve approvals failed");
328
369
  }
329
370
  if (isPmPaused()) {
330
371
  tick.paused = true;
@@ -336,31 +377,34 @@ export function createPmScheduler(deps) {
336
377
  tick.promoted = await actions.promoteReadyIssues({});
337
378
  }
338
379
  else {
339
- const activeRuns = await getActiveRunsFromDb(db);
380
+ const agentRunDir = deps.agentRunDir ?? join(homedir(), "data", "runs");
340
381
  const baseDir = deps.repoCloneDir ?? join(homedir(), "work", "repos");
341
382
  const defaultBranch = deps.defaultBranch ?? "main";
342
- // Find the first cloned repo directory (runner clones to <repoCloneDir>/<slug>/)
343
- let repoDir = baseDir;
344
- try {
345
- const { readdir, stat } = await import("node:fs/promises");
346
- const entries = await readdir(baseDir);
347
- const candidates = await Promise.all(entries.map(async (entry) => {
348
- const candidate = `${baseDir}/${entry}`;
383
+ const { readdir, stat } = await import("node:fs/promises");
384
+ // Fetch active runs from DB and scan for the first cloned repo dir in parallel.
385
+ const [activeRuns, repoDir] = await Promise.all([
386
+ getActiveRunsFromDb(db, agentRunDir),
387
+ (async () => {
349
388
  try {
350
- const s = await stat(`${candidate}/.git`);
351
- if (s.isDirectory())
352
- return candidate;
389
+ const entries = await readdir(baseDir);
390
+ const candidates = await Promise.all(entries.map(async (entry) => {
391
+ const candidate = `${baseDir}/${entry}`;
392
+ try {
393
+ const s = await stat(`${candidate}/.git`);
394
+ if (s.isDirectory())
395
+ return candidate;
396
+ }
397
+ catch { /* not a git repo */ }
398
+ return null;
399
+ }));
400
+ return candidates.find((c) => c !== null) ?? baseDir;
353
401
  }
354
- catch { /* not a git repo */ }
355
- return null;
356
- }));
357
- const found = candidates.find((c) => c !== null);
358
- if (found)
359
- repoDir = found;
360
- }
361
- catch {
362
- log.warn("could not scan repoCloneDir for git repos");
363
- }
402
+ catch {
403
+ log.warn("could not scan repoCloneDir for git repos");
404
+ return baseDir;
405
+ }
406
+ })(),
407
+ ]);
364
408
  const fileMaps = await getActiveFileMaps({
365
409
  activeRuns,
366
410
  defaultBranch,
@@ -385,12 +429,12 @@ export function createPmScheduler(deps) {
385
429
  // BEC-181: omit getFailureCount so promoteReadyIssues uses the batch
386
430
  // batchCountConsecutiveFailures path (single DB round-trip for all
387
431
  // candidates) instead of per-issue N+1 queries.
432
+ probeOverrideIds,
388
433
  });
389
434
  }
390
435
  }
391
436
  catch (err) {
392
- log.error({ err }, "promote failed");
393
- tick.errors.push(`promote: ${err.message}`);
437
+ captureTickError(tick, "promote", err, "promote failed");
394
438
  }
395
439
  }
396
440
  if (!isPmPaused() && isFeatureLicensed("approval-workflows")) {
@@ -421,15 +465,13 @@ export function createPmScheduler(deps) {
421
465
  tick.deprioritizeRequested = depResult.value;
422
466
  }
423
467
  else {
424
- log.error({ err: depResult.reason }, "deprioritize failed");
425
- tick.errors.push(`deprioritize: ${depResult.reason.message}`);
468
+ captureTickError(tick, "deprioritize", depResult.reason, "deprioritize failed");
426
469
  }
427
470
  if (cancelResult.status === "fulfilled") {
428
471
  tick.cancelRequested = cancelResult.value;
429
472
  }
430
473
  else {
431
- log.error({ err: cancelResult.reason }, "cancel failed");
432
- tick.errors.push(`cancel: ${cancelResult.reason.message}`);
474
+ captureTickError(tick, "cancel", cancelResult.reason, "cancel failed");
433
475
  }
434
476
  }
435
477
  // BEC-223: Populate circuit-broken issues for the digest before posting.
@@ -510,10 +552,11 @@ export function createPmScheduler(deps) {
510
552
  },
511
553
  };
512
554
  }
513
- async function getActiveRunsFromDb(db) {
555
+ async function getActiveRunsFromDb(db, agentRunDir) {
514
556
  try {
515
557
  const rows = await db
516
558
  .select({
559
+ id: pipelineRuns.id,
517
560
  issueId: pipelineRuns.issueId,
518
561
  branch: pipelineRuns.branch,
519
562
  })
@@ -521,7 +564,11 @@ async function getActiveRunsFromDb(db) {
521
564
  .where(inArray(pipelineRuns.status, [...ACTIVE_STATUSES]));
522
565
  return rows
523
566
  .filter((r) => r.branch)
524
- .map((r) => ({ issueId: r.issueId, branch: r.branch }));
567
+ .map((r) => ({
568
+ issueId: r.issueId,
569
+ branch: r.branch,
570
+ worktreePath: join(agentRunDir, r.id, "worktree"),
571
+ }));
525
572
  }
526
573
  catch {
527
574
  return [];