@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
@@ -0,0 +1,127 @@
1
+ import { parseArtifactName } from './artifact-name.js';
2
+ const LOCAL_SECTIONS = {
3
+ analysis: [
4
+ ['source', '需求来源', 'Requirements Source'],
5
+ ['understanding', '需求理解', 'Requirements Understanding'],
6
+ ['files', '相关文件', 'Related Files'],
7
+ ['impact', '影响评估', 'Impact Assessment'],
8
+ ['risks', '技术风险', 'Technical Risks'],
9
+ ['effort', '工作量和复杂度评估', 'Effort and Complexity Assessment'],
10
+ ['state-check', '状态核对', 'State Check']
11
+ ],
12
+ plan: [
13
+ ['understanding', '问题理解', 'Problem Understanding'],
14
+ ['constraints', '约束条件', 'Constraints'],
15
+ ['options', '方案对比', 'Options Comparison'],
16
+ ['approach', '技术方法', 'Technical Approach'],
17
+ ['steps', '实施步骤', 'Implementation Steps'],
18
+ ['files', '文件清单', 'File List'],
19
+ ['verification', '验证策略', 'Verification Strategy'],
20
+ ['state-check', '状态核对', 'State Check']
21
+ ],
22
+ code: [
23
+ ['input', '实现输入', 'Implementation Input'],
24
+ ['files', '变更文件', 'Changed Files'],
25
+ ['key-code', '关键代码说明', 'Key Code Notes'],
26
+ ['tests', '测试结果', 'Test Results'],
27
+ ['deviations', '与方案的差异', 'Differences from Plan'],
28
+ ['review-focus', '供审查关注的内容', 'Review Focus'],
29
+ ['state-check', '状态核对', 'State Check'],
30
+ ['evidence', '证据原文', 'Raw Evidence']
31
+ ],
32
+ 'review-analysis': [
33
+ ['summary', '审查摘要', 'Review Summary'],
34
+ ['coverage', '检视覆盖声明', 'Inspection Coverage'],
35
+ ['specialized-coverage', '需求分析专项覆盖', 'Requirements Analysis Coverage'],
36
+ ['traceability', '追踪矩阵', 'Traceability Matrix'],
37
+ ['issues', '问题清单', 'Findings'],
38
+ ['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
39
+ ['manual-validation', '人工校验项', 'Manual Validation Items'],
40
+ ['conclusion', '结论与建议', 'Conclusion and Recommendation'],
41
+ ['state-check', '状态核对', 'State Check'],
42
+ ['evidence', '证据原文', 'Raw Evidence'],
43
+ ['self-critique', '自我质疑', 'Self-critique'],
44
+ ['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
45
+ ],
46
+ 'review-plan': [
47
+ ['summary', '审查摘要', 'Review Summary'],
48
+ ['coverage', '检视覆盖声明', 'Inspection Coverage'],
49
+ ['specialized-coverage', '技术方案架构覆盖', 'Technical Plan Architecture Coverage'],
50
+ ['traceability', '追踪矩阵', 'Traceability Matrix'],
51
+ ['issues', '问题清单', 'Findings'],
52
+ ['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
53
+ ['manual-validation', '人工校验项', 'Manual Validation Items'],
54
+ ['conclusion', '结论与建议', 'Conclusion and Recommendation'],
55
+ ['state-check', '状态核对', 'State Check'],
56
+ ['evidence', '证据原文', 'Raw Evidence'],
57
+ ['self-critique', '自我质疑', 'Self-critique'],
58
+ ['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
59
+ ],
60
+ 'review-code': [
61
+ ['summary', '审查摘要', 'Review Summary'],
62
+ ['coverage', '检视覆盖声明', 'Inspection Coverage'],
63
+ ['specialized-coverage', '代码实现专项覆盖', 'Code Implementation Coverage'],
64
+ ['traceability', '追踪矩阵', 'Traceability Matrix'],
65
+ ['issues', '问题清单', 'Findings'],
66
+ ['non-blocking', '非阻塞建议', 'Non-blocking Suggestions'],
67
+ ['manual-validation', '人工校验项', 'Manual Validation Items'],
68
+ ['conclusion', '结论与建议', 'Conclusion and Recommendation'],
69
+ ['state-check', '状态核对', 'State Check'],
70
+ ['evidence', '证据原文', 'Raw Evidence'],
71
+ ['self-critique', '自我质疑', 'Self-critique'],
72
+ ['ledger-writeback', '审查分歧账本回写', 'Review Disagreement Ledger Write-back']
73
+ ]
74
+ };
75
+ function buildSections(family) {
76
+ return LOCAL_SECTIONS[family].map(([id, zh, en], index) => ({
77
+ id,
78
+ order: index + 1,
79
+ headings: { zh, en },
80
+ marker: `artifact-section:${family}:${id}`
81
+ }));
82
+ }
83
+ const ARTIFACT_SCHEMAS = [
84
+ { family: 'analysis', title: { zh: '需求分析报告', en: 'Requirements Analysis' }, sections: buildSections('analysis'), requiredPatterns: ['^\\$ '] },
85
+ { family: 'review-analysis', title: { zh: '需求分析审查报告', en: 'Analysis Review Report' }, sections: buildSections('review-analysis'), requiredPatterns: ['^### (?:审查决定|Approval Decision)$', '^\\$ '] },
86
+ { family: 'plan', title: { zh: '技术方案', en: 'Technical Plan' }, sections: buildSections('plan'), requiredPatterns: ['^\\$ '] },
87
+ { family: 'review-plan', title: { zh: '技术方案审查报告', en: 'Plan Review Report' }, sections: buildSections('review-plan'), requiredPatterns: ['^### (?:审查决定|Approval Decision)$', '^\\$ '] },
88
+ { family: 'code', title: { zh: '实现报告', en: 'Implementation Report' }, sections: buildSections('code'), requiredPatterns: ['^\\$ '] },
89
+ { family: 'review-code', title: { zh: '代码审查报告', en: 'Code Review Report' }, sections: buildSections('review-code'), requiredPatterns: [
90
+ '^### (?:审查决定|Approval Decision)$',
91
+ '^\\$ ',
92
+ '^- \\*\\*(?:总体结论|Overall Verdict)\\*\\*[::]\\s*(?:通过|需要修改|拒绝|Approved|Changes Requested|Rejected)\\s*$',
93
+ '^- \\*\\*(?:审查基线提交|Review Baseline Commit)\\*\\*[::]\\s*\\S',
94
+ '^- \\*\\*(?:审查差异基线|Reviewed Diff Base)\\*\\*[::]\\s*[0-9a-f]{40,64}\\s*$',
95
+ '^- \\*\\*(?:审查差异指纹|Reviewed Diff Fingerprint)\\*\\*[::]\\s*sha256:[0-9a-f]{64}\\s*$',
96
+ '^- \\*\\*(?:审查快照树|Reviewed Snapshot Tree)\\*\\*[::]\\s*[0-9a-f]{40,64}\\s*$'
97
+ ] }
98
+ ];
99
+ function getArtifactSchema(family) {
100
+ return ARTIFACT_SCHEMAS.find((schema) => schema.family === family) ?? null;
101
+ }
102
+ function renderArtifactSkeleton(input) {
103
+ const schema = getArtifactSchema(input.family);
104
+ if (!schema)
105
+ throw new Error(`unknown artifact schema family '${input.family}'`);
106
+ const locale = input.locale ?? 'zh-CN';
107
+ const identity = parseArtifactName(input.artifact);
108
+ if (identity?.family !== input.family)
109
+ throw new Error(`invalid artifact identity '${input.artifact}' for '${input.family}'`);
110
+ const round = identity.round;
111
+ const title = schema.title[locale === 'en' ? 'en' : 'zh'];
112
+ const headings = locale === 'en' ? 'en' : 'zh';
113
+ const lines = [
114
+ `<!-- artifact-context:${input.taskId}:${input.family}:${round} -->`,
115
+ `# ${title}`,
116
+ ''
117
+ ];
118
+ for (const section of schema.sections) {
119
+ lines.push(`## ${section.headings[headings]}`);
120
+ lines.push(`<!-- ${section.marker} -->`);
121
+ lines.push('<!-- artifact-slot:empty -->');
122
+ lines.push('');
123
+ }
124
+ return `${lines.join('\n').trimEnd()}\n`;
125
+ }
126
+ export { ARTIFACT_SCHEMAS, getArtifactSchema, renderArtifactSkeleton };
127
+ //# sourceMappingURL=artifact-schema.js.map
@@ -1,5 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { parseArtifactName } from './artifact-name.js';
3
4
  import { invalidationBlocks, isArtifactInvalidated, parseInvalidationDocument } from './invalidation.js';
4
5
  import { receiptForOutput } from './artifact-receipts.js';
5
6
  import { parseTypedTaskFrontmatter } from './frontmatter.js';
@@ -8,6 +9,8 @@ import { parseReviewSummary, resolveCanonicalVerdict } from './review-artifacts.
8
9
  import { parseReworkIntentDocument } from './rework-intent.js';
9
10
  import { sha256File } from './artifact-receipts.js';
10
11
  import { hasOpenLifecycleExecution } from './activity-log.js';
12
+ import { parseQualificationAudit, parseTaskQualification } from './qualification-audit.js';
13
+ const ARTIFACT_AUDIT_FAMILIES = new Set(['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code']);
11
14
  const REASONS = new Set([
12
15
  'user-request', 'new-requirement', 'upstream-fact-doubt', 'review-finding', 'retry', 'validation-rerun'
13
16
  ]);
@@ -42,6 +45,9 @@ function canStart(action, facts, trigger) {
42
45
  return deny('TASK_NOT_ACTIVE', `state=${facts.taskState}`);
43
46
  if (invalidationBlocks(facts.invalidation))
44
47
  return deny('INVALIDATION_INCOMPLETE');
48
+ if (facts.qualificationStale && facts.recommendedAction !== action) {
49
+ return deny('QUALIFICATION_STALE', ...(facts.qualificationStaleArtifacts ?? ['qualification audit is stale']));
50
+ }
45
51
  if (facts.executionBusy)
46
52
  return deny('EXECUTION_BUSY');
47
53
  const implicit = trigger.explicitRequest === false;
@@ -103,12 +109,9 @@ function canStart(action, facts, trigger) {
103
109
  }
104
110
  return deny('CAPABILITY_ACTION_UNKNOWN');
105
111
  }
106
- function artifactRound(name) {
107
- const match = /-r(\d+)\.md$/.exec(name);
108
- return match ? Number(match[1]) : 1;
109
- }
110
112
  function latestArtifact(names) {
111
- return [...names].sort((left, right) => artifactRound(right) - artifactRound(left) || left.localeCompare(right))[0] ?? null;
113
+ return names.map(parseArtifactName).filter((identity) => identity !== null)
114
+ .sort((left, right) => right.round - left.round || left.name.localeCompare(right.name))[0]?.name ?? null;
112
115
  }
113
116
  function reviewedInputName(content, expectedFamily) {
114
117
  const header = content.split(/\r?\n/).findIndex((line) => /\*\*(?:审查输入|Review Input)\*\*[::]/.test(line));
@@ -122,9 +125,37 @@ function reviewMatchesLatest(facts, source, review) {
122
125
  const latestSource = latestArtifact(facts.artifacts[source] ?? []);
123
126
  return Boolean(latestSource && facts.reviewedInputs?.[review] === latestSource);
124
127
  }
128
+ function qualificationCandidateSnapshotMatches(audit, qualification) {
129
+ const current = new Map(qualification.candidates.map((candidate) => [candidate.candidateId, candidate]));
130
+ return audit.candidateQualifications.length === current.size && audit.candidateQualifications.every((row) => {
131
+ const candidate = current.get(row.candidateId);
132
+ return Boolean(candidate && candidate.status === row.status && candidate.impact === row.impact
133
+ && candidate.evidence === row.evidence && candidate.constraintIds.join(',') === row.constraintIds.join(','));
134
+ });
135
+ }
136
+ const QUALIFICATION_RECOVERY_ORDER = [
137
+ { action: 'analysis', pattern: /^analysis(?:-r\d+)?\.md$/ },
138
+ { action: 'review-analysis', pattern: /^review-analysis(?:-r\d+)?\.md$/ },
139
+ { action: 'plan', pattern: /^plan(?:-r\d+)?\.md$/ },
140
+ { action: 'review-plan', pattern: /^review-plan(?:-r\d+)?\.md$/ },
141
+ { action: 'code', pattern: /^code(?:-r\d+)?\.md$/ },
142
+ { action: 'review-code', pattern: /^review-code(?:-r\d+)?\.md$/ }
143
+ ];
144
+ function qualificationRecoveryAction(facts) {
145
+ const stale = facts.qualificationStaleArtifacts ?? [];
146
+ return QUALIFICATION_RECOVERY_ORDER.find(({ pattern }) => stale.some((name) => pattern.test(name)))?.action ?? null;
147
+ }
125
148
  function recommendNext(facts) {
126
149
  if (invalidationBlocks(facts.invalidation))
127
150
  return { action: null, reasonCode: 'INVALIDATION_INCOMPLETE', evidence: ['reconcile task invalidation before routing'] };
151
+ if (facts.qualificationStale) {
152
+ const action = qualificationRecoveryAction(facts);
153
+ return {
154
+ action,
155
+ reasonCode: 'QUALIFICATION_RECOVERY_REQUIRED',
156
+ evidence: facts.qualificationStaleArtifacts ?? ['qualification audit is stale']
157
+ };
158
+ }
128
159
  const pendingIntent = (facts.reworkIntents ?? []).find((intent) => intent.status === 'pending');
129
160
  if (pendingIntent)
130
161
  return { action: pendingIntent.target, reasonCode: 'REWORK_INTENT_PENDING', evidence: [pendingIntent.intentId, pendingIntent.findingId] };
@@ -175,16 +206,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
175
206
  const stat = fs.lstatSync(path.join(taskDir, name));
176
207
  return stat.isFile() && !stat.isSymbolicLink();
177
208
  });
178
- const artifactFamilies = {
179
- analysis: /^analysis(?:-r\d+)?\.md$/,
180
- 'review-analysis': /^review-analysis(?:-r\d+)?\.md$/,
181
- plan: /^plan(?:-r\d+)?\.md$/,
182
- 'review-plan': /^review-plan(?:-r\d+)?\.md$/,
183
- code: /^code(?:-r\d+)?\.md$/,
184
- 'review-code': /^review-code(?:-r\d+)?\.md$/
209
+ const artifactFamilies = ['analysis', 'review-analysis', 'plan', 'review-plan', 'code', 'review-code'];
210
+ const familyFor = (name) => {
211
+ const family = parseArtifactName(name)?.family;
212
+ return artifactFamilies.find((candidate) => candidate === family) ?? null;
185
213
  };
186
- const familyFor = (name) => Object.keys(artifactFamilies)
187
- .find((family) => artifactFamilies[family].test(name)) ?? null;
188
214
  const activeFiles = files.filter((name) => {
189
215
  const family = familyFor(name);
190
216
  return !family || !isArtifactInvalidated(invalidation.document, family, name);
@@ -192,12 +218,46 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
192
218
  const artifactHashes = {};
193
219
  for (const name of activeFiles)
194
220
  artifactHashes[name] = sha256File(path.join(taskDir, name));
195
- const artifacts = Object.fromEntries(Object.keys(artifactFamilies).map((family) => [
196
- family, activeFiles.filter((name) => artifactFamilies[family].test(name))
221
+ const artifacts = Object.fromEntries(artifactFamilies.map((family) => [
222
+ family, activeFiles.filter((name) => familyFor(name) === family)
197
223
  ]));
198
- const staleArtifacts = Object.fromEntries(Object.keys(artifactFamilies).map((family) => [
199
- family, files.filter((name) => artifactFamilies[family].test(name) && isArtifactInvalidated(invalidation.document, family, name))
224
+ const staleArtifacts = Object.fromEntries(artifactFamilies.map((family) => [
225
+ family, files.filter((name) => familyFor(name) === family && isArtifactInvalidated(invalidation.document, family, name))
200
226
  ]));
227
+ const qualification = parseTaskQualification(content);
228
+ if (!qualification.ok)
229
+ return { ok: false, code: 'TASK_CAPABILITY_FACTS_INVALID', message: qualification.message };
230
+ const qualificationStaleArtifacts = [];
231
+ if (qualification.qualification.present) {
232
+ const constraints = new Map(qualification.qualification.constraints.map((row) => [row.constraintId, row.digest]));
233
+ for (const family of artifactFamilies) {
234
+ if (!ARTIFACT_AUDIT_FAMILIES.has(family))
235
+ continue;
236
+ const name = latestArtifact(artifacts[family] ?? []);
237
+ if (!name)
238
+ continue;
239
+ let auditContent;
240
+ try {
241
+ auditContent = fs.readFileSync(path.join(taskDir, name), 'utf8');
242
+ }
243
+ catch {
244
+ qualificationStaleArtifacts.push(name);
245
+ continue;
246
+ }
247
+ const audit = parseQualificationAudit(auditContent);
248
+ if (!audit.ok || !audit.audit.present || !audit.audit.snapshot) {
249
+ qualificationStaleArtifacts.push(name);
250
+ continue;
251
+ }
252
+ const constraintsChanged = audit.audit.constraintDependencies.some((dependency) => constraints.get(dependency.constraintId) !== dependency.constraintDigest);
253
+ const taskInputChanged = audit.audit.snapshot.taskInputDigest !== qualification.qualification.taskInputDigest;
254
+ if (audit.audit.snapshot.nonConstraintInputDigest !== qualification.qualification.nonConstraintInputDigest
255
+ || constraintsChanged
256
+ || (taskInputChanged && !constraintsChanged)
257
+ || (taskInputChanged && !qualificationCandidateSnapshotMatches(audit.audit, qualification.qualification)))
258
+ qualificationStaleArtifacts.push(name);
259
+ }
260
+ }
201
261
  const reviews = {};
202
262
  const reviewedInputs = {};
203
263
  for (const family of ['review-analysis', 'review-plan', 'review-code']) {
@@ -226,7 +286,11 @@ function buildLifecycleFacts(taskDir, content, taskState = 'active', executionBu
226
286
  taskState, currentStep: String(metadata.current_step ?? ''), artifacts, reviews,
227
287
  staleArtifacts, reviewedInputs, artifactHashes,
228
288
  invalidation: invalidation.document, reworkIntents: rework.intents,
229
- unresolvedLedger, executionBusy: executionBusy || hasOpenLifecycleExecution(content), recommendedAction: null
289
+ unresolvedLedger,
290
+ executionBusy: executionBusy || hasOpenLifecycleExecution(content),
291
+ recommendedAction: null,
292
+ qualificationStale: qualificationStaleArtifacts.length > 0,
293
+ qualificationStaleArtifacts
230
294
  };
231
295
  facts.recommendedAction = recommendNext(facts).action;
232
296
  return { ok: true, facts };
@@ -5,7 +5,12 @@ import { computeLifecycleBuildIdentity, verifyLifecycleBuildIdentity } from '../
5
5
  import { verifyCodexSandboxControllerContextWithWarnings as verifySandboxControllerWithWarnings } from '../agent-clients/adapters/codex-lifecycle/sandbox-controller.js';
6
6
  import { verifyCodexSandboxControllerContextWithWarnings as verifyControllerContextFileWithWarnings } from '../agent-clients/adapters/codex-lifecycle/controller-context.js';
7
7
  import { resolveTaskRef } from './resolve-ref.js';
8
- import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
8
+ import { activateMatchingOrchestrationDelegation, hasActivatableOrchestrationDelegation, hasSealableOrchestrationDelegation, OrchestrationStateError, pauseMatchingOrchestrationDelegation, prepareOrchestrationDelegation, routeOrchestration, reconcileMatchingOrchestrationDelegation, sealMatchingOrchestrationDelegationWithHostEvidence } from './orchestration.js';
9
+ import { randomUUID, createHash } from 'node:crypto';
10
+ import { consumeLifecycleRecoveryAttestation, issueLifecycleRecoveryAttestation, validateLifecycleRecoveryAttestation } from './control-authority.js';
11
+ function buildIdentityDigest(value) {
12
+ return createHash('sha256').update(JSON.stringify(value), 'utf8').digest('hex');
13
+ }
9
14
  function coreOptions(options) {
10
15
  return { ...options.orchestrationOptions, repoRoot: options.repoRoot ?? options.orchestrationOptions?.repoRoot };
11
16
  }
@@ -73,8 +78,9 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
73
78
  if (!resolved.ok)
74
79
  return bridgeFailure(resolved.code, resolved.message);
75
80
  const preflight = await (options.preflight ?? preflightCodexLifecycleEvidence)(repoRoot);
76
- if (!input.capabilityToken) {
77
- return bridgeFailure('ORCHESTRATION_CODEX_CAPABILITY_REQUIRED', 'Codex prepare requires a current-session capability token');
81
+ const capabilityRef = input.capabilityRef;
82
+ if (!capabilityRef) {
83
+ return bridgeFailure('ORCHESTRATION_CODEX_CAPABILITY_REQUIRED', 'Codex prepare requires a current-session capability reference');
78
84
  }
79
85
  const buildIdentity = options.buildIdentity ?? computeLifecycleBuildIdentity(repoRoot);
80
86
  const brokerController = options.controllerBinding ?? brokerControllerBinding();
@@ -99,7 +105,7 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
99
105
  controlGeneration: localController.controlGeneration
100
106
  } : null);
101
107
  const capabilityStore = options.capabilityStore ?? createCodexCapabilityStore();
102
- const attested = capabilityStore.inspect(input.capabilityToken);
108
+ const attested = capabilityStore.inspectReference(capabilityRef);
103
109
  const capabilityIdentity = verifyLifecycleBuildIdentity(attested.buildIdentity, buildIdentity);
104
110
  if (!capabilityIdentity.ok) {
105
111
  return bridgeFailure(capabilityIdentity.code, capabilityIdentity.message);
@@ -124,14 +130,57 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
124
130
  controlGeneration: controller.controlGeneration
125
131
  } } : {})
126
132
  };
133
+ if (input.lifecycleRecoveryAttestation) {
134
+ try {
135
+ validateLifecycleRecoveryAttestation(input.lifecycleRecoveryAttestation);
136
+ }
137
+ catch (error) {
138
+ return bridgeFailure('LIFECYCLE_AUTHORITY_ATTESTATION_INVALID', error instanceof Error ? error.message : String(error));
139
+ }
140
+ }
141
+ let lifecycleRecoveryAttestation = input.lifecycleRecoveryAttestation ?? null;
142
+ const routed = input.capabilityRef && !lifecycleRecoveryAttestation
143
+ ? routeOrchestration(taskRef, coreOptions(options))
144
+ : null;
145
+ if (routed && !routed.next)
146
+ return routed;
147
+ if (routed?.next && ['analysis', 'plan', 'code'].includes(routed.next.stage)) {
148
+ const recoveryRequest = {
149
+ version: 1,
150
+ requestId: randomUUID(),
151
+ operationId: randomUUID(),
152
+ phase: 'orchestration.prepare',
153
+ taskId: resolved.taskId,
154
+ family: routed.next.stage === 'analysis' ? 'analysis'
155
+ : routed.next.stage === 'plan' ? 'plan' : 'code',
156
+ artifact: routed.next.artifact,
157
+ round: routed.next.round,
158
+ lifecycleRequestId: randomUUID(),
159
+ authorityRef: capabilityRef,
160
+ expectedControlGeneration: controller?.controlGeneration ?? '',
161
+ expectedControllerInstanceDigest: controller?.instanceDigest ?? '0'.repeat(64),
162
+ expectedBuildIdentityDigest: buildIdentityDigest(buildIdentity),
163
+ expectedHookDefinitionHash: preflight.hookDefinitionHash
164
+ };
165
+ const authority = issueLifecycleRecoveryAttestation(recoveryRequest, {
166
+ capabilityStore,
167
+ ...(controller ? { controllerBinding: controller } : {}),
168
+ buildIdentity
169
+ });
170
+ if (authority.status === 'rejected' || !authority.attestation) {
171
+ return bridgeFailure(authority.error?.code ?? 'LIFECYCLE_AUTHORITY_REJECTED', authority.error?.message ?? 'lifecycle authority was rejected');
172
+ }
173
+ lifecycleRecoveryAttestation = authority.attestation;
174
+ }
127
175
  const prepared = prepareOrchestrationDelegation(taskRef, {
128
176
  ...input,
129
- lifecycleProvenance
177
+ lifecycleProvenance,
178
+ lifecycleRecoveryAttestation
130
179
  }, {
131
180
  ...coreOptions(options),
132
181
  validateLifecycleCapability: () => {
133
182
  try {
134
- const validated = capabilityStore.validate(input.capabilityToken, capabilityExpected);
183
+ const validated = capabilityStore.validateReference(capabilityRef, capabilityExpected);
135
184
  if (validated.sessionId !== attested.sessionId
136
185
  || validated.turnId !== attested.turnId
137
186
  || validated.toolUseId !== attested.toolUseId) {
@@ -146,24 +195,16 @@ async function prepareCodexOrchestrationDelegation(taskRef, input, options = {})
146
195
  return capabilityFailure(error);
147
196
  }
148
197
  },
149
- consumeLifecycleCapability: () => {
150
- try {
151
- const consumed = capabilityStore.consume(input.capabilityToken, capabilityExpected);
152
- if (consumed.sessionId !== attested.sessionId
153
- || consumed.turnId !== attested.turnId
154
- || consumed.toolUseId !== attested.toolUseId) {
155
- return {
156
- code: 'CODEX_CAPABILITY_IDENTITY_CHANGED',
157
- message: 'capability identity changed during consumption'
158
- };
159
- }
160
- return null;
161
- }
162
- catch (error) {
163
- return capabilityFailure(error);
164
- }
165
- }
198
+ consumeLifecycleCapability: () => null
166
199
  });
200
+ if (lifecycleRecoveryAttestation && !options.deferLifecycleRecoveryConsumption && prepared.status !== 'failed') {
201
+ try {
202
+ consumeLifecycleRecoveryAttestation(lifecycleRecoveryAttestation);
203
+ }
204
+ catch (error) {
205
+ return bridgeFailure(error instanceof Error ? error.name : 'LIFECYCLE_AUTHORITY_CONSUME_FAILED', error instanceof Error ? error.message : String(error));
206
+ }
207
+ }
167
208
  return identityWarnings.length > 0 && prepared.status !== 'failed'
168
209
  ? { ...prepared, warnings: Object.freeze(identityWarnings) }
169
210
  : prepared;
@@ -211,7 +252,12 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
211
252
  const contextVerification = contextPath
212
253
  ? verifySandboxControllerWithWarnings(contextPath, { repoRoot })
213
254
  : null;
214
- const controller = contextVerification?.context ?? null;
255
+ const controller = options.controllerBinding
256
+ ?? brokerControllerBinding()
257
+ ?? (contextVerification?.context ? {
258
+ instanceDigest: contextVerification.context.controllerInstanceDigest,
259
+ controlGeneration: contextVerification.context.controlGeneration
260
+ } : null);
215
261
  const activated = activateMatchingOrchestrationDelegation('codex', {
216
262
  nativeAgent: evidence.nativeAgent,
217
263
  childId: evidence.childThreadId,
@@ -233,7 +279,7 @@ async function activateCodexOrchestrationDelegation(childThreadId, options = {})
233
279
  capabilityTurnId: evidence.parentTurnId,
234
280
  spawnToolUseId: evidence.spawnToolUseId,
235
281
  spawnObservedAt: record.spawnObservedAt ?? undefined,
236
- controllerInstanceDigest: controller?.controllerInstanceDigest ?? null,
282
+ controllerInstanceDigest: controller?.instanceDigest ?? null,
237
283
  controlGeneration: controller?.controlGeneration ?? null
238
284
  }
239
285
  }, coreOptions(options));
@@ -0,0 +1,28 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ function gitText(repoRoot, args) {
3
+ return execFileSync('git', [...args], {
4
+ cwd: repoRoot,
5
+ encoding: 'utf8',
6
+ stdio: ['ignore', 'pipe', 'pipe']
7
+ }).trim();
8
+ }
9
+ function checkpointCommitMatches(repoRoot, intent, head) {
10
+ try {
11
+ const parent = gitText(repoRoot, ['rev-parse', `${head}^`]);
12
+ const tree = gitText(repoRoot, ['rev-parse', `${head}^{tree}`]);
13
+ const message = gitText(repoRoot, ['show', '-s', '--format=%s', head]);
14
+ const changed = gitText(repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head])
15
+ .split('\n')
16
+ .filter(Boolean)
17
+ .sort();
18
+ return parent === intent.expectedHead
19
+ && tree === intent.expectedTree
20
+ && message === intent.message
21
+ && JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ export { checkpointCommitMatches };
28
+ //# sourceMappingURL=commit-identity.js.map
@@ -2,6 +2,7 @@ import fs from 'node:fs';
2
2
  import { execFileSync } from 'node:child_process';
3
3
  import { commitExplicitPaths, inspectGitWorkflow, pushGitRefs } from '../git/workflow.js';
4
4
  import { parseTaskFrontmatter } from './frontmatter.js';
5
+ import { checkpointCommitMatches } from './commit-identity.js';
5
6
  import { resolveTaskContext, resolveTaskRef } from './resolve-ref.js';
6
7
  import { commitPushDecision } from './commit-policy.js';
7
8
  import { mergeOperationWarnings } from './operation-outcome.js';
@@ -163,21 +164,6 @@ function syncTaskCommit(input, task, committedHead) {
163
164
  return warning('TASK_STATUS_SYNC_FAILED', error instanceof Error ? error.message : String(error), true, 'task', task.taskId, 'ACTION_REQUIRED');
164
165
  }
165
166
  }
166
- function checkpointChildMatches(task, intent, head) {
167
- try {
168
- const parent = gitText(task.repoRoot, ['rev-parse', `${head}^`]);
169
- const tree = gitText(task.repoRoot, ['rev-parse', `${head}^{tree}`]);
170
- const message = gitText(task.repoRoot, ['show', '-s', '--format=%s', head]);
171
- const changed = gitText(task.repoRoot, ['diff-tree', '--no-commit-id', '--name-only', '-r', head]).split('\n').filter(Boolean).sort();
172
- return parent === intent.expectedHead
173
- && tree === intent.expectedTree
174
- && message === intent.message
175
- && JSON.stringify(changed) === JSON.stringify([...intent.paths].sort());
176
- }
177
- catch {
178
- return false;
179
- }
180
- }
181
167
  function checkpointIdentity(input, task, delivery) {
182
168
  if (delivery.mode !== 'local')
183
169
  throw new Error('checkpoint identity requires local delivery');
@@ -256,7 +242,7 @@ function executeUnlocked(input, task, mode) {
256
242
  operations: [{ name: 'commit', status: 'no-op' }], error: null
257
243
  };
258
244
  }
259
- if (inspected.snapshot.head !== identity.expectedHead && !checkpointChildMatches(task, pendingIntent, inspected.snapshot.head))
245
+ if (inspected.snapshot.head !== identity.expectedHead && !checkpointCommitMatches(task.repoRoot, pendingIntent, inspected.snapshot.head))
260
246
  return {
261
247
  status: 'failed', changed: false, snapshot: inspected.snapshot, operations: [],
262
248
  error: { code: 'COMMIT_INTENT_HEAD_CONFLICT', message: 'Current HEAD does not match the pending checkpoint intent' }