crewly 1.20.153 → 1.20.154

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 (758) hide show
  1. package/README.md +21 -3
  2. package/config/constants.ts +78 -0
  3. package/config/hooks/agent-status/report.sh +78 -0
  4. package/config/hooks/control-plane-guard/pretooluse-bash.sh +241 -0
  5. package/config/orchestrator_tasks/prompts/assign-task-orchestrator-prompt-template.md +19 -49
  6. package/config/orchestrator_tasks/prompts/checkin-orchestrator-prompt-template.md +25 -125
  7. package/config/orchestrator_tasks/prompts/project-start-orchestrator-prompt-template.md +29 -100
  8. package/config/roles/orchestrator/prompt.md +18 -2
  9. package/config/roles/team-leader/prompt.md +13 -3
  10. package/config/roles/team-leader/role.json +1 -1
  11. package/config/roles/team-leader/tl-addon.md +12 -3
  12. package/config/skills/agent/core/complete-task/SKILL.md +1 -1
  13. package/config/skills/agent/core/project-tickets/SKILL.md +127 -0
  14. package/config/skills/agent/core/project-tickets/execute.sh +182 -0
  15. package/config/skills/agent/core/project-tickets/execute.test.sh +116 -0
  16. package/config/skills/agent/core/recall/SKILL.md +1 -1
  17. package/config/skills/agent/core/recall/execute.sh +7 -0
  18. package/config/skills/agent/core/report-status/SKILL.md +3 -2
  19. package/config/skills/agent/core/report-status/execute.sh +37 -15
  20. package/config/skills/agent/core/split-ticket/SKILL.md +62 -0
  21. package/config/skills/agent/core/split-ticket/execute.sh +87 -0
  22. package/config/skills/agent/core/split-ticket/execute.test.sh +77 -0
  23. package/config/skills/agent/core/standing-update/SKILL.md +96 -0
  24. package/config/skills/agent/core/standing-update/execute.sh +107 -0
  25. package/config/skills/agent/onboarding/materialize-team/SKILL.md +1 -1
  26. package/config/skills/agent/onboarding/recommend-team/SKILL.md +1 -1
  27. package/config/skills/orchestrator/delegate-task/SKILL.md +4 -3
  28. package/config/skills/orchestrator/render-verdict/SKILL.md +62 -0
  29. package/config/skills/orchestrator/render-verdict/execute.sh +47 -0
  30. package/config/skills/orchestrator/render-verdict/execute.test.sh +121 -0
  31. package/config/skills/orchestrator/wiki-migrate/SKILL.md +0 -1
  32. package/config/skills/team-leader/aggregate-results/SKILL.md +1 -1
  33. package/config/skills/team-leader/assign-ticket/SKILL.md +47 -0
  34. package/config/skills/team-leader/assign-ticket/execute.sh +59 -0
  35. package/config/skills/team-leader/assign-ticket/execute.test.sh +64 -0
  36. package/config/skills/team-leader/decompose-goal/SKILL.md +4 -4
  37. package/config/skills/team-leader/delegate-task/SKILL.md +1 -1
  38. package/config/skills/team-leader/verify-output/SKILL.md +2 -2
  39. package/config/sops/developer/git-workflow.md +1 -1
  40. package/dist/backend/backend/src/constants.d.ts +359 -1
  41. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  42. package/dist/backend/backend/src/constants.js +350 -2
  43. package/dist/backend/backend/src/constants.js.map +1 -1
  44. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +27 -0
  45. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -0
  46. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +55 -0
  47. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -0
  48. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.d.ts +13 -0
  49. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.d.ts.map +1 -0
  50. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.js +19 -0
  51. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.routes.js.map +1 -0
  52. package/dist/backend/backend/src/controllers/api.controller.d.ts +0 -12
  53. package/dist/backend/backend/src/controllers/api.controller.d.ts.map +1 -1
  54. package/dist/backend/backend/src/controllers/api.controller.js +0 -44
  55. package/dist/backend/backend/src/controllers/api.controller.js.map +1 -1
  56. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +27 -5
  57. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
  58. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +55 -15
  59. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
  60. package/dist/backend/backend/src/controllers/approvals/approvals.routes.d.ts.map +1 -1
  61. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js +2 -0
  62. package/dist/backend/backend/src/controllers/approvals/approvals.routes.js.map +1 -1
  63. package/dist/backend/backend/src/controllers/expert/expert.controller.d.ts +13 -0
  64. package/dist/backend/backend/src/controllers/expert/expert.controller.d.ts.map +1 -1
  65. package/dist/backend/backend/src/controllers/expert/expert.controller.js +67 -9
  66. package/dist/backend/backend/src/controllers/expert/expert.controller.js.map +1 -1
  67. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts +41 -0
  68. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -0
  69. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +146 -0
  70. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -0
  71. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts +20 -0
  72. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.d.ts.map +1 -0
  73. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js +29 -0
  74. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.routes.js.map +1 -0
  75. package/dist/backend/backend/src/controllers/project/project.controller.d.ts +2 -2
  76. package/dist/backend/backend/src/controllers/project/project.controller.d.ts.map +1 -1
  77. package/dist/backend/backend/src/controllers/project/project.controller.js +24 -7
  78. package/dist/backend/backend/src/controllers/project/project.controller.js.map +1 -1
  79. package/dist/backend/backend/src/controllers/project/project.routes.d.ts +2 -2
  80. package/dist/backend/backend/src/controllers/project/project.routes.d.ts.map +1 -1
  81. package/dist/backend/backend/src/controllers/project/project.routes.js +3 -36
  82. package/dist/backend/backend/src/controllers/project/project.routes.js.map +1 -1
  83. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +93 -0
  84. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -0
  85. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +252 -0
  86. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -0
  87. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +34 -0
  88. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -0
  89. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +51 -0
  90. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -0
  91. package/dist/backend/backend/src/controllers/request-types.d.ts +13 -0
  92. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  93. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +49 -0
  94. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -0
  95. package/dist/backend/backend/src/controllers/standing/standing.controller.js +100 -0
  96. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -0
  97. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +38 -0
  98. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  99. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +143 -8
  100. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  101. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  102. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +6 -1
  103. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  104. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +2 -0
  105. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  106. package/dist/backend/backend/src/controllers/team/team.controller.js +26 -6
  107. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  108. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts +18 -0
  109. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
  110. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +56 -0
  111. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
  112. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts +1 -0
  113. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts.map +1 -1
  114. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js +3 -1
  115. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js.map +1 -1
  116. package/dist/backend/backend/src/controllers/types.d.ts +1 -2
  117. package/dist/backend/backend/src/controllers/types.d.ts.map +1 -1
  118. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +2 -3
  119. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  120. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +2 -3
  121. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  122. package/dist/backend/backend/src/index.d.ts.map +1 -1
  123. package/dist/backend/backend/src/index.js +100 -7
  124. package/dist/backend/backend/src/index.js.map +1 -1
  125. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +29 -0
  126. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
  127. package/dist/backend/backend/src/middleware/api-token.middleware.js +38 -0
  128. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
  129. package/dist/backend/backend/src/models/index.d.ts +0 -1
  130. package/dist/backend/backend/src/models/index.d.ts.map +1 -1
  131. package/dist/backend/backend/src/models/index.js +0 -1
  132. package/dist/backend/backend/src/models/index.js.map +1 -1
  133. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  134. package/dist/backend/backend/src/routes/api.routes.js +24 -3
  135. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  136. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts +6 -2
  137. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts.map +1 -1
  138. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js +6 -2
  139. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js.map +1 -1
  140. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +28 -1
  141. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  142. package/dist/backend/backend/src/services/agent/agent-registration.service.js +93 -34
  143. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  144. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +169 -0
  145. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -0
  146. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +231 -0
  147. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -0
  148. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +1 -1
  149. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  150. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +9 -0
  151. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  152. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +16 -0
  153. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  154. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +50 -0
  155. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  156. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts +9 -1
  157. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  158. package/dist/backend/backend/src/services/agent/tmux-command.service.js +12 -2
  159. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  160. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +9 -8
  162. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.d.ts +75 -0
  164. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.js +89 -0
  166. package/dist/backend/backend/src/services/ai/prompt-modules/active-work.module.js.map +1 -0
  167. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +3 -0
  168. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/ai/prompt-modules/index.js +3 -0
  170. package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
  171. package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js +1 -1
  172. package/dist/backend/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -1
  173. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +12 -0
  175. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  176. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +14 -0
  177. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  178. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  179. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  180. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +11 -7
  181. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  182. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts +41 -0
  183. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts.map +1 -0
  184. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.js +44 -0
  185. package/dist/backend/backend/src/services/ai/prompt-modules/session-briefing.module.js.map +1 -0
  186. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +67 -0
  187. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -0
  188. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js +146 -0
  189. package/dist/backend/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -0
  190. package/dist/backend/backend/src/services/ai/prompt-template.service.d.ts.map +1 -1
  191. package/dist/backend/backend/src/services/ai/prompt-template.service.js +9 -7
  192. package/dist/backend/backend/src/services/ai/prompt-template.service.js.map +1 -1
  193. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  194. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +7 -0
  195. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  196. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts +7 -0
  197. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -1
  198. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js +9 -1
  199. package/dist/backend/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -1
  200. package/dist/backend/backend/src/services/core/logger.service.d.ts +21 -0
  201. package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
  202. package/dist/backend/backend/src/services/core/logger.service.js +42 -4
  203. package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
  204. package/dist/backend/backend/src/services/core/storage.service.d.ts +1 -5
  205. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  206. package/dist/backend/backend/src/services/core/storage.service.js +5 -162
  207. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  208. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  209. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +15 -9
  210. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  211. package/dist/backend/backend/src/services/index.d.ts +0 -4
  212. package/dist/backend/backend/src/services/index.d.ts.map +1 -1
  213. package/dist/backend/backend/src/services/index.js +0 -4
  214. package/dist/backend/backend/src/services/index.js.map +1 -1
  215. package/dist/backend/backend/src/services/intent-task/intent-task.service.d.ts +1 -1
  216. package/dist/backend/backend/src/services/intent-task/intent-task.service.js +1 -1
  217. package/dist/backend/backend/src/services/mcp-server.d.ts +19 -6
  218. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  219. package/dist/backend/backend/src/services/mcp-server.js +46 -16
  220. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  221. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  222. package/dist/backend/backend/src/services/mcp-tool-definitions.js +3 -2
  223. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  224. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +247 -0
  225. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -0
  226. package/dist/backend/backend/src/services/memory/standing-answers.service.js +534 -0
  227. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -0
  228. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts +104 -0
  229. package/dist/backend/backend/src/services/memory/standing-refresh.service.d.ts.map +1 -0
  230. package/dist/backend/backend/src/services/memory/standing-refresh.service.js +218 -0
  231. package/dist/backend/backend/src/services/memory/standing-refresh.service.js.map +1 -0
  232. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +35 -0
  233. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  234. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +99 -1
  235. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  236. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.d.ts +75 -0
  237. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.d.ts.map +1 -0
  238. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.js +80 -0
  239. package/dist/backend/backend/src/services/monitoring/agent-attention-registry.js.map +1 -0
  240. package/dist/backend/backend/src/services/monitoring/agent-attention.d.ts +114 -0
  241. package/dist/backend/backend/src/services/monitoring/agent-attention.d.ts.map +1 -0
  242. package/dist/backend/backend/src/services/monitoring/agent-attention.js +165 -0
  243. package/dist/backend/backend/src/services/monitoring/agent-attention.js.map +1 -0
  244. package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts +76 -0
  245. package/dist/backend/backend/src/services/monitoring/agent-hook-state.d.ts.map +1 -0
  246. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js +96 -0
  247. package/dist/backend/backend/src/services/monitoring/agent-hook-state.js.map +1 -0
  248. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +1 -1
  249. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.d.ts +1 -1
  250. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.d.ts.map +1 -1
  251. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.js +13 -3
  252. package/dist/backend/backend/src/services/orchestrator/onboarding/recommend-team.js.map +1 -1
  253. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.d.ts.map +1 -1
  254. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js +0 -4
  255. package/dist/backend/backend/src/services/orchestrator/prompts/onboarding-mode.prompt.js.map +1 -1
  256. package/dist/backend/backend/src/services/project/project-search.service.d.ts +22 -16
  257. package/dist/backend/backend/src/services/project/project-search.service.d.ts.map +1 -1
  258. package/dist/backend/backend/src/services/project/project-search.service.js +30 -53
  259. package/dist/backend/backend/src/services/project/project-search.service.js.map +1 -1
  260. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +381 -0
  261. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -0
  262. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +839 -0
  263. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -0
  264. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +214 -0
  265. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -0
  266. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +466 -0
  267. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -0
  268. package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts +121 -0
  269. package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -0
  270. package/dist/backend/backend/src/services/project-tickets/ticket-file.js +468 -0
  271. package/dist/backend/backend/src/services/project-tickets/ticket-file.js.map +1 -0
  272. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.d.ts +69 -0
  273. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.d.ts.map +1 -0
  274. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.js +194 -0
  275. package/dist/backend/backend/src/services/project-tickets/ticket-folder-lock.js.map +1 -0
  276. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.d.ts +47 -0
  277. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.d.ts.map +1 -0
  278. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.js +83 -0
  279. package/dist/backend/backend/src/services/project-tickets/ticket-tracking.js.map +1 -0
  280. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.d.ts +97 -0
  281. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.d.ts.map +1 -0
  282. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.js +201 -0
  283. package/dist/backend/backend/src/services/project-tickets/v1-task-migration.js.map +1 -0
  284. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +86 -22
  285. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  286. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +173 -28
  287. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  288. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +19 -1
  289. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  290. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +33 -4
  291. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  292. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +24 -12
  293. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  294. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +87 -19
  295. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  296. package/dist/backend/backend/src/services/runtime-adapter.d.ts +1 -1
  297. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
  298. package/dist/backend/backend/src/services/runtime-adapter.js +5 -9
  299. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
  300. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts +26 -1
  301. package/dist/backend/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  302. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +33 -2
  303. package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  304. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +5 -0
  305. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  306. package/dist/backend/backend/src/services/session/pty/pty-session.js +8 -1
  307. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  308. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts +18 -0
  309. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  310. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js +23 -0
  311. package/dist/backend/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  312. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts +8 -0
  313. package/dist/backend/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/session/session-backend.interface.js.map +1 -1
  315. package/dist/backend/backend/src/services/session/session-command-helper.d.ts +12 -2
  316. package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  317. package/dist/backend/backend/src/services/session/session-command-helper.js +14 -2
  318. package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
  319. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts +239 -0
  320. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts.map +1 -0
  321. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js +395 -0
  322. package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js.map +1 -0
  323. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.d.ts +53 -0
  324. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.d.ts.map +1 -0
  325. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.js +83 -0
  326. package/dist/backend/backend/src/services/task-pool/give-up/give-up-stats.js.map +1 -0
  327. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.d.ts +93 -0
  328. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.d.ts.map +1 -0
  329. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.js +244 -0
  330. package/dist/backend/backend/src/services/task-pool/give-up/stop-classifier.js.map +1 -0
  331. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +145 -19
  332. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  333. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +321 -53
  334. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  335. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  336. package/dist/backend/backend/src/services/template/template.service.js +11 -6
  337. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  338. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +21 -4
  339. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  340. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +53 -3
  341. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  342. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts +85 -6
  343. package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  344. package/dist/backend/backend/src/services/v3/escalation-router.service.js +188 -9
  345. package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
  346. package/dist/backend/backend/src/services/v3/escalation.service.js +1 -1
  347. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  348. package/dist/backend/backend/src/services/v3/mission-executor.service.js +2 -2
  349. package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
  350. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts +184 -0
  351. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.d.ts.map +1 -0
  352. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js +420 -0
  353. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-data.js.map +1 -0
  354. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts +61 -0
  355. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.d.ts.map +1 -0
  356. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js +100 -0
  357. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.boot.js.map +1 -0
  358. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts +36 -0
  359. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.d.ts.map +1 -0
  360. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js +239 -0
  361. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.renderer.js.map +1 -0
  362. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +152 -0
  363. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -0
  364. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +209 -0
  365. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -0
  366. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +194 -0
  367. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -0
  368. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js +85 -0
  369. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -0
  370. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +6 -4
  371. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  372. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +15 -6
  373. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  374. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.d.ts.map +1 -1
  375. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js +14 -5
  376. package/dist/backend/backend/src/services/v3/request-status-update.subscriber.js.map +1 -1
  377. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  378. package/dist/backend/backend/src/services/v3/request.service.js +2 -0
  379. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  380. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.d.ts +82 -0
  381. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.d.ts.map +1 -0
  382. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.js +172 -0
  383. package/dist/backend/backend/src/services/v3/ticket-ask-classifier.js.map +1 -0
  384. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  385. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +2 -0
  386. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  387. package/dist/backend/backend/src/services/v3/ticket-intake-log.d.ts +87 -0
  388. package/dist/backend/backend/src/services/v3/ticket-intake-log.d.ts.map +1 -0
  389. package/dist/backend/backend/src/services/v3/ticket-intake-log.js +116 -0
  390. package/dist/backend/backend/src/services/v3/ticket-intake-log.js.map +1 -0
  391. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +133 -15
  392. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  393. package/dist/backend/backend/src/services/v3/ticket-intake.service.js +263 -45
  394. package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  395. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts +3 -1
  396. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  397. package/dist/backend/backend/src/services/v3/ticket-review.service.js +6 -2
  398. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  399. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  400. package/dist/backend/backend/src/services/v3/v3-data.service.js +9 -3
  401. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  402. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +41 -1
  403. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  404. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +51 -2
  405. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  406. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +13 -5
  407. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +10 -9
  409. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -1
  410. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts +241 -0
  411. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.d.ts.map +1 -0
  412. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js +511 -0
  413. package/dist/backend/backend/src/services/worktree/workitem-worktree.service.js.map +1 -0
  414. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts +70 -0
  415. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -0
  416. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +121 -0
  417. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -0
  418. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts +260 -0
  419. package/dist/backend/backend/src/services/worktree/worktree-git.d.ts.map +1 -0
  420. package/dist/backend/backend/src/services/worktree/worktree-git.js +569 -0
  421. package/dist/backend/backend/src/services/worktree/worktree-git.js.map +1 -0
  422. package/dist/backend/backend/src/types/event-bus.types.d.ts +1 -1
  423. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  424. package/dist/backend/backend/src/types/event-bus.types.js +8 -0
  425. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  426. package/dist/backend/backend/src/types/index.d.ts +23 -18
  427. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  428. package/dist/backend/backend/src/types/index.js.map +1 -1
  429. package/dist/backend/backend/src/types/intent-task.types.d.ts +1 -1
  430. package/dist/backend/backend/src/types/intent-task.types.d.ts.map +1 -1
  431. package/dist/backend/backend/src/types/project-ticket.types.d.ts +132 -0
  432. package/dist/backend/backend/src/types/project-ticket.types.d.ts.map +1 -0
  433. package/dist/backend/backend/src/types/project-ticket.types.js +120 -0
  434. package/dist/backend/backend/src/types/project-ticket.types.js.map +1 -0
  435. package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
  436. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
  437. package/dist/backend/backend/src/types/review-reason.types.js +1 -0
  438. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
  439. package/dist/backend/backend/src/types/v2/index.d.ts +2 -2
  440. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  441. package/dist/backend/backend/src/types/v2/index.js +1 -1
  442. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  443. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts +7 -0
  444. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  445. package/dist/backend/backend/src/types/v2/reconcile.types.js.map +1 -1
  446. package/dist/backend/backend/src/types/v2/request.types.d.ts +18 -0
  447. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  448. package/dist/backend/backend/src/types/v2/request.types.js +1 -0
  449. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  450. package/dist/backend/backend/src/types/v2/ticket.types.d.ts +6 -2
  451. package/dist/backend/backend/src/types/v2/ticket.types.d.ts.map +1 -1
  452. package/dist/backend/backend/src/types/v2/ticket.types.js +1 -1
  453. package/dist/backend/backend/src/types/v2/ticket.types.js.map +1 -1
  454. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +169 -14
  455. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  456. package/dist/backend/backend/src/types/v2/work-item.types.js +263 -44
  457. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  458. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +33 -0
  459. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  460. package/dist/backend/backend/src/utils/agent-caller.utils.js +37 -0
  461. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  462. package/dist/backend/backend/src/utils/secret-env.d.ts +61 -0
  463. package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -0
  464. package/dist/backend/backend/src/utils/secret-env.js +89 -0
  465. package/dist/backend/backend/src/utils/secret-env.js.map +1 -0
  466. package/dist/backend/build-info.json +2 -2
  467. package/dist/backend/config/constants.d.ts +71 -0
  468. package/dist/backend/config/constants.d.ts.map +1 -1
  469. package/dist/backend/config/constants.js +77 -0
  470. package/dist/backend/config/constants.js.map +1 -1
  471. package/dist/cli/backend/src/constants.d.ts +359 -1
  472. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  473. package/dist/cli/backend/src/constants.js +350 -2
  474. package/dist/cli/backend/src/constants.js.map +1 -1
  475. package/dist/cli/backend/src/models/index.d.ts +0 -1
  476. package/dist/cli/backend/src/models/index.d.ts.map +1 -1
  477. package/dist/cli/backend/src/models/index.js +0 -1
  478. package/dist/cli/backend/src/models/index.js.map +1 -1
  479. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +28 -1
  480. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  481. package/dist/cli/backend/src/services/agent/agent-registration.service.js +93 -34
  482. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  483. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +169 -0
  484. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -0
  485. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +231 -0
  486. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -0
  487. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +16 -0
  488. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  489. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +50 -0
  490. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  491. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  492. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +9 -8
  493. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  494. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.d.ts +75 -0
  495. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.d.ts.map +1 -0
  496. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.js +89 -0
  497. package/dist/cli/backend/src/services/ai/prompt-modules/active-work.module.js.map +1 -0
  498. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js +1 -1
  499. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -1
  500. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  501. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +12 -0
  502. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  503. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +14 -0
  504. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  505. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  506. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  507. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +11 -7
  508. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  509. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts +41 -0
  510. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.d.ts.map +1 -0
  511. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.js +44 -0
  512. package/dist/cli/backend/src/services/ai/prompt-modules/session-briefing.module.js.map +1 -0
  513. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts +67 -0
  514. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.d.ts.map +1 -0
  515. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js +146 -0
  516. package/dist/cli/backend/src/services/ai/prompt-modules/standing-answers.module.js.map +1 -0
  517. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts +7 -0
  518. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.d.ts.map +1 -1
  519. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js +9 -1
  520. package/dist/cli/backend/src/services/continuation/patterns/waiting-patterns.js.map +1 -1
  521. package/dist/cli/backend/src/services/core/logger.service.d.ts +21 -0
  522. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
  523. package/dist/cli/backend/src/services/core/logger.service.js +42 -4
  524. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
  525. package/dist/cli/backend/src/services/core/storage.service.d.ts +1 -5
  526. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  527. package/dist/cli/backend/src/services/core/storage.service.js +5 -162
  528. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  529. package/dist/cli/backend/src/services/mcp-server.d.ts +19 -6
  530. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  531. package/dist/cli/backend/src/services/mcp-server.js +46 -16
  532. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  533. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -1
  534. package/dist/cli/backend/src/services/mcp-tool-definitions.js +3 -2
  535. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  536. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +247 -0
  537. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -0
  538. package/dist/cli/backend/src/services/memory/standing-answers.service.js +534 -0
  539. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -0
  540. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +35 -0
  541. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  542. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +99 -1
  543. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  544. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.d.ts +75 -0
  545. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.d.ts.map +1 -0
  546. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.js +80 -0
  547. package/dist/cli/backend/src/services/monitoring/agent-attention-registry.js.map +1 -0
  548. package/dist/cli/backend/src/services/monitoring/agent-attention.d.ts +114 -0
  549. package/dist/cli/backend/src/services/monitoring/agent-attention.d.ts.map +1 -0
  550. package/dist/cli/backend/src/services/monitoring/agent-attention.js +165 -0
  551. package/dist/cli/backend/src/services/monitoring/agent-attention.js.map +1 -0
  552. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +214 -0
  553. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -0
  554. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +466 -0
  555. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -0
  556. package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts +121 -0
  557. package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -0
  558. package/dist/cli/backend/src/services/project-tickets/ticket-file.js +468 -0
  559. package/dist/cli/backend/src/services/project-tickets/ticket-file.js.map +1 -0
  560. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.d.ts +69 -0
  561. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.d.ts.map +1 -0
  562. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.js +194 -0
  563. package/dist/cli/backend/src/services/project-tickets/ticket-folder-lock.js.map +1 -0
  564. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.d.ts +47 -0
  565. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.d.ts.map +1 -0
  566. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.js +83 -0
  567. package/dist/cli/backend/src/services/project-tickets/ticket-tracking.js.map +1 -0
  568. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.d.ts +97 -0
  569. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.d.ts.map +1 -0
  570. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.js +201 -0
  571. package/dist/cli/backend/src/services/project-tickets/v1-task-migration.js.map +1 -0
  572. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +26 -1
  573. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -1
  574. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +33 -2
  575. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
  576. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +5 -0
  577. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  578. package/dist/cli/backend/src/services/session/pty/pty-session.js +8 -1
  579. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  580. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +18 -0
  581. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -1
  582. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +23 -0
  583. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -1
  584. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +8 -0
  585. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -1
  586. package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -1
  587. package/dist/cli/backend/src/services/session/session-command-helper.d.ts +12 -2
  588. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -1
  589. package/dist/cli/backend/src/services/session/session-command-helper.js +14 -2
  590. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -1
  591. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +145 -19
  592. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  593. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +321 -53
  594. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  595. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
  596. package/dist/cli/backend/src/services/template/template.service.js +11 -6
  597. package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
  598. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts +85 -6
  599. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
  600. package/dist/cli/backend/src/services/v3/escalation-router.service.js +188 -9
  601. package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -1
  602. package/dist/cli/backend/src/services/v3/mission-executor.service.js +2 -2
  603. package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
  604. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts +6 -4
  605. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  606. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js +15 -6
  607. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  608. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  609. package/dist/cli/backend/src/services/v3/request.service.js +2 -0
  610. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  611. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.d.ts +82 -0
  612. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.d.ts.map +1 -0
  613. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.js +172 -0
  614. package/dist/cli/backend/src/services/v3/ticket-ask-classifier.js.map +1 -0
  615. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -1
  616. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +2 -0
  617. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  618. package/dist/cli/backend/src/services/v3/ticket-intake-log.d.ts +87 -0
  619. package/dist/cli/backend/src/services/v3/ticket-intake-log.d.ts.map +1 -0
  620. package/dist/cli/backend/src/services/v3/ticket-intake-log.js +116 -0
  621. package/dist/cli/backend/src/services/v3/ticket-intake-log.js.map +1 -0
  622. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +133 -15
  623. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -1
  624. package/dist/cli/backend/src/services/v3/ticket-intake.service.js +263 -45
  625. package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -1
  626. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts +3 -1
  627. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  628. package/dist/cli/backend/src/services/v3/ticket-review.service.js +6 -2
  629. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  630. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  631. package/dist/cli/backend/src/services/v3/v3-data.service.js +9 -3
  632. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  633. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts +260 -0
  634. package/dist/cli/backend/src/services/worktree/worktree-git.d.ts.map +1 -0
  635. package/dist/cli/backend/src/services/worktree/worktree-git.js +569 -0
  636. package/dist/cli/backend/src/services/worktree/worktree-git.js.map +1 -0
  637. package/dist/cli/backend/src/types/event-bus.types.d.ts +1 -1
  638. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  639. package/dist/cli/backend/src/types/event-bus.types.js +8 -0
  640. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  641. package/dist/cli/backend/src/types/index.d.ts +23 -18
  642. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  643. package/dist/cli/backend/src/types/index.js.map +1 -1
  644. package/dist/cli/backend/src/types/intent-task.types.d.ts +1 -1
  645. package/dist/cli/backend/src/types/intent-task.types.d.ts.map +1 -1
  646. package/dist/cli/backend/src/types/project-ticket.types.d.ts +132 -0
  647. package/dist/cli/backend/src/types/project-ticket.types.d.ts.map +1 -0
  648. package/dist/cli/backend/src/types/project-ticket.types.js +120 -0
  649. package/dist/cli/backend/src/types/project-ticket.types.js.map +1 -0
  650. package/dist/cli/backend/src/types/v2/index.d.ts +2 -2
  651. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  652. package/dist/cli/backend/src/types/v2/index.js +1 -1
  653. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  654. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +7 -0
  655. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  656. package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -1
  657. package/dist/cli/backend/src/types/v2/request.types.d.ts +18 -0
  658. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  659. package/dist/cli/backend/src/types/v2/request.types.js +1 -0
  660. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  661. package/dist/cli/backend/src/types/v2/ticket.types.d.ts +6 -2
  662. package/dist/cli/backend/src/types/v2/ticket.types.d.ts.map +1 -1
  663. package/dist/cli/backend/src/types/v2/ticket.types.js +1 -1
  664. package/dist/cli/backend/src/types/v2/ticket.types.js.map +1 -1
  665. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +169 -14
  666. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  667. package/dist/cli/backend/src/types/v2/work-item.types.js +263 -44
  668. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  669. package/dist/cli/backend/src/utils/secret-env.d.ts +61 -0
  670. package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -0
  671. package/dist/cli/backend/src/utils/secret-env.js +89 -0
  672. package/dist/cli/backend/src/utils/secret-env.js.map +1 -0
  673. package/dist/cli/cli/src/commands/onboard.d.ts +1 -1
  674. package/dist/cli/cli/src/commands/onboard.js +3 -3
  675. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  676. package/dist/cli/cli/src/commands/publish.d.ts.map +1 -1
  677. package/dist/cli/cli/src/commands/publish.js +4 -5
  678. package/dist/cli/cli/src/commands/publish.js.map +1 -1
  679. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  680. package/dist/cli/cli/src/commands/service.js +5 -2
  681. package/dist/cli/cli/src/commands/service.js.map +1 -1
  682. package/dist/cli/cli/src/commands/tickets.d.ts +60 -0
  683. package/dist/cli/cli/src/commands/tickets.d.ts.map +1 -0
  684. package/dist/cli/cli/src/commands/tickets.js +111 -0
  685. package/dist/cli/cli/src/commands/tickets.js.map +1 -0
  686. package/dist/cli/cli/src/index.js +12 -0
  687. package/dist/cli/cli/src/index.js.map +1 -1
  688. package/dist/cli/cli/src/utils/archive-creator.d.ts +7 -3
  689. package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -1
  690. package/dist/cli/cli/src/utils/archive-creator.js +17 -5
  691. package/dist/cli/cli/src/utils/archive-creator.js.map +1 -1
  692. package/dist/cli/cli/src/utils/cloud-submit.d.ts +1 -1
  693. package/dist/cli/cli/src/utils/cloud-submit.js +1 -1
  694. package/dist/cli/cli/src/utils/gh-submit.d.ts +10 -1
  695. package/dist/cli/cli/src/utils/gh-submit.d.ts.map +1 -1
  696. package/dist/cli/cli/src/utils/gh-submit.js +20 -4
  697. package/dist/cli/cli/src/utils/gh-submit.js.map +1 -1
  698. package/dist/cli/cli/src/utils/package-validator.d.ts +29 -6
  699. package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -1
  700. package/dist/cli/cli/src/utils/package-validator.js +88 -36
  701. package/dist/cli/cli/src/utils/package-validator.js.map +1 -1
  702. package/dist/cli/config/constants.d.ts +71 -0
  703. package/dist/cli/config/constants.d.ts.map +1 -1
  704. package/dist/cli/config/constants.js +77 -0
  705. package/dist/cli/config/constants.js.map +1 -1
  706. package/dist/cli/config/skills/marketplace-registry.d.ts +143 -0
  707. package/dist/cli/config/skills/marketplace-registry.d.ts.map +1 -0
  708. package/dist/cli/config/skills/marketplace-registry.js +192 -0
  709. package/dist/cli/config/skills/marketplace-registry.js.map +1 -0
  710. package/frontend/dist/assets/index-8d4b3ad2.js +4951 -0
  711. package/frontend/dist/assets/index-b6aded4c.css +42 -0
  712. package/frontend/dist/index.html +2 -2
  713. package/package.json +1 -1
  714. package/config/task_starters/build_e2e_test_plan_prompt.json +0 -51
  715. package/config/task_starters/build_tasks_prompt.json +0 -55
  716. package/config/task_starters/prompts/build_tasks_step1_milestone_structure.md +0 -274
  717. package/config/task_starters/prompts/e2e_test_plan_step1_build_tests.md +0 -391
  718. package/config/task_starters/prompts/e2e_test_plan_step2_run_tests.md +0 -240
  719. package/config/templates/customer-loyalty-team.json +0 -44
  720. package/config/templates/dtc-viral-content-team.json +0 -58
  721. package/config/templates/expert-innovation-team.json +0 -60
  722. package/config/templates/pragmatic-mvp-dev-team.json +0 -58
  723. package/config/templates/pro-sops/norms/content-production-pipeline.md +0 -39
  724. package/config/templates/pro-sops/norms/customer-onboarding-sop.md +0 -40
  725. package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts +0 -13
  726. package/dist/backend/backend/src/controllers/task-management/tickets.controller.d.ts.map +0 -1
  727. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js +0 -214
  728. package/dist/backend/backend/src/controllers/task-management/tickets.controller.js.map +0 -1
  729. package/dist/backend/backend/src/models/Ticket.d.ts +0 -24
  730. package/dist/backend/backend/src/models/Ticket.d.ts.map +0 -1
  731. package/dist/backend/backend/src/models/Ticket.js +0 -102
  732. package/dist/backend/backend/src/models/Ticket.js.map +0 -1
  733. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +0 -134
  734. package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +0 -1
  735. package/dist/backend/backend/src/services/agent/task-planning.service.js +0 -291
  736. package/dist/backend/backend/src/services/agent/task-planning.service.js.map +0 -1
  737. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts +0 -71
  738. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.d.ts.map +0 -1
  739. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js +0 -304
  740. package/dist/backend/backend/src/services/monitoring/task-assignment-monitor.service.js.map +0 -1
  741. package/dist/backend/backend/src/services/project/task-folder.service.d.ts +0 -48
  742. package/dist/backend/backend/src/services/project/task-folder.service.d.ts.map +0 -1
  743. package/dist/backend/backend/src/services/project/task-folder.service.js +0 -193
  744. package/dist/backend/backend/src/services/project/task-folder.service.js.map +0 -1
  745. package/dist/backend/backend/src/services/project/task.service.d.ts +0 -47
  746. package/dist/backend/backend/src/services/project/task.service.d.ts.map +0 -1
  747. package/dist/backend/backend/src/services/project/task.service.js +0 -253
  748. package/dist/backend/backend/src/services/project/task.service.js.map +0 -1
  749. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts +0 -130
  750. package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +0 -1
  751. package/dist/backend/backend/src/services/project/ticket-editor.service.js +0 -406
  752. package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +0 -1
  753. package/dist/cli/backend/src/models/Ticket.d.ts +0 -24
  754. package/dist/cli/backend/src/models/Ticket.d.ts.map +0 -1
  755. package/dist/cli/backend/src/models/Ticket.js +0 -102
  756. package/dist/cli/backend/src/models/Ticket.js.map +0 -1
  757. package/frontend/dist/assets/index-2bdb57b9.css +0 -42
  758. package/frontend/dist/assets/index-54f1061c.js +0 -4963
@@ -13,7 +13,7 @@ import { ClaimService } from './claim.service.js';
13
13
  import { LoggerService } from '../core/logger.service.js';
14
14
  import { formatError } from '../../utils/format-error.js';
15
15
  import { TeamBudgetExceededError, } from '../budget/team-budget-gate.service.js';
16
- import { isWorkItem, isValidWorkItemTransition, isTransitionPermitted, LAST_REQUEUED_AT_METADATA_KEY, DISPOSITION_METADATA_KEY, DISPOSITION_REQUIRED_STATUSES, getWorkItemDisposition, WORK_ITEM_BLOCK_SOURCES, isExplicitlyBlocked, } from '../../types/v2/work-item.types.js';
16
+ import { isWorkItem, isValidWorkItemTransition, checkTransitionPermission, normalizeTransitionActor, describeTransitionActor, getWorkItemReviewer, ForbiddenTransitionError, VERDICT_TRANSITIONS, WORK_ITEM_REVIEWER_KEY, LAST_REQUEUED_AT_METADATA_KEY, DISPOSITION_METADATA_KEY, DISPOSITION_REQUIRED_STATUSES, getWorkItemDisposition, WORK_ITEM_BLOCK_SOURCES, isExplicitlyBlocked, TERMINAL_WORK_ITEM_STATUSES, } from '../../types/v2/work-item.types.js';
17
17
  import { createTaskClaim, } from '../../types/v2/claim.types.js';
18
18
  import { orderForAgent } from './ticket-claim-policy.js';
19
19
  import { SUPERSEDED_BY_METADATA_KEY } from '../v3/request-completion.js';
@@ -144,6 +144,37 @@ export class TaskPoolService {
144
144
  setEventBusService(bus) {
145
145
  this.eventBus = bus;
146
146
  }
147
+ /**
148
+ * Listeners told after a WorkItem is newly claimed (not for an
149
+ * already-held claim). There is no claim event on the bus; the claim sites
150
+ * are the HTTP controller, AgentAutoClaim and the boot path, so the hook
151
+ * lives here. Listeners run fire-and-forget: a slow or failing listener
152
+ * never delays or fails the claim. Used by the per-WorkItem worktree
153
+ * service (#814).
154
+ */
155
+ claimListeners = [];
156
+ /**
157
+ * Register a claim listener (see {@link claimListeners}).
158
+ *
159
+ * @param listener - Called with the claimed WorkItem and the claiming agent
160
+ * @returns Unsubscribe function
161
+ */
162
+ onClaimed(listener) {
163
+ this.claimListeners.push(listener);
164
+ return () => {
165
+ this.claimListeners = this.claimListeners.filter((l) => l !== listener);
166
+ };
167
+ }
168
+ /** Fire claim listeners without awaiting them; errors are logged, never thrown. */
169
+ notifyClaimed(workItem, agentId) {
170
+ for (const listener of this.claimListeners) {
171
+ Promise.resolve()
172
+ .then(() => listener(workItem, agentId))
173
+ .catch((err) => {
174
+ this.logger.warn('Claim listener failed (non-fatal)', { workItemId: workItem.id, error: formatError(err) });
175
+ });
176
+ }
177
+ }
147
178
  /**
148
179
  * Wire the Request-linker reference used by {@link addToPool} to
149
180
  * intrinsically link the new WI into its parent `Request.workItemIds[]`
@@ -897,6 +928,7 @@ export class TaskPoolService {
897
928
  title: selected.title,
898
929
  });
899
930
  await this.noteTicketSelfClaim(claimedItem, agentId);
931
+ this.notifyClaimed(claimedItem, agentId);
900
932
  return {
901
933
  workItem: claimedItem,
902
934
  claim,
@@ -980,6 +1012,7 @@ export class TaskPoolService {
980
1012
  await this.storage.flush();
981
1013
  this.logger.info('WorkItem claimed (specific)', { workItemId, agentId, claimId: claim.id });
982
1014
  await this.noteTicketSelfClaim(claimedItem, agentId);
1015
+ this.notifyClaimed(claimedItem, agentId);
983
1016
  return { workItem: claimedItem, claim };
984
1017
  });
985
1018
  }
@@ -1094,6 +1127,9 @@ export class TaskPoolService {
1094
1127
  * `done_by_worker` and wake the TL for sign-off.
1095
1128
  * - All other types (`cron_run`, `notify`, `reconcile`, `check`,
1096
1129
  * `confirm`, `review`, ...) default to simple completion (`done`).
1130
+ * - Bridge-auto maintenance items (`metadata.autoCreated`) and
1131
+ * trigger-fired check-ins (`triggerId`) complete as `done` too —
1132
+ * nothing reviews them (#813).
1097
1133
  *
1098
1134
  * The default is overridable via `wi.metadata.requiresVerification`:
1099
1135
  * - `true` — force verification path even for non-delegate types
@@ -1110,6 +1146,17 @@ export class TaskPoolService {
1110
1146
  return true;
1111
1147
  if (metaFlag === false)
1112
1148
  return false;
1149
+ // #813: bridge-auto maintenance items get no review item (the bridge
1150
+ // re-scans on its own tick), so parking them in done_by_worker only
1151
+ // stranded them until the TTL auto-verified them. Complete them as done.
1152
+ if (wi.metadata?.['autoCreated'] === true)
1153
+ return false;
1154
+ // #813: a trigger-fired item (schedule-followup / watch-for-event) is a
1155
+ // check-in the agent set for itself, created as `delegate` by default.
1156
+ // Nothing reviewed them — 123 of 293 verified items in the live pool on
1157
+ // 2026-09-26 were these, verified with no review item. Complete as done.
1158
+ if (wi.triggerId)
1159
+ return false;
1113
1160
  return wi.type === 'delegate';
1114
1161
  }
1115
1162
  /**
@@ -1264,6 +1311,11 @@ export class TaskPoolService {
1264
1311
  * the actor is not permitted to perform `running → done`.
1265
1312
  */
1266
1313
  async completeSimpleItem(workItemId, actorRole, result) {
1314
+ // #813: completing a review item renders a verdict on its source. Check
1315
+ // that this caller may render it BEFORE the review item itself is marked
1316
+ // done — otherwise a refused verdict leaves a "done" review and a source
1317
+ // that nobody reviewed.
1318
+ const verdictPlan = await this.planReviewVerdict(workItemId, actorRole, result);
1267
1319
  await this.releaseClaim(workItemId, 'completed');
1268
1320
  const updated = await this.transitionStatus(workItemId, 'done', actorRole, (wi) => {
1269
1321
  if (result)
@@ -1282,40 +1334,26 @@ export class TaskPoolService {
1282
1334
  //
1283
1335
  // When a verify WI completes (metadata.verifyOf points at its source),
1284
1336
  // propagate the verdict to the source via verifyItem so the source
1285
- // moves done_by_worker → verified AND its own dependents unblock. Use
1286
- // the 'system' actor — this is automatic propagation, not a fresh
1287
- // TL action (the TL action was completing this verify WI).
1288
- const verifyOf = updated?.metadata && typeof updated.metadata.verifyOf === 'string'
1289
- ? updated.metadata.verifyOf
1290
- : undefined;
1291
- if (verifyOf) {
1337
+ // moves done_by_worker → verified AND its own dependents unblock.
1338
+ // #813: the verdict is rendered AS THE CALLER who completed the review
1339
+ // item (it used to be 'system', which let anyone's completion certify
1340
+ // the source). {@link planReviewVerdict} already checked the caller.
1341
+ if (verdictPlan) {
1292
1342
  try {
1293
- const source = await this.storage.findWorkItem(verifyOf);
1294
- if (source && source.status === 'done_by_worker') {
1295
- // Ticket loop Phase 3: a reviewer can send work back by completing
1296
- // the review with `verdict: 'rejected'` (+ feedback). Before this,
1297
- // completing a review always meant "verified" and the bridge's
1298
- // retry path was unreachable from a reviewer.
1299
- const rejected = result?.verdict === 'rejected';
1300
- const feedback = typeof result?.feedback === 'string' && result.feedback.trim()
1301
- ? result.feedback.trim()
1302
- : typeof result?.summary === 'string'
1303
- ? result.summary
1304
- : undefined;
1305
- await this.verifyItem(verifyOf, 'system', rejected ? 'rejected' : 'verified', rejected ? feedback : undefined);
1306
- this.logger.info('Verify WI complete → propagated to source', {
1307
- verifyWorkItemId: workItemId,
1308
- sourceWorkItemId: verifyOf,
1309
- verdict: rejected ? 'rejected' : 'verified',
1310
- });
1311
- }
1343
+ await this.verifyItem(verdictPlan.sourceId, verdictPlan.reviewer, verdictPlan.verdict, verdictPlan.verdict === 'rejected' ? verdictPlan.feedback : undefined);
1344
+ this.logger.info('Verify WI complete → propagated to source', {
1345
+ verifyWorkItemId: workItemId,
1346
+ sourceWorkItemId: verdictPlan.sourceId,
1347
+ verdict: verdictPlan.verdict,
1348
+ reviewer: describeTransitionActor(verdictPlan.reviewer),
1349
+ });
1312
1350
  }
1313
1351
  catch (err) {
1314
1352
  // Propagation is best-effort — a failed propagate must NOT roll
1315
1353
  // back the verify WI's own completion.
1316
1354
  this.logger.warn('Verify-to-source propagation failed (non-fatal)', {
1317
1355
  verifyWorkItemId: workItemId,
1318
- sourceWorkItemId: verifyOf,
1356
+ sourceWorkItemId: verdictPlan.sourceId,
1319
1357
  error: err instanceof Error ? err.message : String(err),
1320
1358
  });
1321
1359
  }
@@ -1331,6 +1369,130 @@ export class TaskPoolService {
1331
1369
  }
1332
1370
  return updated;
1333
1371
  }
1372
+ /**
1373
+ * The verdict a review item's completion would render on its source, after
1374
+ * checking that the completing caller may render it (#813).
1375
+ *
1376
+ * A review item carries `metadata.verifyOf` = the source WorkItem id. The
1377
+ * caller completes the review as its assignee (`agent` role) or as the
1378
+ * orchestrator; on the source it acts as the REVIEWER, so the verdict is
1379
+ * checked as `team_lead`/`orchestrator` with the caller's session — the
1380
+ * reviewer rule then decides by identity, not by the claimed role.
1381
+ *
1382
+ * @param workItemId - The item being completed
1383
+ * @param actorInput - The caller completing it
1384
+ * @param result - The completion result (`verdict: 'rejected'` sends it back)
1385
+ * @returns The planned verdict, or null when this item reviews nothing that
1386
+ * is still awaiting review
1387
+ * @throws ForbiddenTransitionError when the caller may not render the verdict
1388
+ */
1389
+ async planReviewVerdict(workItemId, actorInput, result) {
1390
+ const reviewItem = await this.storage.findWorkItem(workItemId);
1391
+ const verifyOf = reviewItem?.metadata && typeof reviewItem.metadata.verifyOf === 'string'
1392
+ ? reviewItem.metadata.verifyOf
1393
+ : undefined;
1394
+ if (!verifyOf)
1395
+ return null;
1396
+ const source = await this.storage.findWorkItem(verifyOf);
1397
+ if (!source || source.status !== 'done_by_worker')
1398
+ return null;
1399
+ // Ticket loop Phase 3: a reviewer can send work back by completing the
1400
+ // review with `verdict: 'rejected'` (+ feedback).
1401
+ const verdict = result?.verdict === 'rejected' ? 'rejected' : 'verified';
1402
+ const feedback = typeof result?.feedback === 'string' && result.feedback.trim()
1403
+ ? result.feedback.trim()
1404
+ : typeof result?.summary === 'string'
1405
+ ? result.summary
1406
+ : undefined;
1407
+ const reviewer = TaskPoolService.reviewerActorFor(actorInput);
1408
+ // The review item's assignee is the reviewer of record for its source.
1409
+ await this.assertTransitionPermitted(source, verdict, reviewer, reviewItem?.target);
1410
+ // Persist the reviewer of record so the verdict below (and any later
1411
+ // audit) sees the same identity this check just accepted.
1412
+ if (reviewItem?.target && !getWorkItemReviewer(source)) {
1413
+ await this.storage.updateWorkItem(verifyOf, (wi) => {
1414
+ wi.metadata = { ...(wi.metadata ?? {}), [WORK_ITEM_REVIEWER_KEY]: reviewItem.target };
1415
+ });
1416
+ }
1417
+ return { sourceId: verifyOf, verdict, reviewer, ...(feedback ? { feedback } : {}) };
1418
+ }
1419
+ /**
1420
+ * Map the caller of a review item's completion to the actor that renders
1421
+ * the verdict on the source. `agent` → `team_lead` (it is reviewing, not
1422
+ * working); every other role is kept. A missing actor stays missing, so it
1423
+ * is refused.
1424
+ *
1425
+ * @param actorInput - The completing caller
1426
+ * @returns The reviewer actor (or undefined → refused by the gate)
1427
+ */
1428
+ static reviewerActorFor(actorInput) {
1429
+ const actor = normalizeTransitionActor(actorInput);
1430
+ if (!actor)
1431
+ return actorInput;
1432
+ return {
1433
+ ...actor,
1434
+ role: actor.role === 'agent' ? 'team_lead' : actor.role,
1435
+ via: actor.via ?? 'review-item-completion',
1436
+ };
1437
+ }
1438
+ /**
1439
+ * Run the closed permission gate for one transition and throw on refusal.
1440
+ *
1441
+ * For the verdict edges, an item that predates reviewer stamping gets its
1442
+ * reviewer from its review item (`<id>:verify:<id>`, targeted at the
1443
+ * reviewer when the bridge created it), so a lead can still review items
1444
+ * that were in flight when #813 shipped.
1445
+ *
1446
+ * @param item - The WorkItem as it is now
1447
+ * @param to - Target status
1448
+ * @param actorInput - The caller
1449
+ * @param reviewerHint - Reviewer of record when the caller already knows it
1450
+ * (the target of the review item being completed)
1451
+ * @throws ForbiddenTransitionError when refused
1452
+ */
1453
+ async assertTransitionPermitted(item, to, actorInput, reviewerHint) {
1454
+ let subject = item;
1455
+ if (VERDICT_TRANSITIONS.has(`${item.status}→${to}`) && !getWorkItemReviewer(item)) {
1456
+ const reviewer = reviewerHint ?? (await this.storage.findWorkItem(`${item.id}:verify:${item.id}`))?.target;
1457
+ if (reviewer) {
1458
+ subject = { ...item, metadata: { ...(item.metadata ?? {}), [WORK_ITEM_REVIEWER_KEY]: reviewer } };
1459
+ }
1460
+ }
1461
+ const decision = checkTransitionPermission(subject, to, actorInput);
1462
+ if (!decision.allowed) {
1463
+ const actor = normalizeTransitionActor(actorInput);
1464
+ this.logger.warn('Refused WorkItem transition', {
1465
+ workItemId: item.id,
1466
+ from: item.status,
1467
+ to,
1468
+ actor: describeTransitionActor(actor),
1469
+ reason: decision.reason,
1470
+ });
1471
+ throw new ForbiddenTransitionError(item.id, item.status, to, actor, decision);
1472
+ }
1473
+ }
1474
+ /**
1475
+ * Stamp a review-escalation marker on a `done_by_worker` item (#813).
1476
+ *
1477
+ * The marker is what lets the next reviewer in the chain render the verdict
1478
+ * (the orchestrator after {@link REVIEW_ESCALATED_TO_ORC_KEY}), and it
1479
+ * makes each escalation fire once even across a backend restart — the
1480
+ * reconciler used to dedupe in memory only. Status is not touched.
1481
+ *
1482
+ * @param workItemId - The item under review
1483
+ * @param key - Metadata key to stamp (the orc or owner escalation key)
1484
+ * @param at - Timestamp to record (defaults to now)
1485
+ * @returns True when stamped, false when the item is gone or no longer awaiting review
1486
+ */
1487
+ async stampReviewEscalation(workItemId, key, at = new Date().toISOString()) {
1488
+ const item = await this.storage.findWorkItem(workItemId);
1489
+ if (!item || item.status !== 'done_by_worker')
1490
+ return false;
1491
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
1492
+ wi.metadata = { ...(wi.metadata ?? {}), [key]: at };
1493
+ });
1494
+ return !!ok;
1495
+ }
1334
1496
  /**
1335
1497
  * TL records a verdict on a WorkItem in `done_by_worker` status.
1336
1498
  *
@@ -1360,10 +1522,28 @@ export class TaskPoolService {
1360
1522
  const updated = await this.transitionStatus(workItemId, verdict, actorRole, (wi) => {
1361
1523
  if (comment)
1362
1524
  wi.error = comment;
1525
+ // #813: record WHO rendered the verdict, so reports can show that a
1526
+ // verified item was reviewed and by whom.
1527
+ const by = normalizeTransitionActor(actorRole);
1528
+ wi.metadata = {
1529
+ ...(wi.metadata ?? {}),
1530
+ reviewedBy: by?.session ?? by?.role,
1531
+ reviewedByRole: by?.role,
1532
+ reviewedAt: new Date().toISOString(),
1533
+ };
1363
1534
  });
1364
1535
  if (verdict === 'verified') {
1365
1536
  await this.resolveBlockedDependents(workItemId);
1366
1537
  }
1538
+ // #819: a verdict rendered THROUGH this method directly (POST /verdict,
1539
+ // or an escalation's owner resolution) never completes the tracking
1540
+ // `<id>:verify:<id>` review item — only the normal "TL completes their
1541
+ // review WorkItem" path does that (via completeSimpleItem's own call
1542
+ // into verifyItem). Left alone, that review item sits open in the
1543
+ // reviewer's queue forever even though its source is already decided.
1544
+ // No-op when the review item was already closed by that normal path
1545
+ // (its status is already terminal by the time we get here).
1546
+ await this.closeReviewItemAfterDirectVerdict(workItemId);
1367
1547
  await this.storage.flush();
1368
1548
  this.logger.info('WorkItem verdict recorded', { workItemId, verdict, actorRole });
1369
1549
  // F1-BRIDGE-1: the `rejected` branch publishes task:rejected so the
@@ -1382,34 +1562,84 @@ export class TaskPoolService {
1382
1562
  return updated;
1383
1563
  }
1384
1564
  /**
1385
- * Legacy facade — picks the verification path for the caller.
1565
+ * Close the review item tracking a source WorkItem's verification, once
1566
+ * the verdict has been rendered directly on the source (#819) — e.g. via
1567
+ * `POST /verdict`, or the owner resolving an escalation — rather than by
1568
+ * completing the review item itself. Without this, `<id>:verify:<id>`
1569
+ * sits open in the reviewer's queue forever, even though its source has
1570
+ * already been verified or rejected.
1386
1571
  *
1387
- * Existing call sites (REST controller, task-management controllers,
1388
- * V3 data service) invoke `completeItem(id, result)` without an
1389
- * explicit actor role. The facade reads the WorkItem, applies the
1390
- * {@link requiresVerification} policy, and dispatches to either
1391
- * {@link submitForVerification} (delegate items / explicit opt-in)
1392
- * or {@link completeSimpleItem} (everything else).
1572
+ * A review item still `running` (claimed by its reviewer) is completed the
1573
+ * same way a reviewer's own completion would ({@link completeSimpleItem});
1574
+ * `planReviewVerdict` is a safe no-op there because the source is no
1575
+ * longer `done_by_worker`, so this can never recurse back into
1576
+ * {@link verifyItem}. A review item never claimed (`queued`/`blocked`/
1577
+ * `scheduled`) is cancelled instead, since `→done` requires `running`.
1578
+ * Already-terminal or missing review items are left alone.
1393
1579
  *
1394
- * The legacy actor role for these implicit callers is `'agent'`.
1395
- * Migrations to explicit-actor calls can land in follow-up tickets
1396
- * without touching the five call sites in this PR.
1580
+ * Best-effort: any failure here is logged, never thrown — the real verdict
1581
+ * on the source has already been recorded, and that must not be
1582
+ * jeopardized by a failure to tidy up a secondary tracking item.
1583
+ *
1584
+ * @param sourceId - The WorkItem whose verdict was just rendered
1585
+ */
1586
+ async closeReviewItemAfterDirectVerdict(sourceId) {
1587
+ const reviewId = `${sourceId}:verify:${sourceId}`;
1588
+ try {
1589
+ const reviewItem = await this.storage.findWorkItem(reviewId);
1590
+ if (!reviewItem || TERMINAL_WORK_ITEM_STATUSES.has(reviewItem.status))
1591
+ return;
1592
+ if (reviewItem.status === 'running') {
1593
+ await this.completeSimpleItem(reviewId, { role: 'system', via: 'verifyItem:auto-close-review' }, {
1594
+ summary: 'Auto-closed: the verdict was rendered directly on the source it reviews.',
1595
+ });
1596
+ }
1597
+ else {
1598
+ await this.transitionStatus(reviewId, 'cancelled', { role: 'system', via: 'verifyItem:auto-close-review' }, (wi) => {
1599
+ wi.metadata = {
1600
+ ...(wi.metadata ?? {}),
1601
+ autoClosedReason: 'verdict rendered directly on the source it reviews',
1602
+ };
1603
+ });
1604
+ await this.storage.flush();
1605
+ }
1606
+ }
1607
+ catch (err) {
1608
+ this.logger.warn('Failed to auto-close review item after a direct verdict (non-fatal)', {
1609
+ sourceId,
1610
+ reviewId,
1611
+ error: err instanceof Error ? err.message : String(err),
1612
+ });
1613
+ }
1614
+ }
1615
+ /**
1616
+ * Completion facade — picks the verification path for the caller.
1617
+ *
1618
+ * Reads the WorkItem, applies the {@link requiresVerification} policy, and
1619
+ * dispatches to either {@link submitForVerification} (delegate items /
1620
+ * explicit opt-in) or {@link completeSimpleItem} (everything else).
1621
+ *
1622
+ * #813: the caller's actor is REQUIRED. It used to be hard-coded `'agent'`
1623
+ * with no identity, so a review item's completion could not tell its
1624
+ * reviewer from anyone else. Controllers resolve it server-side (see
1625
+ * `resolveTransitionActor` in the task-pool controller).
1397
1626
  *
1398
1627
  * @param workItemId - WorkItem id
1399
1628
  * @param result - Optional result payload
1629
+ * @param actor - Who is completing it (role + session)
1400
1630
  * @throws When the WorkItem is missing or the underlying transition
1401
- * is rejected (invalid state, forbidden actor).
1631
+ * is rejected (invalid state, forbidden actor, not the reviewer).
1402
1632
  */
1403
- async completeItem(workItemId, result) {
1633
+ async completeItem(workItemId, result, actor) {
1404
1634
  const workItem = await this.storage.findWorkItem(workItemId);
1405
1635
  if (!workItem) {
1406
1636
  throw new Error(`WorkItem not found: ${workItemId}`);
1407
1637
  }
1408
1638
  if (this.requiresVerification(workItem)) {
1409
- await this.submitForVerification(workItemId, 'agent', result);
1639
+ await this.submitForVerification(workItemId, actor, result);
1410
1640
  }
1411
1641
  else {
1412
- await this.completeSimpleItem(workItemId, 'agent', result);
1642
+ await this.completeSimpleItem(workItemId, actor, result);
1413
1643
  }
1414
1644
  }
1415
1645
  /**
@@ -1967,6 +2197,22 @@ export class TaskPoolService {
1967
2197
  return null;
1968
2198
  return (await this.storage.findWorkItem(workItemId)) ?? null;
1969
2199
  }
2200
+ /**
2201
+ * Shallow-merge keys into a WorkItem's metadata (no status change).
2202
+ *
2203
+ * @param workItemId - WorkItem id
2204
+ * @param patch - Keys to set on `metadata`
2205
+ * @returns The updated WorkItem, or null if not found
2206
+ */
2207
+ async mergeItemMetadata(workItemId, patch) {
2208
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
2209
+ wi.metadata = { ...(wi.metadata ?? {}), ...patch };
2210
+ });
2211
+ if (!ok)
2212
+ return null;
2213
+ await this.storage.flush();
2214
+ return (await this.storage.findWorkItem(workItemId)) ?? null;
2215
+ }
1970
2216
  /**
1971
2217
  * Re-point a queued WorkItem at another agent (its target went stale).
1972
2218
  * Only `queued` items move: running work belongs to whoever holds it.
@@ -2059,6 +2305,25 @@ export class TaskPoolService {
2059
2305
  this.logger.info('WorkItem handoff', { workItemId, fromAgent, newTarget });
2060
2306
  return (await this.storage.findWorkItem(workItemId)) ?? null;
2061
2307
  }
2308
+ /**
2309
+ * Set one top-level metadata key on a WorkItem. Never changes its status
2310
+ * (this is not a transition), so it needs no actor. Used by the worktree
2311
+ * service to record `metadata.worktree` (#814).
2312
+ *
2313
+ * @param workItemId - WorkItem id
2314
+ * @param key - Metadata key
2315
+ * @param value - New value (replaces the old one)
2316
+ * @returns The updated WorkItem, or null when it does not exist
2317
+ */
2318
+ async patchMetadata(workItemId, key, value) {
2319
+ const ok = await this.storage.updateWorkItem(workItemId, (wi) => {
2320
+ const existing = (wi.metadata && typeof wi.metadata === 'object' ? wi.metadata : {});
2321
+ wi.metadata = { ...existing, [key]: value };
2322
+ });
2323
+ if (!ok)
2324
+ return null;
2325
+ return (await this.storage.findWorkItem(workItemId)) ?? null;
2326
+ }
2062
2327
  /**
2063
2328
  * Appends a working-state note to a WorkItem's metadata.notes array.
2064
2329
  *
@@ -2183,7 +2448,7 @@ export class TaskPoolService {
2183
2448
  * @throws Error if transition is invalid (state machine — see WORK_ITEM_TRANSITIONS)
2184
2449
  * @throws Error if actor is not permitted (role check — see TRANSITION_PERMISSIONS)
2185
2450
  */
2186
- async updateItemStatus(workItemId, newStatus, actorRole = 'system',
2451
+ async updateItemStatus(workItemId, newStatus, actorRole,
2187
2452
  /**
2188
2453
  * Optional human-readable reason. Persisted on:
2189
2454
  * - `WorkItem.cancelReason` when `newStatus === 'cancelled'`
@@ -2192,7 +2457,13 @@ export class TaskPoolService {
2192
2457
  * explanation)
2193
2458
  * - Ignored for other status transitions.
2194
2459
  */
2195
- reason) {
2460
+ reason,
2461
+ /**
2462
+ * Optional `WorkItem.blockSource` to set atomically with a transition
2463
+ * INTO `blocked` (the waiting_on_human rule passes
2464
+ * WORK_ITEM_BLOCK_SOURCES.WAITING_ON_HUMAN, #815). Ignored otherwise.
2465
+ */
2466
+ blockSource) {
2196
2467
  const items = await this.storage.getWorkItems();
2197
2468
  const item = items.find((wi) => wi.id === workItemId);
2198
2469
  if (!item) {
@@ -2216,11 +2487,8 @@ export class TaskPoolService {
2216
2487
  if (!isValidWorkItemTransition(item.status, newStatus)) {
2217
2488
  throw new Error(`Invalid status transition for WorkItem ${workItemId}: ${item.status} → ${newStatus}`);
2218
2489
  }
2219
- // TRANS-1 V3: enforce per-role permissions. system role always passes.
2220
- if (!isTransitionPermitted(item.status, newStatus, actorRole)) {
2221
- throw new Error(`Forbidden transition for WorkItem ${workItemId}: actor='${actorRole}' ` +
2222
- `not permitted to perform ${item.status} → ${newStatus}.`);
2223
- }
2490
+ // TRANS-1 V3 + #813: closed, item-aware permission gate. No role bypasses it.
2491
+ await this.assertTransitionPermitted(item, newStatus, actorRole);
2224
2492
  // Capture pre-write status. See transitionStatus's identical block
2225
2493
  // for the writeup — storage.updateWorkItem mutates in place, so
2226
2494
  // reading item.status after the write yields newStatus and the
@@ -2261,6 +2529,9 @@ export class TaskPoolService {
2261
2529
  if (newStatus === 'blocked' && typeof reason === 'string' && reason.length > 0) {
2262
2530
  wi.blockedReason = reason;
2263
2531
  }
2532
+ if (newStatus === 'blocked' && blockSource) {
2533
+ wi.blockSource = blockSource;
2534
+ }
2264
2535
  // Ticket loop Phase 3: an agent picks its own unblocked work back up
2265
2536
  // before new work, so remember that this item was blocked.
2266
2537
  if (fromStatus === 'blocked' && newStatus === 'queued') {
@@ -2362,10 +2633,7 @@ export class TaskPoolService {
2362
2633
  if (!isValidWorkItemTransition(item.status, newStatus)) {
2363
2634
  throw new Error(`Invalid status transition for WorkItem ${workItemId}: ${item.status} → ${newStatus}`);
2364
2635
  }
2365
- if (!isTransitionPermitted(item.status, newStatus, actorRole)) {
2366
- throw new Error(`Forbidden transition for WorkItem ${workItemId}: actor='${actorRole}' ` +
2367
- `not permitted to perform ${item.status} → ${newStatus}.`);
2368
- }
2636
+ await this.assertTransitionPermitted(item, newStatus, actorRole);
2369
2637
  // Capture the pre-write status into a local. `storage.updateWorkItem`
2370
2638
  // mutates the same in-memory object that `findWorkItem` returned, so
2371
2639
  // reading `item.status` AFTER the write yields the new value — which