code-coordinator 0.5.58__tar.gz → 0.5.60__tar.gz

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 (815) hide show
  1. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/CLAUDE.md +10 -0
  2. {code_coordinator-0.5.58/code_coordinator.egg-info → code_coordinator-0.5.60}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.58 → code_coordinator-0.5.60/code_coordinator.egg-info}/PKG-INFO +1 -1
  4. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/SOURCES.txt +1 -0
  5. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/scm_file_list.json +1 -0
  6. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/acceptance.py +19 -4
  8. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agent.py +37 -6
  9. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/drive.py +276 -1
  10. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/drive_state.py +30 -0
  11. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/merge_queue.py +76 -5
  12. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/providers/claude.py +4 -1
  13. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/providers/claude_pty.py +5 -1
  14. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_drive.py +366 -1
  15. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_drive_state.py +45 -0
  16. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_merge_queue.py +51 -6
  17. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_providers_pty.py +22 -0
  18. code_coordinator-0.5.60/tests/test_worker_test_scoping.py +162 -0
  19. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.claude/commands/board.md +0 -0
  20. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.claude/commands/complete-session.md +0 -0
  21. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.claude/commands/coordinator.md +0 -0
  22. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.githooks/_lib.sh +0 -0
  23. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.githooks/post-checkout +0 -0
  24. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.githooks/post-commit +0 -0
  25. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.githooks/post-merge +0 -0
  26. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/workflows/cargo-test.yml +0 -0
  29. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/workflows/release-tui.yml +0 -0
  31. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/.gitignore +0 -0
  33. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/GOAL.md +0 -0
  34. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/LICENSE +0 -0
  35. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/README.md +0 -0
  37. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/dependency_links.txt +0 -0
  38. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/entry_points.txt +0 -0
  39. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/requires.txt +0 -0
  40. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/client.py +0 -0
  63. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/config.py +0 -0
  94. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  104. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  106. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  107. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/db.py +0 -0
  205. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/drive_queue.py +0 -0
  230. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/events.py +0 -0
  231. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/plan_usage.py +0 -0
  256. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/repo_state.py +0 -0
  257. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/spawned_coord.py +0 -0
  258. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/timer_active.py +0 -0
  259. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/toolchain.py +0 -0
  260. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/unit_drift.py +0 -0
  261. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/unit_enablement.py +0 -0
  262. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/checks/worktrees.py +0 -0
  263. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/cli.py +0 -0
  264. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/context.py +0 -0
  265. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/fleet_snapshot.py +0 -0
  266. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/models.py +0 -0
  267. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/pypi.py +0 -0
  268. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/registry.py +0 -0
  269. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/render.py +0 -0
  270. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/health/units.py +0 -0
  271. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/hooks.py +0 -0
  272. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/housekeeping.py +0 -0
  273. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/interactive.py +0 -0
  274. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/issue_store.py +0 -0
  275. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/liveness_auditor.py +0 -0
  276. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/machine_pause.py +0 -0
  277. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/milestone_chat.py +0 -0
  278. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/milestone_dispatch.py +0 -0
  279. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/milestone_gate.py +0 -0
  280. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/milestone_order.py +0 -0
  281. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/mock_author.py +0 -0
  282. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/models.py +0 -0
  283. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/network.py +0 -0
  284. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/new_issue_chat.py +0 -0
  285. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/__init__.py +0 -0
  286. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/baseline.py +0 -0
  287. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/cli.py +0 -0
  288. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/collect.py +0 -0
  289. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/digest.py +0 -0
  290. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/models.py +0 -0
  291. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/predicate.py +0 -0
  292. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/service.py +0 -0
  293. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/store.py +0 -0
  294. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notifier/transport.py +0 -0
  295. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/notify.py +0 -0
  296. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/openapi.py +0 -0
  297. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/overlap_fence.py +0 -0
  298. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/parentage.py +0 -0
  299. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/parentage_github.py +0 -0
  300. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/pipeline.py +0 -0
  301. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/plan_parser.py +0 -0
  302. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/plans.py +0 -0
  303. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/platform_paths.py +0 -0
  304. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/portal_bridge.py +0 -0
  305. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/pr_body_lint.py +0 -0
  306. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/prereqs.py +0 -0
  307. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/progress.py +0 -0
  308. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/providers/__init__.py +0 -0
  309. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/providers/base.py +0 -0
  310. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/providers/opencode.py +0 -0
  311. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/reconcile.py +0 -0
  312. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/refine_chat.py +0 -0
  313. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/release_cordon.py +0 -0
  314. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/release_propagate.py +0 -0
  315. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/release_verify.py +0 -0
  316. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/release_window.py +0 -0
  317. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/reports.py +0 -0
  318. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/revalidate.py +0 -0
  319. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/review.py +0 -0
  320. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/scorecard.py +0 -0
  321. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/serve_app.py +0 -0
  322. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/skills/update-issue/SKILL.md +0 -0
  323. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/smoke.py +0 -0
  324. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/spend_ceiling.py +0 -0
  325. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/split_work.py +0 -0
  326. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/stage_projection.py +0 -0
  327. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/state.py +0 -0
  328. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/test_author.py +0 -0
  329. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/test_chat.py +0 -0
  330. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/test_orchestrator.py +0 -0
  331. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/test_report.py +0 -0
  332. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/tui_release.py +0 -0
  333. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/usage.py +0 -0
  334. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/usage_limits.py +0 -0
  335. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/usage_rollup.py +0 -0
  336. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coord/worker_events.py +0 -0
  337. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/coordinator.example.yml +0 -0
  338. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-agent.service +0 -0
  339. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-db-backup.service +0 -0
  340. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-db-backup.sh +0 -0
  341. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-db-backup.timer +0 -0
  342. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-drive-queue.service +0 -0
  343. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-drive-queue.timer +0 -0
  344. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-notify.service +0 -0
  345. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-notify.timer +0 -0
  346. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-release-propagate.service +0 -0
  347. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-release-propagate.timer +0 -0
  348. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-release-window.service +0 -0
  349. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-release-window.timer +0 -0
  350. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-serve.service +0 -0
  351. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-web-dist-build.service +0 -0
  352. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-web-dist-build.sh +0 -0
  353. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-web-dist-build.timer +0 -0
  354. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-web-rollback.sh +0 -0
  355. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/coord-web.service +0 -0
  356. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/deploy/node-shim.sh +0 -0
  357. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/AGENT_OPERATIONS.md +0 -0
  358. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/ARCHITECTURE.md +0 -0
  359. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/ARCH_SECURITY_GATES.md +0 -0
  360. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/COCKPIT.md +0 -0
  361. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/CONTROL_CENTER.md +0 -0
  362. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/CROSS_PLATFORM.md +0 -0
  363. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/CUSTOMER_PORTAL.md +0 -0
  364. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/DRIVE_QUEUE.md +0 -0
  365. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/EPHEMERAL_WORKERS.md +0 -0
  366. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/FORGE_MIGRATION.md +0 -0
  367. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/GRAPHIFY_SETUP.md +0 -0
  368. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/ISSUE_GUIDANCE.md +0 -0
  369. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/MAC_MINI.md +0 -0
  370. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  371. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/NOTIFIER.md +0 -0
  372. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/OPENCODE_VERIFICATION.md +0 -0
  373. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/OPERATING_GOTCHAS.md +0 -0
  374. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/ORACLE_LOOP.md +0 -0
  375. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/PHONE_WEBAPP.md +0 -0
  376. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/PIPELINE_V2.md +0 -0
  377. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/PLATFORM_EVOLUTION.md +0 -0
  378. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/SECOND_BACKEND.md +0 -0
  379. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/STORE_SERVICE.md +0 -0
  380. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  381. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/WEB_CONTROL_CENTER.md +0 -0
  382. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/mocks/web/README.md +0 -0
  383. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/mocks/web/_tokens.css +0 -0
  384. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/mocks/web/issue-detail.html +0 -0
  385. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/mocks/web/pipeline-narrow.html +0 -0
  386. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/docs/mocks/web/pipeline-wide.html +0 -0
  387. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/graphify-out/.gitignore +0 -0
  388. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/install-agent.sh +0 -0
  389. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/pyproject.toml +0 -0
  390. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/audit_review_verdict_overrides.py +0 -0
  391. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  392. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/build-worker-image.sh +0 -0
  393. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/coordinator-machine.py +0 -0
  394. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/epic-down.sh +0 -0
  395. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/epic-up.sh +0 -0
  396. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/preflight.sh +0 -0
  397. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/provision-worker.sh +0 -0
  398. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  399. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  400. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/azure-workers/verify-github-token.sh +0 -0
  401. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/codegen.py +0 -0
  402. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/coord-test-runner.sh +0 -0
  403. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/drive-batch.sh +0 -0
  404. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/gen_board_fixture.py +0 -0
  405. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/next_release_tag.py +0 -0
  406. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/run_tests_in_populated_home.sh +0 -0
  407. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/run_tests_without_gh.sh +0 -0
  408. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/smoke_437_interactive.py +0 -0
  409. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/verify_878_review_capture.py +0 -0
  410. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/verify_release_published.py +0 -0
  411. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/scripts/verify_release_wheel.py +0 -0
  412. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/setup.cfg +0 -0
  413. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/SMOKE_SET.md +0 -0
  414. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/__init__.py +0 -0
  415. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  416. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/contract.md +0 -0
  417. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/manifest.yml +0 -0
  418. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  419. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  420. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  421. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  422. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-37/conftest.py +0 -0
  423. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-37/contract.md +0 -0
  424. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-37/manifest.yml +0 -0
  425. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  426. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  427. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/contract.md +0 -0
  428. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/manifest.yml +0 -0
  429. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  430. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  431. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  432. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  433. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  434. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  435. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  436. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  437. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  438. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  439. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/contract.md +0 -0
  440. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  441. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  442. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/manifest.yml +0 -0
  443. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-51/tsconfig.json +0 -0
  445. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/conftest.py +0 -0
  447. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/board-pipeline-basic.json +0 -0
  448. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  449. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  450. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  451. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/all_pass.json +0 -0
  452. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  453. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/mixed_fail.json +0 -0
  454. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  455. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  456. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/skip.json +0 -0
  457. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/playwright/truncated.json +0 -0
  458. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  459. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  460. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  461. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  462. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  463. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  464. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  465. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  466. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_acceptance.py +0 -0
  467. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_acceptance_drivers.py +0 -0
  468. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent.py +0 -0
  469. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_api_error.py +0 -0
  470. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_app.py +0 -0
  471. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_branch_base.py +0 -0
  472. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_branch_capture.py +0 -0
  473. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_config_free_1712.py +0 -0
  474. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_deploy_units_endpoint.py +0 -0
  475. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_dirty_worktree.py +0 -0
  476. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_graph_self_heal.py +0 -0
  477. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_health_h3.py +0 -0
  478. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_idle_restart.py +0 -0
  479. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_push_failure.py +0 -0
  480. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_reap.py +0 -0
  481. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_repos_and_pull.py +0 -0
  482. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_restart_services_endpoint.py +0 -0
  483. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_startup_diagnostics.py +0 -0
  484. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_update.py +0 -0
  485. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_update_bluegreen.py +0 -0
  486. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_usage_limit.py +0 -0
  487. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_agent_zero_commit.py +0 -0
  488. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_ambient_home_isolation.py +0 -0
  489. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_approve_reject_plan.py +0 -0
  490. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_approve_usage_gate.py +0 -0
  491. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_assignment_already_recorded_daemon.py +0 -0
  492. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_audit_log.py +0 -0
  493. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_audit_outcome.py +0 -0
  494. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_audit_query.py +0 -0
  495. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_auto_loop.py +0 -0
  496. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_auto_release_publish_2035.py +0 -0
  497. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_base_checkout_restore.py +0 -0
  498. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_cap_762.py +0 -0
  499. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_fixture.py +0 -0
  500. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_read_path.py +0 -0
  501. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_service.py +0 -0
  502. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_state.py +0 -0
  503. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_board_wire.py +0 -0
  504. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_brain.py +0 -0
  505. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_branch_model.py +0 -0
  506. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_bug_intake.py +0 -0
  507. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_build_worker_image_env_update.py +0 -0
  508. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cargo_cache.py +0 -0
  509. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_ci_acceptance_gate_1950.py +0 -0
  510. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_ci_store.py +0 -0
  511. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_claim.py +0 -0
  512. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_acceptance.py +0 -0
  513. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_assign.py +0 -0
  514. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  515. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_assign_interactive_remote.py +0 -0
  516. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_assign_provider.py +0 -0
  517. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_audit.py +0 -0
  518. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_chat_continue.py +0 -0
  519. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_diagnose_config_provenance.py +0 -0
  520. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_diagnose_graph.py +0 -0
  521. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_doctor.py +0 -0
  522. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_doctor_config_free_1801.py +0 -0
  523. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  524. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_drive.py +0 -0
  525. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_drive_queue.py +0 -0
  526. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_escalate.py +0 -0
  527. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_fix_headless_review.py +0 -0
  528. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_gate_a.py +0 -0
  529. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_install_drift.py +0 -0
  530. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_install_skills.py +0 -0
  531. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_issue_create_label.py +0 -0
  532. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_issue_reopen.py +0 -0
  533. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_merge.py +0 -0
  534. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_assign.py +0 -0
  535. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_capture.py +0 -0
  536. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_chat_add_child.py +0 -0
  537. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_dispatch.py +0 -0
  538. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_gate_b.py +0 -0
  539. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_gate_c.py +0 -0
  540. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_order.py +0 -0
  541. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  542. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_milestone_ship.py +0 -0
  543. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_network.py +0 -0
  544. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_new_issue_chat.py +0 -0
  545. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_plans.py +0 -0
  546. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_portal.py +0 -0
  547. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_pull_artifact.py +0 -0
  548. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_queue.py +0 -0
  549. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_reattach_sessions.py +0 -0
  550. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_refine_board.py +0 -0
  551. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_release_preflight.py +0 -0
  552. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_release_propagate.py +0 -0
  553. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_release_window.py +0 -0
  554. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_scorecard.py +0 -0
  555. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_set_review_findings.py +0 -0
  556. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_advisory_terminal.py +0 -0
  557. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_merge_queue.py +0 -0
  558. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_provider.py +0 -0
  559. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_review_finalizing.py +0 -0
  560. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_test_failed_tag.py +0 -0
  561. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_status_usage_limit.py +0 -0
  562. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_sync_comments_873.py +0 -0
  563. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_test_plan.py +0 -0
  564. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_track.py +0 -0
  565. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_tui_update.py +0 -0
  566. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cli_wait.py +0 -0
  567. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_client_base_install.py +0 -0
  568. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_comments.py +0 -0
  569. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_completion_summary.py +0 -0
  570. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_config.py +0 -0
  571. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_config_acceptance.py +0 -0
  572. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_config_audit.py +0 -0
  573. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_config_pricing.py +0 -0
  574. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_config_usage_gate.py +0 -0
  575. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_conflict_fix.py +0 -0
  576. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_conflict_fix_semantic.py +0 -0
  577. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coord_test.py +0 -0
  578. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coord_test_runner_baseline.py +0 -0
  579. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coord_test_runner_routing.py +0 -0
  580. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coord_test_runner_toolchain.py +0 -0
  581. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coord_web_sse_restart_live.py +0 -0
  582. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_coordinator_machine.py +0 -0
  583. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_cross_platform_imports.py +0 -0
  584. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dashboard.py +0 -0
  585. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dashboard_fixture.py +0 -0
  586. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dashboard_terminal.py +0 -0
  587. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dashboard_terminal_live.py +0 -0
  588. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_db.py +0 -0
  589. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dead_end.py +0 -0
  590. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_coord_db_backup.py +0 -0
  591. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_coord_web_dist.py +0 -0
  592. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_coord_web_rollback.py +0 -0
  593. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_drive_queue_unit.py +0 -0
  594. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_manifest.py +0 -0
  595. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_units_lane.py +0 -0
  596. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deploy_web_unit.py +0 -0
  597. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_deps.py +0 -0
  598. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_diagnose.py +0 -0
  599. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dispatch.py +0 -0
  600. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dispatch_target_validation.py +0 -0
  601. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_dist_name.py +0 -0
  602. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_done_housekeeping.py +0 -0
  603. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_drive_queue.py +0 -0
  604. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_drive_tmux.py +0 -0
  605. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_epic_up_capability_detection.py +0 -0
  606. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  607. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_epic_up_image_provenance.py +0 -0
  608. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_errors.py +0 -0
  609. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_events.py +0 -0
  610. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_failure_class.py +0 -0
  611. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_filelock.py +0 -0
  612. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  613. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_fix_of_force_override.py +0 -0
  614. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_fleet_config_health.py +0 -0
  615. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_fleet_health_probes.py +0 -0
  616. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_fleet_health_snapshot.py +0 -0
  617. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_freshness.py +0 -0
  618. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_gate_a.py +0 -0
  619. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_gate_b.py +0 -0
  620. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_gate_snapshot_staleness.py +0 -0
  621. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_gates.py +0 -0
  622. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_generated_types_fixture.py +0 -0
  623. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_github_ops.py +0 -0
  624. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_goal.py +0 -0
  625. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_graph_health.py +0 -0
  626. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_incident_regression.py +0 -0
  634. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_pypi.py +0 -0
  635. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_registry.py +0 -0
  636. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_timer_active.py +0 -0
  637. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_toolchain.py +0 -0
  638. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_unit_drift.py +0 -0
  639. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_health_unit_enablement.py +0 -0
  640. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_hooks.py +0 -0
  641. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_human_attended_437.py +0 -0
  642. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_init.py +0 -0
  643. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_integration.py +0 -0
  644. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_briefing_echo.py +0 -0
  645. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_prefill_state.py +0 -0
  646. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_session_relaunch.py +0 -0
  647. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_test_verdict_backstop.py +0 -0
  648. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_token_attribution.py +0 -0
  649. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_interactive_worktree.py +0 -0
  650. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_issue_store_seam.py +0 -0
  651. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_liveness_auditor.py +0 -0
  652. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_liveness_notify.py +0 -0
  653. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_machine_pause.py +0 -0
  654. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_merge_verify.py +0 -0
  655. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_milestone_chat.py +0 -0
  656. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_milestone_dispatch.py +0 -0
  657. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_milestone_gate.py +0 -0
  658. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_milestone_order.py +0 -0
  659. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_milestone_seam.py +0 -0
  660. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_mock_author.py +0 -0
  661. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_model_tiering.py +0 -0
  662. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_models.py +0 -0
  663. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_models_config_labels.py +0 -0
  664. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_needs_attention.py +0 -0
  665. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_network.py +0 -0
  666. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_new_issue_chat.py +0 -0
  667. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_next_release_tag.py +0 -0
  668. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_no_direct_gh_calls.py +0 -0
  669. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_node_shim.py +0 -0
  670. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_baseline.py +0 -0
  671. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_cli.py +0 -0
  672. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_collect.py +0 -0
  673. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_config.py +0 -0
  674. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_drive_seam.py +0 -0
  675. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_isolation.py +0 -0
  676. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_predicate.py +0 -0
  677. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_quiet_hours.py +0 -0
  678. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notifier_service.py +0 -0
  679. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notify.py +0 -0
  680. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_notify_drain.py +0 -0
  681. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_openapi.py +0 -0
  682. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_operational_defaults.py +0 -0
  683. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_overlap_fence.py +0 -0
  684. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_packaged_deploy_units.py +0 -0
  685. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_parentage.py +0 -0
  686. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_paste_landed.py +0 -0
  687. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_pipeline.py +0 -0
  688. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_plan_followup_approve_plan_command.py +0 -0
  689. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_plan_followup_pr_command.py +0 -0
  690. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_plan_followup_review_command.py +0 -0
  691. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_plan_only.py +0 -0
  692. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_plan_parser.py +0 -0
  693. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_platform_paths.py +0 -0
  694. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_portal_bridge.py +0 -0
  695. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_portal_config.py +0 -0
  696. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_pr_body_lint.py +0 -0
  697. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_prereqs.py +0 -0
  698. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_production_db_guard.py +0 -0
  699. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_progress.py +0 -0
  700. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_provider_seam.py +0 -0
  701. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_providers.py +0 -0
  702. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_providers_config_labels.py +0 -0
  703. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_quiet_hours_store_2146.py +0 -0
  705. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reap_merged_sessions.py +0 -0
  706. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reap_stale_interactive_tick.py +0 -0
  707. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reconcile_merges.py +0 -0
  710. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_release_propagate.py +0 -0
  714. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_release_verify.py +0 -0
  716. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_release_window.py +0 -0
  717. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_remote_auto_prune.py +0 -0
  718. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_remote_interactive_reaper.py +0 -0
  719. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_report_result_push.py +0 -0
  720. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_reports.py +0 -0
  721. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_serve.py +0 -0
  737. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_serve_app_board_trim.py +0 -0
  738. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_session.py +0 -0
  739. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_slice_issue_attribution.py +0 -0
  740. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_smoke.py +0 -0
  741. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_smoke_live_checkout_restore.py +0 -0
  742. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_smoke_workflow.py +0 -0
  743. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_spend_ceiling.py +0 -0
  744. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_spend_ceiling_coordinator.py +0 -0
  745. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_split.py +0 -0
  746. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_split_work.py +0 -0
  747. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_stage_projection.py +0 -0
  748. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_stalled_pipeline.py +0 -0
  749. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_state.py +0 -0
  750. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_state_review_findings_daemon.py +0 -0
  751. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_status_fleet_footer.py +0 -0
  752. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_stop_1567.py +0 -0
  753. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_stuck.py +0 -0
  754. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_terminal_command.py +0 -0
  755. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_author.py +0 -0
  756. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_chat.py +0 -0
  757. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_orchestrator.py +0 -0
  758. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_report.py +0 -0
  759. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_verdict_parsing.py +0 -0
  760. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_test_verdict_transcript_floor.py +0 -0
  761. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_thin_client_board_audit.py +0 -0
  762. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_thin_client_config_load_1080.py +0 -0
  763. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_thin_client_daemon_routing_906.py +0 -0
  764. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_tmux_host.py +0 -0
  765. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_tmux_session.py +0 -0
  766. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_usage.py +0 -0
  768. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_usage_limits.py +0 -0
  769. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_usage_rollup.py +0 -0
  770. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_venv_live_install_2121.py +0 -0
  771. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_version_single_source.py +0 -0
  772. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_watch.py +0 -0
  773. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_worker_events.py +0 -0
  774. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_worker_image_pin_sync.py +0 -0
  775. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_worker_safety.py +0 -0
  776. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_worktree.py +0 -0
  777. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  778. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/Cargo.lock +0 -0
  779. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/Cargo.toml +0 -0
  780. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/cargo-config-local-quadraui.toml.example +0 -0
  781. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/audit.rs +0 -0
  782. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/chat.rs +0 -0
  783. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/data.rs +0 -0
  784. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/dialogs.rs +0 -0
  785. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/drive.rs +0 -0
  786. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/drive_queue.rs +0 -0
  787. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/escalation.rs +0 -0
  788. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/events.rs +0 -0
  789. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/fixtures.rs +0 -0
  790. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/fleet_health.rs +0 -0
  791. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/fleet_sessions.rs +0 -0
  792. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/fleet_terminals.rs +0 -0
  793. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/format.rs +0 -0
  794. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/milestone_dag.rs +0 -0
  795. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/mod.rs +0 -0
  796. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/msv.rs +0 -0
  797. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/pipeline.rs +0 -0
  798. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/plans.rs +0 -0
  799. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/render.rs +0 -0
  800. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/reports.rs +0 -0
  801. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/sessions.rs +0 -0
  802. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/settings_ui.rs +0 -0
  803. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/sidebar.rs +0 -0
  804. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/terminal.rs +0 -0
  805. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/tests.rs +0 -0
  806. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/types.rs +0 -0
  807. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/app/workspace.rs +0 -0
  808. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/bin/gtk.rs +0 -0
  809. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/commands.rs +0 -0
  810. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/lib.rs +0 -0
  811. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/main.rs +0 -0
  812. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/src/settings.rs +0 -0
  813. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/tests/acceptance.rs +0 -0
  814. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/tests/cli.rs +0 -0
  815. {code_coordinator-0.5.58 → code_coordinator-0.5.60}/tui/tests/fixtures/board_sample.json +0 -0
@@ -100,6 +100,16 @@ coord approve --dry-run 1,2
100
100
  coord assign --dry-run precision claude-coordinator 42
101
101
  ```
102
102
 
103
+ **Workers: scope your test run to your diff, never `pytest` bare (#2169).**
104
+ The full suite exceeds Claude Code's 600s Bash ceiling on this repo and
105
+ duplicates the Test stage + CI, which both run it against your pushed SHA
106
+ regardless. Run just the file(s) that mirror what you changed — `pytest
107
+ tests/test_<module>.py` for a `coord/<module>.py` change, `cargo test` from
108
+ `tui/` scoped with a test-name filter for a `tui/**` change. To see what
109
+ the Test stage itself would run for your diff (and confirm you're not
110
+ missing a suite), `scripts/coord-test-runner.sh <worktree> --print-routing`
111
+ computes the routing without actually building or testing anything.
112
+
103
113
  ## Key Design Decisions
104
114
 
105
115
  - **No API key needed.** Everything uses `claude -p` which runs on Max/Pro subscription via OAuth.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.58
3
+ Version: 0.5.60
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.58
3
+ Version: 0.5.60
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -720,6 +720,7 @@ tests/test_watch.py
720
720
  tests/test_worker_events.py
721
721
  tests/test_worker_image_pin_sync.py
722
722
  tests/test_worker_safety.py
723
+ tests/test_worker_test_scoping.py
723
724
  tests/test_worktree.py
724
725
  tests/test_worktree_rmtree_chokepoint.py
725
726
  tests/acceptance/ms-33/audit_1039.rs
@@ -750,6 +750,7 @@
750
750
  "tests/test_worker_events.py",
751
751
  "tests/test_worker_image_pin_sync.py",
752
752
  "tests/test_worker_safety.py",
753
+ "tests/test_worker_test_scoping.py",
753
754
  "tests/test_worktree.py",
754
755
  "tests/test_worktree_rmtree_chokepoint.py",
755
756
  "tui/Cargo.lock",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.58",
2
+ "tag": "0.5.60",
3
3
  "distance": 0,
4
- "node": "g36b37b343666fd25278ef49e2b4521e94ec1a50a",
4
+ "node": "ge01001eaf8201fb10e8bd9b1a0f6c018d93b3fb8",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-13"
@@ -574,6 +574,16 @@ def expected_red_failure_summary(verdict: dict[str, Any]) -> str:
574
574
  can't mistake this for "a test failed" — it is the opposite signal, and
575
575
  the fix is editorial (clear the manifest entry, or realize the
576
576
  assertion never exercised the bug), not code.
577
+
578
+ #2199: the guidance below used to send the operator to `coord
579
+ acceptance record`, on the claim that a green trust-gate run clears the
580
+ entry automatically. PR #2173 deliberately moved clearing OUT of
581
+ `record` and into the post-merge hook (`coord.merge_queue.
582
+ _maybe_clear_expected_red` / `coord.acceptance.
583
+ clear_expected_red_via_pr`, right after the fix's own PR actually
584
+ merges — see that function's docstring for the ordering bug this
585
+ fixed). Re-running `record` today clears nothing; an operator who
586
+ followed the old wording would watch it not work with no clue why.
577
587
  """
578
588
  ids = verdict.get("unexpected_green") or []
579
589
  if not ids:
@@ -583,10 +593,15 @@ def expected_red_failure_summary(verdict: dict[str, Any]) -> str:
583
593
  f"HARD FAILURE: {len(ids)} test(s) listed in `expected_red` now PASS:\n"
584
594
  f"{listed}\n"
585
595
  "An expected-red test that passes means either the fix already "
586
- "landed silently (clear it `coord acceptance record` does this "
587
- "automatically on a green trust-gate run) or the assertion never "
588
- "exercised the bug in the first place (#1965). This is NOT an "
589
- "ordinary test failure it is the opposite signal."
596
+ "landed silently it clears automatically once ITS OWN PR actually "
597
+ "merges (the post-merge hook, not `coord acceptance record`; see "
598
+ "docs/ORACLE_LOOP.md). Still listed after that merge? Check `coord "
599
+ "merge`'s own output for an `expected_red_clear_skipped*` event "
600
+ "naming why (no work assignment found, no passing trust-gate "
601
+ "verdict recorded, or a stale acceptance SHA), or run `coord "
602
+ "acceptance expected-red <repo>` to see current state — or the "
603
+ "assertion never exercised the bug in the first place (#1965). "
604
+ "This is NOT an ordinary test failure — it is the opposite signal."
590
605
  )
591
606
 
592
607
 
@@ -2845,9 +2845,17 @@ This session is ONE-SHOT and non-interactive (#1394):
2845
2845
  completion notifications will NEVER reach you — nothing wakes you up.
2846
2846
  - NEVER start a long-running command in the background and then end your \
2847
2847
  turn waiting for it (no `run_in_background`, no `&`, no "I'll wait for the \
2848
- test run to finish"). Run it in the FOREGROUND and block until it returns, \
2849
- or raise the timeout, or skip it and say so. If you end your turn waiting, \
2850
- the session is over and your work is thrown away.
2848
+ test run to finish") there is no next turn for a notification to land \
2849
+ in, so ending your turn that way throws the work away. Prefer running it \
2850
+ in the FOREGROUND and blocking until it returns. If it genuinely cannot \
2851
+ finish inside one Bash call, you may background it and poll it yourself, \
2852
+ in bounded steps, from THIS SAME still-running session — `Monitor`, or \
2853
+ repeated `TaskOutput` calls with a bounded `timeout`, never a foreground \
2854
+ loop that blocks past the ceiling (`until ! pgrep ...; do sleep ...; done` \
2855
+ hits the identical 600s wall) and never a final message that leaves it \
2856
+ running unattended and relies on being woken back up. Otherwise, raise the \
2857
+ timeout or skip it and say so. If you end your turn waiting, the session \
2858
+ is over and your work is thrown away.
2851
2859
  - ALWAYS `git add`, `git commit`, and `git push origin HEAD` BEFORE your \
2852
2860
  final message — even if the build is broken, the tests are failing, or you \
2853
2861
  ran out of time. Uncommitted changes are destroyed when the session ends. \
@@ -2883,8 +2891,25 @@ intentional `#[allow]` with reason, a deferred refactor flagged \
2883
2891
  elsewhere), explicitly call it out in your final message with the \
2884
2892
  reason. Don't silently ship warnings.
2885
2893
  - Re-run the build after fixes to confirm clean output.
2886
- - Run the project's test command (`cargo test`, `pytest`, etc.) and \
2887
- confirm it passes before declaring done.
2894
+ - Run only the tests that cover your diff never the project's whole \
2895
+ test suite. A full suite routinely exceeds this tool's 600-second Bash \
2896
+ ceiling, and a worker that tries to shepherd it past that wall (splitting \
2897
+ it into chunks, backgrounding it and blocking on a poll loop, ...) burns \
2898
+ most of a session on that instead of the fix, for no net-new signal: the \
2899
+ Test stage and CI both re-run the FULL suite against your pushed SHA right \
2900
+ after you, on a clean checkout, which is strictly better evidence than a \
2901
+ worker's own partial run (#2169). Find the test file(s)/module(s) whose \
2902
+ name or path mirrors what you changed (e.g. `tests/test_<module>.py` for \
2903
+ `coord/<module>.py`, the crate-local `#[cfg(test)]` block for a Rust file) \
2904
+ and run just those — confirm they pass before declaring done.
2905
+ - Exception: if this assignment IS an oracle-loop acceptance round (you \
2906
+ were told to run `coord acceptance run --issue N`), keep running that \
2907
+ sealed slice as many times as it takes to go green. It is the loop's \
2908
+ convergence signal, not duplicated effort, and the scoping rule above does \
2909
+ not apply to it.
2910
+ - If even the scoped run genuinely cannot finish in time, follow the \
2911
+ background-and-poll pattern in the ONE-SHOT section above — do not invent \
2912
+ a chunk-and-loop workaround.
2888
2913
 
2889
2914
  #252: before exiting, emit a SMOKE_TESTS block telling the human what to \
2890
2915
  manually verify. You changed the code; you know what's worth poking.
@@ -3668,7 +3693,13 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
3668
3693
  else:
3669
3694
  system_prompt = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
3670
3695
  system_prompt += build_deny_prompt(spec.deny_commands)
3671
- allowed_tools = "Read,Edit,Write,Bash"
3696
+ # #2169: `Monitor` is the sanctioned way to poll a backgrounded
3697
+ # long-running command in bounded steps (see the ONE-SHOT section of
3698
+ # WORKER_SYSTEM_PROMPT) instead of a foreground loop that blocks
3699
+ # past the 600s Bash ceiling. `TaskOutput`/`TaskStop` were already
3700
+ # reachable without being in this list; `Monitor` was the one
3701
+ # observed denied.
3702
+ allowed_tools = "Read,Edit,Write,Bash,Monitor"
3672
3703
 
3673
3704
  # NOTE: briefing is NOT passed as a positional arg — it is written to
3674
3705
  # stdin as the first stream-json user message by ``_spawn``.
@@ -288,6 +288,35 @@ class DriveCounters:
288
288
  # capture deserves its own full budget of cheap waits before the next
289
289
  # forced retry.
290
290
  gate_wait_rounds: int = 0
291
+ # #2199: bounded retry for the trust gate's OWN dispatch — distinct from
292
+ # `fix_rounds` (which bounds "the work needs another round" once a
293
+ # verdict, passed or failed, actually landed on the board). This counts
294
+ # attempts where `coord acceptance record` itself never got that far —
295
+ # a missing local checkout, a driver crash, GitHub unreachable — so a
296
+ # persistently broken environment reaches a named `_die()` instead of
297
+ # `coord drive` re-running a full git-worktree + suite invocation every
298
+ # poll forever. Bounded by `opts.max_work_retries`, the same "how many
299
+ # times do we retry a flaky infra thing" budget `work_retries` uses.
300
+ #
301
+ # #2199 review (blocking finding 1): scoped to ONE sha via
302
+ # `acceptance_gate_attempts_sha` below — NOT a lifetime total. A fresh
303
+ # SHA (a fix round pushing a new commit) legitimately needs its own
304
+ # dispatch, and that dispatch is the entire point of the "same shape as
305
+ # `_decide_test`'s fix loop" design a few lines up in
306
+ # `_decide_acceptance_gate`; sharing one un-reset counter across every
307
+ # SHA a drive ever sees meant the SECOND round after the FIRST fix round
308
+ # already exhausted the default `max_work_retries=1` budget and died
309
+ # with a false "environment broken" diagnosis — even though the trust
310
+ # gate was working exactly as designed (quadraui#542's actual shape:
311
+ # one fix round, then this).
312
+ acceptance_gate_attempts: int = 0
313
+ # #2199 review: the SHA `acceptance_gate_attempts` above is counting
314
+ # dispatch attempts FOR. `_decide_acceptance_gate` resets the counter to
315
+ # 0 whenever it sees a SHA that doesn't match this — a fresh commit (a
316
+ # fix round, a rebase) always gets its own full attempt budget, and only
317
+ # repeated failures to produce ANY verdict for the SAME commit reach
318
+ # `_die()`.
319
+ acceptance_gate_attempts_sha: str = ""
291
320
  # #2079: a SECOND, independent budget of exactly the same shape, spent
292
321
  # only on landing the oracle-mode JIT acceptance slice
293
322
  # (`_decide_acceptance_landing`). Separate rather than shared because the
@@ -375,6 +404,14 @@ class AcceptanceGateChecker(Protocol):
375
404
 
376
405
  def resolve_for_path(self, repo_name: str, milestone_number: int) -> str | None: ...
377
406
 
407
+ def is_issue_exempt(
408
+ self,
409
+ repo_name: str,
410
+ milestone_number: int,
411
+ issue_number: int,
412
+ issue_labels: tuple[str, ...],
413
+ ) -> bool: ...
414
+
378
415
 
379
416
  @dataclass
380
417
  class GitHubAcceptanceGateChecker:
@@ -412,6 +449,34 @@ class GitHubAcceptanceGateChecker:
412
449
  return None
413
450
  return resolve_for_path(self.config, repo_cfg, milestone_number)
414
451
 
452
+ def is_issue_exempt(
453
+ self,
454
+ repo_name: str,
455
+ milestone_number: int,
456
+ issue_number: int,
457
+ issue_labels: tuple[str, ...],
458
+ ) -> bool:
459
+ """#2199: does *issue_number* opt out of the sealed suite — the
460
+ SAME ``manifest.exempt`` list / ``oracle:exempt`` label the #1138
461
+ hard gate (:func:`coord.milestone_dispatch.issue_oracle_ready`)
462
+ already reads. Reused rather than re-derived so the JIT-authoring
463
+ gate and the #2199 trust gate can never disagree about which
464
+ issues the oracle loop covers — see that function's own docstring
465
+ for why ``exempt`` says "doesn't consume the sealed suite" and
466
+ nothing about Gate A sign-off (already established True by the
467
+ time :func:`resolve_oracle_decision` calls this).
468
+ """
469
+ from coord.milestone_dispatch import issue_oracle_ready # noqa: PLC0415
470
+
471
+ repo_cfg = self.config.repo(repo_name)
472
+ if repo_cfg is None:
473
+ return False
474
+ readiness = issue_oracle_ready(
475
+ repo_cfg, self.config, milestone_number, issue_number,
476
+ issue_labels=issue_labels,
477
+ )
478
+ return readiness.exempt
479
+
415
480
 
416
481
  @dataclass(frozen=True)
417
482
  class OracleDecision:
@@ -424,11 +489,23 @@ class OracleDecision:
424
489
  to guess which mode a run is in. ``tracking_issue`` is set iff ``active``
425
490
  — the argument :func:`_decide_acceptance_author` needs to build ``coord
426
491
  acceptance author <repo> <tracking_issue> --issue <N>``.
492
+
493
+ #2199: ``issue_exempt`` — resolved alongside ``active`` (same one-shot
494
+ GitHub fetch budget: ``AcceptanceGateChecker.is_issue_exempt`` reuses the
495
+ #1138 hard gate's own manifest read) — is *this issue*'s
496
+ ``manifest.exempt``/``oracle:exempt`` opt-out from the sealed suite.
497
+ :func:`_decide_acceptance_gate` (the trust gate) skips entirely when
498
+ this is ``True``: an exempt issue has no authored slice for `coord
499
+ acceptance record` to re-run, so treating its absence as a red verdict
500
+ would be exactly the "acquire a new blocking gate it never opted into"
501
+ regression #2199's acceptance criteria rule out. Always ``False`` when
502
+ ``active`` is ``False`` — meaningless outside the oracle loop.
427
503
  """
428
504
 
429
505
  active: bool
430
506
  reason: str
431
507
  tracking_issue: int | None = None
508
+ issue_exempt: bool = False
432
509
 
433
510
 
434
511
  def resolve_oracle_decision(
@@ -488,6 +565,13 @@ def resolve_oracle_decision(
488
565
  f"acceptance mock {state.repo} {state.milestone_tracking_issue}` "
489
566
  "first for the oracle loop, docs/ORACLE_LOOP.md)",
490
567
  )
568
+ # #2199: resolved here, alongside everything else `resolve_oracle_decision`
569
+ # already settles once per run — see `OracleDecision.issue_exempt`'s
570
+ # docstring for why the trust gate needs this and why it must reuse
571
+ # (not re-derive) the #1138 hard gate's own exemption check.
572
+ issue_exempt = gate_checker.is_issue_exempt(
573
+ state.repo, state.milestone_number, state.issue, state.issue_labels,
574
+ )
491
575
  return OracleDecision(
492
576
  True,
493
577
  f"ORACLE DRIVE — ms-{state.milestone_number}'s Gate-A contract is "
@@ -496,6 +580,7 @@ def resolve_oracle_decision(
496
580
  f"{state.milestone_tracking_issue} --issue {state.issue}`) before "
497
581
  "dispatching work",
498
582
  tracking_issue=state.milestone_tracking_issue,
583
+ issue_exempt=issue_exempt,
499
584
  )
500
585
 
501
586
 
@@ -851,12 +936,14 @@ def _acceptance_message(message: str, state: IssueState) -> str:
851
936
 
852
937
 
853
938
  class MergeVerifier(Protocol):
854
- """The two git/GitHub questions the state machine cannot answer itself."""
939
+ """The git/GitHub questions the state machine cannot answer itself."""
855
940
 
856
941
  def branch_has_commits(self, state: IssueState) -> bool: ...
857
942
 
858
943
  def verify_merged(self, state: IssueState) -> bool: ...
859
944
 
945
+ def branch_head_sha(self, state: IssueState) -> str | None: ...
946
+
860
947
 
861
948
  @dataclass
862
949
  class GitMergeVerifier:
@@ -965,6 +1052,23 @@ class GitMergeVerifier:
965
1052
  finally:
966
1053
  self._git(base, "update-ref", "-d", vref)
967
1054
 
1055
+ def branch_head_sha(self, state: IssueState) -> str | None:
1056
+ """The exact commit `coord acceptance record --sha` (#2199) must be
1057
+ pointed at — the trust gate re-runs the sealed suite against a
1058
+ precise SHA, never a branch name that could move under a slow
1059
+ drive loop. GitHub API, not a local checkout: same reasoning as
1060
+ :meth:`verify_merged`'s primary path — authoritative for every
1061
+ machine this driver might run on, no ``~/src/<repo>`` clone
1062
+ required. Returns ``None`` (never raises) when the branch is gone
1063
+ or GitHub is unreachable; callers treat that as "try again next
1064
+ poll", never as a verdict.
1065
+ """
1066
+ if not state.work_branch or not state.repo_github:
1067
+ return None
1068
+ from coord import github_ops # noqa: PLC0415
1069
+
1070
+ return github_ops.get_branch_sha(state.repo_github, state.work_branch)
1071
+
968
1072
 
969
1073
  # ── preflight (pure) ─────────────────────────────────────────────────────────
970
1074
 
@@ -1326,6 +1430,22 @@ def decide(
1326
1430
  _escalate_dead_end(state, dead_end), warnings=warnings
1327
1431
  )
1328
1432
 
1433
+ # #2199: the oracle loop's TRUST GATE — docs/ORACLE_LOOP.md Phase-1 step
1434
+ # 6, right here between the dead-end predicate and the Test gate,
1435
+ # because this is the first point `coord drive` has observed the work
1436
+ # assignment's branch head AFTER push. Before this, nothing ever called
1437
+ # `coord acceptance record`: an issue driven end-to-end by `coord drive`
1438
+ # completed with `acceptance_state = None` forever, so the sealed suite
1439
+ # was never re-run externally and `_maybe_clear_expected_red` could
1440
+ # never clear (quadraui#542).
1441
+ acceptance_gate = _decide_acceptance_gate(
1442
+ state, opts, counters, machine, oracle, verifier, gate_checker
1443
+ )
1444
+ if acceptance_gate is not None:
1445
+ return replace(
1446
+ acceptance_gate, warnings=warnings + acceptance_gate.warnings
1447
+ )
1448
+
1329
1449
  test = _decide_test(state, opts, counters, machine)
1330
1450
  if test is not None:
1331
1451
  return replace(test, warnings=warnings + test.warnings)
@@ -1467,6 +1587,161 @@ def _decide_advisory(
1467
1587
  )
1468
1588
 
1469
1589
 
1590
+ def _decide_acceptance_gate(
1591
+ state: IssueState,
1592
+ opts: DriveOptions,
1593
+ counters: DriveCounters,
1594
+ machine: str,
1595
+ oracle: OracleDecision | None,
1596
+ verifier: MergeVerifier,
1597
+ gate_checker: AcceptanceGateChecker | None,
1598
+ ) -> Action | None:
1599
+ """The #2199 oracle-loop TRUST GATE — ``coord acceptance record --repo
1600
+ R --issue N --sha <pushed sha>``, run by the COORDINATOR (this process,
1601
+ never inside the worker's own session) against the exact commit the
1602
+ work assignment pushed. docs/ORACLE_LOOP.md's Phase-1 step 6, and the
1603
+ reason it exists: a headless worker's in-session "green" claim
1604
+ (``coord acceptance run``, Phase-1 step 5) can lie; it cannot fake the
1605
+ coordinator re-running the sealed suite itself. ``None`` means "not
1606
+ applicable, or already resolved for this SHA — fall through to Test".
1607
+
1608
+ Before #2199 NOTHING ever called this — an issue driven end-to-end by
1609
+ ``coord drive`` completed with ``acceptance_state = None`` forever, so
1610
+ ``coord.merge_queue._maybe_clear_expected_red`` could never clear an
1611
+ ``expected_red`` entry either (quadraui#542, quadraui#492).
1612
+
1613
+ Only fires when ``oracle.active`` (a driver-configured repo, an issue
1614
+ in a milestone whose Gate-A contract is merged — the same condition
1615
+ that gated JIT-slice authoring) AND this issue is not
1616
+ ``oracle.issue_exempt`` (``manifest.exempt`` / the ``oracle:exempt``
1617
+ label — an issue that never consumed the sealed suite has nothing for
1618
+ ``record`` to re-run, so gating on its absence would be a NEW blocking
1619
+ gate an exempt issue never opted into, exactly what #2199's acceptance
1620
+ criteria rule out). Every other issue — no driver, no milestone,
1621
+ ``--no-acceptance`` — passes straight through unchanged.
1622
+
1623
+ *gate_checker* (#2199 review, blocking finding 3): resolves
1624
+ ``--for-path`` for a ROUTED repo (``acceptance.drivers.<repo>.routes``)
1625
+ exactly like :func:`_decide_acceptance_author` already does — without
1626
+ it, ``coord commands/acceptance.py``'s ``_resolve_driver`` hard-refuses
1627
+ every dispatch on a routed repo with "no route matched", so the trust
1628
+ gate silently never functioned there at all.
1629
+ """
1630
+ if oracle is None or not oracle.active or oracle.issue_exempt:
1631
+ return None
1632
+ assert gate_checker is not None, (
1633
+ "oracle.active implies resolve_oracle_decision ran with a real "
1634
+ "gate_checker; decide() always threads one through"
1635
+ )
1636
+
1637
+ sha = verifier.branch_head_sha(state)
1638
+ if sha is None:
1639
+ # GitHub unreachable or the branch vanished between polls — don't
1640
+ # let a transient lookup block a whole drive run; retry next poll.
1641
+ return _wait(label="ACCEPTANCE: waiting to resolve the pushed SHA")
1642
+
1643
+ if state.work_acceptance_sha == sha:
1644
+ if state.work_acceptance_state == "passed":
1645
+ return None # trust gate already green for this exact commit
1646
+ if state.work_acceptance_state == "failed":
1647
+ # Same shape as a failed Test verdict (#2199 acceptance: "a
1648
+ # failed trust gate must block, not warn ... at the same place
1649
+ # a failed Test verdict does") — a bounded fix-round retry,
1650
+ # sharing the ONE fix budget `_decide_test` also spends from
1651
+ # (#1692: a failed test and a failed trust gate are two shapes
1652
+ # of the same "the work needs another round" loop).
1653
+ if counters.fix_rounds >= opts.max_fix_rounds:
1654
+ return _die(
1655
+ f"acceptance trust gate still failing after "
1656
+ f"{counters.fix_rounds} fix round(s) at {sha} — "
1657
+ "stopping.\n"
1658
+ f" Reason: {state.work_acceptance_reason or 'none recorded'}\n"
1659
+ f" Inspect: coord log {state.work_aid} --machine "
1660
+ f"{state.work_machine or machine}"
1661
+ )
1662
+ counters.fix_rounds += 1
1663
+ return Action(
1664
+ kind=RUN,
1665
+ label=(
1666
+ "ACCEPTANCE: trust gate failed → fix round "
1667
+ f"{counters.fix_rounds}/{opts.max_fix_rounds} "
1668
+ f"(coord fix {state.work_aid})"
1669
+ ),
1670
+ command=("fix", state.work_aid),
1671
+ error_message=(
1672
+ f"coord fix {state.work_aid} failed to dispatch after a "
1673
+ "failed acceptance trust gate."
1674
+ ),
1675
+ )
1676
+
1677
+ # No verdict recorded yet for this exact SHA — never run, or run
1678
+ # against a now-stale one (a fix round, a rebase). Dispatch it.
1679
+ #
1680
+ # #2199 review (blocking finding 1): `acceptance_gate_attempts` is
1681
+ # scoped to THIS sha, not a lifetime total — a fresh SHA (this branch
1682
+ # runs again after a fix round pushed a new commit) gets its own full
1683
+ # attempt budget. Without this reset, the legitimate re-dispatch for
1684
+ # SHA2 inherited SHA1's already-spent count and died immediately with a
1685
+ # false "environment broken" diagnosis on exactly the second round the
1686
+ # docstring above says this mirrors `_decide_test` for.
1687
+ if counters.acceptance_gate_attempts_sha != sha:
1688
+ counters.acceptance_gate_attempts = 0
1689
+ counters.acceptance_gate_attempts_sha = sha
1690
+
1691
+ # `on_error="warn"` is deliberate: `coord acceptance record` exits
1692
+ # non-zero BOTH when it successfully records a red verdict (the board
1693
+ # write already happened before it exits — the next poll's
1694
+ # `work_acceptance_state == "failed"` branch above is what actually
1695
+ # bounces to Fix) and when it errors out before ever reaching a verdict
1696
+ # (no local checkout, a driver crash, a git fetch failure). Raising
1697
+ # `DriveError` here on either would turn a routine red trust-gate round
1698
+ # into a terminal drive failure — exactly the "must block [via Fix],
1699
+ # not warn" the acceptance criteria ask for, achieved one poll later by
1700
+ # observation rather than by inspecting this exit code directly.
1701
+ if counters.acceptance_gate_attempts >= opts.max_work_retries:
1702
+ return _die(
1703
+ f"acceptance trust gate never produced a verdict for {sha} "
1704
+ f"after {counters.acceptance_gate_attempts} attempt(s) — "
1705
+ "`coord acceptance record` keeps failing before recording "
1706
+ "anything (checkout/driver/environment problem, not a red "
1707
+ "suite).\n"
1708
+ f" Inspect: coord acceptance record --repo {state.repo} "
1709
+ f"--issue {state.issue} --sha {sha}"
1710
+ )
1711
+ counters.acceptance_gate_attempts += 1
1712
+
1713
+ # #2199 review (blocking finding 3): resolve `--for-path` exactly like
1714
+ # `_decide_acceptance_author` does — a routed repo's `_resolve_driver`
1715
+ # (coord/commands/acceptance.py) hard-refuses with "no route matched"
1716
+ # when it's omitted, which made the trust gate structurally unable to
1717
+ # ever record a verdict for such a repo.
1718
+ from coord.acceptance import ForPathResolutionError # noqa: PLC0415
1719
+
1720
+ try:
1721
+ for_path = gate_checker.resolve_for_path(state.repo, state.milestone_number)
1722
+ except ForPathResolutionError as exc:
1723
+ return _die(
1724
+ f"could not resolve --for-path for {state.repo}'s acceptance "
1725
+ f"trust gate on #{state.issue}: {exc}"
1726
+ )
1727
+ command = [
1728
+ "acceptance", "record", "--repo", state.repo, "--issue",
1729
+ str(state.issue), "--sha", sha,
1730
+ ]
1731
+ if for_path:
1732
+ command += ["--for-path", for_path]
1733
+
1734
+ return Action(
1735
+ kind=RUN,
1736
+ label=(
1737
+ "ACCEPTANCE: trust gate → coord acceptance record --sha "
1738
+ f"{sha[:12]}" + (f" --for-path {for_path}" if for_path else "")
1739
+ ),
1740
+ command=tuple(command),
1741
+ on_error="warn",
1742
+ )
1743
+
1744
+
1470
1745
  def _decide_test(
1471
1746
  state: IssueState,
1472
1747
  opts: DriveOptions,
@@ -84,6 +84,20 @@ class IssueState:
84
84
  work_review_iter: int = 0
85
85
  work_exit_code: int | None = None
86
86
  work_failure_reason: str = ""
87
+ # #2199: the trust-gate verdict `coord acceptance record --issue N --sha
88
+ # <sha>` writes onto THIS issue's own `work` row (see `coord.state.
89
+ # record_acceptance_verdict` — the same field `coord.merge_queue.
90
+ # _maybe_clear_expected_red` already reads via `getattr(work,
91
+ # "acceptance_state", None)`). "" | "passed" | "failed" — "" means no
92
+ # verdict has ever been recorded for this work row, which is exactly
93
+ # the ambiguity #2199 exists to resolve: nothing used to write this at
94
+ # all, so it was indistinguishable from "the gate ran and lied clean".
95
+ # `work_acceptance_sha` is the commit the last verdict was recorded
96
+ # against — a fresh push (fix round, rebase) invalidates it the same
97
+ # way `review_head_sha` invalidates a stale review approval.
98
+ work_acceptance_state: str = ""
99
+ work_acceptance_reason: str = ""
100
+ work_acceptance_sha: str = ""
87
101
 
88
102
  review_aid: str = ""
89
103
  review_status: str = ""
@@ -141,6 +155,12 @@ class IssueState:
141
155
  # member of any tracked work order — the "normal drive" case.
142
156
  milestone_number: int | None = None
143
157
  milestone_tracking_issue: int | None = None
158
+ # #2199: this issue's own GitHub labels — resolved from the same
159
+ # `/board` `issues` row `milestone_number` is (no extra I/O). Threaded
160
+ # through so `resolve_oracle_decision` can resolve per-issue
161
+ # `oracle:exempt`/`manifest.exempt` opt-out for the trust gate
162
+ # (`AcceptanceGateChecker.is_issue_exempt`) without a second board scan.
163
+ issue_labels: tuple[str, ...] = ()
144
164
 
145
165
  # The JIT slice's own `type="test-author"` assignment (#1171: keyed on
146
166
  # `for_issue_number == issue`, NOT `issue_number` — that field is the
@@ -224,6 +244,12 @@ class IssueState:
224
244
  self.work_aid,
225
245
  self.work_status,
226
246
  self.work_test_state,
247
+ # #2199: the trust gate's own verdict is a real transition
248
+ # the same way work_test_state is — see the docstring above
249
+ # for why omitting an analogous field mutes the `state:`
250
+ # log line and fools the stall detector.
251
+ self.work_acceptance_state,
252
+ self.work_acceptance_sha,
227
253
  self.work_review_state,
228
254
  self.work_review_iter,
229
255
  self.review_status,
@@ -402,6 +428,9 @@ def project(payload: dict, repo: str, issue: int, config: Any) -> IssueState:
402
428
  work_review_iter=int(g(work, "review_iteration", 0) or 0),
403
429
  work_exit_code=None if exit_code is None else int(exit_code),
404
430
  work_failure_reason=g(work, "failure_reason"),
431
+ work_acceptance_state=g(work, "acceptance_state"),
432
+ work_acceptance_reason=g(work, "acceptance_reason"),
433
+ work_acceptance_sha=g(work, "acceptance_sha"),
405
434
  review_aid=g(review, "assignment_id"),
406
435
  review_status=g(review, "status"),
407
436
  review_verdict=g(review, "review_verdict"),
@@ -421,6 +450,7 @@ def project(payload: dict, repo: str, issue: int, config: Any) -> IssueState:
421
450
  picked_machine_no_capable=_machine_pick.no_capable_machine,
422
451
  milestone_number=milestone_number,
423
452
  milestone_tracking_issue=milestone_tracking_issue,
453
+ issue_labels=tuple(issue_labels),
424
454
  # #2024: the per-issue Test-stage policy, off the labels already read
425
455
  # above (no extra I/O). `test_mode_from_labels` is the same function
426
456
  # `coord.state._get_issue_test_mode_local` uses, so the driver and the