agent-control-plane 0.1.0

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 (317) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +589 -0
  3. package/SKILL.md +149 -0
  4. package/assets/workflow-catalog.json +57 -0
  5. package/bin/audit-issue-routing.sh +74 -0
  6. package/bin/issue-resource-class.sh +58 -0
  7. package/bin/label-follow-up-issues.sh +114 -0
  8. package/bin/pr-risk.sh +532 -0
  9. package/bin/sync-pr-labels.sh +112 -0
  10. package/hooks/heartbeat-hooks.sh +573 -0
  11. package/hooks/issue-reconcile-hooks.sh +217 -0
  12. package/hooks/pr-reconcile-hooks.sh +225 -0
  13. package/npm/bin/agent-control-plane.js +1984 -0
  14. package/npm/public-bin/agent-control-plane +3 -0
  15. package/package.json +61 -0
  16. package/tools/bin/agent-cleanup-worktree +247 -0
  17. package/tools/bin/agent-github-update-labels +66 -0
  18. package/tools/bin/agent-init-worktree +216 -0
  19. package/tools/bin/agent-project-archive-run +52 -0
  20. package/tools/bin/agent-project-capture-worker +46 -0
  21. package/tools/bin/agent-project-catch-up-merged-prs +137 -0
  22. package/tools/bin/agent-project-cleanup-session +244 -0
  23. package/tools/bin/agent-project-detached-launch +107 -0
  24. package/tools/bin/agent-project-heartbeat-loop +2347 -0
  25. package/tools/bin/agent-project-open-issue-worktree +89 -0
  26. package/tools/bin/agent-project-open-pr-worktree +80 -0
  27. package/tools/bin/agent-project-publish-issue-pr +349 -0
  28. package/tools/bin/agent-project-reconcile-issue-session +1128 -0
  29. package/tools/bin/agent-project-reconcile-pr-session +1005 -0
  30. package/tools/bin/agent-project-retry-state +147 -0
  31. package/tools/bin/agent-project-run-claude-session +657 -0
  32. package/tools/bin/agent-project-run-codex-resilient +718 -0
  33. package/tools/bin/agent-project-run-codex-session +316 -0
  34. package/tools/bin/agent-project-run-kilo-session +27 -0
  35. package/tools/bin/agent-project-run-openclaw-session +984 -0
  36. package/tools/bin/agent-project-run-opencode-session +27 -0
  37. package/tools/bin/agent-project-sync-anchor-repo +128 -0
  38. package/tools/bin/agent-project-worker-status +143 -0
  39. package/tools/bin/audit-agent-worktrees.sh +310 -0
  40. package/tools/bin/audit-issue-routing.sh +11 -0
  41. package/tools/bin/audit-retained-layout.sh +58 -0
  42. package/tools/bin/audit-retained-overlap.sh +135 -0
  43. package/tools/bin/audit-retained-worktrees.sh +228 -0
  44. package/tools/bin/branch-verification-guard.sh +351 -0
  45. package/tools/bin/capture-worker.sh +18 -0
  46. package/tools/bin/check-skill-contracts.sh +324 -0
  47. package/tools/bin/cleanup-worktree.sh +44 -0
  48. package/tools/bin/codex-quota +31 -0
  49. package/tools/bin/create-follow-up-issue.sh +114 -0
  50. package/tools/bin/dashboard-launchd-bootstrap.sh +38 -0
  51. package/tools/bin/flow-config-lib.sh +2127 -0
  52. package/tools/bin/flow-resident-worker-lib.sh +683 -0
  53. package/tools/bin/flow-runtime-doctor.sh +97 -0
  54. package/tools/bin/flow-shell-lib.sh +266 -0
  55. package/tools/bin/heartbeat-recovery-preflight.sh +106 -0
  56. package/tools/bin/heartbeat-safe-auto.sh +551 -0
  57. package/tools/bin/install-dashboard-launchd.sh +152 -0
  58. package/tools/bin/install-project-launchd.sh +219 -0
  59. package/tools/bin/issue-publish-scope-guard.sh +242 -0
  60. package/tools/bin/issue-requires-local-workspace-install.sh +31 -0
  61. package/tools/bin/issue-resource-class.sh +12 -0
  62. package/tools/bin/kick-scheduler.sh +75 -0
  63. package/tools/bin/label-follow-up-issues.sh +14 -0
  64. package/tools/bin/new-pr-worktree.sh +50 -0
  65. package/tools/bin/new-worktree.sh +49 -0
  66. package/tools/bin/pr-risk.sh +12 -0
  67. package/tools/bin/prepare-worktree.sh +140 -0
  68. package/tools/bin/profile-activate.sh +109 -0
  69. package/tools/bin/profile-adopt.sh +219 -0
  70. package/tools/bin/profile-smoke.sh +461 -0
  71. package/tools/bin/project-init.sh +189 -0
  72. package/tools/bin/project-launchd-bootstrap.sh +54 -0
  73. package/tools/bin/project-remove.sh +155 -0
  74. package/tools/bin/project-runtime-supervisor.sh +56 -0
  75. package/tools/bin/project-runtimectl.sh +586 -0
  76. package/tools/bin/provider-cooldown-state.sh +166 -0
  77. package/tools/bin/publish-issue-worker.sh +31 -0
  78. package/tools/bin/reconcile-issue-worker.sh +34 -0
  79. package/tools/bin/reconcile-pr-worker.sh +34 -0
  80. package/tools/bin/record-verification.sh +71 -0
  81. package/tools/bin/render-architecture-infographics.sh +110 -0
  82. package/tools/bin/render-dashboard-demo-media.sh +333 -0
  83. package/tools/bin/render-dashboard-snapshot.py +16 -0
  84. package/tools/bin/render-flow-config.sh +86 -0
  85. package/tools/bin/retry-state.sh +31 -0
  86. package/tools/bin/reuse-issue-worktree.sh +75 -0
  87. package/tools/bin/run-codex-bypass.sh +3 -0
  88. package/tools/bin/run-codex-safe.sh +3 -0
  89. package/tools/bin/run-codex-task.sh +231 -0
  90. package/tools/bin/scaffold-profile.sh +374 -0
  91. package/tools/bin/serve-dashboard.sh +5 -0
  92. package/tools/bin/split-retained-slice.sh +124 -0
  93. package/tools/bin/start-issue-worker.sh +796 -0
  94. package/tools/bin/start-pr-fix-worker.sh +458 -0
  95. package/tools/bin/start-pr-merge-repair-worker.sh +8 -0
  96. package/tools/bin/start-pr-review-worker.sh +227 -0
  97. package/tools/bin/start-resident-issue-loop.sh +908 -0
  98. package/tools/bin/sync-agent-repo.sh +52 -0
  99. package/tools/bin/sync-dependency-baseline.sh +247 -0
  100. package/tools/bin/sync-pr-labels.sh +12 -0
  101. package/tools/bin/sync-recurring-issue-checklist.sh +274 -0
  102. package/tools/bin/sync-shared-agent-home.sh +214 -0
  103. package/tools/bin/sync-vscode-workspace.sh +157 -0
  104. package/tools/bin/test-smoke.sh +63 -0
  105. package/tools/bin/uninstall-project-launchd.sh +55 -0
  106. package/tools/bin/update-github-labels.sh +14 -0
  107. package/tools/bin/worker-status.sh +19 -0
  108. package/tools/bin/workflow-catalog.sh +77 -0
  109. package/tools/dashboard/app.js +286 -0
  110. package/tools/dashboard/dashboard_snapshot.py +466 -0
  111. package/tools/dashboard/index.html +41 -0
  112. package/tools/dashboard/server.py +64 -0
  113. package/tools/dashboard/styles.css +351 -0
  114. package/tools/templates/issue-prompt-template.md +109 -0
  115. package/tools/templates/pr-fix-template.md +120 -0
  116. package/tools/templates/pr-merge-repair-template.md +91 -0
  117. package/tools/templates/pr-review-template.md +62 -0
  118. package/tools/templates/scheduled-issue-prompt-template.md +62 -0
  119. package/tools/tests/test-agent-control-plane-npm-cli.sh +279 -0
  120. package/tools/tests/test-agent-github-update-labels-falls-back-to-repository-id.sh +56 -0
  121. package/tools/tests/test-agent-project-claude-session-wrapper-clears-stale-sandbox-artifacts.sh +89 -0
  122. package/tools/tests/test-agent-project-claude-session-wrapper-does-not-retry-provider-quota.sh +82 -0
  123. package/tools/tests/test-agent-project-claude-session-wrapper-retries-transient-failures.sh +90 -0
  124. package/tools/tests/test-agent-project-claude-session-wrapper-times-out.sh +73 -0
  125. package/tools/tests/test-agent-project-claude-session-wrapper.sh +103 -0
  126. package/tools/tests/test-agent-project-cleanup-session-orphan-fallback.sh +90 -0
  127. package/tools/tests/test-agent-project-cleanup-session-skip-worktree-cleanup.sh +90 -0
  128. package/tools/tests/test-agent-project-codex-live-thread-persist.sh +76 -0
  129. package/tools/tests/test-agent-project-codex-recovery.sh +731 -0
  130. package/tools/tests/test-agent-project-codex-session-wrapper-clears-stale-sandbox-artifacts.sh +105 -0
  131. package/tools/tests/test-agent-project-codex-session-wrapper.sh +97 -0
  132. package/tools/tests/test-agent-project-open-pr-worktree-config-prefix.sh +81 -0
  133. package/tools/tests/test-agent-project-openclaw-session-wrapper-clears-stale-sandbox-artifacts.sh +109 -0
  134. package/tools/tests/test-agent-project-openclaw-session-wrapper-infers-blocked-result-contract.sh +89 -0
  135. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-literal-env-artifacts.sh +113 -0
  136. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-version-mismatch.sh +135 -0
  137. package/tools/tests/test-agent-project-openclaw-session-wrapper-resident.sh +179 -0
  138. package/tools/tests/test-agent-project-openclaw-session-wrapper-reuses-existing-agent-after-add-race.sh +119 -0
  139. package/tools/tests/test-agent-project-openclaw-session-wrapper-terminates-rate-limit-hang.sh +91 -0
  140. package/tools/tests/test-agent-project-openclaw-session-wrapper.sh +117 -0
  141. package/tools/tests/test-agent-project-publish-issue-pr-prunes-stale-worktree-entry.sh +148 -0
  142. package/tools/tests/test-agent-project-publish-issue-pr-reads-archived-session.sh +146 -0
  143. package/tools/tests/test-agent-project-publish-issue-pr-recovers-final-head.sh +145 -0
  144. package/tools/tests/test-agent-project-publish-issue-pr-reuses-existing-worktree.sh +147 -0
  145. package/tools/tests/test-agent-project-reconcile-failure-reason.sh +456 -0
  146. package/tools/tests/test-agent-project-reconcile-issue-archived-session-fallback.sh +96 -0
  147. package/tools/tests/test-agent-project-reconcile-issue-before-blocked.sh +90 -0
  148. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery-uses-recovered-worktree.sh +212 -0
  149. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery.sh +207 -0
  150. package/tools/tests/test-agent-project-reconcile-issue-provider-quota-schedules-provider-cooldown.sh +101 -0
  151. package/tools/tests/test-agent-project-reconcile-issue-session-backfills-lane-metadata-from-worker-key.sh +113 -0
  152. package/tools/tests/test-agent-project-reconcile-issue-session-clears-stale-failed-summary.sh +117 -0
  153. package/tools/tests/test-agent-project-reconcile-issue-session-initializes-shared-agent-home.sh +55 -0
  154. package/tools/tests/test-agent-project-reconcile-issue-session-normalizes-runner-state.sh +125 -0
  155. package/tools/tests/test-agent-project-reconcile-issue-session-records-invalid-contract-summary.sh +118 -0
  156. package/tools/tests/test-agent-project-reconcile-issue-session-skips-duplicate-blocked-comment.sh +144 -0
  157. package/tools/tests/test-agent-project-reconcile-issue-session-standardizes-no-commits-blocker.sh +145 -0
  158. package/tools/tests/test-agent-project-reconcile-issue-session-synthesizes-blocked-comment.sh +139 -0
  159. package/tools/tests/test-agent-project-reconcile-pr-blocked-host-recovery.sh +242 -0
  160. package/tools/tests/test-agent-project-reconcile-pr-guard-blocked-no-commit.sh +142 -0
  161. package/tools/tests/test-agent-project-reconcile-pr-provider-quota-schedules-provider-cooldown.sh +106 -0
  162. package/tools/tests/test-agent-project-reconcile-pr-session-initializes-shared-agent-home.sh +66 -0
  163. package/tools/tests/test-agent-project-reconcile-pr-updated-branch-noop.sh +129 -0
  164. package/tools/tests/test-audit-agent-worktrees-active-launch-skips-git-inspection.sh +69 -0
  165. package/tools/tests/test-audit-agent-worktrees-broken-worktree.sh +43 -0
  166. package/tools/tests/test-audit-agent-worktrees-pending-launch-owner.sh +46 -0
  167. package/tools/tests/test-audit-agent-worktrees-unreconciled-owner.sh +79 -0
  168. package/tools/tests/test-audit-issue-routing-managed-branch-globs.sh +56 -0
  169. package/tools/tests/test-branch-verification-guard-generated-artifacts.sh +72 -0
  170. package/tools/tests/test-branch-verification-guard-targeted-coverage.sh +125 -0
  171. package/tools/tests/test-codex-quota-manager-failure-driven-rotation.sh +178 -0
  172. package/tools/tests/test-codex-quota-wrapper.sh +37 -0
  173. package/tools/tests/test-contribution-docs.sh +18 -0
  174. package/tools/tests/test-control-plane-dashboard-runtime-smoke.sh +343 -0
  175. package/tools/tests/test-create-follow-up-issue.sh +73 -0
  176. package/tools/tests/test-dashboard-launchd-bootstrap.sh +55 -0
  177. package/tools/tests/test-flow-export-execution-env-exports-repo-id.sh +30 -0
  178. package/tools/tests/test-flow-export-github-cli-auth-env-prefers-git-credential.sh +48 -0
  179. package/tools/tests/test-flow-github-api-repo-fallback-preserves-input.sh +85 -0
  180. package/tools/tests/test-flow-github-api-repo-prefers-explicit-repository-id.sh +60 -0
  181. package/tools/tests/test-flow-github-issue-list-falls-back-to-repository-id.sh +64 -0
  182. package/tools/tests/test-flow-github-pr-list-falls-back-to-repository-id.sh +77 -0
  183. package/tools/tests/test-flow-resident-can-reuse-does-not-leak-metadata.sh +52 -0
  184. package/tools/tests/test-flow-resident-reap-stale-controllers.sh +63 -0
  185. package/tools/tests/test-flow-resolve-codex-quota-tools.sh +104 -0
  186. package/tools/tests/test-flow-runtime-doctor-profile-selection.sh +27 -0
  187. package/tools/tests/test-heartbeat-codex-pr-linked-issue-exclusion.sh +79 -0
  188. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-idle-controller.sh +115 -0
  189. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-live-lane-controller.sh +117 -0
  190. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-claude.sh +96 -0
  191. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-codex.sh +96 -0
  192. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop.sh +96 -0
  193. package/tools/tests/test-heartbeat-loop-auth-wait-does-not-consume-capacity.sh +170 -0
  194. package/tools/tests/test-heartbeat-loop-blocked-recovery-lane.sh +201 -0
  195. package/tools/tests/test-heartbeat-loop-blocked-recovery-vs-pr-reservation.sh +201 -0
  196. package/tools/tests/test-heartbeat-loop-idle-resident-controller-does-not-block-launches.sh +160 -0
  197. package/tools/tests/test-heartbeat-loop-pr-launch-dedup.sh +133 -0
  198. package/tools/tests/test-heartbeat-loop-provider-cooldown-suppresses-launches.sh +157 -0
  199. package/tools/tests/test-heartbeat-loop-reaps-stale-resident-controller.sh +181 -0
  200. package/tools/tests/test-heartbeat-loop-waiting-provider-resident-controller-does-not-block-launches.sh +160 -0
  201. package/tools/tests/test-heartbeat-ready-issues-blocked-recovery.sh +134 -0
  202. package/tools/tests/test-heartbeat-safe-auto-dynamic-concurrency.sh +162 -0
  203. package/tools/tests/test-heartbeat-safe-auto-no-tmux-sessions.sh +136 -0
  204. package/tools/tests/test-heartbeat-safe-auto-openclaw-skips-codex-quota.sh +139 -0
  205. package/tools/tests/test-heartbeat-safe-auto-quota-health-signal.sh +119 -0
  206. package/tools/tests/test-heartbeat-safe-auto-stale-shared-loop-pid-does-not-skip.sh +140 -0
  207. package/tools/tests/test-heartbeat-safe-auto-static-capacity-without-quota-cache.sh +142 -0
  208. package/tools/tests/test-heartbeat-safe-auto-zero-healthy-pools.sh +141 -0
  209. package/tools/tests/test-heartbeat-sync-issue-labels-empty-schedule.sh +65 -0
  210. package/tools/tests/test-heartbeat-sync-open-agent-prs-terminal-clears-running.sh +179 -0
  211. package/tools/tests/test-install-dashboard-launchd.sh +78 -0
  212. package/tools/tests/test-install-project-launchd-adds-tool-paths.sh +87 -0
  213. package/tools/tests/test-install-project-launchd.sh +110 -0
  214. package/tools/tests/test-issue-local-workspace-install-policy.sh +81 -0
  215. package/tools/tests/test-issue-publish-scope-guard-docs-signal.sh +70 -0
  216. package/tools/tests/test-issue-reconcile-hooks-success-clears-blocked.sh +36 -0
  217. package/tools/tests/test-kick-scheduler-requires-explicit-profile.sh +47 -0
  218. package/tools/tests/test-label-follow-up-issues-falls-back-to-repository-id.sh +132 -0
  219. package/tools/tests/test-manual-operator-entrypoints-require-explicit-profile.sh +64 -0
  220. package/tools/tests/test-package-funding-metadata.sh +21 -0
  221. package/tools/tests/test-package-public-metadata.sh +62 -0
  222. package/tools/tests/test-placeholder-worker-adapters.sh +38 -0
  223. package/tools/tests/test-pr-reconcile-hooks-refreshes-recurring-issue-checklist.sh +110 -0
  224. package/tools/tests/test-pr-risk-cohesive-mobile-locale-scope.sh +70 -0
  225. package/tools/tests/test-pr-risk-fix-label-semantics.sh +114 -0
  226. package/tools/tests/test-pr-risk-local-first-no-checks.sh +70 -0
  227. package/tools/tests/test-prepare-worktree-simple-repo-baseline.sh +67 -0
  228. package/tools/tests/test-profile-activate.sh +33 -0
  229. package/tools/tests/test-profile-adopt-allow-missing-repo.sh +68 -0
  230. package/tools/tests/test-profile-adopt-skip-workspace-sync-missing-file.sh +61 -0
  231. package/tools/tests/test-profile-adopt-syncs-anchor-and-workspace.sh +90 -0
  232. package/tools/tests/test-profile-smoke-collision.sh +44 -0
  233. package/tools/tests/test-profile-smoke-invalid-claude-config.sh +31 -0
  234. package/tools/tests/test-profile-smoke-invalid-provider-pool.sh +68 -0
  235. package/tools/tests/test-profile-smoke-repo-slug-mismatch.sh +36 -0
  236. package/tools/tests/test-profile-smoke.sh +45 -0
  237. package/tools/tests/test-project-init-force-and-skip-sync.sh +61 -0
  238. package/tools/tests/test-project-init-repo-slug-mismatch.sh +29 -0
  239. package/tools/tests/test-project-init.sh +66 -0
  240. package/tools/tests/test-project-launchd-bootstrap.sh +66 -0
  241. package/tools/tests/test-project-remove.sh +150 -0
  242. package/tools/tests/test-project-runtime-supervisor.sh +47 -0
  243. package/tools/tests/test-project-runtimectl-launchd.sh +115 -0
  244. package/tools/tests/test-project-runtimectl-missing-profile.sh +54 -0
  245. package/tools/tests/test-project-runtimectl-start-falls-back-to-bootstrap.sh +108 -0
  246. package/tools/tests/test-project-runtimectl-status-reports-supervisor-as-heartbeat-parent.sh +95 -0
  247. package/tools/tests/test-project-runtimectl-status-supervisor-running.sh +59 -0
  248. package/tools/tests/test-project-runtimectl-stop-cancels-pending-kick.sh +85 -0
  249. package/tools/tests/test-project-runtimectl-stop-clears-running-labels.sh +78 -0
  250. package/tools/tests/test-project-runtimectl.sh +212 -0
  251. package/tools/tests/test-provider-cooldown-state-prefers-runtime-worker-context.sh +39 -0
  252. package/tools/tests/test-provider-cooldown-state.sh +59 -0
  253. package/tools/tests/test-public-repo-docs.sh +159 -0
  254. package/tools/tests/test-reconcile-pr-worker-acp-config-routing.sh +75 -0
  255. package/tools/tests/test-render-dashboard-snapshot.sh +149 -0
  256. package/tools/tests/test-render-flow-config-demo-profile.sh +36 -0
  257. package/tools/tests/test-render-flow-config-provider-pool-fallback.sh +81 -0
  258. package/tools/tests/test-render-flow-config.sh +52 -0
  259. package/tools/tests/test-run-codex-task-claude-routing.sh +125 -0
  260. package/tools/tests/test-run-codex-task-codex-resident-routing.sh +108 -0
  261. package/tools/tests/test-run-codex-task-kilo-routing.sh +98 -0
  262. package/tools/tests/test-run-codex-task-openclaw-resident-routing.sh +117 -0
  263. package/tools/tests/test-run-codex-task-openclaw-routing.sh +113 -0
  264. package/tools/tests/test-run-codex-task-opencode-routing.sh +98 -0
  265. package/tools/tests/test-run-codex-task-provider-pool-fallback-routing.sh +146 -0
  266. package/tools/tests/test-scaffold-profile.sh +108 -0
  267. package/tools/tests/test-serve-dashboard.sh +93 -0
  268. package/tools/tests/test-start-issue-worker-blocked-context.sh +129 -0
  269. package/tools/tests/test-start-issue-worker-blocks-complete-recurring-checklist.sh +189 -0
  270. package/tools/tests/test-start-issue-worker-local-install-routing.sh +157 -0
  271. package/tools/tests/test-start-issue-worker-profile-template-routing.sh +149 -0
  272. package/tools/tests/test-start-issue-worker-recurring-resident-reuse-codex.sh +212 -0
  273. package/tools/tests/test-start-issue-worker-recurring-resident-reuse.sh +219 -0
  274. package/tools/tests/test-start-issue-worker-renders-verification-snippet.sh +155 -0
  275. package/tools/tests/test-start-issue-worker-resident-reuse-falls-back-to-new-worktree.sh +199 -0
  276. package/tools/tests/test-start-pr-fix-worker-host-blocker-context.sh +275 -0
  277. package/tools/tests/test-start-resident-issue-loop-adopts-next-recurring-issue.sh +185 -0
  278. package/tools/tests/test-start-resident-issue-loop-clears-pending-while-waiting-due.sh +152 -0
  279. package/tools/tests/test-start-resident-issue-loop-consumes-queued-lease.sh +186 -0
  280. package/tools/tests/test-start-resident-issue-loop-fails-over-provider-pool.sh +212 -0
  281. package/tools/tests/test-start-resident-issue-loop-immediate-cycles.sh +148 -0
  282. package/tools/tests/test-start-resident-issue-loop-waits-for-provider.sh +194 -0
  283. package/tools/tests/test-start-resident-issue-loop-waits-for-terminal-reconcile-status.sh +198 -0
  284. package/tools/tests/test-start-resident-issue-loop-yields-to-live-lane-controller.sh +145 -0
  285. package/tools/tests/test-sync-pr-labels-fix-lane-uses-repair-queued.sh +67 -0
  286. package/tools/tests/test-sync-recurring-issue-checklist-backfills-workflow-complete-blocker.sh +70 -0
  287. package/tools/tests/test-sync-recurring-issue-checklist.sh +95 -0
  288. package/tools/tests/test-sync-shared-agent-home-local-source-root.sh +66 -0
  289. package/tools/tests/test-sync-shared-agent-home-preserves-unrelated-workflow-catalog-skill.sh +47 -0
  290. package/tools/tests/test-test-smoke.sh +86 -0
  291. package/tools/tests/test-uninstall-project-launchd.sh +37 -0
  292. package/tools/tests/test-update-github-labels-prefers-sibling-helper.sh +49 -0
  293. package/tools/tests/test-workflow-catalog.sh +43 -0
  294. package/tools/vendor/codex-quota/LICENSE +21 -0
  295. package/tools/vendor/codex-quota/README.md +459 -0
  296. package/tools/vendor/codex-quota/codex-quota.js +261 -0
  297. package/tools/vendor/codex-quota/lib/claude-accounts.js +226 -0
  298. package/tools/vendor/codex-quota/lib/claude-oauth.js +174 -0
  299. package/tools/vendor/codex-quota/lib/claude-tokens.js +471 -0
  300. package/tools/vendor/codex-quota/lib/claude-usage.js +929 -0
  301. package/tools/vendor/codex-quota/lib/codex-accounts.js +205 -0
  302. package/tools/vendor/codex-quota/lib/codex-tokens.js +326 -0
  303. package/tools/vendor/codex-quota/lib/codex-usage.js +32 -0
  304. package/tools/vendor/codex-quota/lib/color.js +72 -0
  305. package/tools/vendor/codex-quota/lib/constants.js +57 -0
  306. package/tools/vendor/codex-quota/lib/container.js +143 -0
  307. package/tools/vendor/codex-quota/lib/display.js +1111 -0
  308. package/tools/vendor/codex-quota/lib/fs.js +63 -0
  309. package/tools/vendor/codex-quota/lib/handlers.js +2060 -0
  310. package/tools/vendor/codex-quota/lib/jwt.js +33 -0
  311. package/tools/vendor/codex-quota/lib/oauth.js +486 -0
  312. package/tools/vendor/codex-quota/lib/paths.js +34 -0
  313. package/tools/vendor/codex-quota/lib/prompts.js +44 -0
  314. package/tools/vendor/codex-quota/lib/sync.js +1438 -0
  315. package/tools/vendor/codex-quota/lib/token-match.js +96 -0
  316. package/tools/vendor/codex-quota-manager/scripts/auto-switch.sh +500 -0
  317. package/tools/vendor/codex-quota-manager/scripts/batch-add.sh +123 -0
@@ -0,0 +1,351 @@
1
+ :root {
2
+ --bg: #f4f3ee;
3
+ --panel: #fffdf7;
4
+ --panel-strong: #f8f4e6;
5
+ --ink: #192126;
6
+ --muted: #5a6872;
7
+ --line: #d7d0c0;
8
+ --accent: #0f766e;
9
+ --accent-soft: #d8f1ec;
10
+ --warn: #a16207;
11
+ --warn-soft: #fce7b2;
12
+ --danger: #b42318;
13
+ --danger-soft: #fdd8d2;
14
+ --shadow: 0 18px 50px rgba(25, 33, 38, 0.08);
15
+ }
16
+
17
+ * {
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ body {
22
+ margin: 0;
23
+ font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", serif;
24
+ background:
25
+ radial-gradient(circle at top right, rgba(15, 118, 110, 0.08), transparent 34%),
26
+ linear-gradient(180deg, #faf7ef 0%, var(--bg) 100%);
27
+ color: var(--ink);
28
+ }
29
+
30
+ .page {
31
+ max-width: 1440px;
32
+ margin: 0 auto;
33
+ padding: 32px 20px 48px;
34
+ }
35
+
36
+ .hero {
37
+ display: flex;
38
+ justify-content: space-between;
39
+ gap: 24px;
40
+ align-items: flex-start;
41
+ padding: 24px;
42
+ border: 1px solid var(--line);
43
+ border-radius: 28px;
44
+ background: rgba(255, 253, 247, 0.92);
45
+ box-shadow: var(--shadow);
46
+ }
47
+
48
+ .eyebrow {
49
+ margin: 0 0 8px;
50
+ text-transform: uppercase;
51
+ letter-spacing: 0.08em;
52
+ font-size: 12px;
53
+ color: var(--accent);
54
+ }
55
+
56
+ .hero h1 {
57
+ margin: 0;
58
+ font-size: clamp(34px, 5vw, 56px);
59
+ line-height: 0.95;
60
+ }
61
+
62
+ .subtitle {
63
+ max-width: 760px;
64
+ margin: 16px 0 0;
65
+ color: var(--muted);
66
+ font-size: 18px;
67
+ line-height: 1.45;
68
+ }
69
+
70
+ .hero-actions {
71
+ min-width: 220px;
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 14px;
75
+ align-items: flex-end;
76
+ }
77
+
78
+ button {
79
+ appearance: none;
80
+ border: 0;
81
+ border-radius: 999px;
82
+ padding: 12px 18px;
83
+ font: inherit;
84
+ background: var(--ink);
85
+ color: white;
86
+ cursor: pointer;
87
+ }
88
+
89
+ button:hover {
90
+ background: #0f1720;
91
+ }
92
+
93
+ .meta {
94
+ text-align: right;
95
+ color: var(--muted);
96
+ font-size: 14px;
97
+ }
98
+
99
+ .overview {
100
+ margin-top: 24px;
101
+ display: grid;
102
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
103
+ gap: 14px;
104
+ }
105
+
106
+ .card {
107
+ padding: 18px;
108
+ border-radius: 22px;
109
+ border: 1px solid var(--line);
110
+ background: var(--panel);
111
+ box-shadow: var(--shadow);
112
+ }
113
+
114
+ .stat-label {
115
+ color: var(--muted);
116
+ font-size: 13px;
117
+ text-transform: uppercase;
118
+ letter-spacing: 0.06em;
119
+ }
120
+
121
+ .stat-value {
122
+ margin-top: 8px;
123
+ font-size: 34px;
124
+ font-weight: 700;
125
+ }
126
+
127
+ .profiles {
128
+ margin-top: 28px;
129
+ display: flex;
130
+ flex-direction: column;
131
+ gap: 22px;
132
+ }
133
+
134
+ .profile {
135
+ padding: 22px;
136
+ border-radius: 28px;
137
+ border: 1px solid var(--line);
138
+ background: rgba(255, 253, 247, 0.94);
139
+ box-shadow: var(--shadow);
140
+ }
141
+
142
+ .profile-header {
143
+ display: flex;
144
+ justify-content: space-between;
145
+ gap: 16px;
146
+ align-items: flex-start;
147
+ }
148
+
149
+ .profile-title {
150
+ display: flex;
151
+ flex-wrap: wrap;
152
+ gap: 10px;
153
+ align-items: center;
154
+ }
155
+
156
+ .profile-title h2 {
157
+ margin: 0;
158
+ font-size: 28px;
159
+ }
160
+
161
+ .profile-subtitle {
162
+ margin-top: 8px;
163
+ color: var(--muted);
164
+ }
165
+
166
+ .badge-row {
167
+ display: flex;
168
+ flex-wrap: wrap;
169
+ gap: 8px;
170
+ justify-content: flex-end;
171
+ }
172
+
173
+ .badge {
174
+ display: inline-flex;
175
+ align-items: center;
176
+ gap: 6px;
177
+ padding: 7px 10px;
178
+ border-radius: 999px;
179
+ font-size: 13px;
180
+ border: 1px solid transparent;
181
+ background: var(--panel-strong);
182
+ }
183
+
184
+ .badge.good {
185
+ background: var(--accent-soft);
186
+ color: #0d5a54;
187
+ }
188
+
189
+ .badge.warn {
190
+ background: var(--warn-soft);
191
+ color: #855500;
192
+ }
193
+
194
+ .badge.danger {
195
+ background: var(--danger-soft);
196
+ color: var(--danger);
197
+ }
198
+
199
+ .profile-grid {
200
+ margin-top: 18px;
201
+ display: grid;
202
+ grid-template-columns: repeat(12, minmax(0, 1fr));
203
+ gap: 14px;
204
+ }
205
+
206
+ .panel {
207
+ grid-column: span 12;
208
+ padding: 16px;
209
+ border-radius: 22px;
210
+ border: 1px solid var(--line);
211
+ background: var(--panel);
212
+ }
213
+
214
+ .panel.half {
215
+ grid-column: span 6;
216
+ }
217
+
218
+ .panel.third {
219
+ grid-column: span 4;
220
+ }
221
+
222
+ .panel h3 {
223
+ margin: 0 0 12px;
224
+ font-size: 18px;
225
+ }
226
+
227
+ .panel-subtitle {
228
+ margin: -6px 0 12px;
229
+ color: var(--muted);
230
+ font-size: 14px;
231
+ }
232
+
233
+ .table-wrap {
234
+ overflow-x: auto;
235
+ }
236
+
237
+ table {
238
+ width: 100%;
239
+ border-collapse: collapse;
240
+ font-size: 14px;
241
+ }
242
+
243
+ th,
244
+ td {
245
+ padding: 10px 8px;
246
+ text-align: left;
247
+ vertical-align: top;
248
+ border-top: 1px solid var(--line);
249
+ }
250
+
251
+ th {
252
+ color: var(--muted);
253
+ font-size: 12px;
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.06em;
256
+ border-top: 0;
257
+ }
258
+
259
+ .mono {
260
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
261
+ font-size: 12px;
262
+ }
263
+
264
+ .muted {
265
+ color: var(--muted);
266
+ }
267
+
268
+ .status-pill {
269
+ display: inline-flex;
270
+ align-items: center;
271
+ padding: 4px 8px;
272
+ border-radius: 999px;
273
+ font-size: 12px;
274
+ font-weight: 700;
275
+ background: var(--panel-strong);
276
+ }
277
+
278
+ .status-pill.RUNNING,
279
+ .status-pill.waiting-worker,
280
+ .status-pill.launching,
281
+ .status-pill.reconciling {
282
+ background: var(--accent-soft);
283
+ color: #0d5a54;
284
+ }
285
+
286
+ .status-pill.waiting-provider,
287
+ .status-pill.waiting-due,
288
+ .status-pill.waiting-open-pr,
289
+ .status-pill.idle,
290
+ .status-pill.sleeping {
291
+ background: var(--warn-soft);
292
+ color: #855500;
293
+ }
294
+
295
+ .status-pill.FAILED,
296
+ .status-pill.stopped,
297
+ .status-pill.launch-failed {
298
+ background: var(--danger-soft);
299
+ color: var(--danger);
300
+ }
301
+
302
+ .status-pill.implemented {
303
+ background: #dcfce7;
304
+ color: #166534;
305
+ }
306
+
307
+ .status-pill.reported,
308
+ .status-pill.completed {
309
+ background: #dbeafe;
310
+ color: #1d4ed8;
311
+ }
312
+
313
+ .status-pill.blocked {
314
+ background: #fef3c7;
315
+ color: #92400e;
316
+ }
317
+
318
+ .status-pill.failed,
319
+ .status-pill.unknown {
320
+ background: var(--danger-soft);
321
+ color: var(--danger);
322
+ }
323
+
324
+ .status-pill.running {
325
+ background: var(--accent-soft);
326
+ color: #0d5a54;
327
+ }
328
+
329
+ .empty-state {
330
+ color: var(--muted);
331
+ padding: 10px 4px;
332
+ }
333
+
334
+ @media (max-width: 960px) {
335
+ .hero,
336
+ .profile-header {
337
+ flex-direction: column;
338
+ }
339
+
340
+ .hero-actions,
341
+ .badge-row {
342
+ align-items: flex-start;
343
+ justify-content: flex-start;
344
+ text-align: left;
345
+ }
346
+
347
+ .panel.half,
348
+ .panel.third {
349
+ grid-column: span 12;
350
+ }
351
+ }
@@ -0,0 +1,109 @@
1
+ # Task
2
+
3
+ Implement issue #{ISSUE_ID} in `{REPO_SLUG}`.
4
+
5
+ # Issue Context
6
+
7
+ - Title: {ISSUE_TITLE}
8
+ - URL: {ISSUE_URL}
9
+ - Auto-merge requested: {ISSUE_AUTOMERGE}
10
+
11
+ {ISSUE_BODY}
12
+ {ISSUE_RECURRING_CONTEXT}
13
+ {ISSUE_BLOCKER_CONTEXT}
14
+
15
+ # MANDATORY WORKFLOW (follow in order, no skipping)
16
+
17
+ You MUST complete ALL 5 phases in order. Do not skip any phase. Do not commit until Phase 4 passes.
18
+
19
+ ## Phase 1: READ & SCOPE
20
+
21
+ - Read the repo instructions: `AGENTS.md`, relevant spec or design docs, and any repo conventions tied to this issue.
22
+ - Identify the single primary product surface you will touch.
23
+ - If the issue spans multiple surfaces, pick ONE and create follow-up issues for the rest using:
24
+ ```bash
25
+ bash "$ACP_FLOW_TOOLS_DIR/create-follow-up-issue.sh" --parent {ISSUE_ID} --title "..." --body-file /tmp/follow-up.md
26
+ ```
27
+ - Treat a broad umbrella issue as a coordination brief rather than permission to ship every slice in one PR.
28
+ - Write down your scope decision before coding.
29
+
30
+ ## Phase 2: IMPLEMENT
31
+
32
+ - Make the smallest root-cause fix that satisfies the issue.
33
+ - Work only inside the dedicated worktree.
34
+ - Add or update tests when feasible.
35
+ - STOP after implementation. Do not commit yet.
36
+
37
+ ## Phase 3: VERIFY (MANDATORY)
38
+
39
+ After implementing, you MUST run verification commands and record each one.
40
+ Every successful command must be recorded or the host publish will fail.
41
+ After each successful verification command, record it with `record-verification.sh`.
42
+
43
+ ```bash
44
+ {ISSUE_VERIFICATION_COMMAND_SNIPPET}
45
+ ```
46
+
47
+ Required verification coverage:
48
+ - Run the narrowest repo-supported `typecheck`, `build`, `test`, or `lint` command that proves the touched surface is safe.
49
+ - If you changed tests only, run the most relevant targeted test command and record it.
50
+ - If you changed localization resources or user-facing copy, run repo locale validation or hardcoded-copy scans if the repo provides them.
51
+ - If a verification command fails, fix the issue and rerun until it passes.
52
+
53
+ CRITICAL: `verification.jsonl` must exist in `$ACP_RUN_DIR` with at least one `pass` entry before you can write `OUTCOME=implemented`.
54
+
55
+ ## Phase 4: SELF-REVIEW (MANDATORY)
56
+
57
+ Before committing, perform this checklist:
58
+
59
+ - [ ] Run `git diff --check`.
60
+ - [ ] Count non-test product files: if the change is broad, stop and split scope instead of publishing one large PR.
61
+ - [ ] If you touched auth, login, session, or reset flows, verify existing users and legacy data still behave correctly.
62
+ - [ ] If you touched public endpoints, public routes, or operator workflows, search downstream consumers in `scripts/`, `docs/`, and specs.
63
+ - [ ] If you changed localization resources or user-facing copy, confirm localization coverage and scanning are still valid.
64
+ - [ ] If you touched mobile routes or screens, keep route scope narrow and verify loading, empty, and error states.
65
+
66
+ Before committing, verify the journal exists:
67
+ ```bash
68
+ test -s "$ACP_RUN_DIR/verification.jsonl" && echo "OK: verification.jsonl exists" || echo "BLOCKED: missing verification.jsonl"
69
+ ```
70
+
71
+ ## Phase 5: COMMIT & REPORT
72
+
73
+ - Commit with a conventional commit message.
74
+ - Do NOT push or open a PR; the host handles that.
75
+ - Write `$ACP_RESULT_FILE`:
76
+ ```bash
77
+ cat > "$ACP_RESULT_FILE" <<'OUTER_EOF'
78
+ OUTCOME=implemented
79
+ ACTION=host-publish-issue-pr
80
+ ISSUE_ID={ISSUE_ID}
81
+ OUTER_EOF
82
+ ```
83
+ - In your final output, include the changed files, verification commands actually run, and one short self-review note naming the main regression risk you checked.
84
+
85
+ # STOP CONDITIONS
86
+
87
+ Stop and report blocked if:
88
+ - The issue is ambiguous, blocked by missing credentials, or expands into high-risk scope.
89
+ - You cannot complete verification successfully.
90
+ - The issue needs full decomposition into focused follow-up issues.
91
+
92
+ If stopped blocked, write `$ACP_RUN_DIR/issue-comment.md` with a blocker summary, then:
93
+ ```bash
94
+ cat > "$ACP_RESULT_FILE" <<'OUTER_EOF'
95
+ OUTCOME=blocked
96
+ ACTION=host-comment-blocker
97
+ ISSUE_ID={ISSUE_ID}
98
+ OUTER_EOF
99
+ ```
100
+
101
+ If fully decomposed into follow-up issues, start the first line of `issue-comment.md` with exactly:
102
+ `Superseded by focused follow-up issues: #...`
103
+
104
+ # Git Rules
105
+
106
+ - Do NOT push the branch from inside the worker.
107
+ - Do NOT open a PR from inside the worker.
108
+ - Do NOT comment on the source issue with a PR URL from inside the worker.
109
+ - Exit successfully after writing the result file.
@@ -0,0 +1,120 @@
1
+ You are the PR repair worker for `{REPO_SLUG}`.
2
+
3
+ Before making any change:
4
+
5
+ 1. Read `{REPO_ROOT}/AGENTS.md`.
6
+ 2. Read `{REPO_ROOT}/openspec/AGENT_RULES.md`.
7
+ 3. Read `{REPO_ROOT}/openspec/AGENTS.md`.
8
+ 4. Read `{REPO_ROOT}/openspec/project.md`.
9
+ 5. Read `{REPO_ROOT}/openspec/CONVENTIONS.md`.
10
+ 6. Read `{REPO_ROOT}/docs/TESTING_AND_SEED_POLICY.md`.
11
+ 7. Stay on this PR branch worktree. Do not push or mutate GitHub from inside the worker.
12
+
13
+ PR metadata:
14
+
15
+ - PR: {PR_NUMBER} - {PR_TITLE}
16
+ - URL: {PR_URL}
17
+ - Base branch: {PR_BASE_REF}
18
+ - Head branch: {PR_HEAD_REF}
19
+ - Linked issue: {PR_LINKED_ISSUE_ID}
20
+ - Risk classification: {PR_RISK}
21
+ - Risk reason: {PR_RISK_REASON}
22
+ - Merge state: {PR_MERGE_STATE_STATUS}
23
+ - Mergeable: {PR_MERGEABLE_STATUS}
24
+
25
+ Changed files:
26
+ {PR_FILES_TEXT}
27
+
28
+ Required targeted verification coverage before `updated-branch`:
29
+ {PR_REQUIRED_TARGETED_VERIFICATION_TEXT}
30
+
31
+ Pre-approved local verification fallbacks:
32
+ {PR_PREAPPROVED_VERIFICATION_FALLBACKS_TEXT}
33
+
34
+ Current CI / merge blockers:
35
+ {PR_CHECK_FAILURES_TEXT}
36
+
37
+ Current GitHub checks:
38
+ {PR_CHECKS_TEXT}
39
+
40
+ Current missing reasons:
41
+ {PR_MISSING_REASONS_TEXT}
42
+
43
+ Current local merge-conflict paths:
44
+ {PR_CONFLICT_PATHS_TEXT}
45
+
46
+ Actionable current-head review findings:
47
+ {PR_REVIEW_FINDINGS_TEXT}
48
+
49
+ Current host-side publish blocker summary:
50
+ {PR_LOCAL_HOST_BLOCKER_SUMMARY_TEXT}
51
+
52
+ Current final-review blocker summary:
53
+ {PR_BLOCKER_SUMMARY_TEXT}
54
+
55
+ PR body:
56
+ {PR_BODY}
57
+
58
+ Required flow:
59
+
60
+ 1. Inspect the current diff and the failing/pending CI signals first:
61
+ - `openspec list`
62
+ - `git diff --stat origin/main...HEAD`
63
+ - `git status --short`
64
+ - if `Merge state` is not `CLEAN` or `Mergeable` is `FALSE`, treat branch drift/conflicts as the concrete blocker first
65
+ - if `Actionable current-head review findings` is not `- none`, treat those findings as the concrete blockers to address first
66
+ - otherwise, if `Current host-side publish blocker summary` is not `- none`, treat that summary as the concrete blocker to address first
67
+ - otherwise, if `Current final-review blocker summary` is not `- none`, treat that summary as the concrete blocker to address first
68
+ 2. Never run dependency bootstrap or workspace-mutating commands here:
69
+ - do not run `pnpm install`, `npm install`, `yarn install`, or `bun install`
70
+ - do not mutate the retained dependency checkout under `{DEPENDENCY_SOURCE_ROOT}`
71
+ - do not repair the shared `node_modules` baseline from this worker
72
+ - do not run `git fetch`, `git merge`, `git rebase`, `git commit`, `git push`, or other Git metadata-writing commands from inside this worker; host-side wrappers own those steps
73
+ 3. If the blocker is branch drift or a merge conflict, use the already-prepared local refs and make the smallest branch-local source update needed to restore mergeability on this PR branch. Keep the resolution scoped to the PR intent; do not rewrite unrelated code.
74
+ - Treat `Current local merge-conflict paths` as the authoritative conflict list to clear.
75
+ - Do not stop after fixing only one file if other conflict paths remain.
76
+ - Before you declare success, rerun local merge simulation and confirm there are no remaining conflict paths for this branch against `{PR_BASE_REF}`.
77
+ 4. Make the smallest change that fixes the concrete PR blockers on this existing branch.
78
+ 5. Run the narrowest verification that proves the fix for the blocker you changed.
79
+ - This is an unattended automated repair run. Do not ask the user for clarification, approval, or a next-step choice from inside the worker. Treat this prompt as the full execution contract for the run.
80
+ - After each successful verification command, record it with:
81
+ `bash "$ACP_FLOW_TOOLS_DIR/record-verification.sh" --run-dir "$ACP_RUN_DIR" --status pass --command "<exact command>"`
82
+ - If you changed a `*.spec.*` or `*.test.*` file, include a targeted test command for that file or the directly related surface.
83
+ - The host verification guard is literal. If `Required targeted verification coverage before updated-branch` is not `- none`, every listed file must have at least one recorded successful command whose command text clearly names that file, its direct stem, or the scoped e2e/mobile runner you used for that exact spec.
84
+ - If a changed web Playwright spec hits a local bind/listen failure while starting Next or Playwright (for example `listen EPERM ... 0.0.0.0:3000`), retry exactly once with the matching command from `Pre-approved local verification fallbacks` before declaring the run blocked.
85
+ - Do not write `updated-branch` until every listed coverage item is satisfied in `verification.jsonl`.
86
+ 6. If you make source changes, leave them as local file edits in this worktree. Do not run Git staging/commit/push commands yourself; host reconcile will stage, commit, validate mergeability, and push only if the branch is actually clean.
87
+ 7. Write a short markdown summary for the PR to `$ACP_RUN_DIR/pr-comment.md`.
88
+ 8. If the reported blocker is already resolved on the current PR branch and no code change is needed, or the only remaining blocker is external worktree dependency state while the branch diff itself already satisfies the requested fix:
89
+ - make that explicit in `$ACP_RUN_DIR/pr-comment.md`
90
+ - write `$ACP_RESULT_FILE` exactly like this:
91
+ ```bash
92
+ cat > "$ACP_RESULT_FILE" <<'EOF'
93
+ OUTCOME=no-change-needed
94
+ ACTION=host-refresh-pr-state
95
+ PR_NUMBER={PR_NUMBER}
96
+ ISSUE_ID={PR_LINKED_ISSUE_ID}
97
+ EOF
98
+ ```
99
+ - exit successfully after saving the summary comment
100
+ 9. If you are blocked or cannot fix the branch safely after addressing any actionable review findings and running the narrowest feasible verification, write `$ACP_RESULT_FILE` exactly like this:
101
+ ```bash
102
+ cat > "$ACP_RESULT_FILE" <<'EOF'
103
+ OUTCOME=blocked
104
+ ACTION=host-comment-pr-blocker
105
+ PR_NUMBER={PR_NUMBER}
106
+ ISSUE_ID={PR_LINKED_ISSUE_ID}
107
+ EOF
108
+ ```
109
+ Then exit successfully after saving the blocker summary in `$ACP_RUN_DIR/pr-comment.md`. Do not stop after printing a question or suggestion; always finish by writing one of the allowed result contracts.
110
+ 10. If you fixed the branch and left only the intended source changes ready for host-side commit/push, write `$ACP_RESULT_FILE` exactly like this:
111
+ ```bash
112
+ cat > "$ACP_RESULT_FILE" <<'EOF'
113
+ OUTCOME=updated-branch
114
+ ACTION=host-push-pr-branch
115
+ PR_NUMBER={PR_NUMBER}
116
+ ISSUE_ID={PR_LINKED_ISSUE_ID}
117
+ EOF
118
+ ```
119
+ Only use this outcome after you have confirmed the branch no longer has remaining local merge-conflict paths against `{PR_BASE_REF}`, you did not run Git commit/push commands yourself, and `$ACP_RUN_DIR/verification.jsonl` contains the successful verification commands you actually ran.
120
+ 11. Exit after writing the result file. The host reconciler will push the updated branch, comment on the PR, refresh labels, and leave CI to rerun on GitHub. Never end this run with a question to the user instead of a result file.
@@ -0,0 +1,91 @@
1
+ You are the PR merge-repair worker for `{REPO_SLUG}`.
2
+
3
+ Before making any change:
4
+
5
+ 1. Read `{REPO_ROOT}/AGENTS.md`.
6
+ 2. Read `{REPO_ROOT}/openspec/AGENT_RULES.md`.
7
+ 3. Read `{REPO_ROOT}/openspec/AGENTS.md`.
8
+ 4. Read `{REPO_ROOT}/openspec/project.md`.
9
+ 5. Read `{REPO_ROOT}/openspec/CONVENTIONS.md`.
10
+ 6. Read `{REPO_ROOT}/docs/TESTING_AND_SEED_POLICY.md`.
11
+ 7. Stay on this PR branch worktree. Do not push or mutate GitHub from inside the worker.
12
+
13
+ PR metadata:
14
+
15
+ - PR: {PR_NUMBER} - {PR_TITLE}
16
+ - URL: {PR_URL}
17
+ - Base branch: {PR_BASE_REF}
18
+ - Head branch: {PR_HEAD_REF}
19
+ - Linked issue: {PR_LINKED_ISSUE_ID}
20
+ - Risk classification: {PR_RISK}
21
+ - Risk reason: {PR_RISK_REASON}
22
+ - Merge state: {PR_MERGE_STATE_STATUS}
23
+ - Mergeable: {PR_MERGEABLE_STATUS}
24
+ - Host-prepared merge status: {PR_HOST_MERGE_STATUS}
25
+
26
+ Changed files:
27
+ {PR_FILES_TEXT}
28
+
29
+ Current unresolved merge-conflict paths:
30
+ {PR_CONFLICT_PATHS_TEXT}
31
+
32
+ Host merge preparation notes:
33
+ {PR_HOST_MERGE_SUMMARY_TEXT}
34
+
35
+ Current GitHub checks:
36
+ {PR_CHECKS_TEXT}
37
+
38
+ Current missing reasons:
39
+ {PR_MISSING_REASONS_TEXT}
40
+
41
+ Actionable current-head review findings:
42
+ {PR_REVIEW_FINDINGS_TEXT}
43
+
44
+ PR body:
45
+ {PR_BODY}
46
+
47
+ Required flow:
48
+
49
+ 1. Treat this worktree as an already-prepared merge repair state from host control-plane.
50
+ - `origin/{PR_BASE_REF}` has already been merged into this worktree locally.
51
+ - if `Current unresolved merge-conflict paths` is not `- none detected after host merge preparation`, resolve those files first.
52
+ 2. Never run Git control commands from inside the worker:
53
+ - do not run `git fetch`, `git pull`, `git merge`, `git rebase`, `git commit`, `git push`, or any command that writes Git metadata
54
+ - do not abort or restart the prepared merge state
55
+ 3. Inspect only the concrete branch-repair state you were given:
56
+ - `openspec list`
57
+ - `git status --short`
58
+ - `git diff --check`
59
+ - `git diff --name-only --diff-filter=U`
60
+ - if you need context for a conflicted file, inspect the local conflict markers and surrounding source in this worktree
61
+ 4. Make the smallest source-only edits needed to finish the merge repair while preserving the PR intent.
62
+ - keep unrelated auto-merged files alone
63
+ - do not reformat broad areas or rewrite unrelated logic
64
+ 5. Run the narrowest verification that proves the repaired conflict is safe.
65
+ - After each successful verification command, record it with:
66
+ `bash "$ACP_FLOW_TOOLS_DIR/record-verification.sh" --run-dir "$ACP_RUN_DIR" --status pass --command "<exact command>"`
67
+ - If you changed a `*.spec.*` or `*.test.*` file while resolving the merge, include a targeted test command for that file or the directly related surface.
68
+ 6. If host already prepared a clean merge state and no unresolved conflict paths remain, do not use `no-change-needed`.
69
+ - write `updated-branch` so host reconcile can commit and push the prepared merge repair
70
+ 7. Save a short markdown summary to `$ACP_RUN_DIR/pr-comment.md`.
71
+ 8. If you cannot safely resolve the prepared merge state, write `$ACP_RESULT_FILE` exactly like this:
72
+ ```bash
73
+ cat > "$ACP_RESULT_FILE" <<'EOF'
74
+ OUTCOME=blocked
75
+ ACTION=host-comment-pr-blocker
76
+ PR_NUMBER={PR_NUMBER}
77
+ ISSUE_ID={PR_LINKED_ISSUE_ID}
78
+ EOF
79
+ ```
80
+ Then exit successfully after saving the blocker summary.
81
+ 9. If the prepared merge state is now clean and ready for host commit/push, write `$ACP_RESULT_FILE` exactly like this:
82
+ ```bash
83
+ cat > "$ACP_RESULT_FILE" <<'EOF'
84
+ OUTCOME=updated-branch
85
+ ACTION=host-push-pr-branch
86
+ PR_NUMBER={PR_NUMBER}
87
+ ISSUE_ID={PR_LINKED_ISSUE_ID}
88
+ EOF
89
+ ```
90
+ Only use this outcome after `$ACP_RUN_DIR/verification.jsonl` contains the successful verification commands you actually ran.
91
+ 10. Exit after writing the result file. Host reconcile owns the commit/push/label refresh.