@fitlab-ai/agent-infra 0.9.13 → 0.9.15

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 (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -1,6 +1,7 @@
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
+ import { artifactName, maxArtifactRound } from './artifact-name.js';
4
5
  import { parseTypedTaskFrontmatter } from './frontmatter.js';
5
6
  import { validateCurrentTaskContract } from './current-contract.js';
6
7
  import { parseReviewSummary } from './review-artifacts.js';
@@ -33,10 +34,12 @@ const ORCHESTRATION_STATE_INVALID_MESSAGE = 'orchestration.json does not match t
33
34
  class OrchestrationStateError extends Error {
34
35
  code = 'ORCHESTRATION_STATE_INVALID';
35
36
  taskId;
36
- constructor(taskId = null) {
37
+ reasonCodes;
38
+ constructor(taskId = null, reasonCodes = []) {
37
39
  super(ORCHESTRATION_STATE_INVALID_MESSAGE);
38
40
  this.name = 'OrchestrationStateError';
39
41
  this.taskId = taskId;
42
+ this.reasonCodes = Object.freeze([...reasonCodes]);
40
43
  }
41
44
  }
42
45
  function isRecord(value) {
@@ -99,7 +102,7 @@ function isRecovery(value) {
99
102
  && guards.completionEvidenceAbsent === true
100
103
  && value.resultingStatus === 'running';
101
104
  }
102
- function isCompletionEvidence(value) {
105
+ export function isCompletionEvidence(value) {
103
106
  return hasExactKeys(value, [
104
107
  'kind', 'observedAt', 'head', 'headTree', 'worktreeTree', 'lastReviewedCommit', 'prNumber', 'prHead'
105
108
  ])
@@ -117,48 +120,151 @@ const ORCHESTRATION_RUN_KEYS = [
117
120
  'modelPolicySource', 'recoveryHistory', 'baseline', 'pendingDelegation', 'receipts',
118
121
  'pause', 'commitAuthorization', 'completionEvidence', 'createdAt', 'updatedAt'
119
122
  ];
120
- function parseOrchestrationRun(value, expectedTaskId) {
121
- if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)
122
- || !exactText(value.taskId)
123
- || (expectedTaskId !== undefined && value.taskId !== expectedTaskId)
124
- || !exactText(value.runId)
125
- || !['running', 'paused', 'completed'].includes(value.status)
126
- || !(value.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(value.nextStage))
127
- || !Number.isSafeInteger(value.stepCount) || value.stepCount < 0
128
- || !Number.isSafeInteger(value.maxSteps) || value.maxSteps < 1
129
- || !isModelPolicy(value.modelPolicy)
130
- || !isModelPolicySource(value.modelPolicySource)
131
- || !Array.isArray(value.recoveryHistory) || !value.recoveryHistory.every(isRecovery)
132
- || typeof value.baseline !== 'string'
133
- || !(value.pendingDelegation === null || isDelegationReceipt(value.pendingDelegation))
134
- || !Array.isArray(value.receipts) || !value.receipts.every(isDelegationReceipt)
135
- || !(value.pause === null || isPause(value.pause))
136
- || !hasExactKeys(value.commitAuthorization, ['issuedAt', 'consumedAt'])
137
- || !nullableText(value.commitAuthorization.issuedAt)
138
- || !nullableText(value.commitAuthorization.consumedAt)
139
- || !(value.completionEvidence === null || isCompletionEvidence(value.completionEvidence))
140
- || !exactText(value.createdAt)
141
- || !exactText(value.updatedAt)) {
142
- throw new OrchestrationStateError();
143
- }
144
- const receipts = [...value.receipts, ...(value.pendingDelegation ? [value.pendingDelegation] : [])];
145
- if (receipts.some((receipt) => receipt.taskId !== value.taskId || receipt.runId !== value.runId)) {
146
- throw new OrchestrationStateError();
123
+ function orchestrationStateReasonCodes(value, expectedTaskId) {
124
+ if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS))
125
+ return ['top-level-keys'];
126
+ const record = value;
127
+ const reasons = [];
128
+ if (!exactText(record.taskId))
129
+ reasons.push('taskId');
130
+ else if (expectedTaskId !== undefined && record.taskId !== expectedTaskId)
131
+ reasons.push('taskId-mismatch');
132
+ if (!exactText(record.runId))
133
+ reasons.push('runId');
134
+ if (!['running', 'paused', 'completed'].includes(record.status))
135
+ reasons.push('status');
136
+ if (!(record.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(record.nextStage))) {
137
+ reasons.push('nextStage');
138
+ }
139
+ if (!Number.isSafeInteger(record.stepCount) || record.stepCount < 0)
140
+ reasons.push('stepCount');
141
+ if (!Number.isSafeInteger(record.maxSteps) || record.maxSteps < 1)
142
+ reasons.push('maxSteps');
143
+ if (!isModelPolicy(record.modelPolicy))
144
+ reasons.push('modelPolicy');
145
+ if (!isModelPolicySource(record.modelPolicySource))
146
+ reasons.push('modelPolicySource');
147
+ if (!Array.isArray(record.recoveryHistory) || !record.recoveryHistory.every(isRecovery))
148
+ reasons.push('recoveryHistory');
149
+ if (typeof record.baseline !== 'string')
150
+ reasons.push('baseline');
151
+ if (!(record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation)))
152
+ reasons.push('pendingDelegation');
153
+ if (!Array.isArray(record.receipts) || !record.receipts.every(isDelegationReceipt))
154
+ reasons.push('receipts');
155
+ if (!(record.pause === null || isPause(record.pause)))
156
+ reasons.push('pause');
157
+ if (!hasExactKeys(record.commitAuthorization, ['issuedAt', 'consumedAt'])) {
158
+ reasons.push('commitAuthorization');
159
+ }
160
+ else {
161
+ if (!nullableText(record.commitAuthorization.issuedAt))
162
+ reasons.push('commitAuthorization.issuedAt');
163
+ if (!nullableText(record.commitAuthorization.consumedAt))
164
+ reasons.push('commitAuthorization.consumedAt');
165
+ }
166
+ if (!(record.completionEvidence === null || isCompletionEvidence(record.completionEvidence)))
167
+ reasons.push('completionEvidence');
168
+ if (!exactText(record.createdAt))
169
+ reasons.push('createdAt');
170
+ if (!exactText(record.updatedAt))
171
+ reasons.push('updatedAt');
172
+ if (Array.isArray(record.receipts) && record.receipts.every(isDelegationReceipt)
173
+ && (record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) {
174
+ const receipts = [...record.receipts, ...(record.pendingDelegation ? [record.pendingDelegation] : [])];
175
+ if (receipts.some((receipt) => receipt.taskId !== record.taskId || receipt.runId !== record.runId)) {
176
+ reasons.push('receipt-identity');
177
+ }
147
178
  }
179
+ return reasons;
180
+ }
181
+ function emitDiagnostic(options, event, fields) {
182
+ try {
183
+ options?.diagnosticLog?.(event, fields);
184
+ }
185
+ catch {
186
+ // Diagnostics must never change lifecycle behavior.
187
+ }
188
+ }
189
+ function fileObservation(file) {
190
+ try {
191
+ const stat = fs.lstatSync(file);
192
+ let realpath = null;
193
+ try {
194
+ realpath = fs.realpathSync.native(file);
195
+ }
196
+ catch { /* retain the lstat observation */ }
197
+ return {
198
+ file,
199
+ exists: true,
200
+ fileType: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',
201
+ symbolicLink: stat.isSymbolicLink(),
202
+ bytes: stat.isFile() ? stat.size : null,
203
+ mtimeMs: stat.mtimeMs,
204
+ device: stat.dev,
205
+ inode: stat.ino,
206
+ realpath
207
+ };
208
+ }
209
+ catch (error) {
210
+ return {
211
+ file,
212
+ exists: false,
213
+ fileType: null,
214
+ symbolicLink: null,
215
+ bytes: null,
216
+ mtimeMs: null,
217
+ device: null,
218
+ inode: null,
219
+ realpath: null,
220
+ fsError: error instanceof Error && 'code' in error ? String(error.code) : null
221
+ };
222
+ }
223
+ }
224
+ function parseOrchestrationRun(value, expectedTaskId) {
225
+ const reasonCodes = orchestrationStateReasonCodes(value, expectedTaskId);
226
+ if (reasonCodes.length > 0)
227
+ throw new OrchestrationStateError(expectedTaskId ?? null, reasonCodes);
148
228
  return value;
149
229
  }
150
- function readRun(taskDir) {
230
+ function readRun(taskDir, options = {}) {
151
231
  const file = orchestrationPath(taskDir);
152
- if (!fs.existsSync(file))
153
- return null;
154
232
  const taskId = path.basename(taskDir);
233
+ const observed = options.diagnosticLog ? fileObservation(file) : {};
234
+ if (!fs.existsSync(file)) {
235
+ emitDiagnostic(options, 'orchestration-state-missing', { taskId, taskDir, ...observed });
236
+ return null;
237
+ }
238
+ emitDiagnostic(options, 'orchestration-state-read-start', { taskId, taskDir, ...observed });
239
+ let rawBytes = null;
240
+ let rawSha256 = null;
155
241
  try {
156
- return parseOrchestrationRun(JSON.parse(fs.readFileSync(file, 'utf8')), taskId);
242
+ const raw = fs.readFileSync(file, 'utf8');
243
+ if (options.diagnosticLog) {
244
+ rawBytes = Buffer.byteLength(raw, 'utf8');
245
+ rawSha256 = createHash('sha256').update(raw, 'utf8').digest('hex');
246
+ }
247
+ const run = parseOrchestrationRun(JSON.parse(raw), taskId);
248
+ emitDiagnostic(options, 'orchestration-state-read-ok', {
249
+ taskId, taskDir, file, rawBytes, rawSha256, status: run.status, runId: run.runId,
250
+ stepCount: run.stepCount, pendingDelegation: run.pendingDelegation !== null
251
+ });
252
+ return run;
157
253
  }
158
254
  catch (error) {
159
- if (error instanceof OrchestrationStateError)
160
- throw new OrchestrationStateError(taskId);
161
- throw new OrchestrationStateError(taskId);
255
+ const reasonCodes = error instanceof OrchestrationStateError && error.reasonCodes.length > 0
256
+ ? error.reasonCodes
257
+ : [error instanceof SyntaxError ? 'json-parse' : 'file-read'];
258
+ emitDiagnostic(options, 'orchestration-state-read-failed', {
259
+ taskId,
260
+ taskDir,
261
+ ...observed,
262
+ rawBytes,
263
+ rawSha256,
264
+ reasonCodes: reasonCodes.join(','),
265
+ errorType: error instanceof Error ? error.name : typeof error,
266
+ });
267
+ throw new OrchestrationStateError(taskId, reasonCodes);
162
268
  }
163
269
  }
164
270
  function atomicWrite(file, value) {
@@ -232,7 +338,7 @@ function beginOrResumeOrchestration(taskRef, options = {}) {
232
338
  }
233
339
  let existing;
234
340
  try {
235
- existing = readRun(resolved.taskDir);
341
+ existing = readRun(resolved.taskDir, options);
236
342
  }
237
343
  catch (error) {
238
344
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
@@ -332,18 +438,8 @@ function beginOrResumeOrchestration(taskRef, options = {}) {
332
438
  atomicWrite(orchestrationPath(resolved.taskDir), run);
333
439
  return { status: 'running', changed: true, taskId: resolved.taskId, run, next: null, error: null };
334
440
  }
335
- function highestRound(taskDir, family) {
336
- const pattern = new RegExp(`^${family}(?:-r(\\d+))?\\.md$`);
337
- return fs.readdirSync(taskDir).reduce((max, name) => {
338
- const match = pattern.exec(name);
339
- return match ? Math.max(max, match[1] ? Number(match[1]) : 1) : max;
340
- }, 0);
341
- }
342
- function artifactName(family, round) {
343
- return round === 1 ? `${family}.md` : `${family}-r${round}.md`;
344
- }
345
441
  function validateSavedCurrentDiffBase(repoRoot, metadata, taskDir, reviewedHead) {
346
- const reviewRound = highestRound(taskDir, 'review-code');
442
+ const reviewRound = maxArtifactRound(fs.readdirSync(taskDir), 'review-code');
347
443
  const reviewContent = fs.readFileSync(path.join(taskDir, artifactName('review-code', reviewRound)), 'utf8');
348
444
  const savedTargetHead = extractReviewTargetHead(reviewContent);
349
445
  const savedDiffBase = extractReviewDiffBase(reviewContent);
@@ -387,10 +483,9 @@ function routeFromFacts(facts) {
387
483
  if (action === 'manual-validation' || action === 'validation-run')
388
484
  return null;
389
485
  const family = action === 'analysis' ? 'analysis' : action;
390
- const round = Math.max(0, ...[...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])].map((name) => {
391
- const match = /-r(\d+)\.md$/.exec(name);
392
- return match ? Number(match[1]) : 1;
393
- })) + 1;
486
+ const round = maxArtifactRound([
487
+ ...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])
488
+ ], family) + 1;
394
489
  const command = action === 'analysis' ? 'analyze-task' : action === 'plan' ? 'plan-task' : action === 'code' ? 'code-task' : action;
395
490
  const role = action.startsWith('review-') ? 'reviewer' : 'executor';
396
491
  return { action: command, role, stage: action, round, artifact: artifactName(family, round) };
@@ -437,7 +532,7 @@ function routeOrchestration(taskRef, options = {}) {
437
532
  }
438
533
  let run;
439
534
  try {
440
- run = readRun(resolved.taskDir);
535
+ run = readRun(resolved.taskDir, options);
441
536
  }
442
537
  catch (error) {
443
538
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
@@ -449,7 +544,7 @@ function routeOrchestration(taskRef, options = {}) {
449
544
  if (!routed)
450
545
  return failed('ORCHESTRATION_ROUTE_UNKNOWN', 'cannot determine a unique lifecycle action', resolved.taskId);
451
546
  if ('completion' in routed) {
452
- const reviewRound = highestRound(resolved.taskDir, 'review-code');
547
+ const reviewRound = maxArtifactRound(fs.readdirSync(resolved.taskDir), 'review-code');
453
548
  const review = parseReviewSummary(fs.readFileSync(path.join(resolved.taskDir, artifactName('review-code', reviewRound)), 'utf8'));
454
549
  if (!review.ok || review.summary.manualValidation === null) {
455
550
  return failed('ORCHESTRATION_REVIEW_INVALID', 'latest code review has no numeric manual-validation count', resolved.taskId);
@@ -543,7 +638,7 @@ function statusOrchestration(taskRef, options = {}) {
543
638
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
544
639
  if (!resolved.ok)
545
640
  return failed(resolved.code, resolved.message, resolved.taskId);
546
- const run = readRun(resolved.taskDir);
641
+ const run = readRun(resolved.taskDir, options);
547
642
  if (!run)
548
643
  return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
549
644
  return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
@@ -555,7 +650,15 @@ function prepareOrchestrationDelegationUnlocked(taskRef, input, options = {}) {
555
650
  if (!(options.supportsLifecycleDelegation ?? supportsLifecycleDelegation)(input.client)) {
556
651
  return failed('ORCHESTRATION_CLIENT_UNSUPPORTED', `client '${input.client}' does not support lifecycle orchestration`, resolved.taskId);
557
652
  }
558
- const run = readRun(resolved.taskDir);
653
+ emitDiagnostic(options, 'orchestration-prepare-start', {
654
+ taskId: resolved.taskId,
655
+ taskDir: resolved.taskDir,
656
+ repoRoot: resolved.repoRoot,
657
+ client: input.client,
658
+ requestedModel: input.requestedModel ?? null,
659
+ requestedReasoningEffort: input.requestedReasoningEffort ?? null
660
+ });
661
+ const run = readRun(resolved.taskDir, options);
559
662
  if (!run || run.status !== 'running')
560
663
  return failed('ORCHESTRATION_RUN_NOT_RUNNING', 'a running orchestration is required', resolved.taskId);
561
664
  if (run.pendingDelegation)
@@ -579,6 +682,13 @@ function prepareOrchestrationDelegationUnlocked(taskRef, input, options = {}) {
579
682
  if (input.client === 'codex' && !input.lifecycleProvenance) {
580
683
  return failed('ORCHESTRATION_CODEX_PROVENANCE_REQUIRED', 'Codex prepare requires lifecycle provenance', resolved.taskId);
581
684
  }
685
+ if (input.lifecycleRecoveryAttestation
686
+ && (input.lifecycleRecoveryAttestation.phase !== 'orchestration.prepare'
687
+ || input.lifecycleRecoveryAttestation.taskId !== resolved.taskId
688
+ || input.lifecycleRecoveryAttestation.artifact !== next.artifact
689
+ || input.lifecycleRecoveryAttestation.round !== next.round)) {
690
+ return failed('LIFECYCLE_AUTHORITY_TUPLE_MISMATCH', 'orchestration authority does not match the routed stage', resolved.taskId);
691
+ }
582
692
  const expectedPolicy = run.modelPolicy[next.role];
583
693
  if (input.requestedModel !== expectedPolicy.model) {
584
694
  return failed('ORCHESTRATION_REQUESTED_MODEL_MISMATCH', `requested model does not match the persisted ${next.role} model`, resolved.taskId);
@@ -643,7 +753,7 @@ function dispatchOrchestrationDelegationUnlocked(taskRef, options = {}) {
643
753
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
644
754
  if (!resolved.ok)
645
755
  return failed(resolved.code, resolved.message, resolved.taskId);
646
- const run = readRun(resolved.taskDir);
756
+ const run = readRun(resolved.taskDir, options);
647
757
  if (!run?.pendingDelegation)
648
758
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
649
759
  if (run.status !== 'running') {
@@ -677,17 +787,44 @@ function matchingDelegations(predicate, options) {
677
787
  const activeRoot = path.join(repoRoot, '.agents', 'workspace', 'active');
678
788
  if (!fs.existsSync(activeRoot))
679
789
  return [];
680
- return fs.readdirSync(activeRoot, { withFileTypes: true })
790
+ emitDiagnostic(options, 'orchestration-active-scan-start', {
791
+ activeRoot
792
+ });
793
+ const matches = fs.readdirSync(activeRoot, { withFileTypes: true })
681
794
  .filter((entry) => entry.isDirectory())
682
795
  .flatMap((entry) => {
683
- const run = readRun(path.join(activeRoot, entry.name));
796
+ const candidateTaskId = entry.name;
797
+ const candidateTaskDir = path.join(activeRoot, candidateTaskId);
798
+ emitDiagnostic(options, 'orchestration-active-scan-candidate', {
799
+ candidateTaskId,
800
+ candidateTaskDir,
801
+ orchestrationPath: orchestrationPath(candidateTaskDir)
802
+ });
803
+ let run;
804
+ try {
805
+ run = readRun(candidateTaskDir, options);
806
+ }
807
+ catch (error) {
808
+ emitDiagnostic(options, 'orchestration-active-scan-candidate-failed', {
809
+ candidateTaskId,
810
+ candidateTaskDir,
811
+ errorType: error instanceof Error ? error.name : typeof error,
812
+ reasonCodes: error instanceof OrchestrationStateError ? error.reasonCodes.join(',') : null
813
+ });
814
+ throw error;
815
+ }
684
816
  if (!run || run.status !== 'running' || !run.pendingDelegation)
685
817
  return [];
686
818
  const receipt = run.pendingDelegation;
687
819
  return predicate(receipt)
688
- ? [{ taskId: entry.name, run }]
820
+ ? [{ taskId: candidateTaskId, run }]
689
821
  : [];
690
822
  });
823
+ emitDiagnostic(options, 'orchestration-active-scan-finished', {
824
+ activeRoot,
825
+ matchingDelegations: matches.length
826
+ });
827
+ return matches;
691
828
  }
692
829
  function uniqueMatchingDelegation(client, predicate, options) {
693
830
  const matches = matchingDelegations((receipt) => receipt.client === client && predicate(receipt), options);
@@ -838,7 +975,7 @@ function activateOrchestrationDelegation(taskRef, event, options = {}) {
838
975
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
839
976
  if (!resolved.ok)
840
977
  return failed(resolved.code, resolved.message, resolved.taskId);
841
- const run = readRun(resolved.taskDir);
978
+ const run = readRun(resolved.taskDir, options);
842
979
  if (!run?.pendingDelegation)
843
980
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
844
981
  if (run.status !== 'running') {
@@ -864,7 +1001,7 @@ async function awaitOrchestrationDelegationActivation(taskRef, event, options =
864
1001
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
865
1002
  if (!resolved.ok)
866
1003
  return failed(resolved.code, resolved.message, resolved.taskId);
867
- const run = readRun(resolved.taskDir);
1004
+ const run = readRun(resolved.taskDir, options);
868
1005
  if (!run?.pendingDelegation) {
869
1006
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
870
1007
  }
@@ -901,7 +1038,7 @@ function recoverPreparedOrchestrationDelegation(taskRef, options = {}) {
901
1038
  return failed(resolved.code, resolved.message, resolved.taskId);
902
1039
  try {
903
1040
  return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-orchestration.recover-prepared', () => {
904
- const run = readRun(resolved.taskDir);
1041
+ const run = readRun(resolved.taskDir, options);
905
1042
  const receipt = run?.pendingDelegation;
906
1043
  if (!run || !receipt) {
907
1044
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
@@ -957,7 +1094,7 @@ function completeOrchestrationStage(taskRef, event, options = {}) {
957
1094
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
958
1095
  if (!resolved.ok)
959
1096
  return failed(resolved.code, resolved.message, resolved.taskId);
960
- const run = readRun(resolved.taskDir);
1097
+ const run = readRun(resolved.taskDir, options);
961
1098
  if (!run)
962
1099
  return { status: 'running', changed: false, taskId: resolved.taskId, run: null, next: null, error: null };
963
1100
  if (!run.pendingDelegation)
@@ -975,7 +1112,7 @@ function inspectOrchestrationStage(taskRef, event, options = {}) {
975
1112
  return failed(resolved.code, resolved.message, resolved.taskId);
976
1113
  let run;
977
1114
  try {
978
- run = readRun(resolved.taskDir);
1115
+ run = readRun(resolved.taskDir, options);
979
1116
  }
980
1117
  catch (error) {
981
1118
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
@@ -1023,7 +1160,7 @@ function sealOrchestrationDelegation(taskRef, event, options = {}) {
1023
1160
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1024
1161
  if (!resolved.ok)
1025
1162
  return failed(resolved.code, resolved.message, resolved.taskId);
1026
- const run = readRun(resolved.taskDir);
1163
+ const run = readRun(resolved.taskDir, options);
1027
1164
  if (!run?.pendingDelegation)
1028
1165
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1029
1166
  const result = sealDelegation(run.pendingDelegation, event, { now: options.now });
@@ -1037,7 +1174,7 @@ function advanceOrchestration(taskRef, options = {}) {
1037
1174
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1038
1175
  if (!resolved.ok)
1039
1176
  return failed(resolved.code, resolved.message, resolved.taskId);
1040
- const run = readRun(resolved.taskDir);
1177
+ const run = readRun(resolved.taskDir, options);
1041
1178
  if (!run?.pendingDelegation)
1042
1179
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1043
1180
  const result = consumeDelegation(run.pendingDelegation, { now: options.now });
@@ -1060,7 +1197,7 @@ function pauseOrchestration(taskRef, code, message, recoverable, options = {}) {
1060
1197
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1061
1198
  if (!resolved.ok)
1062
1199
  return failed(resolved.code, resolved.message, resolved.taskId);
1063
- const run = readRun(resolved.taskDir);
1200
+ const run = readRun(resolved.taskDir, options);
1064
1201
  if (!run)
1065
1202
  return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
1066
1203
  const updated = withUpdatedRun(run, { status: 'paused', pause: { code, message, recoverable } });