@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,7 +1,8 @@
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
 
5
+ import { artifactName, maxArtifactRound } from './artifact-name.ts';
5
6
  import { parseTypedTaskFrontmatter } from './frontmatter.ts';
6
7
  import { validateCurrentTaskContract } from './current-contract.ts';
7
8
  import { parseReviewSummary } from './review-artifacts.ts';
@@ -39,6 +40,7 @@ import type {
39
40
  OrchestrationModelPolicy,
40
41
  OrchestrationRolePolicy
41
42
  } from '../agent-clients/types.ts';
43
+ import type { LifecycleRecoveryAttestationV1 } from './control-authority.ts';
42
44
  import {
43
45
  captureRepositorySnapshot,
44
46
  captureWorkspaceSnapshot,
@@ -154,6 +156,7 @@ type OrchestrationCompletionPlanResult = Readonly<{
154
156
  type OrchestrationOptions = {
155
157
  repoRoot?: string;
156
158
  gitWorktreeRoot?: string;
159
+ diagnosticLog?: OrchestrationDiagnosticLogger;
157
160
  id?: () => string;
158
161
  now?: () => string;
159
162
  maxSteps?: number;
@@ -172,12 +175,17 @@ type OrchestrationOptions = {
172
175
  supportsLifecycleDelegation?: (client: AgentClientId) => boolean;
173
176
  validateLifecycleCapability?: () => Exclude<OrchestrationResult['error'], null> | null;
174
177
  consumeLifecycleCapability?: () => Exclude<OrchestrationResult['error'], null> | null;
178
+ lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
175
179
  token?: () => string;
176
180
  monotonicNow?: () => number;
177
181
  sleep?: (milliseconds: number) => Promise<void>;
178
182
  hasActiveLifecycleEvidence?: (receipt: DelegationReceipt) => boolean;
179
183
  };
180
184
 
185
+ export type OrchestrationDiagnosticValue = string | number | boolean | null;
186
+ export type OrchestrationDiagnosticFields = Readonly<Record<string, OrchestrationDiagnosticValue>>;
187
+ export type OrchestrationDiagnosticLogger = (event: string, fields: OrchestrationDiagnosticFields) => void;
188
+
181
189
  function supportsLifecycleDelegation(client: AgentClientId): boolean {
182
190
  return getAgentClientCapability(client, 'subagents').level !== 'unsupported'
183
191
  && getAgentClientCapability(client, 'orchestration').level !== 'unsupported'
@@ -194,11 +202,13 @@ const ORCHESTRATION_STATE_INVALID_MESSAGE = 'orchestration.json does not match t
194
202
  class OrchestrationStateError extends Error {
195
203
  readonly code = 'ORCHESTRATION_STATE_INVALID';
196
204
  readonly taskId: string | null;
205
+ readonly reasonCodes: readonly string[];
197
206
 
198
- constructor(taskId: string | null = null) {
207
+ constructor(taskId: string | null = null, reasonCodes: readonly string[] = []) {
199
208
  super(ORCHESTRATION_STATE_INVALID_MESSAGE);
200
209
  this.name = 'OrchestrationStateError';
201
210
  this.taskId = taskId;
211
+ this.reasonCodes = Object.freeze([...reasonCodes]);
202
212
  }
203
213
  }
204
214
 
@@ -268,7 +278,7 @@ function isRecovery(value: unknown): value is OrchestrationRecovery {
268
278
  && value.resultingStatus === 'running';
269
279
  }
270
280
 
271
- function isCompletionEvidence(value: unknown): value is CleanCompletionEvidence {
281
+ export function isCompletionEvidence(value: unknown): value is CleanCompletionEvidence {
272
282
  return hasExactKeys(value, [
273
283
  'kind', 'observedAt', 'head', 'headTree', 'worktreeTree', 'lastReviewedCommit', 'prNumber', 'prHead'
274
284
  ])
@@ -288,46 +298,128 @@ const ORCHESTRATION_RUN_KEYS = [
288
298
  'pause', 'commitAuthorization', 'completionEvidence', 'createdAt', 'updatedAt'
289
299
  ] as const;
290
300
 
291
- function parseOrchestrationRun(value: unknown, expectedTaskId?: string): OrchestrationRun {
292
- if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)
293
- || !exactText(value.taskId)
294
- || (expectedTaskId !== undefined && value.taskId !== expectedTaskId)
295
- || !exactText(value.runId)
296
- || !['running', 'paused', 'completed'].includes(value.status as string)
297
- || !(value.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(value.nextStage as string))
298
- || !Number.isSafeInteger(value.stepCount) || (value.stepCount as number) < 0
299
- || !Number.isSafeInteger(value.maxSteps) || (value.maxSteps as number) < 1
300
- || !isModelPolicy(value.modelPolicy)
301
- || !isModelPolicySource(value.modelPolicySource)
302
- || !Array.isArray(value.recoveryHistory) || !value.recoveryHistory.every(isRecovery)
303
- || typeof value.baseline !== 'string'
304
- || !(value.pendingDelegation === null || isDelegationReceipt(value.pendingDelegation))
305
- || !Array.isArray(value.receipts) || !value.receipts.every(isDelegationReceipt)
306
- || !(value.pause === null || isPause(value.pause))
307
- || !hasExactKeys(value.commitAuthorization, ['issuedAt', 'consumedAt'])
308
- || !nullableText(value.commitAuthorization.issuedAt)
309
- || !nullableText(value.commitAuthorization.consumedAt)
310
- || !(value.completionEvidence === null || isCompletionEvidence(value.completionEvidence))
311
- || !exactText(value.createdAt)
312
- || !exactText(value.updatedAt)) {
313
- throw new OrchestrationStateError();
301
+ function orchestrationStateReasonCodes(value: unknown, expectedTaskId?: string): string[] {
302
+ if (!hasExactKeys(value, ORCHESTRATION_RUN_KEYS)) return ['top-level-keys'];
303
+ const record = value;
304
+ const reasons: string[] = [];
305
+ if (!exactText(record.taskId)) reasons.push('taskId');
306
+ else if (expectedTaskId !== undefined && record.taskId !== expectedTaskId) reasons.push('taskId-mismatch');
307
+ if (!exactText(record.runId)) reasons.push('runId');
308
+ if (!['running', 'paused', 'completed'].includes(record.status as string)) reasons.push('status');
309
+ if (!(record.nextStage === null || ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code', 'commit'].includes(record.nextStage as string))) {
310
+ reasons.push('nextStage');
311
+ }
312
+ if (!Number.isSafeInteger(record.stepCount) || (record.stepCount as number) < 0) reasons.push('stepCount');
313
+ if (!Number.isSafeInteger(record.maxSteps) || (record.maxSteps as number) < 1) reasons.push('maxSteps');
314
+ if (!isModelPolicy(record.modelPolicy)) reasons.push('modelPolicy');
315
+ if (!isModelPolicySource(record.modelPolicySource)) reasons.push('modelPolicySource');
316
+ if (!Array.isArray(record.recoveryHistory) || !record.recoveryHistory.every(isRecovery)) reasons.push('recoveryHistory');
317
+ if (typeof record.baseline !== 'string') reasons.push('baseline');
318
+ if (!(record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) reasons.push('pendingDelegation');
319
+ if (!Array.isArray(record.receipts) || !record.receipts.every(isDelegationReceipt)) reasons.push('receipts');
320
+ if (!(record.pause === null || isPause(record.pause))) reasons.push('pause');
321
+ if (!hasExactKeys(record.commitAuthorization, ['issuedAt', 'consumedAt'])) {
322
+ reasons.push('commitAuthorization');
323
+ } else {
324
+ if (!nullableText(record.commitAuthorization.issuedAt)) reasons.push('commitAuthorization.issuedAt');
325
+ if (!nullableText(record.commitAuthorization.consumedAt)) reasons.push('commitAuthorization.consumedAt');
326
+ }
327
+ if (!(record.completionEvidence === null || isCompletionEvidence(record.completionEvidence))) reasons.push('completionEvidence');
328
+ if (!exactText(record.createdAt)) reasons.push('createdAt');
329
+ if (!exactText(record.updatedAt)) reasons.push('updatedAt');
330
+ if (Array.isArray(record.receipts) && record.receipts.every(isDelegationReceipt)
331
+ && (record.pendingDelegation === null || isDelegationReceipt(record.pendingDelegation))) {
332
+ const receipts = [...record.receipts, ...(record.pendingDelegation ? [record.pendingDelegation] : [])];
333
+ if (receipts.some((receipt) => receipt.taskId !== record.taskId || receipt.runId !== record.runId)) {
334
+ reasons.push('receipt-identity');
335
+ }
336
+ }
337
+ return reasons;
338
+ }
339
+
340
+ function emitDiagnostic(options: Pick<OrchestrationOptions, 'diagnosticLog'> | undefined, event: string, fields: OrchestrationDiagnosticFields): void {
341
+ try {
342
+ options?.diagnosticLog?.(event, fields);
343
+ } catch {
344
+ // Diagnostics must never change lifecycle behavior.
314
345
  }
315
- const receipts = [...value.receipts, ...(value.pendingDelegation ? [value.pendingDelegation] : [])];
316
- if (receipts.some((receipt) => receipt.taskId !== value.taskId || receipt.runId !== value.runId)) {
317
- throw new OrchestrationStateError();
346
+ }
347
+
348
+ function fileObservation(file: string): OrchestrationDiagnosticFields {
349
+ try {
350
+ const stat = fs.lstatSync(file);
351
+ let realpath: string | null = null;
352
+ try { realpath = fs.realpathSync.native(file); } catch { /* retain the lstat observation */ }
353
+ return {
354
+ file,
355
+ exists: true,
356
+ fileType: stat.isFile() ? 'file' : stat.isDirectory() ? 'directory' : 'other',
357
+ symbolicLink: stat.isSymbolicLink(),
358
+ bytes: stat.isFile() ? stat.size : null,
359
+ mtimeMs: stat.mtimeMs,
360
+ device: stat.dev,
361
+ inode: stat.ino,
362
+ realpath
363
+ };
364
+ } catch (error) {
365
+ return {
366
+ file,
367
+ exists: false,
368
+ fileType: null,
369
+ symbolicLink: null,
370
+ bytes: null,
371
+ mtimeMs: null,
372
+ device: null,
373
+ inode: null,
374
+ realpath: null,
375
+ fsError: error instanceof Error && 'code' in error ? String(error.code) : null
376
+ };
318
377
  }
378
+ }
379
+
380
+ function parseOrchestrationRun(value: unknown, expectedTaskId?: string): OrchestrationRun {
381
+ const reasonCodes = orchestrationStateReasonCodes(value, expectedTaskId);
382
+ if (reasonCodes.length > 0) throw new OrchestrationStateError(expectedTaskId ?? null, reasonCodes);
319
383
  return value as OrchestrationRun;
320
384
  }
321
385
 
322
- function readRun(taskDir: string): OrchestrationRun | null {
386
+ function readRun(taskDir: string, options: Pick<OrchestrationOptions, 'diagnosticLog'> = {}): OrchestrationRun | null {
323
387
  const file = orchestrationPath(taskDir);
324
- if (!fs.existsSync(file)) return null;
325
388
  const taskId = path.basename(taskDir);
389
+ const observed = options.diagnosticLog ? fileObservation(file) : {};
390
+ if (!fs.existsSync(file)) {
391
+ emitDiagnostic(options, 'orchestration-state-missing', { taskId, taskDir, ...observed });
392
+ return null;
393
+ }
394
+ emitDiagnostic(options, 'orchestration-state-read-start', { taskId, taskDir, ...observed });
395
+ let rawBytes: number | null = null;
396
+ let rawSha256: string | null = null;
326
397
  try {
327
- return parseOrchestrationRun(JSON.parse(fs.readFileSync(file, 'utf8')), taskId);
398
+ const raw = fs.readFileSync(file, 'utf8');
399
+ if (options.diagnosticLog) {
400
+ rawBytes = Buffer.byteLength(raw, 'utf8');
401
+ rawSha256 = createHash('sha256').update(raw, 'utf8').digest('hex');
402
+ }
403
+ const run = parseOrchestrationRun(JSON.parse(raw), taskId);
404
+ emitDiagnostic(options, 'orchestration-state-read-ok', {
405
+ taskId, taskDir, file, rawBytes, rawSha256, status: run.status, runId: run.runId,
406
+ stepCount: run.stepCount, pendingDelegation: run.pendingDelegation !== null
407
+ });
408
+ return run;
328
409
  } catch (error) {
329
- if (error instanceof OrchestrationStateError) throw new OrchestrationStateError(taskId);
330
- throw new OrchestrationStateError(taskId);
410
+ const reasonCodes = error instanceof OrchestrationStateError && error.reasonCodes.length > 0
411
+ ? error.reasonCodes
412
+ : [error instanceof SyntaxError ? 'json-parse' : 'file-read'];
413
+ emitDiagnostic(options, 'orchestration-state-read-failed', {
414
+ taskId,
415
+ taskDir,
416
+ ...observed,
417
+ rawBytes,
418
+ rawSha256,
419
+ reasonCodes: reasonCodes.join(','),
420
+ errorType: error instanceof Error ? error.name : typeof error,
421
+ });
422
+ throw new OrchestrationStateError(taskId, reasonCodes);
331
423
  }
332
424
  }
333
425
 
@@ -417,7 +509,7 @@ function beginOrResumeOrchestration(taskRef: string, options: OrchestrationOptio
417
509
  }
418
510
  let existing: OrchestrationRun | null;
419
511
  try {
420
- existing = readRun(resolved.taskDir);
512
+ existing = readRun(resolved.taskDir, options);
421
513
  } catch (error) {
422
514
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
423
515
  }
@@ -515,25 +607,13 @@ function beginOrResumeOrchestration(taskRef: string, options: OrchestrationOptio
515
607
  return { status: 'running', changed: true, taskId: resolved.taskId, run, next: null, error: null };
516
608
  }
517
609
 
518
- function highestRound(taskDir: string, family: string): number {
519
- const pattern = new RegExp(`^${family}(?:-r(\\d+))?\\.md$`);
520
- return fs.readdirSync(taskDir).reduce((max, name) => {
521
- const match = pattern.exec(name);
522
- return match ? Math.max(max, match[1] ? Number(match[1]) : 1) : max;
523
- }, 0);
524
- }
525
-
526
- function artifactName(family: string, round: number): string {
527
- return round === 1 ? `${family}.md` : `${family}-r${round}.md`;
528
- }
529
-
530
610
  function validateSavedCurrentDiffBase(
531
611
  repoRoot: string,
532
612
  metadata: ReturnType<typeof parseTypedTaskFrontmatter>,
533
613
  taskDir: string,
534
614
  reviewedHead: string
535
615
  ): Readonly<{ code: string; message: string }> | null {
536
- const reviewRound = highestRound(taskDir, 'review-code');
616
+ const reviewRound = maxArtifactRound(fs.readdirSync(taskDir), 'review-code');
537
617
  const reviewContent = fs.readFileSync(path.join(taskDir, artifactName('review-code', reviewRound)), 'utf8');
538
618
  const savedTargetHead = extractReviewTargetHead(reviewContent);
539
619
  const savedDiffBase = extractReviewDiffBase(reviewContent);
@@ -571,10 +651,9 @@ function routeFromFacts(facts: LifecycleFacts): Omit<OrchestrationNext, 'request
571
651
  const action = recommendation.action;
572
652
  if (action === 'manual-validation' || action === 'validation-run') return null;
573
653
  const family = action === 'analysis' ? 'analysis' : action;
574
- const round = Math.max(0, ...[...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])].map((name) => {
575
- const match = /-r(\d+)\.md$/.exec(name);
576
- return match ? Number(match[1]) : 1;
577
- })) + 1;
654
+ const round = maxArtifactRound([
655
+ ...(facts.artifacts[family] ?? []), ...(facts.staleArtifacts?.[family] ?? [])
656
+ ], family) + 1;
578
657
  const command = action === 'analysis' ? 'analyze-task' : action === 'plan' ? 'plan-task' : action === 'code' ? 'code-task' : action;
579
658
  const role = action.startsWith('review-') ? 'reviewer' : 'executor';
580
659
  return { action: command, role, stage: action, round, artifact: artifactName(family, round) };
@@ -616,7 +695,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
616
695
  }
617
696
  let run: OrchestrationRun | null;
618
697
  try {
619
- run = readRun(resolved.taskDir);
698
+ run = readRun(resolved.taskDir, options);
620
699
  } catch (error) {
621
700
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
622
701
  }
@@ -630,7 +709,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
630
709
  const routed = routeFromFacts(facts.facts);
631
710
  if (!routed) return failed('ORCHESTRATION_ROUTE_UNKNOWN', 'cannot determine a unique lifecycle action', resolved.taskId);
632
711
  if ('completion' in routed) {
633
- const reviewRound = highestRound(resolved.taskDir, 'review-code');
712
+ const reviewRound = maxArtifactRound(fs.readdirSync(resolved.taskDir), 'review-code');
634
713
  const review = parseReviewSummary(fs.readFileSync(
635
714
  path.join(resolved.taskDir, artifactName('review-code', reviewRound)),
636
715
  'utf8'
@@ -729,7 +808,7 @@ function routeOrchestration(taskRef: string, options: OrchestrationOptions = {})
729
808
  function statusOrchestration(taskRef: string, options: OrchestrationOptions = {}): OrchestrationResult {
730
809
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
731
810
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
732
- const run = readRun(resolved.taskDir);
811
+ const run = readRun(resolved.taskDir, options);
733
812
  if (!run) return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
734
813
  return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
735
814
  }
@@ -741,6 +820,7 @@ function prepareOrchestrationDelegationUnlocked(
741
820
  requestedModel?: string;
742
821
  requestedReasoningEffort?: string;
743
822
  lifecycleProvenance?: DelegationLifecycleProvenance;
823
+ lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
744
824
  }>,
745
825
  options: OrchestrationOptions = {}
746
826
  ): OrchestrationResult {
@@ -749,7 +829,15 @@ function prepareOrchestrationDelegationUnlocked(
749
829
  if (!(options.supportsLifecycleDelegation ?? supportsLifecycleDelegation)(input.client)) {
750
830
  return failed('ORCHESTRATION_CLIENT_UNSUPPORTED', `client '${input.client}' does not support lifecycle orchestration`, resolved.taskId);
751
831
  }
752
- const run = readRun(resolved.taskDir);
832
+ emitDiagnostic(options, 'orchestration-prepare-start', {
833
+ taskId: resolved.taskId,
834
+ taskDir: resolved.taskDir,
835
+ repoRoot: resolved.repoRoot,
836
+ client: input.client,
837
+ requestedModel: input.requestedModel ?? null,
838
+ requestedReasoningEffort: input.requestedReasoningEffort ?? null
839
+ });
840
+ const run = readRun(resolved.taskDir, options);
753
841
  if (!run || run.status !== 'running') return failed('ORCHESTRATION_RUN_NOT_RUNNING', 'a running orchestration is required', resolved.taskId);
754
842
  if (run.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_BUSY', 'the run already has a pending delegation', resolved.taskId);
755
843
  const repositoryPending = matchingDelegations(() => true, options);
@@ -769,6 +857,13 @@ function prepareOrchestrationDelegationUnlocked(
769
857
  if (input.client === 'codex' && !input.lifecycleProvenance) {
770
858
  return failed('ORCHESTRATION_CODEX_PROVENANCE_REQUIRED', 'Codex prepare requires lifecycle provenance', resolved.taskId);
771
859
  }
860
+ if (input.lifecycleRecoveryAttestation
861
+ && (input.lifecycleRecoveryAttestation.phase !== 'orchestration.prepare'
862
+ || input.lifecycleRecoveryAttestation.taskId !== resolved.taskId
863
+ || input.lifecycleRecoveryAttestation.artifact !== next.artifact
864
+ || input.lifecycleRecoveryAttestation.round !== next.round)) {
865
+ return failed('LIFECYCLE_AUTHORITY_TUPLE_MISMATCH', 'orchestration authority does not match the routed stage', resolved.taskId);
866
+ }
772
867
  const expectedPolicy = run.modelPolicy[next.role];
773
868
  if (input.requestedModel !== expectedPolicy.model) {
774
869
  return failed('ORCHESTRATION_REQUESTED_MODEL_MISMATCH', `requested model does not match the persisted ${next.role} model`, resolved.taskId);
@@ -833,6 +928,7 @@ function prepareOrchestrationDelegation(
833
928
  requestedModel?: string;
834
929
  requestedReasoningEffort?: string;
835
930
  lifecycleProvenance?: DelegationLifecycleProvenance;
931
+ lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
836
932
  }>,
837
933
  options: OrchestrationOptions = {}
838
934
  ): OrchestrationResult {
@@ -862,7 +958,7 @@ function dispatchOrchestrationDelegationUnlocked(
862
958
  ): OrchestrationResult {
863
959
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
864
960
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
865
- const run = readRun(resolved.taskDir);
961
+ const run = readRun(resolved.taskDir, options);
866
962
  if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
867
963
  if (run.status !== 'running') {
868
964
  return failed('ORCHESTRATION_STATE_INVALID', 'spawn dispatch requires a running orchestration', resolved.taskId);
@@ -908,16 +1004,42 @@ function matchingDelegations(
908
1004
  const repoRoot = options.repoRoot ?? process.cwd();
909
1005
  const activeRoot = path.join(repoRoot, '.agents', 'workspace', 'active');
910
1006
  if (!fs.existsSync(activeRoot)) return [];
911
- return fs.readdirSync(activeRoot, { withFileTypes: true })
1007
+ emitDiagnostic(options, 'orchestration-active-scan-start', {
1008
+ activeRoot
1009
+ });
1010
+ const matches = fs.readdirSync(activeRoot, { withFileTypes: true })
912
1011
  .filter((entry) => entry.isDirectory())
913
1012
  .flatMap((entry) => {
914
- const run = readRun(path.join(activeRoot, entry.name));
1013
+ const candidateTaskId = entry.name;
1014
+ const candidateTaskDir = path.join(activeRoot, candidateTaskId);
1015
+ emitDiagnostic(options, 'orchestration-active-scan-candidate', {
1016
+ candidateTaskId,
1017
+ candidateTaskDir,
1018
+ orchestrationPath: orchestrationPath(candidateTaskDir)
1019
+ });
1020
+ let run: OrchestrationRun | null;
1021
+ try {
1022
+ run = readRun(candidateTaskDir, options);
1023
+ } catch (error) {
1024
+ emitDiagnostic(options, 'orchestration-active-scan-candidate-failed', {
1025
+ candidateTaskId,
1026
+ candidateTaskDir,
1027
+ errorType: error instanceof Error ? error.name : typeof error,
1028
+ reasonCodes: error instanceof OrchestrationStateError ? error.reasonCodes.join(',') : null
1029
+ });
1030
+ throw error;
1031
+ }
915
1032
  if (!run || run.status !== 'running' || !run.pendingDelegation) return [];
916
1033
  const receipt = run.pendingDelegation;
917
1034
  return predicate(receipt)
918
- ? [{ taskId: entry.name, run }]
1035
+ ? [{ taskId: candidateTaskId, run }]
919
1036
  : [];
920
1037
  });
1038
+ emitDiagnostic(options, 'orchestration-active-scan-finished', {
1039
+ activeRoot,
1040
+ matchingDelegations: matches.length
1041
+ });
1042
+ return matches;
921
1043
  }
922
1044
 
923
1045
  function uniqueMatchingDelegation(
@@ -1163,7 +1285,7 @@ function activateOrchestrationDelegation(
1163
1285
  ): OrchestrationResult {
1164
1286
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1165
1287
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1166
- const run = readRun(resolved.taskDir);
1288
+ const run = readRun(resolved.taskDir, options);
1167
1289
  if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1168
1290
  if (run.status !== 'running') {
1169
1291
  return { status: run.status, changed: false, taskId: resolved.taskId, run, next: null, error: null };
@@ -1191,7 +1313,7 @@ async function awaitOrchestrationDelegationActivation(
1191
1313
  while (true) {
1192
1314
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1193
1315
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1194
- const run = readRun(resolved.taskDir);
1316
+ const run = readRun(resolved.taskDir, options);
1195
1317
  if (!run?.pendingDelegation) {
1196
1318
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1197
1319
  }
@@ -1257,7 +1379,7 @@ function recoverPreparedOrchestrationDelegation(
1257
1379
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1258
1380
  try {
1259
1381
  return withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-orchestration.recover-prepared', () => {
1260
- const run = readRun(resolved.taskDir);
1382
+ const run = readRun(resolved.taskDir, options);
1261
1383
  const receipt = run?.pendingDelegation;
1262
1384
  if (!run || !receipt) {
1263
1385
  return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
@@ -1329,7 +1451,7 @@ function completeOrchestrationStage(
1329
1451
  ): OrchestrationResult {
1330
1452
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1331
1453
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1332
- const run = readRun(resolved.taskDir);
1454
+ const run = readRun(resolved.taskDir, options);
1333
1455
  if (!run) return { status: 'running', changed: false, taskId: resolved.taskId, run: null, next: null, error: null };
1334
1456
  if (!run.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'active run has no pending delegation', resolved.taskId);
1335
1457
  const result = completeDelegationStage(run.pendingDelegation, event);
@@ -1348,7 +1470,7 @@ function inspectOrchestrationStage(
1348
1470
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1349
1471
  let run: OrchestrationRun | null;
1350
1472
  try {
1351
- run = readRun(resolved.taskDir);
1473
+ run = readRun(resolved.taskDir, options);
1352
1474
  } catch (error) {
1353
1475
  return failed('ORCHESTRATION_STATE_INVALID', error instanceof Error ? error.message : String(error), resolved.taskId);
1354
1476
  }
@@ -1409,7 +1531,7 @@ function sealOrchestrationDelegation(
1409
1531
  ): OrchestrationResult {
1410
1532
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1411
1533
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1412
- const run = readRun(resolved.taskDir);
1534
+ const run = readRun(resolved.taskDir, options);
1413
1535
  if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1414
1536
  const result = sealDelegation(run.pendingDelegation, event, { now: options.now });
1415
1537
  if (!result.ok) return pauseOrchestration(taskRef, result.code, result.message, true, options);
@@ -1421,7 +1543,7 @@ function sealOrchestrationDelegation(
1421
1543
  function advanceOrchestration(taskRef: string, options: OrchestrationOptions = {}): OrchestrationResult {
1422
1544
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1423
1545
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1424
- const run = readRun(resolved.taskDir);
1546
+ const run = readRun(resolved.taskDir, options);
1425
1547
  if (!run?.pendingDelegation) return failed('ORCHESTRATION_DELEGATION_MISSING', 'no pending delegation exists', resolved.taskId);
1426
1548
  const result = consumeDelegation(run.pendingDelegation, { now: options.now });
1427
1549
  if (!result.ok) return pauseOrchestration(taskRef, result.code, result.message, true, options);
@@ -1448,7 +1570,7 @@ function pauseOrchestration(
1448
1570
  ): OrchestrationResult {
1449
1571
  const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
1450
1572
  if (!resolved.ok) return failed(resolved.code, resolved.message, resolved.taskId);
1451
- const run = readRun(resolved.taskDir);
1573
+ const run = readRun(resolved.taskDir, options);
1452
1574
  if (!run) return failed('ORCHESTRATION_RUN_MISSING', 'no orchestration run exists', resolved.taskId);
1453
1575
  const updated = withUpdatedRun(run, { status: 'paused', pause: { code, message, recoverable } });
1454
1576
  saveRun(resolved.taskDir, updated);
@@ -1483,6 +1605,7 @@ export {
1483
1605
  statusOrchestration,
1484
1606
  };
1485
1607
  export type {
1608
+ CleanCompletionEvidence,
1486
1609
  OrchestrationCompletionPlanResult,
1487
1610
  OrchestrationModelPolicy,
1488
1611
  OrchestrationNext,