@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,5 +1,7 @@
1
1
  import type { SandboxControlManifest } from './protocol.ts';
2
- import { commandForEngine, runEngine, runProbe } from '../shell.ts';
2
+ import { runProbe } from '../shell.ts';
3
+ import { captureSandboxAuthority, isSandboxAuthorityEvidence, verifySandboxAuthority } from '../engines/authority.ts';
4
+ import { discoverExactContainer } from '../engines/docker-exact-discovery.ts';
3
5
 
4
6
  export type ContainerObservation =
5
7
  | Readonly<{ state: 'found'; id: string; running: boolean; labels: Readonly<Record<string, string>> }>
@@ -12,20 +14,13 @@ export type ContainerInspection = Readonly<{
12
14
  labels?: unknown;
13
15
  }>;
14
16
 
15
- function isAuthoritativeNotFound(error: unknown): boolean {
16
- const message = error instanceof Error ? error.message : String(error);
17
- return /(?:no such (?:container|object)|container .* not found|cannot find container)/i.test(message);
18
- }
19
-
20
17
  export function classifySandboxContainerInspection(
21
18
  expected: SandboxControlManifest['containerIdentity'],
22
19
  inspection: ContainerInspection | { notFound: true } | { error: unknown }
23
20
  ): ContainerObservation {
24
21
  if ('notFound' in inspection) return { state: 'absent', id: expected.id };
25
22
  if ('error' in inspection) {
26
- return isAuthoritativeNotFound(inspection.error)
27
- ? { state: 'absent', id: expected.id }
28
- : { state: 'unknown', reason: `container inspection failed: ${inspection.error instanceof Error ? inspection.error.message : String(inspection.error)}` };
23
+ return { state: 'unknown', reason: `container inspection failed: ${inspection.error instanceof Error ? inspection.error.message : String(inspection.error)}` };
29
24
  }
30
25
  const response = inspection as ContainerInspection;
31
26
  if (typeof response.id !== 'string' || response.id !== expected.id
@@ -49,44 +44,33 @@ export function classifySandboxContainerInspection(
49
44
 
50
45
  export async function inspectSandboxControlContainer(
51
46
  manifest: SandboxControlManifest,
52
- options: { run?: typeof runEngine; probe?: typeof runProbe; timeoutMs?: number } = {}
47
+ options: { probe?: typeof runProbe; timeoutMs?: number } = {}
53
48
  ): Promise<ContainerObservation> {
49
+ if (!isSandboxAuthorityEvidence(manifest.authorityEvidence)) {
50
+ return { state: 'unknown', reason: 'SANDBOX_AUTHORITY_EVIDENCE_MISSING' };
51
+ }
54
52
  try {
55
- const args = ['inspect', '--format', '{{json .}}', manifest.containerIdentity.id];
56
- let raw: string;
57
- if (options.run) {
58
- raw = options.run(manifest.engine, 'docker', args, options.timeoutMs === undefined ? {} : { timeout: options.timeoutMs });
59
- } else {
60
- const command = commandForEngine(manifest.engine, 'docker', args);
61
- const result = (options.probe ?? runProbe)(
62
- command.cmd,
63
- command.args,
64
- options.timeoutMs === undefined ? {} : { timeout: options.timeoutMs }
65
- );
66
- if (result.status !== 0) {
67
- const stderr = typeof result.stderr === 'string' ? result.stderr : result.stderr?.toString('utf8') ?? '';
68
- return classifySandboxContainerInspection(manifest.containerIdentity, {
69
- error: new Error(stderr || `container inspection exited with ${result.status ?? 'unknown'}`)
70
- });
71
- }
72
- raw = typeof result.stdout === 'string' ? result.stdout : result.stdout?.toString('utf8') ?? '';
53
+ const authority = captureSandboxAuthority(manifest.engine, {
54
+ probe: options.probe,
55
+ timeoutMs: options.timeoutMs,
56
+ lockDomain: manifest.authorityEvidence.lockDomain,
57
+ route: manifest.authorityEvidence
58
+ });
59
+ const authorityState = verifySandboxAuthority(manifest.authorityEvidence, authority);
60
+ if (authorityState.state !== 'verified') {
61
+ return { state: 'unknown', reason: authorityState.reason ?? 'SANDBOX_AUTHORITY_UNAVAILABLE' };
73
62
  }
74
- const parsed = JSON.parse(raw) as {
75
- Id?: unknown;
76
- State?: { Running?: unknown };
77
- Config?: { Labels?: unknown };
78
- } | Array<{
79
- Id?: unknown;
80
- State?: { Running?: unknown };
81
- Config?: { Labels?: unknown };
82
- }>;
83
- const value = Array.isArray(parsed) && parsed.length === 1 ? parsed[0] : parsed;
84
- if (!value || Array.isArray(value)) return { state: 'unknown', reason: 'container inspection response is incomplete' };
85
- return classifySandboxContainerInspection(manifest.containerIdentity, {
86
- id: value.Id,
87
- running: value.State?.Running,
88
- labels: value.Config?.Labels
63
+ const discovered = discoverExactContainer(manifest.engine, manifest.containerIdentity.id, {
64
+ probe: options.probe,
65
+ timeoutMs: options.timeoutMs,
66
+ authority: manifest.authorityEvidence
89
67
  });
68
+ if (discovered.state === 'absent') return { state: 'absent', id: discovered.id };
69
+ if (discovered.state === 'conflict') {
70
+ return { state: 'unknown', reason: `SANDBOX_CONTROL_CONTAINER_CONFLICT: ${discovered.reason}` };
71
+ }
72
+ if (discovered.state === 'unknown') return discovered;
73
+ return classifySandboxContainerInspection(manifest.containerIdentity, discovered);
90
74
  } catch (error) {
91
75
  return classifySandboxContainerInspection(manifest.containerIdentity, { error });
92
76
  }
@@ -3,16 +3,40 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { randomUUID } from 'node:crypto';
5
5
  import { getProcessStartTime } from '../../server/process-state.ts';
6
- import { createTask } from '../../task/create-service.ts';
6
+ import {
7
+ createTask,
8
+ projectTaskCreateResult,
9
+ taskCreateExitCode,
10
+ taskCreateFailure,
11
+ type TaskCreateResult
12
+ } from '../../task/create-service.ts';
7
13
  import { applyTaskFinalization } from '../../task/finalization.ts';
8
- import { bindSandboxControlTask, validateSandboxControlRequest, type SandboxControlExecution, type SandboxControlManifest, type SandboxControlRequest } from './protocol.ts';
9
- import { atomicWriteJson, executionPath, readActiveLease, terminateSandboxControlExecution } from './state.ts';
14
+ import {
15
+ bindSandboxControlTask,
16
+ validateSandboxControlRequest,
17
+ type SandboxControlExecution,
18
+ type SandboxControlExecutorGateV2,
19
+ type SandboxControlManifest,
20
+ type SandboxControlRequest
21
+ } from './protocol.ts';
22
+ import {
23
+ atomicWriteJson,
24
+ executionPath,
25
+ readActiveLease,
26
+ terminateSandboxControlExecution
27
+ } from './state.ts';
28
+ import { requestAuditFields, resultAuditFields, appendDiagnosticAudit, createSandboxControlAuditContext, appendCriticalAudit, writeSandboxControlTransition } from './audit.ts';
29
+ import { validateSandboxControlIdentity } from './identity-sentinel.ts';
10
30
  import {
11
31
  createSandboxExecutorExecutionContext,
12
32
  dispatchTaskControlOperation,
13
33
  parseTaskControlOperation,
34
+ validateLifecycleRecoveryAttestation,
35
+ type LifecycleAuthorityResponseV1,
36
+ type LifecycleRecoveryAttestationV1,
14
37
  type TaskControlOperation
15
38
  } from '../../task/control-authority.ts';
39
+ import { executeTaskWorkflow } from './workflow-executor.ts';
16
40
  import { assertSandboxControlBrokerOwner, readSandboxControlManifest, type BrokerOwner } from './lifecycle.ts';
17
41
  import { computeLifecycleBuildIdentity } from '../../agent-clients/adapters/codex-lifecycle/build-identity.ts';
18
42
  import {
@@ -21,6 +45,7 @@ import {
21
45
  openCodexControllerRegistration,
22
46
  resolveCodexControllerBinding
23
47
  } from './controller-registration.ts';
48
+ import type { OrchestrationDiagnosticLogger } from '../../task/orchestration.ts';
24
49
 
25
50
  export type SandboxControlExecutionResult = {
26
51
  exitCode: number;
@@ -59,6 +84,27 @@ function safeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
59
84
  return Object.fromEntries(Object.entries(env).filter(([key]) => !key.toUpperCase().startsWith('AGENT_INFRA_CONTROL_')));
60
85
  }
61
86
 
87
+ function safeRealpath(value: string): string | null {
88
+ try {
89
+ return fs.realpathSync.native(value);
90
+ } catch {
91
+ return null;
92
+ }
93
+ }
94
+
95
+ function appendExecutorAudit(
96
+ manifest: SandboxControlManifest,
97
+ event: string,
98
+ fields: Record<string, string | number | boolean | null> = {}
99
+ ): void {
100
+ try {
101
+ appendDiagnosticAudit(manifest, event, { source: 'executor', ...fields });
102
+ } catch {
103
+ // Diagnostics must never change the control protocol.
104
+ }
105
+ }
106
+
107
+
62
108
  export function nodeEntryArgs(entry: string, args: string[]): string[] {
63
109
  return path.extname(entry) === '.ts'
64
110
  ? ['--experimental-strip-types', '--no-warnings', entry, ...args]
@@ -81,6 +127,7 @@ export async function prepareSandboxControlExecution(params: {
81
127
  request: SandboxControlRequest;
82
128
  requestPath: string;
83
129
  internalCliPath: string;
130
+ lifecycleAuthority?: LifecycleAuthorityResponseV1;
84
131
  }): Promise<PreparedSandboxControlExecution> {
85
132
  const nonce = randomUUID();
86
133
  const child = spawn(
@@ -134,7 +181,16 @@ export async function prepareSandboxControlExecution(params: {
134
181
  if (!canWrite()) throw new Error('SANDBOX_CONTROL_OWNER_LOST');
135
182
  atomicWriteJson(executionPath(params.manifest, params.request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
136
183
  if (!canWrite()) throw new Error('SANDBOX_CONTROL_OWNER_LOST');
137
- child.send({ version: 1, nonce, owner: gateOwner });
184
+ const authority = params.lifecycleAuthority?.attestation ?? null;
185
+ child.send({
186
+ version: 2,
187
+ nonce,
188
+ owner: gateOwner,
189
+ requestId: params.request.id,
190
+ operationId: authority?.operationId ?? params.request.id,
191
+ phase: authority?.phase ?? (params.request.family === 'task-workflow' ? 'artifact.finalize-local' : 'orchestration.prepare'),
192
+ authority
193
+ } satisfies SandboxControlExecutorGateV2);
138
194
  },
139
195
  completion,
140
196
  terminate(updateState = true) {
@@ -148,7 +204,7 @@ export async function prepareSandboxControlExecution(params: {
148
204
  };
149
205
  }
150
206
 
151
- function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner> {
207
+ function waitForGate(nonce: string, timeoutMs = 2_000): Promise<Readonly<{ owner: BrokerOwner; authority: LifecycleRecoveryAttestationV1 | null; requestId: string; operationId: string; phase: SandboxControlExecutorGateV2['phase'] }>> {
152
208
  return new Promise((resolve, reject) => {
153
209
  const timer = setTimeout(() => reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_TIMEOUT')), timeoutMs);
154
210
  const onDisconnect = () => {
@@ -163,9 +219,14 @@ function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner> {
163
219
  version?: unknown;
164
220
  nonce?: unknown;
165
221
  owner?: Partial<BrokerOwner> | null;
222
+ requestId?: unknown;
223
+ operationId?: unknown;
224
+ phase?: unknown;
225
+ authority?: unknown;
166
226
  } | null;
167
227
  const owner = value?.owner;
168
- if (!value || value.version !== 1 || value.nonce !== nonce
228
+ if (!value || Object.keys(value).sort().join(',') !== 'authority,nonce,operationId,owner,phase,requestId,version'
229
+ || value.version !== 2 || value.nonce !== nonce
169
230
  || !owner || owner.version !== 3 || !Number.isSafeInteger(owner.pid) || (owner.pid ?? 0) <= 0
170
231
  || typeof owner.startTime !== 'number' || !Number.isSafeInteger(owner.startTime)
171
232
  || typeof owner.brokerId !== 'string' || owner.brokerId.length === 0
@@ -173,7 +234,21 @@ function waitForGate(nonce: string, timeoutMs = 2_000): Promise<BrokerOwner> {
173
234
  reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
174
235
  return;
175
236
  }
176
- resolve(owner as BrokerOwner);
237
+ if (typeof value.requestId !== 'string' || typeof value.operationId !== 'string'
238
+ || !['orchestration.prepare', 'artifact.finalize-local', 'task-event.completed'].includes(value.phase as string)
239
+ || (value.authority !== null && value.authority !== undefined && (() => {
240
+ try { validateLifecycleRecoveryAttestation(value.authority); return false; } catch { return true; }
241
+ })())) {
242
+ reject(new Error('SANDBOX_CONTROL_EXECUTOR_GATE_INVALID'));
243
+ return;
244
+ }
245
+ resolve({
246
+ owner: owner as BrokerOwner,
247
+ authority: value.authority === null || value.authority === undefined ? null : value.authority as LifecycleRecoveryAttestationV1,
248
+ requestId: value.requestId,
249
+ operationId: value.operationId,
250
+ phase: value.phase as SandboxControlExecutorGateV2['phase']
251
+ });
177
252
  });
178
253
  });
179
254
  }
@@ -218,6 +293,22 @@ function lifecycleFailure(code: string, message: string): SandboxControlExecutio
218
293
  };
219
294
  }
220
295
 
296
+ function taskCreateExecutionResult(result: TaskCreateResult): SandboxControlExecutionResult {
297
+ return {
298
+ exitCode: taskCreateExitCode(result),
299
+ stdout: `${JSON.stringify(result)}\n`,
300
+ stderr: ''
301
+ };
302
+ }
303
+
304
+ function taskCreateExecutionFailure(requestId: string, code: string, message: string): SandboxControlExecutionResult {
305
+ return taskCreateExecutionResult(taskCreateFailure({ code, message, retryable: false }, {
306
+ requestId,
307
+ accepted: true,
308
+ recovery: 'inspect-domain-state'
309
+ }));
310
+ }
311
+
221
312
  function finalizationResult(result: Awaited<ReturnType<typeof applyTaskFinalization>>): SandboxControlExecutionResult {
222
313
  const payload = {
223
314
  version: 1,
@@ -237,21 +328,28 @@ function finalizationResult(result: Awaited<ReturnType<typeof applyTaskFinalizat
237
328
  type ExecuteRequestOptions = Readonly<{
238
329
  buildIdentity?: typeof computeLifecycleBuildIdentity;
239
330
  resolveControllerBinding?: typeof resolveCodexControllerBinding;
331
+ lifecycleRecoveryAttestation?: LifecycleRecoveryAttestationV1 | null;
240
332
  }>;
241
333
 
242
- export async function executeRequest(
334
+ async function executeRequestInner(
243
335
  manifest: SandboxControlManifest,
244
336
  manifestPath: string,
245
337
  request: SandboxControlRequest,
246
338
  options: ExecuteRequestOptions = {}
247
339
  ): Promise<SandboxControlExecutionResult> {
248
340
  if (request.family === 'task-create') {
249
- const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
250
- return {
251
- exitCode: result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0,
252
- stdout: `${JSON.stringify(result)}\n`,
253
- stderr: ''
254
- };
341
+ try {
342
+ const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
343
+ return taskCreateExecutionResult(projectTaskCreateResult(result, {
344
+ requestId: request.id,
345
+ accepted: true,
346
+ recovery: 'none'
347
+ }));
348
+ } catch (error) {
349
+ const detail = error instanceof Error ? error.message : String(error);
350
+ const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'TASK_CREATE_EXECUTION_FAILED';
351
+ return taskCreateExecutionFailure(request.id, code, detail);
352
+ }
255
353
  }
256
354
  if (request.family === 'codex-controller') {
257
355
  try {
@@ -293,9 +391,20 @@ export async function executeRequest(
293
391
  });
294
392
  return { exitCode: 0, stdout: `${JSON.stringify(result)}\n`, stderr: '' };
295
393
  } catch (error) {
394
+ const errorCode = error instanceof CodexControllerRegistrationError
395
+ ? error.code
396
+ : /^([A-Z][A-Z0-9_]+)/u.exec(error instanceof Error ? error.message : String(error))?.[1]
397
+ ?? 'CODEX_SANDBOX_CONTROLLER_FAILED';
398
+ appendExecutorAudit(manifest, 'controller-operation-failed', {
399
+ ...requestAuditFields(manifest, request),
400
+ controllerCommand: request.command,
401
+ errorCode,
402
+ errorType: error instanceof Error ? error.name : typeof error,
403
+ });
296
404
  return controllerFailure(error);
297
405
  }
298
406
  }
407
+ if (request.family === 'task-workflow') return executeTaskWorkflow(manifest, request.workflow, options.lifecycleRecoveryAttestation ?? null);
299
408
  if (request.family === 'task-finalization') {
300
409
  const operation = parseTaskControlOperation(
301
410
  'task-finalization', [manifest.taskId!, 'complete', '--agent', request.agent]
@@ -309,7 +418,8 @@ export async function executeRequest(
309
418
  taskId: manifest.taskId!,
310
419
  generation: manifest.generation,
311
420
  manifestPath,
312
- requestId: request.id
421
+ requestId: request.id,
422
+ lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
313
423
  }),
314
424
  operation
315
425
  );
@@ -339,23 +449,31 @@ export async function executeRequest(
339
449
  && operation.input.client === 'codex';
340
450
  if (codexPrepare) {
341
451
  if (!request.controllerProof) {
342
- return orchestrationFailure(
343
- 'CODEX_SANDBOX_CONTROLLER_PROOF_REQUIRED',
344
- 'Codex prepare requires a current controller lease proof'
345
- );
346
- }
347
- try {
348
- controllerBinding = (options.resolveControllerBinding ?? resolveCodexControllerBinding)({
349
- manifest,
350
- manifestPath,
351
- proof: request.controllerProof,
352
- buildIdentity: (options.buildIdentity ?? computeLifecycleBuildIdentity)(manifest.repoRoot)
353
- });
354
- } catch (error) {
355
- const code = error instanceof CodexControllerRegistrationError
356
- ? error.code
357
- : 'CODEX_SANDBOX_CONTROLLER_PROOF_INVALID';
358
- return orchestrationFailure(code, `${code}: Codex controller proof was rejected`);
452
+ const authority = options.lifecycleRecoveryAttestation;
453
+ if (!authority || authority.phase !== 'orchestration.prepare') {
454
+ return orchestrationFailure(
455
+ 'CODEX_SANDBOX_CONTROLLER_PROOF_REQUIRED',
456
+ 'Codex prepare requires a current controller lease proof'
457
+ );
458
+ }
459
+ controllerBinding = {
460
+ instanceDigest: authority.controllerInstanceDigest,
461
+ controlGeneration: authority.controlGeneration
462
+ };
463
+ } else {
464
+ try {
465
+ controllerBinding = (options.resolveControllerBinding ?? resolveCodexControllerBinding)({
466
+ manifest,
467
+ manifestPath,
468
+ proof: request.controllerProof,
469
+ buildIdentity: (options.buildIdentity ?? computeLifecycleBuildIdentity)(manifest.repoRoot)
470
+ });
471
+ } catch (error) {
472
+ const code = error instanceof CodexControllerRegistrationError
473
+ ? error.code
474
+ : 'CODEX_SANDBOX_CONTROLLER_PROOF_INVALID';
475
+ return orchestrationFailure(code, `${code}: Codex controller proof was rejected`);
476
+ }
359
477
  }
360
478
  } else if (request.controllerProof !== null) {
361
479
  return orchestrationFailure(
@@ -364,6 +482,14 @@ export async function executeRequest(
364
482
  );
365
483
  }
366
484
  }
485
+ const diagnosticLog: OrchestrationDiagnosticLogger = (event, fields): void => {
486
+ appendExecutorAudit(manifest, event.startsWith('orchestration-') ? event : `orchestration-${event}`, {
487
+ requestId: request.id,
488
+ requestFamily: request.family,
489
+ sandboxTaskId: manifest.taskId,
490
+ ...fields
491
+ });
492
+ };
367
493
  const context = createSandboxExecutorExecutionContext({
368
494
  repoRoot: manifest.repoRoot,
369
495
  worktreeRoot: manifest.worktreeRoot,
@@ -372,7 +498,9 @@ export async function executeRequest(
372
498
  generation: manifest.generation,
373
499
  manifestPath,
374
500
  requestId: request.id,
375
- ...(controllerBinding ? { controllerBinding } : {})
501
+ diagnosticLog,
502
+ ...(controllerBinding ? { controllerBinding } : {}),
503
+ lifecycleRecoveryAttestation: options.lifecycleRecoveryAttestation ?? null
376
504
  });
377
505
  const format = (value: unknown): SandboxControlExecutionResult => {
378
506
  const result = value as { status?: string };
@@ -390,27 +518,116 @@ export async function executeRequest(
390
518
  return format(await dispatchTaskControlOperation(context, operation));
391
519
  }
392
520
 
521
+ export async function executeRequest(
522
+ manifest: SandboxControlManifest,
523
+ manifestPath: string,
524
+ request: SandboxControlRequest,
525
+ options: ExecuteRequestOptions = {}
526
+ ): Promise<SandboxControlExecutionResult> {
527
+ const fields = requestAuditFields(manifest, request);
528
+ appendExecutorAudit(manifest, 'executor-request-start', fields);
529
+ try {
530
+ const result = await executeRequestInner(manifest, manifestPath, request, options);
531
+ appendExecutorAudit(manifest, 'executor-request-finished', {
532
+ requestId: request.id,
533
+ requestFamily: request.family,
534
+ sandboxTaskId: manifest.taskId,
535
+ ...resultAuditFields(result)
536
+ });
537
+ return result;
538
+ } catch (error) {
539
+ appendExecutorAudit(manifest, 'executor-request-failed', {
540
+ requestId: request.id,
541
+ requestFamily: request.family,
542
+ sandboxTaskId: manifest.taskId,
543
+ errorType: error instanceof Error ? error.name : typeof error,
544
+ });
545
+ throw error;
546
+ }
547
+ }
548
+
393
549
  export async function runSandboxControlExecutor(requestPath: string, nonce: string): Promise<void> {
394
- const gateOwner = await waitForGate(nonce);
550
+ const gate = await waitForGate(nonce);
551
+ const gateOwner = gate.owner;
395
552
  process.disconnect?.();
396
553
  const manifestPath = process.env.AGENT_INFRA_EXECUTOR_MANIFEST;
397
554
  if (!manifestPath) throw new Error('SANDBOX_CONTROL_EXECUTOR_MANIFEST_MISSING');
398
555
  const manifest = readSandboxControlManifest(manifestPath);
556
+ const identity = validateSandboxControlIdentity({
557
+ publicStatusDir: manifest.publicStatusDir,
558
+ root: path.dirname(path.resolve(manifestPath)),
559
+ mode: manifest.mode,
560
+ taskId: manifest.taskId,
561
+ generation: manifest.generation,
562
+ controlRootId: manifest.controlRootId
563
+ });
564
+ if (identity.state !== 'valid') {
565
+ throw new Error(`SANDBOX_CONTROL_IDENTITY_${identity.state.replaceAll('-', '_').toUpperCase()}`);
566
+ }
399
567
  const root = fs.realpathSync.native(process.cwd());
400
- if (fs.realpathSync.native(manifest.repoRoot) !== root) throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
568
+ const expectedRoot = safeRealpath(manifest.repoRoot);
569
+ if (expectedRoot !== root) {
570
+ appendExecutorAudit(manifest, 'executor-root-validation-failed', {
571
+ hostCwd: process.cwd(),
572
+ observedRoot: root,
573
+ expectedRoot
574
+ });
575
+ throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
576
+ }
401
577
  const raw = JSON.parse(fs.readFileSync(requestPath, 'utf8')) as unknown;
402
578
  const request = validateSandboxControlRequest(raw, manifest);
579
+ if (gate.requestId !== request.id) throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_REQUEST_MISMATCH');
580
+ if (gate.authority !== null
581
+ && (gate.authority.requestId !== request.id
582
+ || gate.authority.operationId !== gate.operationId
583
+ || gate.authority.phase !== gate.phase)) {
584
+ throw new Error('SANDBOX_CONTROL_EXECUTOR_GATE_AUTHORITY_MISMATCH');
585
+ }
586
+ appendExecutorAudit(manifest, 'executor-request-validated', requestAuditFields(manifest, request));
403
587
  const requestDirectory = path.resolve(path.dirname(requestPath));
404
588
  const processingDirectory = path.resolve(path.join(manifest.processingDir, request.id));
405
589
  const channelRequestDirectory = path.resolve(path.join(manifest.channelDir, 'requests'));
406
590
  if (requestDirectory !== processingDirectory && requestDirectory !== channelRequestDirectory) {
591
+ appendExecutorAudit(manifest, 'executor-request-path-validation-failed', {
592
+ ...requestAuditFields(manifest, request),
593
+ requestPath,
594
+ requestDirectory,
595
+ processingDirectory,
596
+ channelRequestDirectory
597
+ });
407
598
  throw new Error('SANDBOX_CONTROL_EXECUTOR_REQUEST_INVALID');
408
599
  }
409
600
  let result: SandboxControlExecutionResult;
410
601
  try {
411
602
  assertSandboxControlExecutorAuthority(manifest, gateOwner);
412
- result = await executeRequest(manifest, manifestPath, request);
603
+ const operation = request.family === 'task-lifecycle' || request.family === 'task-orchestration'
604
+ ? (() => {
605
+ try { return parseTaskControlOperation(request.family, request.args); } catch { return null; }
606
+ })()
607
+ : null;
608
+ const context = createSandboxControlAuditContext(manifest, {
609
+ requestId: request.id,
610
+ family: request.family,
611
+ operation: operation?.family === 'task-orchestration'
612
+ ? operation.intent
613
+ : operation?.family === 'task-lifecycle'
614
+ ? operation.request.intent
615
+ : request.family === 'task-finalization' ? request.operation : null,
616
+ phase: 'started-committed',
617
+ outcome: 'in-progress'
618
+ });
619
+ appendCriticalAudit(manifest, context, { transition: 'started-committed' });
620
+ writeSandboxControlTransition(manifest, { requestId: request.id, phase: 'started-committed' });
621
+ const execution = readJsonExecution(executionPath(manifest, request.id));
622
+ atomicWriteJson(executionPath(manifest, request.id), { ...execution, phase: 'running', updatedAt: Date.now() });
623
+ result = await executeRequest(manifest, manifestPath, request, {
624
+ lifecycleRecoveryAttestation: gate.authority
625
+ });
413
626
  } catch (error) {
627
+ appendExecutorAudit(manifest, 'executor-authority-or-dispatch-failed', {
628
+ ...requestAuditFields(manifest, request),
629
+ errorType: error instanceof Error ? error.name : typeof error,
630
+ });
414
631
  const detail = error instanceof Error ? error.message : String(error);
415
632
  const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'SANDBOX_CONTROL_EXECUTOR_FAILED';
416
633
  result = request.family === 'task-finalization'
@@ -422,7 +639,9 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
422
639
  })}\n`,
423
640
  stderr: ''
424
641
  }
425
- : request.family === 'task-lifecycle'
642
+ : request.family === 'task-create'
643
+ ? taskCreateExecutionFailure(request.id, code, detail)
644
+ : request.family === 'task-lifecycle'
426
645
  ? lifecycleFailure(code, detail)
427
646
  : orchestrationFailure(code, detail);
428
647
  }
@@ -431,6 +650,12 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
431
650
  process.exitCode = result.exitCode;
432
651
  }
433
652
 
653
+ function readJsonExecution(filePath: string): SandboxControlExecution {
654
+ const value = JSON.parse(fs.readFileSync(filePath, 'utf8')) as SandboxControlExecution;
655
+ if (!value || value.requestId.length === 0) throw new Error('SANDBOX_CONTROL_EXECUTION_INVALID');
656
+ return value;
657
+ }
658
+
434
659
  export function disconnectExecutor(child: ChildProcess): void {
435
660
  if (child.connected) child.disconnect();
436
661
  }
@@ -0,0 +1,29 @@
1
+ import type { TaskFinalizationReceipt } from '../../task/finalization.ts';
2
+ import type { SandboxControlResponse } from './protocol.ts';
3
+
4
+ export function finalizationTerminalResponse(taskId: string, requestId: string, receipt: TaskFinalizationReceipt): SandboxControlResponse {
5
+ const pendingSteps = [
6
+ receipt.taskComment === 'pending' ? 'task-comment' : null,
7
+ receipt.verification === 'pending' ? 'verification' : null
8
+ ].filter((step): step is string => step !== null);
9
+ const completedSteps = ['lifecycle', receipt.taskComment === 'pending' ? null : 'task-comment', receipt.verification === 'pending' ? null : 'verification']
10
+ .filter((step): step is string => step !== null);
11
+ const warnings = receipt.warnings
12
+ .filter((warning) => warning.status === 'open')
13
+ .map(({ status: _status, resolvedAt: _resolvedAt, ...warning }) => warning);
14
+ const result = {
15
+ status: 'completed', changed: false, taskId,
16
+ lifecycle: { status: 'no-op', changed: false, error: null },
17
+ taskComment: receipt.taskComment === 'pending' ? null : { status: 'no-op', changed: false, error: null },
18
+ verification: receipt.verification === 'pending' ? null : { status: 'no-op', changed: false, error: null },
19
+ completedSteps, pendingSteps,
20
+ result: pendingSteps.length > 0 || receipt.warningProjection === 'pending' || warnings.length > 0
21
+ ? 'completed_with_warnings' : 'completed',
22
+ warnings, error: null
23
+ };
24
+ return {
25
+ version: 2, id: requestId, phase: 'completed', exitCode: 0,
26
+ stdout: `${JSON.stringify({ version: 1, status: 'completed', changed: false, accepted: true, result, error: null })}\n`,
27
+ stderr: '', error: null
28
+ };
29
+ }