@fitlab-ai/agent-infra 0.9.12 → 0.9.14

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 (402) hide show
  1. package/README.md +11 -11
  2. package/README.zh-CN.md +11 -11
  3. package/bin/cli.ts +26 -9
  4. package/dist/bin/cli.js +173 -157
  5. package/dist/bin/internal-cli.js +66 -40
  6. package/dist/lib/agent-client.js +5 -0
  7. package/dist/lib/agent-clients/next-steps.js +6 -1
  8. package/dist/lib/decide.js +3 -3
  9. package/dist/lib/internal/agent-client.js +5 -2
  10. package/dist/lib/internal/cli-route-inventory.js +152 -0
  11. package/dist/lib/internal/codex-lifecycle.js +9 -6
  12. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  13. package/dist/lib/internal/git-workflow.js +10 -6
  14. package/dist/lib/internal/platform-checks.js +19 -7
  15. package/dist/lib/internal/platform-comment.js +25 -13
  16. package/dist/lib/internal/platform-context.js +6 -3
  17. package/dist/lib/internal/platform-issue.js +20 -13
  18. package/dist/lib/internal/platform-metadata.js +88 -0
  19. package/dist/lib/internal/platform-pr-review.js +26 -13
  20. package/dist/lib/internal/platform-pr.js +84 -31
  21. package/dist/lib/internal/platform-release-notes.js +9 -6
  22. package/dist/lib/internal/platform-security.js +93 -0
  23. package/dist/lib/internal/pr-review-grade.js +25 -12
  24. package/dist/lib/internal/release-workflow.js +23 -9
  25. package/dist/lib/internal/sandbox-control.js +50 -7
  26. package/dist/lib/internal/task-activity.js +16 -7
  27. package/dist/lib/internal/task-artifact.js +235 -24
  28. package/dist/lib/internal/task-context.js +4 -1
  29. package/dist/lib/internal/task-create.js +50 -17
  30. package/dist/lib/internal/task-delivery.js +4 -1
  31. package/dist/lib/internal/task-event.js +10 -4
  32. package/dist/lib/internal/task-finalization.js +6 -3
  33. package/dist/lib/internal/task-invalidation.js +63 -0
  34. package/dist/lib/internal/task-ledger.js +20 -6
  35. package/dist/lib/internal/task-lifecycle.js +6 -3
  36. package/dist/lib/internal/task-operation-registry.js +421 -0
  37. package/dist/lib/internal/task-orchestration.js +12 -0
  38. package/dist/lib/internal/task-override.js +14 -7
  39. package/dist/lib/internal/task-qualification.js +90 -0
  40. package/dist/lib/internal/task-review.js +7 -4
  41. package/dist/lib/internal/task-short-id.js +11 -1
  42. package/dist/lib/internal/task-snapshot.js +4 -1
  43. package/dist/lib/internal/task-validate.js +7 -2
  44. package/dist/lib/internal/task-verify.js +11 -7
  45. package/dist/lib/internal/task-warning.js +11 -4
  46. package/dist/lib/platform/adapters.js +1 -3
  47. package/dist/lib/platform/change-request-git-evidence.js +27 -7
  48. package/dist/lib/platform/comment-safety.js +226 -0
  49. package/dist/lib/platform/completion-backfill.js +6 -5
  50. package/dist/lib/platform/context.js +70 -130
  51. package/dist/lib/platform/github-client.js +1 -1
  52. package/dist/lib/platform/github-provider.js +1130 -0
  53. package/dist/lib/platform/in-label-sync.js +143 -0
  54. package/dist/lib/platform/issue-comments.js +237 -72
  55. package/dist/lib/platform/issues.js +335 -189
  56. package/dist/lib/platform/metadata-labels.js +6 -2
  57. package/dist/lib/platform/none-provider.js +28 -0
  58. package/dist/lib/platform/pr-change-report.js +545 -0
  59. package/dist/lib/platform/pr-checks.js +119 -104
  60. package/dist/lib/platform/pr-review.js +88 -72
  61. package/dist/lib/platform/pr-summary.js +541 -50
  62. package/dist/lib/platform/provider-bridge.js +45 -0
  63. package/dist/lib/platform/provider-contract.d.ts +553 -0
  64. package/dist/lib/platform/provider-contract.js +99 -0
  65. package/dist/lib/platform/provider-loader.js +251 -0
  66. package/dist/lib/platform/provider-validation.js +577 -0
  67. package/dist/lib/platform/pull-request-metadata.js +8 -6
  68. package/dist/lib/platform/pull-requests.js +734 -543
  69. package/dist/lib/platform/release-notes.js +78 -55
  70. package/dist/lib/platform/releases.js +79 -50
  71. package/dist/lib/platform/repository-metadata.js +377 -0
  72. package/dist/lib/platform/resource-identity.d.ts +26 -0
  73. package/dist/lib/platform/resource-identity.js +92 -0
  74. package/dist/lib/platform/security-alerts.js +155 -0
  75. package/dist/lib/platform/task-identities.js +31 -0
  76. package/dist/lib/platform/verification-required.js +11 -12
  77. package/dist/lib/platform/verification-sync.js +129 -248
  78. package/dist/lib/pr-review/evidence-grading.js +19 -6
  79. package/dist/lib/process-data/index.js +7 -0
  80. package/dist/lib/run/index.js +68 -23
  81. package/dist/lib/sandbox/commands/control-status.js +22 -0
  82. package/dist/lib/sandbox/commands/create.js +32 -6
  83. package/dist/lib/sandbox/commands/ls.js +5 -0
  84. package/dist/lib/sandbox/commands/rm.js +827 -120
  85. package/dist/lib/sandbox/commands/show.js +16 -0
  86. package/dist/lib/sandbox/control/client.js +174 -19
  87. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  88. package/dist/lib/sandbox/control/container-identity.js +28 -31
  89. package/dist/lib/sandbox/control/executor.js +151 -16
  90. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  91. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  92. package/dist/lib/sandbox/control/protocol.js +77 -0
  93. package/dist/lib/sandbox/control/server.js +677 -34
  94. package/dist/lib/sandbox/control/state.js +209 -4
  95. package/dist/lib/sandbox/control/task-view.js +183 -0
  96. package/dist/lib/sandbox/engines/authority.js +289 -0
  97. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  98. package/dist/lib/sandbox/index.js +5 -0
  99. package/dist/lib/sandbox/recovery.js +21 -1
  100. package/dist/lib/sandbox/workspace-view.js +2 -1
  101. package/dist/lib/sandbox/worktree-safety.js +4 -1
  102. package/dist/lib/server/index.js +8 -0
  103. package/dist/lib/server/protocol.js +38 -1
  104. package/dist/lib/task/activity-log.js +8 -1
  105. package/dist/lib/task/artifact-lifecycle.js +75 -18
  106. package/dist/lib/task/artifact-operations.js +520 -0
  107. package/dist/lib/task/artifact-repair-intent.js +59 -0
  108. package/dist/lib/task/artifact-schema.js +135 -0
  109. package/dist/lib/task/capabilities.js +310 -0
  110. package/dist/lib/task/commands/status.js +32 -0
  111. package/dist/lib/task/commit-operation.js +12 -1
  112. package/dist/lib/task/control-authority.js +12 -5
  113. package/dist/lib/task/create-service.js +111 -12
  114. package/dist/lib/task/create.js +25 -0
  115. package/dist/lib/task/current-contract.js +5 -1
  116. package/dist/lib/task/decision-details.js +1 -1
  117. package/dist/lib/task/events.js +416 -17
  118. package/dist/lib/task/finalization.js +37 -13
  119. package/dist/lib/task/human-override.js +58 -36
  120. package/dist/lib/task/index.js +11 -3
  121. package/dist/lib/task/invalidation-command.js +86 -0
  122. package/dist/lib/task/invalidation.js +260 -0
  123. package/dist/lib/task/ledger-intents.js +37 -0
  124. package/dist/lib/task/local-artifact-finalization.js +299 -0
  125. package/dist/lib/task/orchestration.js +240 -144
  126. package/dist/lib/task/pr-delivery-fact.js +102 -101
  127. package/dist/lib/task/qualification-audit.js +490 -0
  128. package/dist/lib/task/qualification-confirmation.js +109 -0
  129. package/dist/lib/task/qualification-intents.js +148 -0
  130. package/dist/lib/task/review-artifacts.js +22 -23
  131. package/dist/lib/task/review-finalization.js +121 -4
  132. package/dist/lib/task/review-fingerprint.js +24 -2
  133. package/dist/lib/task/rework-intent.js +138 -0
  134. package/dist/lib/task/sections.js +6 -4
  135. package/dist/lib/task/skill-scope.js +23 -0
  136. package/dist/lib/task/task-execution-lock.js +27 -17
  137. package/dist/lib/task/verification-config.js +11 -0
  138. package/dist/lib/task/verification-engine.js +93 -16
  139. package/dist/lib/task/verification.js +3 -3
  140. package/dist/lib/task/workflow-warning-intents.js +1 -1
  141. package/dist/lib/task/write.js +11 -0
  142. package/dist/lib/version.js +11 -1
  143. package/dist/lifecycle-build-manifest.json +3 -3
  144. package/lib/agent-client.ts +9 -0
  145. package/lib/agent-clients/next-steps.ts +6 -1
  146. package/lib/decide.ts +3 -3
  147. package/lib/init.ts +1 -1
  148. package/lib/internal/agent-client.ts +4 -2
  149. package/lib/internal/cli-route-inventory.ts +140 -0
  150. package/lib/internal/codex-lifecycle.ts +8 -6
  151. package/lib/internal/codex-sandbox-controller.ts +7 -2
  152. package/lib/internal/git-workflow.ts +9 -6
  153. package/lib/internal/platform-checks.ts +14 -6
  154. package/lib/internal/platform-comment.ts +20 -12
  155. package/lib/internal/platform-context.ts +5 -3
  156. package/lib/internal/platform-issue.ts +17 -11
  157. package/lib/internal/platform-metadata.ts +70 -0
  158. package/lib/internal/platform-pr-review.ts +23 -12
  159. package/lib/internal/platform-pr.ts +65 -27
  160. package/lib/internal/platform-release-notes.ts +8 -6
  161. package/lib/internal/platform-security.ts +83 -0
  162. package/lib/internal/pr-review-grade.ts +20 -11
  163. package/lib/internal/release-workflow.ts +21 -9
  164. package/lib/internal/sandbox-control.ts +44 -6
  165. package/lib/internal/task-activity.ts +15 -7
  166. package/lib/internal/task-artifact.ts +204 -22
  167. package/lib/internal/task-context.ts +3 -1
  168. package/lib/internal/task-create.ts +78 -17
  169. package/lib/internal/task-delivery.ts +3 -1
  170. package/lib/internal/task-event.ts +9 -4
  171. package/lib/internal/task-finalization.ts +6 -4
  172. package/lib/internal/task-invalidation.ts +41 -0
  173. package/lib/internal/task-ledger.ts +21 -8
  174. package/lib/internal/task-lifecycle.ts +5 -3
  175. package/lib/internal/task-operation-registry.ts +482 -0
  176. package/lib/internal/task-orchestration.ts +12 -0
  177. package/lib/internal/task-override.ts +15 -9
  178. package/lib/internal/task-qualification.ts +61 -0
  179. package/lib/internal/task-review.ts +6 -4
  180. package/lib/internal/task-short-id.ts +10 -1
  181. package/lib/internal/task-snapshot.ts +3 -1
  182. package/lib/internal/task-validate.ts +6 -2
  183. package/lib/internal/task-verify.ts +10 -7
  184. package/lib/internal/task-warning.ts +10 -4
  185. package/lib/platform/adapters.ts +3 -2
  186. package/lib/platform/change-request-git-evidence.ts +36 -9
  187. package/lib/platform/comment-safety.ts +250 -0
  188. package/lib/platform/completion-backfill.ts +9 -8
  189. package/lib/platform/context.ts +97 -134
  190. package/lib/platform/github-client.ts +2 -2
  191. package/lib/platform/github-provider.ts +1132 -0
  192. package/lib/platform/in-label-sync.ts +208 -0
  193. package/lib/platform/issue-comments.ts +255 -80
  194. package/lib/platform/issues.ts +344 -174
  195. package/lib/platform/metadata-labels.ts +5 -2
  196. package/lib/platform/none-provider.ts +35 -0
  197. package/lib/platform/pr-change-report.ts +639 -0
  198. package/lib/platform/pr-checks.ts +126 -106
  199. package/lib/platform/pr-review.ts +88 -85
  200. package/lib/platform/pr-summary.ts +581 -53
  201. package/lib/platform/provider-bridge.ts +82 -0
  202. package/lib/platform/provider-contract.ts +611 -0
  203. package/lib/platform/provider-loader.ts +307 -0
  204. package/lib/platform/provider-validation.ts +611 -0
  205. package/lib/platform/pull-request-metadata.ts +10 -7
  206. package/lib/platform/pull-requests.ts +781 -550
  207. package/lib/platform/release-notes.ts +76 -59
  208. package/lib/platform/releases.ts +77 -43
  209. package/lib/platform/repository-metadata.ts +453 -0
  210. package/lib/platform/resource-identity.ts +121 -0
  211. package/lib/platform/security-alerts.ts +191 -0
  212. package/lib/platform/task-identities.ts +40 -0
  213. package/lib/platform/types.ts +4 -2
  214. package/lib/platform/verification-required.ts +11 -13
  215. package/lib/platform/verification-sync.ts +128 -304
  216. package/lib/pr-review/evidence-grading.ts +25 -8
  217. package/lib/process-data/index.ts +7 -0
  218. package/lib/run/index.ts +62 -22
  219. package/lib/sandbox/commands/control-status.ts +26 -0
  220. package/lib/sandbox/commands/create.ts +46 -6
  221. package/lib/sandbox/commands/ls.ts +7 -0
  222. package/lib/sandbox/commands/rm.ts +1000 -87
  223. package/lib/sandbox/commands/show.ts +16 -0
  224. package/lib/sandbox/control/client.ts +203 -19
  225. package/lib/sandbox/control/completed-reentry.ts +98 -0
  226. package/lib/sandbox/control/container-identity.ts +27 -43
  227. package/lib/sandbox/control/executor.ts +180 -15
  228. package/lib/sandbox/control/lifecycle.ts +629 -17
  229. package/lib/sandbox/control/native-file-lock.ts +209 -0
  230. package/lib/sandbox/control/protocol.ts +118 -2
  231. package/lib/sandbox/control/server.ts +724 -34
  232. package/lib/sandbox/control/state.ts +257 -4
  233. package/lib/sandbox/control/task-view.ts +240 -0
  234. package/lib/sandbox/engines/authority.ts +365 -0
  235. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  236. package/lib/sandbox/index.ts +7 -0
  237. package/lib/sandbox/recovery.ts +21 -1
  238. package/lib/sandbox/workspace-view.ts +9 -3
  239. package/lib/sandbox/worktree-safety.ts +4 -1
  240. package/lib/server/index.ts +10 -0
  241. package/lib/server/protocol.ts +36 -1
  242. package/lib/task/activity-log.ts +8 -0
  243. package/lib/task/artifact-lifecycle.ts +70 -22
  244. package/lib/task/artifact-operations.ts +626 -0
  245. package/lib/task/artifact-repair-intent.ts +71 -0
  246. package/lib/task/artifact-schema.ts +192 -0
  247. package/lib/task/capabilities.ts +331 -0
  248. package/lib/task/commands/status.ts +38 -0
  249. package/lib/task/commit-operation.ts +12 -1
  250. package/lib/task/control-authority.ts +22 -9
  251. package/lib/task/create-service.ts +139 -14
  252. package/lib/task/create.ts +27 -0
  253. package/lib/task/current-contract.ts +6 -1
  254. package/lib/task/decision-details.ts +6 -2
  255. package/lib/task/events.ts +392 -16
  256. package/lib/task/finalization.ts +50 -14
  257. package/lib/task/human-override.ts +70 -46
  258. package/lib/task/index.ts +16 -3
  259. package/lib/task/invalidation-command.ts +86 -0
  260. package/lib/task/invalidation.ts +332 -0
  261. package/lib/task/ledger-intents.ts +35 -1
  262. package/lib/task/local-artifact-finalization.ts +432 -0
  263. package/lib/task/orchestration.ts +223 -133
  264. package/lib/task/pr-delivery-fact.ts +131 -148
  265. package/lib/task/qualification-audit.ts +599 -0
  266. package/lib/task/qualification-confirmation.ts +117 -0
  267. package/lib/task/qualification-intents.ts +150 -0
  268. package/lib/task/review-artifacts.ts +21 -22
  269. package/lib/task/review-finalization.ts +133 -4
  270. package/lib/task/review-fingerprint.ts +23 -2
  271. package/lib/task/rework-intent.ts +165 -0
  272. package/lib/task/sections.ts +6 -4
  273. package/lib/task/skill-scope.ts +24 -0
  274. package/lib/task/task-execution-lock.ts +23 -14
  275. package/lib/task/verification-config.ts +12 -0
  276. package/lib/task/verification-engine.ts +103 -17
  277. package/lib/task/verification.ts +4 -4
  278. package/lib/task/workflow-warning-intents.ts +1 -1
  279. package/lib/task/write.ts +19 -0
  280. package/lib/update.ts +1 -1
  281. package/lib/version.ts +15 -1
  282. package/package.json +12 -1
  283. package/templates/.agents/rules/README.en.md +3 -1
  284. package/templates/.agents/rules/README.zh-CN.md +3 -1
  285. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  286. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  287. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  288. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  289. package/templates/.agents/rules/issue-pr-commands.en.md +1 -1
  290. package/templates/.agents/rules/issue-pr-commands.zh-CN.md +1 -1
  291. package/templates/.agents/rules/issue-sync.en.md +2 -0
  292. package/templates/.agents/rules/issue-sync.zh-CN.md +2 -0
  293. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  294. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  295. package/templates/.agents/rules/local-artifact-repair.en.md +13 -2
  296. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +13 -2
  297. package/templates/.agents/rules/pr-sync.en.md +10 -4
  298. package/templates/.agents/rules/pr-sync.zh-CN.md +17 -4
  299. package/templates/.agents/rules/security-alerts.en.md +8 -8
  300. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  301. package/templates/.agents/rules/task-short-id.en.md +1 -4
  302. package/templates/.agents/rules/task-short-id.zh-CN.md +1 -3
  303. package/templates/.agents/skills/analyze-task/SKILL.en.md +28 -5
  304. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +29 -5
  305. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  306. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  307. package/templates/.agents/skills/check-task/SKILL.en.md +16 -37
  308. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -37
  309. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  310. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  311. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  312. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  313. package/templates/.agents/skills/code-task/SKILL.en.md +41 -9
  314. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +43 -11
  315. package/templates/.agents/skills/code-task/config/verify.en.json +6 -14
  316. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +6 -14
  317. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  318. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  319. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  320. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  321. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  322. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  323. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  324. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  325. package/templates/.agents/skills/commit/reference/issue-metadata-sync.en.md +2 -0
  326. package/templates/.agents/skills/commit/reference/issue-metadata-sync.zh-CN.md +2 -0
  327. package/templates/.agents/skills/commit/reference/pr-summary-sync.en.md +3 -3
  328. package/templates/.agents/skills/commit/reference/pr-summary-sync.zh-CN.md +3 -3
  329. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +10 -4
  330. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +10 -4
  331. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  332. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  333. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +4 -3
  334. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +4 -3
  335. package/templates/.agents/skills/complete-task/SKILL.en.md +26 -21
  336. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +25 -21
  337. package/templates/.agents/skills/create-pr/SKILL.en.md +7 -6
  338. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +7 -7
  339. package/templates/.agents/skills/create-pr/config/verify.json +1 -0
  340. package/templates/.agents/skills/create-pr/reference/change-report.en.md +16 -4
  341. package/templates/.agents/skills/create-pr/reference/change-report.zh-CN.md +16 -4
  342. package/templates/.agents/skills/create-pr/reference/comment-publish.en.md +5 -3
  343. package/templates/.agents/skills/create-pr/reference/comment-publish.zh-CN.md +5 -3
  344. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +1 -1
  345. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +1 -1
  346. package/templates/.agents/skills/create-pr/scripts/change-report.mjs +3 -0
  347. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  348. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  349. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  350. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  351. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  352. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  353. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  354. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  355. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  356. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  357. package/templates/.agents/skills/plan-task/SKILL.en.md +27 -4
  358. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +26 -4
  359. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  360. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  361. package/templates/.agents/skills/review-analysis/SKILL.en.md +17 -4
  362. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +17 -4
  363. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  364. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  365. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  366. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  367. package/templates/.agents/skills/review-code/SKILL.en.md +18 -5
  368. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +18 -5
  369. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  370. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  371. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  372. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  373. package/templates/.agents/skills/review-plan/SKILL.en.md +17 -4
  374. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +17 -4
  375. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  376. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  377. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  378. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  379. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  380. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  381. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  382. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  383. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +9 -3
  384. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +9 -3
  385. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  386. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  387. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  388. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  389. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  390. package/templates/.agents/skills/watch-pr/SKILL.en.md +2 -2
  391. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +2 -2
  392. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.en.md +6 -0
  393. package/templates/.agents/skills/watch-pr/reference/monitor-and-heal.zh-CN.md +6 -0
  394. package/templates/.agents/templates/task.en.md +24 -1
  395. package/templates/.agents/templates/task.zh-CN.md +24 -1
  396. package/templates/.github/workflows/pr-label.yml +7 -26
  397. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  398. package/templates/.agents/scripts/security-alerts.sh +0 -31
  399. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  400. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  401. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  402. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -1,10 +1,9 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { randomUUID } from 'node:crypto';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
4
  import { parseTypedTaskFrontmatter } from './frontmatter.js';
5
5
  import { validateCurrentTaskContract } from './current-contract.js';
6
- import { parseReviewSummary, resolveCanonicalVerdict } from './review-artifacts.js';
7
- import { inspectArtifactDirectory } from './artifact-lifecycle.js';
6
+ import { parseReviewSummary } from './review-artifacts.js';
8
7
  import { LEDGER_SECTION_MISSING_CODE, LEDGER_SECTION_MISSING_MESSAGE, parseLedgerDocument, summarizeLedgerStage, validateLedgerRows } from './ledger.js';
9
8
  import { resolveTaskRef } from './resolve-ref.js';
10
9
  import { activateDelegation, abortPreparedDelegation, completeDelegationStage, consumeDelegation, dispatchDelegation, foldBlankToNull, isDelegationReceipt, managedDelegationRole, prepareDelegation, sealDelegation } from './delegation-receipts.js';
@@ -18,6 +17,9 @@ import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-
18
17
  import { hasActiveCodexLifecycleEvidence } from '../agent-clients/adapters/codex-lifecycle/store.js';
19
18
  import { extractReviewBaseline, extractReviewDiffBase, extractReviewTargetHead, extractReviewedHead } from './review-fingerprint.js';
20
19
  import { resolveDeliveryTarget, resolveDiffBase, resolveTargetHead } from './delivery-target.js';
20
+ import { buildLifecycleFacts, canStart, recommendNext } from './capabilities.js';
21
+ import { hasOpenLifecycleExecution } from './activity-log.js';
22
+ import { invalidationBlocks } from './invalidation.js';
21
23
  function supportsLifecycleDelegation(client) {
22
24
  return getAgentClientCapability(client, 'subagents').level !== 'unsupported'
23
25
  && getAgentClientCapability(client, 'orchestration').level !== 'unsupported'
@@ -31,10 +33,12 @@ const ORCHESTRATION_STATE_INVALID_MESSAGE = 'orchestration.json does not match t
31
33
  class OrchestrationStateError extends Error {
32
34
  code = 'ORCHESTRATION_STATE_INVALID';
33
35
  taskId;
34
- constructor(taskId = null) {
36
+ reasonCodes;
37
+ constructor(taskId = null, reasonCodes = []) {
35
38
  super(ORCHESTRATION_STATE_INVALID_MESSAGE);
36
39
  this.name = 'OrchestrationStateError';
37
40
  this.taskId = taskId;
41
+ this.reasonCodes = Object.freeze([...reasonCodes]);
38
42
  }
39
43
  }
40
44
  function isRecord(value) {
@@ -115,48 +119,151 @@ const ORCHESTRATION_RUN_KEYS = [
115
119
  'modelPolicySource', 'recoveryHistory', 'baseline', 'pendingDelegation', 'receipts',
116
120
  'pause', 'commitAuthorization', 'completionEvidence', 'createdAt', 'updatedAt'
117
121
  ];
118
- function parseOrchestrationRun(value, expectedTaskId) {
119
- if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)
120
- || !exactText(value.taskId)
121
- || (expectedTaskId !== undefined && value.taskId !== expectedTaskId)
122
- || !exactText(value.runId)
123
- || !['running', 'paused', 'completed'].includes(value.status)
124
- || !(value.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(value.nextStage))
125
- || !Number.isSafeInteger(value.stepCount) || value.stepCount < 0
126
- || !Number.isSafeInteger(value.maxSteps) || value.maxSteps < 1
127
- || !isModelPolicy(value.modelPolicy)
128
- || !isModelPolicySource(value.modelPolicySource)
129
- || !Array.isArray(value.recoveryHistory) || !value.recoveryHistory.every(isRecovery)
130
- || typeof value.baseline !== 'string'
131
- || !(value.pendingDelegation === null || isDelegationReceipt(value.pendingDelegation))
132
- || !Array.isArray(value.receipts) || !value.receipts.every(isDelegationReceipt)
133
- || !(value.pause === null || isPause(value.pause))
134
- || !hasExactKeys(value.commitAuthorization, ['issuedAt', 'consumedAt'])
135
- || !nullableText(value.commitAuthorization.issuedAt)
136
- || !nullableText(value.commitAuthorization.consumedAt)
137
- || !(value.completionEvidence === null || isCompletionEvidence(value.completionEvidence))
138
- || !exactText(value.createdAt)
139
- || !exactText(value.updatedAt)) {
140
- throw new OrchestrationStateError();
141
- }
142
- const receipts = [...value.receipts, ...(value.pendingDelegation ? [value.pendingDelegation] : [])];
143
- if (receipts.some((receipt) => receipt.taskId !== value.taskId || receipt.runId !== value.runId)) {
144
- throw new OrchestrationStateError();
122
+ function orchestrationStateReasonCodes(value, expectedTaskId) {
123
+ if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS))
124
+ return ['top-level-keys'];
125
+ const record = value;
126
+ const reasons = [];
127
+ if (!exactText(record.taskId))
128
+ reasons.push('taskId');
129
+ else if (expectedTaskId !== undefined && record.taskId !== expectedTaskId)
130
+ reasons.push('taskId-mismatch');
131
+ if (!exactText(record.runId))
132
+ reasons.push('runId');
133
+ if (!['running', 'paused', 'completed'].includes(record.status))
134
+ reasons.push('status');
135
+ if (!(record.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(record.nextStage))) {
136
+ reasons.push('nextStage');
137
+ }
138
+ if (!Number.isSafeInteger(record.stepCount) || record.stepCount < 0)
139
+ reasons.push('stepCount');
140
+ if (!Number.isSafeInteger(record.maxSteps) || record.maxSteps < 1)
141
+ reasons.push('maxSteps');
142
+ if (!isModelPolicy(record.modelPolicy))
143
+ reasons.push('modelPolicy');
144
+ if (!isModelPolicySource(record.modelPolicySource))
145
+ reasons.push('modelPolicySource');
146
+ if (!Array.isArray(record.recoveryHistory) || !record.recoveryHistory.every(isRecovery))
147
+ reasons.push('recoveryHistory');
148
+ if (typeof record.baseline !== 'string')
149
+ reasons.push('baseline');
150
+ if (!(record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation)))
151
+ reasons.push('pendingDelegation');
152
+ if (!Array.isArray(record.receipts) || !record.receipts.every(isDelegationReceipt))
153
+ reasons.push('receipts');
154
+ if (!(record.pause === null || isPause(record.pause)))
155
+ reasons.push('pause');
156
+ if (!hasExactKeys(record.commitAuthorization, ['issuedAt', 'consumedAt'])) {
157
+ reasons.push('commitAuthorization');
158
+ }
159
+ else {
160
+ if (!nullableText(record.commitAuthorization.issuedAt))
161
+ reasons.push('commitAuthorization.issuedAt');
162
+ if (!nullableText(record.commitAuthorization.consumedAt))
163
+ reasons.push('commitAuthorization.consumedAt');
164
+ }
165
+ if (!(record.completionEvidence === null || isCompletionEvidence(record.completionEvidence)))
166
+ reasons.push('completionEvidence');
167
+ if (!exactText(record.createdAt))
168
+ reasons.push('createdAt');
169
+ if (!exactText(record.updatedAt))
170
+ reasons.push('updatedAt');
171
+ if (Array.isArray(record.receipts) && record.receipts.every(isDelegationReceipt)
172
+ && (record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) {
173
+ const receipts = [...record.receipts, ...(record.pendingDelegation ? [record.pendingDelegation] : [])];
174
+ if (receipts.some((receipt) => receipt.taskId !== record.taskId || receipt.runId !== record.runId)) {
175
+ reasons.push('receipt-identity');
176
+ }
177
+ }
178
+ return reasons;
179
+ }
180
+ function emitDiagnostic(options, event, fields) {
181
+ try {
182
+ options?.diagnosticLog?.(event, fields);
183
+ }
184
+ catch {
185
+ // Diagnostics must never change lifecycle behavior.
186
+ }
187
+ }
188
+ function fileObservation(file) {
189
+ try {
190
+ const stat = fs.lstatSync(file);
191
+ let realpath = null;
192
+ try {
193
+ realpath = fs.realpathSync.native(file);
194
+ }
195
+ catch { /* retain the lstat observation */ }
196
+ return {
197
+ file,
198
+ exists: true,
199
+ fileType: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',
200
+ symbolicLink: stat.isSymbolicLink(),
201
+ bytes: stat.isFile() ? stat.size : null,
202
+ mtimeMs: stat.mtimeMs,
203
+ device: stat.dev,
204
+ inode: stat.ino,
205
+ realpath
206
+ };
207
+ }
208
+ catch (error) {
209
+ return {
210
+ file,
211
+ exists: false,
212
+ fileType: null,
213
+ symbolicLink: null,
214
+ bytes: null,
215
+ mtimeMs: null,
216
+ device: null,
217
+ inode: null,
218
+ realpath: null,
219
+ fsError: error instanceof Error && 'code' in error ? String(error.code) : null
220
+ };
145
221
  }
222
+ }
223
+ function parseOrchestrationRun(value, expectedTaskId) {
224
+ const reasonCodes = orchestrationStateReasonCodes(value, expectedTaskId);
225
+ if (reasonCodes.length > 0)
226
+ throw new OrchestrationStateError(expectedTaskId ?? null, reasonCodes);
146
227
  return value;
147
228
  }
148
- function readRun(taskDir) {
229
+ function readRun(taskDir, options = {}) {
149
230
  const file = orchestrationPath(taskDir);
150
- if (!fs.existsSync(file))
151
- return null;
152
231
  const taskId = path.basename(taskDir);
232
+ const observed = options.diagnosticLog ? fileObservation(file) : {};
233
+ if (!fs.existsSync(file)) {
234
+ emitDiagnostic(options, 'orchestration-state-missing', { taskId, taskDir, ...observed });
235
+ return null;
236
+ }
237
+ emitDiagnostic(options, 'orchestration-state-read-start', { taskId, taskDir, ...observed });
238
+ let rawBytes = null;
239
+ let rawSha256 = null;
153
240
  try {
154
- return parseOrchestrationRun(JSON.parse(fs.readFileSync(file, 'utf8')), taskId);
241
+ const raw = fs.readFileSync(file, 'utf8');
242
+ if (options.diagnosticLog) {
243
+ rawBytes = Buffer.byteLength(raw, 'utf8');
244
+ rawSha256 = createHash('sha256').update(raw, 'utf8').digest('hex');
245
+ }
246
+ const run = parseOrchestrationRun(JSON.parse(raw), taskId);
247
+ emitDiagnostic(options, 'orchestration-state-read-ok', {
248
+ taskId, taskDir, file, rawBytes, rawSha256, status: run.status, runId: run.runId,
249
+ stepCount: run.stepCount, pendingDelegation: run.pendingDelegation !== null
250
+ });
251
+ return run;
155
252
  }
156
253
  catch (error) {
157
- if (error instanceof OrchestrationStateError)
158
- throw new OrchestrationStateError(taskId);
159
- throw new OrchestrationStateError(taskId);
254
+ const reasonCodes = error instanceof OrchestrationStateError && error.reasonCodes.length > 0
255
+ ? error.reasonCodes
256
+ : [error instanceof SyntaxError ? 'json-parse' : 'file-read'];
257
+ emitDiagnostic(options, 'orchestration-state-read-failed', {
258
+ taskId,
259
+ taskDir,
260
+ ...observed,
261
+ rawBytes,
262
+ rawSha256,
263
+ reasonCodes: reasonCodes.join(','),
264
+ errorType: error instanceof Error ? error.name : typeof error,
265
+ });
266
+ throw new OrchestrationStateError(taskId, reasonCodes);
160
267
  }
161
268
  }
162
269
  function atomicWrite(file, value) {
@@ -230,7 +337,7 @@ function beginOrResumeOrchestration(taskRef, options = {}) {
230
337
  }
231
338
  let existing;
232
339
  try {
233
- existing = readRun(resolved.taskDir);
340
+ existing = readRun(resolved.taskDir, options);
234
341
  }
235
342
  catch (error) {
236
343
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
@@ -377,86 +484,21 @@ function validateSavedCurrentDiffBase(repoRoot, metadata, taskDir, reviewedHead)
377
484
  }
378
485
  return null;
379
486
  }
380
- function hasReviewAfterArtifact(taskDir, family, reviewFamily) {
381
- const artifact = inspectArtifactDirectory(taskDir, family);
382
- const review = inspectArtifactDirectory(taskDir, reviewFamily);
383
- return artifact.status === 'ready'
384
- && review.status === 'ready'
385
- && artifact.latest !== null
386
- && review.reviewedInput?.name === artifact.latest.name;
387
- }
388
- function latestReviewApproved(taskDir, family) {
389
- const round = highestRound(taskDir, family);
390
- if (round === 0)
391
- return { approved: false, error: null };
392
- let content;
393
- try {
394
- content = fs.readFileSync(path.join(taskDir, artifactName(family, round)), 'utf8');
395
- }
396
- catch (error) {
397
- return { approved: false, error: String(error) };
398
- }
399
- const parsed = parseReviewSummary(content);
400
- if (!parsed.ok)
401
- return { approved: false, error: `${parsed.code}: ${parsed.message}` };
402
- const verdict = resolveCanonicalVerdict(parsed.summary);
403
- if (!verdict.ok)
404
- return { approved: false, error: `${verdict.code}: ${verdict.message}` };
405
- return { approved: verdict.verdict === 'Approved', error: null };
406
- }
407
- function routeFromFacts(taskDir) {
408
- const analysisRound = highestRound(taskDir, 'analysis');
409
- const analysisReviewRound = highestRound(taskDir, 'review-analysis');
410
- const planRound = highestRound(taskDir, 'plan');
411
- const planReviewRound = highestRound(taskDir, 'review-plan');
412
- const codeRound = highestRound(taskDir, 'code');
413
- const codeReviewRound = highestRound(taskDir, 'review-code');
414
- if (analysisRound === 0) {
415
- const round = analysisRound + 1;
416
- return { action: 'analyze-task', role: 'executor', stage: 'analysis', round, artifact: artifactName('analysis', round) };
417
- }
418
- if (!hasReviewAfterArtifact(taskDir, 'analysis', 'review-analysis')) {
419
- const round = analysisReviewRound + 1;
420
- return { action: 'review-analysis', role: 'reviewer', stage: 'review-analysis', round, artifact: artifactName('review-analysis', round) };
421
- }
422
- const analysisVerdict = latestReviewApproved(taskDir, 'review-analysis');
423
- if (analysisVerdict.error)
424
- return { error: analysisVerdict.error };
425
- if (!analysisVerdict.approved) {
426
- const round = analysisRound + 1;
427
- return { action: 'analyze-task', role: 'executor', stage: 'analysis', round, artifact: artifactName('analysis', round) };
428
- }
429
- if (planRound === 0) {
430
- const round = planRound + 1;
431
- return { action: 'plan-task', role: 'executor', stage: 'plan', round, artifact: artifactName('plan', round) };
432
- }
433
- if (!hasReviewAfterArtifact(taskDir, 'plan', 'review-plan')) {
434
- const round = planReviewRound + 1;
435
- return { action: 'review-plan', role: 'reviewer', stage: 'review-plan', round, artifact: artifactName('review-plan', round) };
436
- }
437
- const planVerdict = latestReviewApproved(taskDir, 'review-plan');
438
- if (planVerdict.error)
439
- return { error: planVerdict.error };
440
- if (!planVerdict.approved) {
441
- const round = planRound + 1;
442
- return { action: 'plan-task', role: 'executor', stage: 'plan', round, artifact: artifactName('plan', round) };
443
- }
444
- if (codeRound === 0) {
445
- const round = codeRound + 1;
446
- return { action: 'code-task', role: 'executor', stage: 'code', round, artifact: artifactName('code', round) };
447
- }
448
- if (!hasReviewAfterArtifact(taskDir, 'code', 'review-code')) {
449
- const round = codeReviewRound + 1;
450
- return { action: 'review-code', role: 'reviewer', stage: 'review-code', round, artifact: artifactName('review-code', round) };
451
- }
452
- const codeVerdict = latestReviewApproved(taskDir, 'review-code');
453
- if (codeVerdict.error)
454
- return { error: codeVerdict.error };
455
- if (!codeVerdict.approved) {
456
- const round = codeRound + 1;
457
- return { action: 'code-task', role: 'executor', stage: 'code', round, artifact: artifactName('code', round) };
458
- }
459
- return { action: 'commit', role: 'executor', stage: 'commit', round: 1, artifact: 'commit' };
487
+ function routeFromFacts(facts) {
488
+ const recommendation = recommendNext(facts);
489
+ if (!recommendation.action)
490
+ return { completion: true };
491
+ const action = recommendation.action;
492
+ if (action === 'manual-validation' || action === 'validation-run')
493
+ return null;
494
+ const family = action === 'analysis' ? 'analysis' : action;
495
+ const round = Math.max(0, ...[...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])].map((name) => {
496
+ const match = /-r(\d+)\.md$/.exec(name);
497
+ return match ? Number(match[1]) : 1;
498
+ })) + 1;
499
+ const command = action === 'analysis' ? 'analyze-task' : action === 'plan' ? 'plan-task' : action === 'code' ? 'code-task' : action;
500
+ const role = action.startsWith('review-') ? 'reviewer' : 'executor';
501
+ return { action: command, role, stage: action, round, artifact: artifactName(family, round) };
460
502
  }
461
503
  function routeOrchestration(taskRef, options = {}) {
462
504
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
@@ -478,12 +520,14 @@ function routeOrchestration(taskRef, options = {}) {
478
520
  }
479
521
  let metadata;
480
522
  let currentLedger = null;
523
+ let currentInvalidation = { operations: [], targets: [] };
481
524
  if (resolved.state === 'active') {
482
525
  const contract = validateCurrentTaskContract(content);
483
526
  if (!contract.ok)
484
527
  return failed('ORCHESTRATION_CURRENT_CONTRACT_INVALID', contract.message, resolved.taskId);
485
528
  metadata = contract.metadata;
486
529
  currentLedger = contract.ledger;
530
+ currentInvalidation = contract.invalidation;
487
531
  }
488
532
  else {
489
533
  try {
@@ -493,19 +537,23 @@ function routeOrchestration(taskRef, options = {}) {
493
537
  return failed('ORCHESTRATION_TASK_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
494
538
  }
495
539
  }
496
- const routed = routeFromFacts(resolved.taskDir);
497
- if (routed && 'error' in routed)
498
- return failed('ORCHESTRATION_REVIEW_INVALID', routed.error, resolved.taskId);
540
+ if (invalidationBlocks(currentInvalidation)) {
541
+ return failed('ORCHESTRATION_INVALIDATION_INCOMPLETE', 'artifact invalidation is incomplete; reconcile task.md before routing downstream work', resolved.taskId);
542
+ }
543
+ let run;
544
+ try {
545
+ run = readRun(resolved.taskDir, options);
546
+ }
547
+ catch (error) {
548
+ return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
549
+ }
550
+ const facts = buildLifecycleFacts(resolved.taskDir, content, resolved.state, hasOpenLifecycleExecution(content) || Boolean(run?.pendingDelegation));
551
+ if (!facts.ok)
552
+ return failed('ORCHESTRATION_CAPABILITY_FACTS_INVALID', facts.message, resolved.taskId);
553
+ const routed = routeFromFacts(facts.facts);
499
554
  if (!routed)
500
555
  return failed('ORCHESTRATION_ROUTE_UNKNOWN', 'cannot determine a unique lifecycle action', resolved.taskId);
501
- const run = readRun(resolved.taskDir);
502
- const policy = run ? rolePolicy(run, routed.role) : null;
503
- const next = {
504
- ...routed,
505
- requestedModel: policy?.model ?? null,
506
- requestedReasoningEffort: policy?.reasoningEffort ?? null
507
- };
508
- if (next.stage === 'commit') {
556
+ if ('completion' in routed) {
509
557
  const reviewRound = highestRound(resolved.taskDir, 'review-code');
510
558
  const review = parseReviewSummary(fs.readFileSync(path.join(resolved.taskDir, artifactName('review-code', reviewRound)), 'utf8'));
511
559
  if (!review.ok || review.summary.manualValidation === null) {
@@ -581,13 +629,26 @@ function routeOrchestration(taskRef, options = {}) {
581
629
  saveRun(resolved.taskDir, completed);
582
630
  return { status: 'completed', changed: true, taskId: resolved.taskId, run: completed, next: null, error: null };
583
631
  }
632
+ const action = routed.stage;
633
+ const capability = canStart(action, facts.facts, {
634
+ initiator: 'orchestrator', requestId: `orchestration:${resolved.taskId}:${routed.stage}:${routed.round}`,
635
+ requestedAction: action, reasonCode: 'user-request', explicitRequest: true
636
+ });
637
+ if (!capability.allowed)
638
+ return failed('ORCHESTRATION_CAPABILITY_DENIED', `${capability.reasonCode}: ${capability.evidence.join(', ')}`, resolved.taskId);
639
+ const policy = run ? rolePolicy(run, routed.role) : null;
640
+ const next = {
641
+ ...routed,
642
+ requestedModel: policy?.model ?? null,
643
+ requestedReasoningEffort: policy?.reasoningEffort ?? null
644
+ };
584
645
  return { status: 'running', changed: false, taskId: resolved.taskId, run, next, error: null };
585
646
  }
586
647
  function statusOrchestration(taskRef, options = {}) {
587
648
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
588
649
  if (!resolved.ok)
589
650
  return failed(resolved.code, resolved.message, resolved.taskId);
590
- const run = readRun(resolved.taskDir);
651
+ const run = readRun(resolved.taskDir, options);
591
652
  if (!run)
592
653
  return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
593
654
  return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
@@ -599,7 +660,15 @@ function prepareOrchestrationDelegationUnlocked(taskRef, input, options = {}) {
599
660
  if (!(options.supportsLifecycleDelegation ?? supportsLifecycleDelegation)(input.client)) {
600
661
  return failed('ORCHESTRATION_CLIENT_UNSUPPORTED', `client '${input.client}' does not support lifecycle orchestration`, resolved.taskId);
601
662
  }
602
- const run = readRun(resolved.taskDir);
663
+ emitDiagnostic(options, 'orchestration-prepare-start', {
664
+ taskId: resolved.taskId,
665
+ taskDir: resolved.taskDir,
666
+ repoRoot: resolved.repoRoot,
667
+ client: input.client,
668
+ requestedModel: input.requestedModel ?? null,
669
+ requestedReasoningEffort: input.requestedReasoningEffort ?? null
670
+ });
671
+ const run = readRun(resolved.taskDir, options);
603
672
  if (!run || run.status !== 'running')
604
673
  return failed('ORCHESTRATION_RUN_NOT_RUNNING', 'a running orchestration is required', resolved.taskId);
605
674
  if (run.pendingDelegation)
@@ -687,7 +756,7 @@ function dispatchOrchestrationDelegationUnlocked(taskRef, options = {}) {
687
756
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
688
757
  if (!resolved.ok)
689
758
  return failed(resolved.code, resolved.message, resolved.taskId);
690
- const run = readRun(resolved.taskDir);
759
+ const run = readRun(resolved.taskDir, options);
691
760
  if (!run?.pendingDelegation)
692
761
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
693
762
  if (run.status !== 'running') {
@@ -721,17 +790,44 @@ function matchingDelegations(predicate, options) {
721
790
  const activeRoot = path.join(repoRoot, '.agents', 'workspace', 'active');
722
791
  if (!fs.existsSync(activeRoot))
723
792
  return [];
724
- return fs.readdirSync(activeRoot, { withFileTypes: true })
793
+ emitDiagnostic(options, 'orchestration-active-scan-start', {
794
+ activeRoot
795
+ });
796
+ const matches = fs.readdirSync(activeRoot, { withFileTypes: true })
725
797
  .filter((entry) => entry.isDirectory())
726
798
  .flatMap((entry) => {
727
- const run = readRun(path.join(activeRoot, entry.name));
799
+ const candidateTaskId = entry.name;
800
+ const candidateTaskDir = path.join(activeRoot, candidateTaskId);
801
+ emitDiagnostic(options, 'orchestration-active-scan-candidate', {
802
+ candidateTaskId,
803
+ candidateTaskDir,
804
+ orchestrationPath: orchestrationPath(candidateTaskDir)
805
+ });
806
+ let run;
807
+ try {
808
+ run = readRun(candidateTaskDir, options);
809
+ }
810
+ catch (error) {
811
+ emitDiagnostic(options, 'orchestration-active-scan-candidate-failed', {
812
+ candidateTaskId,
813
+ candidateTaskDir,
814
+ errorType: error instanceof Error ? error.name : typeof error,
815
+ reasonCodes: error instanceof OrchestrationStateError ? error.reasonCodes.join(',') : null
816
+ });
817
+ throw error;
818
+ }
728
819
  if (!run || run.status !== 'running' || !run.pendingDelegation)
729
820
  return [];
730
821
  const receipt = run.pendingDelegation;
731
822
  return predicate(receipt)
732
- ? [{ taskId: entry.name, run }]
823
+ ? [{ taskId: candidateTaskId, run }]
733
824
  : [];
734
825
  });
826
+ emitDiagnostic(options, 'orchestration-active-scan-finished', {
827
+ activeRoot,
828
+ matchingDelegations: matches.length
829
+ });
830
+ return matches;
735
831
  }
736
832
  function uniqueMatchingDelegation(client, predicate, options) {
737
833
  const matches = matchingDelegations((receipt) => receipt.client === client && predicate(receipt), options);
@@ -882,7 +978,7 @@ function activateOrchestrationDelegation(taskRef, event, options = {}) {
882
978
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
883
979
  if (!resolved.ok)
884
980
  return failed(resolved.code, resolved.message, resolved.taskId);
885
- const run = readRun(resolved.taskDir);
981
+ const run = readRun(resolved.taskDir, options);
886
982
  if (!run?.pendingDelegation)
887
983
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
888
984
  if (run.status !== 'running') {
@@ -908,7 +1004,7 @@ async function awaitOrchestrationDelegationActivation(taskRef, event, options =
908
1004
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
909
1005
  if (!resolved.ok)
910
1006
  return failed(resolved.code, resolved.message, resolved.taskId);
911
- const run = readRun(resolved.taskDir);
1007
+ const run = readRun(resolved.taskDir, options);
912
1008
  if (!run?.pendingDelegation) {
913
1009
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
914
1010
  }
@@ -945,7 +1041,7 @@ function recoverPreparedOrchestrationDelegation(taskRef, options = {}) {
945
1041
  return failed(resolved.code, resolved.message, resolved.taskId);
946
1042
  try {
947
1043
  return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-orchestration.recover-prepared', () => {
948
- const run = readRun(resolved.taskDir);
1044
+ const run = readRun(resolved.taskDir, options);
949
1045
  const receipt = run?.pendingDelegation;
950
1046
  if (!run || !receipt) {
951
1047
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
@@ -1001,7 +1097,7 @@ function completeOrchestrationStage(taskRef, event, options = {}) {
1001
1097
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1002
1098
  if (!resolved.ok)
1003
1099
  return failed(resolved.code, resolved.message, resolved.taskId);
1004
- const run = readRun(resolved.taskDir);
1100
+ const run = readRun(resolved.taskDir, options);
1005
1101
  if (!run)
1006
1102
  return { status: 'running', changed: false, taskId: resolved.taskId, run: null, next: null, error: null };
1007
1103
  if (!run.pendingDelegation)
@@ -1019,7 +1115,7 @@ function inspectOrchestrationStage(taskRef, event, options = {}) {
1019
1115
  return failed(resolved.code, resolved.message, resolved.taskId);
1020
1116
  let run;
1021
1117
  try {
1022
- run = readRun(resolved.taskDir);
1118
+ run = readRun(resolved.taskDir, options);
1023
1119
  }
1024
1120
  catch (error) {
1025
1121
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
@@ -1067,7 +1163,7 @@ function sealOrchestrationDelegation(taskRef, event, options = {}) {
1067
1163
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1068
1164
  if (!resolved.ok)
1069
1165
  return failed(resolved.code, resolved.message, resolved.taskId);
1070
- const run = readRun(resolved.taskDir);
1166
+ const run = readRun(resolved.taskDir, options);
1071
1167
  if (!run?.pendingDelegation)
1072
1168
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1073
1169
  const result = sealDelegation(run.pendingDelegation, event, { now: options.now });
@@ -1081,7 +1177,7 @@ function advanceOrchestration(taskRef, options = {}) {
1081
1177
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1082
1178
  if (!resolved.ok)
1083
1179
  return failed(resolved.code, resolved.message, resolved.taskId);
1084
- const run = readRun(resolved.taskDir);
1180
+ const run = readRun(resolved.taskDir, options);
1085
1181
  if (!run?.pendingDelegation)
1086
1182
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1087
1183
  const result = consumeDelegation(run.pendingDelegation, { now: options.now });
@@ -1104,7 +1200,7 @@ function pauseOrchestration(taskRef, code, message, recoverable, options = {}) {
1104
1200
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1105
1201
  if (!resolved.ok)
1106
1202
  return failed(resolved.code, resolved.message, resolved.taskId);
1107
- const run = readRun(resolved.taskDir);
1203
+ const run = readRun(resolved.taskDir, options);
1108
1204
  if (!run)
1109
1205
  return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
1110
1206
  const updated = withUpdatedRun(run, { status: 'paused', pause: { code, message, recoverable } });