code-coordinator 0.5.118__tar.gz → 0.5.120__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 (857) hide show
  1. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/SOURCES.txt +10 -0
  4. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/scm_file_list.json +10 -0
  5. code_coordinator-0.5.120/code_coordinator.egg-info/scm_version.json +8 -0
  6. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent.py +56 -0
  7. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/cli.py +56 -25
  8. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/drive_queue.py +44 -0
  9. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/portal.py +78 -5
  10. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/config.py +76 -0
  11. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/conflict_fix.py +7 -0
  12. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-drive-queue.service +29 -16
  13. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive_queue.py +78 -0
  14. code_coordinator-0.5.120/coord/skills/portal-followup/SKILL.md +84 -0
  15. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-drive-queue.service +29 -16
  16. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/DRIVE_QUEUE.md +42 -21
  17. code_coordinator-0.5.120/tests/acceptance/ms-65/contract.md +563 -0
  18. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +40 -0
  19. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +40 -0
  20. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-preview-tab.screen +40 -0
  21. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +40 -0
  22. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +40 -0
  23. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +40 -0
  24. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +40 -0
  25. code_coordinator-0.5.120/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +40 -0
  26. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_portal.py +100 -0
  27. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_queue.py +78 -0
  28. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_mock_author.py +10 -1
  29. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_config.py +20 -1
  30. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_safety.py +149 -0
  31. code_coordinator-0.5.118/code_coordinator.egg-info/scm_version.json +0 -8
  32. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/board.md +0 -0
  33. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/complete-session.md +0 -0
  34. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.claude/commands/coordinator.md +0 -0
  35. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/_lib.sh +0 -0
  36. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-checkout +0 -0
  37. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-commit +0 -0
  38. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.githooks/post-merge +0 -0
  39. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  40. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/coord-ci-acceptance.yml +0 -0
  41. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/auto-release.yml +0 -0
  42. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/cargo-test.yml +0 -0
  43. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/publish.yml +0 -0
  44. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/release-tui.yml +0 -0
  45. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.github/workflows/test.yml +0 -0
  46. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/.gitignore +0 -0
  47. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/CLAUDE.md +0 -0
  48. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/GOAL.md +0 -0
  49. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/LICENSE +0 -0
  50. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/MANIFEST.in +0 -0
  51. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/README.md +0 -0
  52. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/dependency_links.txt +0 -0
  53. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/entry_points.txt +0 -0
  54. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/requires.txt +0 -0
  55. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/code_coordinator.egg-info/top_level.txt +0 -0
  56. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/__init__.py +0 -0
  57. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/_board_mapping.py +0 -0
  58. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/acceptance.py +0 -0
  59. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/acceptance_drivers.py +0 -0
  60. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent_app.py +0 -0
  61. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agent_update.py +0 -0
  62. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/.gitignore +0 -0
  63. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/agents/work.md +0 -0
  64. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/agents/opencode/routing.jsonc +0 -0
  65. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/audit.py +0 -0
  66. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/auto_loop.py +0 -0
  67. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/block_log.py +0 -0
  68. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_bool_guard.py +0 -0
  69. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_service.py +0 -0
  70. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/board_wire.py +0 -0
  71. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/brain.py +0 -0
  72. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/branch_model.py +0 -0
  73. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/bug_intake.py +0 -0
  74. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/cargo_cache.py +0 -0
  75. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/ci_github.py +0 -0
  76. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/ci_store.py +0 -0
  77. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/claim.py +0 -0
  78. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/client.py +0 -0
  79. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/__init__.py +0 -0
  80. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/_common.py +0 -0
  81. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/acceptance.py +0 -0
  82. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/agent_ops.py +0 -0
  83. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/audit.py +0 -0
  84. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/chat.py +0 -0
  85. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/dispatch.py +0 -0
  86. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/dispatch_workers.py +0 -0
  87. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/drive.py +0 -0
  88. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/gate_a.py +0 -0
  89. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/gates.py +0 -0
  90. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/issues.py +0 -0
  91. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/lifecycle.py +0 -0
  92. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/merge.py +0 -0
  93. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/milestone.py +0 -0
  94. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/plan_followup.py +0 -0
  95. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/plans.py +0 -0
  96. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/release.py +0 -0
  97. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/repo.py +0 -0
  98. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/report.py +0 -0
  99. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/review.py +0 -0
  100. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/scorecard.py +0 -0
  101. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/sessions.py +0 -0
  102. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/setup.py +0 -0
  103. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/status.py +0 -0
  104. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/terminal.py +0 -0
  105. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/test_gate.py +0 -0
  106. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/commands/tui.py +0 -0
  107. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/comments.py +0 -0
  108. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/config_reload.py +0 -0
  109. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dao.py +0 -0
  110. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/__init__.py +0 -0
  111. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/fixture.py +0 -0
  112. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/index.html +0 -0
  113. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/server.py +0 -0
  114. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/terminal.py +0 -0
  115. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/.gitignore +0 -0
  116. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/components.json +0 -0
  117. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  118. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  119. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  120. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  121. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  122. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  123. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  124. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  125. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  126. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/index.html +0 -0
  127. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  128. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/sw.js +0 -0
  129. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  130. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  131. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  132. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  133. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  134. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  135. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  136. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  137. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  138. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  139. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/eslint.config.js +0 -0
  140. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/index.html +0 -0
  141. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  142. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/package-lock.json +0 -0
  143. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/package.json +0 -0
  144. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  145. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/playwright.config.ts +0 -0
  146. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/postcss.config.js +0 -0
  147. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  148. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  149. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  150. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/App.tsx +0 -0
  151. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/api/client.ts +0 -0
  152. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  153. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  154. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  155. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  156. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  157. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  158. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  159. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  160. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  161. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  162. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  163. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  164. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  165. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  166. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  167. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  168. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  169. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  170. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  171. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  172. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  173. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  174. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  175. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  176. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  177. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  178. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  179. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  180. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  181. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  182. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  183. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  184. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  185. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  186. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  187. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/index.css +0 -0
  188. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  189. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  190. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/main.tsx +0 -0
  191. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  192. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  193. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  194. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  195. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  196. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  197. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  198. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  199. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  200. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  201. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  202. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  203. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  204. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  205. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  206. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  207. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  208. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  209. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  210. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  211. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  212. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  213. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  214. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tailwind.config.js +0 -0
  215. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tsconfig.json +0 -0
  216. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  217. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dashboard/webapp/vite.config.ts +0 -0
  218. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/db.py +0 -0
  219. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dead_end.py +0 -0
  220. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/README.md +0 -0
  221. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-agent.service +0 -0
  222. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.service +0 -0
  223. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.sh +0 -0
  224. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-db-backup.timer +0 -0
  225. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-drive-queue.timer +0 -0
  226. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-notify.service +0 -0
  227. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-notify.timer +0 -0
  228. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-propagate.service +0 -0
  229. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-propagate.timer +0 -0
  230. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-window.service +0 -0
  231. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-release-window.timer +0 -0
  232. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-serve.service +0 -0
  233. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web-dist-build.service +0 -0
  234. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web-dist-build.timer +0 -0
  235. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy/coord-web.service +0 -0
  236. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy_manifest.py +0 -0
  237. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deploy_units.py +0 -0
  238. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/deps.py +0 -0
  239. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/diagnose.py +0 -0
  240. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dispatch.py +0 -0
  241. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/dist_name.py +0 -0
  242. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive.py +0 -0
  243. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/drive_state.py +0 -0
  244. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/events.py +0 -0
  245. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/failure_class.py +0 -0
  246. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/filelock.py +0 -0
  247. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/fleet_config_health.py +0 -0
  248. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/freshness.py +0 -0
  249. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_a.py +0 -0
  250. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_b.py +0 -0
  251. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gate_snapshot.py +0 -0
  252. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/gates.py +0 -0
  253. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/github_ops.py +0 -0
  254. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/goal.py +0 -0
  255. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/graph_health.py +0 -0
  256. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/__init__.py +0 -0
  257. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/aggregate.py +0 -0
  258. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/__init__.py +0 -0
  259. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/agent_install.py +0 -0
  260. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/cargo_targets.py +0 -0
  261. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/claude_binary.py +0 -0
  262. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/deploy_lane_facts.py +0 -0
  263. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/disk.py +0 -0
  264. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_board.py +0 -0
  265. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  266. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_phantom.py +0 -0
  267. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/fleet_unit_drift.py +0 -0
  268. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/graph.py +0 -0
  269. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/graphify_cli.py +0 -0
  270. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/index_lock.py +0 -0
  271. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/plan_usage.py +0 -0
  272. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/repo_state.py +0 -0
  273. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/spawned_coord.py +0 -0
  274. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/timer_active.py +0 -0
  275. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/toolchain.py +0 -0
  276. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/unit_drift.py +0 -0
  277. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/unit_enablement.py +0 -0
  278. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/checks/worktrees.py +0 -0
  279. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/cli.py +0 -0
  280. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/context.py +0 -0
  281. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/fleet_snapshot.py +0 -0
  282. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/models.py +0 -0
  283. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/pypi.py +0 -0
  284. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/registry.py +0 -0
  285. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/render.py +0 -0
  286. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/health/units.py +0 -0
  287. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/hooks.py +0 -0
  288. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/housekeeping.py +0 -0
  289. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/interactive.py +0 -0
  290. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/issue_store.py +0 -0
  291. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/liveness_auditor.py +0 -0
  292. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/machine_pause.py +0 -0
  293. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/merge_queue.py +0 -0
  294. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_chat.py +0 -0
  295. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_dispatch.py +0 -0
  296. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_gate.py +0 -0
  297. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/milestone_order.py +0 -0
  298. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/mock_author.py +0 -0
  299. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/models.py +0 -0
  300. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/network.py +0 -0
  301. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/new_issue_chat.py +0 -0
  302. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/__init__.py +0 -0
  303. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/baseline.py +0 -0
  304. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/cli.py +0 -0
  305. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/collect.py +0 -0
  306. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/digest.py +0 -0
  307. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/models.py +0 -0
  308. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/predicate.py +0 -0
  309. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/service.py +0 -0
  310. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/store.py +0 -0
  311. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notifier/transport.py +0 -0
  312. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/notify.py +0 -0
  313. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/openapi.py +0 -0
  314. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/overlap_fence.py +0 -0
  315. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/overlap_predict.py +0 -0
  316. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/parentage.py +0 -0
  317. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/parentage_github.py +0 -0
  318. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/pipeline.py +0 -0
  319. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/plan_parser.py +0 -0
  320. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/plans.py +0 -0
  321. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/platform_paths.py +0 -0
  322. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_bridge.py +0 -0
  323. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_store.py +0 -0
  324. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/portal_sync.py +0 -0
  325. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/pr_body_lint.py +0 -0
  326. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/prereqs.py +0 -0
  327. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/progress.py +0 -0
  328. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/__init__.py +0 -0
  329. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/base.py +0 -0
  330. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/claude.py +0 -0
  331. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/claude_pty.py +0 -0
  332. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/providers/opencode.py +0 -0
  333. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/queue_diagnose.py +0 -0
  334. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/reconcile.py +0 -0
  335. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/refine_chat.py +0 -0
  336. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_cordon.py +0 -0
  337. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_propagate.py +0 -0
  338. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_verify.py +0 -0
  339. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/release_window.py +0 -0
  340. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/repo_edit.py +0 -0
  341. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/repo_onboard.py +0 -0
  342. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/reports.py +0 -0
  343. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/revalidate.py +0 -0
  344. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/review.py +0 -0
  345. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/scorecard.py +0 -0
  346. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/serve_app.py +0 -0
  347. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/skills/update-issue/SKILL.md +0 -0
  348. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/smoke.py +0 -0
  349. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/spend_ceiling.py +0 -0
  350. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/split_work.py +0 -0
  351. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/stage_projection.py +0 -0
  352. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/state.py +0 -0
  353. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_author.py +0 -0
  354. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_chat.py +0 -0
  355. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_orchestrator.py +0 -0
  356. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/test_report.py +0 -0
  357. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/tui_release.py +0 -0
  358. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage.py +0 -0
  359. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage_limits.py +0 -0
  360. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/usage_rollup.py +0 -0
  361. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coord/worker_events.py +0 -0
  362. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/coordinator.example.yml +0 -0
  363. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-agent.service +0 -0
  364. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.service +0 -0
  365. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.sh +0 -0
  366. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-db-backup.timer +0 -0
  367. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-drive-queue.timer +0 -0
  368. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-notify.service +0 -0
  369. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-notify.timer +0 -0
  370. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-propagate.service +0 -0
  371. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-propagate.timer +0 -0
  372. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-window.service +0 -0
  373. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-release-window.timer +0 -0
  374. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-serve.service +0 -0
  375. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.service +0 -0
  376. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.sh +0 -0
  377. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-dist-build.timer +0 -0
  378. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web-rollback.sh +0 -0
  379. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/coord-web.service +0 -0
  380. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/deploy/node-shim.sh +0 -0
  381. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/AGENT_OPERATIONS.md +0 -0
  382. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ARCHITECTURE.md +0 -0
  383. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ARCH_SECURITY_GATES.md +0 -0
  384. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/COCKPIT.md +0 -0
  385. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CONTROL_CENTER.md +0 -0
  386. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/COST_DISCIPLINE.md +0 -0
  387. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CROSS_PLATFORM.md +0 -0
  388. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/CUSTOMER_PORTAL.md +0 -0
  389. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/EPHEMERAL_WORKERS.md +0 -0
  390. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/FORGE_MIGRATION.md +0 -0
  391. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/GRAPHIFY_SETUP.md +0 -0
  392. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ISSUE_GUIDANCE.md +0 -0
  393. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/MAC_MINI.md +0 -0
  394. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  395. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/NOTIFIER.md +0 -0
  396. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/OPENCODE_VERIFICATION.md +0 -0
  397. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/OPERATING_GOTCHAS.md +0 -0
  398. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/ORACLE_LOOP.md +0 -0
  399. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PHONE_WEBAPP.md +0 -0
  400. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PIPELINE_V2.md +0 -0
  401. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/PLATFORM_EVOLUTION.md +0 -0
  402. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/SECOND_BACKEND.md +0 -0
  403. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/STORE_SERVICE.md +0 -0
  404. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  405. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/WEB_CONTROL_CENTER.md +0 -0
  406. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/README.md +0 -0
  407. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/_tokens.css +0 -0
  408. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/issue-detail.html +0 -0
  409. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/pipeline-narrow.html +0 -0
  410. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/docs/mocks/web/pipeline-wide.html +0 -0
  411. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/graphify-out/.gitignore +0 -0
  412. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/install-agent.sh +0 -0
  413. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/pyproject.toml +0 -0
  414. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/audit_review_verdict_overrides.py +0 -0
  415. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  416. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/build-worker-image.sh +0 -0
  417. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/coordinator-machine.py +0 -0
  418. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/epic-down.sh +0 -0
  419. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/epic-up.sh +0 -0
  420. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/preflight.sh +0 -0
  421. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/provision-worker.sh +0 -0
  422. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  423. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  424. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/azure-workers/verify-github-token.sh +0 -0
  425. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/codegen.py +0 -0
  426. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/coord-test-runner.sh +0 -0
  427. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/drive-batch.sh +0 -0
  428. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/gen_board_fixture.py +0 -0
  429. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/next_release_tag.py +0 -0
  430. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/run_tests_in_populated_home.sh +0 -0
  431. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/run_tests_without_gh.sh +0 -0
  432. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/smoke_437_interactive.py +0 -0
  433. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_878_review_capture.py +0 -0
  434. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_release_published.py +0 -0
  435. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/scripts/verify_release_wheel.py +0 -0
  436. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/setup.cfg +0 -0
  437. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/SMOKE_SET.md +0 -0
  438. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/__init__.py +0 -0
  439. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  440. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/contract.md +0 -0
  441. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/manifest.yml +0 -0
  442. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  443. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  444. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  445. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  446. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/conftest.py +0 -0
  447. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/contract.md +0 -0
  448. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/manifest.yml +0 -0
  449. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  450. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  451. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/contract.md +0 -0
  452. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/manifest.yml +0 -0
  453. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  454. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  455. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  456. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  457. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  458. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  459. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  460. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  461. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  462. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  463. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/contract.md +0 -0
  464. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  465. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  466. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/manifest.yml +0 -0
  467. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  468. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-51/tsconfig.json +0 -0
  469. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  470. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/conftest.py +0 -0
  471. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/board-pipeline-basic.json +0 -0
  472. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  473. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  474. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  475. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  476. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/all_pass.json +0 -0
  477. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  478. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/mixed_fail.json +0 -0
  479. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  480. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  481. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/skip.json +0 -0
  482. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/playwright/truncated.json +0 -0
  483. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  484. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  485. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  486. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  487. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  488. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  489. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  490. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  491. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_acceptance.py +0 -0
  492. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_acceptance_drivers.py +0 -0
  493. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent.py +0 -0
  494. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_api_error.py +0 -0
  495. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_app.py +0 -0
  496. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_branch_base.py +0 -0
  497. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_branch_capture.py +0 -0
  498. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_config_free_1712.py +0 -0
  499. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_deploy_units_endpoint.py +0 -0
  500. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_dirty_worktree.py +0 -0
  501. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_graph_self_heal.py +0 -0
  502. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_health_h3.py +0 -0
  503. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_idle_restart.py +0 -0
  504. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_push_failure.py +0 -0
  505. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_reap.py +0 -0
  506. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_repos_and_pull.py +0 -0
  507. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_restart_services_endpoint.py +0 -0
  508. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_startup_diagnostics.py +0 -0
  509. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_update.py +0 -0
  510. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_update_bluegreen.py +0 -0
  511. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_usage_limit.py +0 -0
  512. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_agent_zero_commit.py +0 -0
  513. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ambient_home_isolation.py +0 -0
  514. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_approve_reject_plan.py +0 -0
  515. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_approve_usage_gate.py +0 -0
  516. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_assignment_already_recorded_daemon.py +0 -0
  517. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_log.py +0 -0
  518. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_outcome.py +0 -0
  519. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_audit_query.py +0 -0
  520. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_auto_loop.py +0 -0
  521. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_auto_release_publish_2035.py +0 -0
  522. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_base_checkout_restore.py +0 -0
  523. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_block_log.py +0 -0
  524. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_cap_762.py +0 -0
  525. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_fixture.py +0 -0
  526. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_read_path.py +0 -0
  527. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_service.py +0 -0
  528. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_state.py +0 -0
  529. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_board_wire.py +0 -0
  530. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_brain.py +0 -0
  531. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_branch_model.py +0 -0
  532. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_bug_intake.py +0 -0
  533. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_build_worker_image_env_update.py +0 -0
  534. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cargo_cache.py +0 -0
  535. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_acceptance_gate_1950.py +0 -0
  536. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_parity_2091.py +0 -0
  537. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_ci_store.py +0 -0
  538. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_claim.py +0 -0
  539. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_acceptance.py +0 -0
  540. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign.py +0 -0
  541. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  542. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_interactive_remote.py +0 -0
  543. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_provider.py +0 -0
  544. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  545. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_audit.py +0 -0
  546. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_chat_continue.py +0 -0
  547. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_diagnose_config_provenance.py +0 -0
  548. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_diagnose_graph.py +0 -0
  549. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_drive_queue.py +0 -0
  554. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_escalate.py +0 -0
  555. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_fix_headless_review.py +0 -0
  556. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_gate_a.py +0 -0
  557. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_install_drift.py +0 -0
  558. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_install_skills.py +0 -0
  559. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_issue_create_label.py +0 -0
  560. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_issue_reopen.py +0 -0
  561. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_merge.py +0 -0
  562. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_assign.py +0 -0
  563. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_capture.py +0 -0
  564. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_chat_add_child.py +0 -0
  565. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_dispatch.py +0 -0
  566. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_gate_b.py +0 -0
  567. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_gate_c.py +0 -0
  568. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_order.py +0 -0
  569. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  570. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_milestone_ship.py +0 -0
  571. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_network.py +0 -0
  572. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_new_issue_chat.py +0 -0
  573. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_plans.py +0 -0
  574. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_pull_artifact.py +0 -0
  575. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_queue.py +0 -0
  576. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_reattach_sessions.py +0 -0
  577. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_refine_board.py +0 -0
  578. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_preflight.py +0 -0
  579. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_propagate.py +0 -0
  580. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_release_window.py +0 -0
  581. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_repo_2220.py +0 -0
  582. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_scorecard.py +0 -0
  583. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_set_review_findings.py +0 -0
  584. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_advisory_terminal.py +0 -0
  585. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_merge_queue.py +0 -0
  586. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_provider.py +0 -0
  587. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_review_finalizing.py +0 -0
  588. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_test_failed_tag.py +0 -0
  589. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_status_usage_limit.py +0 -0
  590. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_sync_comments_873.py +0 -0
  591. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_test_plan.py +0 -0
  592. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_track.py +0 -0
  593. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_tui_update.py +0 -0
  594. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cli_wait.py +0 -0
  595. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_client_base_install.py +0 -0
  596. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_comments.py +0 -0
  597. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_completion_summary.py +0 -0
  598. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config.py +0 -0
  599. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_acceptance.py +0 -0
  600. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_audit.py +0 -0
  601. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_pricing.py +0 -0
  602. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  603. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_config_usage_gate.py +0 -0
  604. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_conflict_fix.py +0 -0
  605. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_conflict_fix_semantic.py +0 -0
  606. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test.py +0 -0
  607. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_baseline.py +0 -0
  608. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_routing.py +0 -0
  609. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_test_runner_toolchain.py +0 -0
  610. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coord_web_sse_restart_live.py +0 -0
  611. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_coordinator_machine.py +0 -0
  612. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_cross_platform_imports.py +0 -0
  613. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard.py +0 -0
  614. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_fixture.py +0 -0
  615. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_terminal.py +0 -0
  616. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dashboard_terminal_live.py +0 -0
  617. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_db.py +0 -0
  618. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dead_end.py +0 -0
  619. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_db_backup.py +0 -0
  620. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_web_dist.py +0 -0
  621. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_coord_web_rollback.py +0 -0
  622. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_drive_queue_unit.py +0 -0
  623. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_manifest.py +0 -0
  624. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_units_lane.py +0 -0
  625. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deploy_web_unit.py +0 -0
  626. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_deps.py +0 -0
  627. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_diagnose.py +0 -0
  628. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dispatch.py +0 -0
  629. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dispatch_target_validation.py +0 -0
  630. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_dist_name.py +0 -0
  631. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_done_housekeeping.py +0 -0
  632. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive.py +0 -0
  633. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_state.py +0 -0
  634. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_drive_tmux.py +0 -0
  635. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_capability_detection.py +0 -0
  636. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  637. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_epic_up_image_provenance.py +0 -0
  638. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_errors.py +0 -0
  639. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_events.py +0 -0
  640. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_failure_class.py +0 -0
  641. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_filelock.py +0 -0
  642. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  643. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fix_of_force_override.py +0 -0
  644. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_config_health.py +0 -0
  645. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_health_probes.py +0 -0
  646. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_fleet_health_snapshot.py +0 -0
  647. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_freshness.py +0 -0
  648. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_a.py +0 -0
  649. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_b.py +0 -0
  650. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gate_snapshot_staleness.py +0 -0
  651. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gates.py +0 -0
  652. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  653. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_generated_types_fixture.py +0 -0
  654. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_github_ops.py +0 -0
  655. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_goal.py +0 -0
  656. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_graph_health.py +0 -0
  657. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_graph_selfheal_absent_2237.py +0 -0
  658. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_handoff.py +0 -0
  659. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_checks.py +0 -0
  660. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_cli.py +0 -0
  661. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_cli_graph.py +0 -0
  662. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_config.py +0 -0
  663. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_context.py +0 -0
  664. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_deploy_lane_facts.py +0 -0
  665. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_incident_regression.py +0 -0
  666. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_pypi.py +0 -0
  667. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_registry.py +0 -0
  668. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_timer_active.py +0 -0
  669. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_toolchain.py +0 -0
  670. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_unit_drift.py +0 -0
  671. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_health_unit_enablement.py +0 -0
  672. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_hooks.py +0 -0
  673. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_human_attended_437.py +0 -0
  674. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_init.py +0 -0
  675. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_integration.py +0 -0
  676. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_briefing_echo.py +0 -0
  677. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_prefill_state.py +0 -0
  678. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_session_relaunch.py +0 -0
  679. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_test_verdict_backstop.py +0 -0
  680. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_token_attribution.py +0 -0
  681. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_interactive_worktree.py +0 -0
  682. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_issue_store_seam.py +0 -0
  683. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_liveness_auditor.py +0 -0
  684. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_liveness_notify.py +0 -0
  685. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_machine_pause.py +0 -0
  686. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_merge_queue.py +0 -0
  687. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_merge_verify.py +0 -0
  688. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_chat.py +0 -0
  689. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_dispatch.py +0 -0
  690. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_gate.py +0 -0
  691. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_order.py +0 -0
  692. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_milestone_seam.py +0 -0
  693. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_model_tiering.py +0 -0
  694. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_models.py +0 -0
  695. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_models_config_labels.py +0 -0
  696. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_needs_attention.py +0 -0
  697. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_network.py +0 -0
  698. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_new_issue_chat.py +0 -0
  699. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_next_release_tag.py +0 -0
  700. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_no_direct_gh_calls.py +0 -0
  701. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_node_shim.py +0 -0
  702. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_baseline.py +0 -0
  703. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_cli.py +0 -0
  704. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_collect.py +0 -0
  705. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_config.py +0 -0
  706. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_drive_seam.py +0 -0
  707. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_isolation.py +0 -0
  708. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_predicate.py +0 -0
  709. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_quiet_hours.py +0 -0
  710. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notifier_service.py +0 -0
  711. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notify.py +0 -0
  712. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_notify_drain.py +0 -0
  713. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_openapi.py +0 -0
  714. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_operational_defaults.py +0 -0
  715. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_overlap_fence.py +0 -0
  716. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_overlap_predict.py +0 -0
  717. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_packaged_deploy_units.py +0 -0
  718. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_parentage.py +0 -0
  719. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_paste_landed.py +0 -0
  720. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_pipeline.py +0 -0
  721. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_approve_plan_command.py +0 -0
  722. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_pr_command.py +0 -0
  723. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_followup_review_command.py +0 -0
  724. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_only.py +0 -0
  725. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_plan_parser.py +0 -0
  726. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_platform_paths.py +0 -0
  727. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_bridge.py +0 -0
  728. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_portal_sync.py +0 -0
  729. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_pr_body_lint.py +0 -0
  730. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_prereqs.py +0 -0
  731. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_production_db_guard.py +0 -0
  732. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_progress.py +0 -0
  733. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_provider_seam.py +0 -0
  734. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers.py +0 -0
  735. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers_config_labels.py +0 -0
  736. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_providers_pty.py +0 -0
  737. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_quiet_hours.py +0 -0
  738. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_quiet_hours_store_2146.py +0 -0
  739. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reap_merged_sessions.py +0 -0
  740. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reap_stale_interactive_tick.py +0 -0
  741. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile.py +0 -0
  742. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_branch.py +0 -0
  743. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_completions.py +0 -0
  744. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_merges.py +0 -0
  745. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_no_agent_record.py +0 -0
  746. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reconcile_usage_limit_done.py +0 -0
  747. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_refine_chat.py +0 -0
  748. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_2101.py +0 -0
  749. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  750. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_cordon_deadlock_2240.py +0 -0
  751. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_propagate.py +0 -0
  752. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_unified_1242.py +0 -0
  753. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_verify.py +0 -0
  754. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_release_window.py +0 -0
  755. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_remote_auto_prune.py +0 -0
  756. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_remote_interactive_reaper.py +0 -0
  757. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_edit_2220.py +0 -0
  758. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_graph_fleet_2237.py +0 -0
  759. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_repo_onboard_2220.py +0 -0
  760. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_report_result_push.py +0 -0
  761. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_reports.py +0 -0
  762. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry.py +0 -0
  763. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry_advisory_1606.py +0 -0
  764. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_retry_type_1636.py +0 -0
  765. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_revalidate.py +0 -0
  766. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review.py +0 -0
  767. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_end_review_without_verdict.py +0 -0
  768. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_parse_failure_diagnostic.py +0 -0
  769. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_reaffirm.py +0 -0
  770. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_state.py +0 -0
  771. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_backstop.py +0 -0
  772. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_override_audit.py +0 -0
  773. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_verdict_relay.py +0 -0
  774. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_review_zero_commits.py +0 -0
  775. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_scoped_review_wiring.py +0 -0
  776. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_scorecard.py +0 -0
  777. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_serve.py +0 -0
  778. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_serve_app_board_trim.py +0 -0
  779. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_session.py +0 -0
  780. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_slice_issue_attribution.py +0 -0
  781. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke.py +0 -0
  782. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke_live_checkout_restore.py +0 -0
  783. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_smoke_workflow.py +0 -0
  784. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_spend_ceiling.py +0 -0
  785. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_spend_ceiling_coordinator.py +0 -0
  786. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_split.py +0 -0
  787. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_split_work.py +0 -0
  788. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stage_projection.py +0 -0
  789. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stalled_pipeline.py +0 -0
  790. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_state.py +0 -0
  791. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_state_review_findings_daemon.py +0 -0
  792. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_status_fleet_footer.py +0 -0
  793. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stop_1567.py +0 -0
  794. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_stuck.py +0 -0
  795. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_terminal_command.py +0 -0
  796. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_author.py +0 -0
  797. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_chat.py +0 -0
  798. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_orchestrator.py +0 -0
  799. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_report.py +0 -0
  800. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_verdict_parsing.py +0 -0
  801. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_test_verdict_transcript_floor.py +0 -0
  802. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_board_audit.py +0 -0
  803. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_config_load_1080.py +0 -0
  804. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_thin_client_daemon_routing_906.py +0 -0
  805. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_tmux_host.py +0 -0
  806. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_tmux_session.py +0 -0
  807. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_transcript_floor.py +0 -0
  808. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage.py +0 -0
  809. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage_limits.py +0 -0
  810. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_usage_rollup.py +0 -0
  811. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_venv_live_install_2121.py +0 -0
  812. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_version_single_source.py +0 -0
  813. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_watch.py +0 -0
  814. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  815. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worker_test_scoping.py +0 -0
  818. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worktree.py +0 -0
  819. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  820. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/Cargo.lock +0 -0
  821. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/Cargo.toml +0 -0
  822. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/cargo-config-local-quadraui.toml.example +0 -0
  823. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/audit.rs +0 -0
  824. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/chat.rs +0 -0
  825. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/data.rs +0 -0
  826. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/dialogs.rs +0 -0
  827. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/drive.rs +0 -0
  828. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/drive_queue.rs +0 -0
  829. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/escalation.rs +0 -0
  830. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/events.rs +0 -0
  831. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fixtures.rs +0 -0
  832. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_health.rs +0 -0
  833. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_sessions.rs +0 -0
  834. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/fleet_terminals.rs +0 -0
  835. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/format.rs +0 -0
  836. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/milestone_dag.rs +0 -0
  837. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/mod.rs +0 -0
  838. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/msv.rs +0 -0
  839. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/pipeline.rs +0 -0
  840. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/plans.rs +0 -0
  841. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/render.rs +0 -0
  842. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/reports.rs +0 -0
  843. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/sessions.rs +0 -0
  844. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/settings_ui.rs +0 -0
  845. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/sidebar.rs +0 -0
  846. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/terminal.rs +0 -0
  847. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/tests.rs +0 -0
  848. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/types.rs +0 -0
  849. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/app/workspace.rs +0 -0
  850. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/bin/gtk.rs +0 -0
  851. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/commands.rs +0 -0
  852. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/lib.rs +0 -0
  853. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/main.rs +0 -0
  854. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/src/settings.rs +0 -0
  855. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/acceptance.rs +0 -0
  856. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/cli.rs +0 -0
  857. {code_coordinator-0.5.118 → code_coordinator-0.5.120}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.118
3
+ Version: 0.5.120
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.118
3
+ Version: 0.5.120
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
@@ -342,6 +342,7 @@ coord/providers/base.py
342
342
  coord/providers/claude.py
343
343
  coord/providers/claude_pty.py
344
344
  coord/providers/opencode.py
345
+ coord/skills/portal-followup/SKILL.md
345
346
  coord/skills/update-issue/SKILL.md
346
347
  deploy/coord-agent.service
347
348
  deploy/coord-db-backup.service
@@ -783,6 +784,15 @@ tests/acceptance/ms-51/home-active.spec.ts
783
784
  tests/acceptance/ms-51/manifest.yml
784
785
  tests/acceptance/ms-51/tsconfig.json
785
786
  tests/acceptance/ms-51/mocks/home-active.html
787
+ tests/acceptance/ms-65/contract.md
788
+ tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen
789
+ tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen
790
+ tests/acceptance/ms-65/mocks/board-preview-tab.screen
791
+ tests/acceptance/ms-65/mocks/board-split-side-by-side.screen
792
+ tests/acceptance/ms-65/mocks/board-tab-context-menu.screen
793
+ tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen
794
+ tests/acceptance/ms-65/mocks/board-tabs-overflow.screen
795
+ tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen
786
796
  tests/acceptance/ms-example/mocks/home-active.html
787
797
  tests/fixtures/board-pipeline-basic.json
788
798
  tests/fixtures/board-pipeline-terminal-gates.json
@@ -305,6 +305,7 @@
305
305
  "coord/review.py",
306
306
  "coord/scorecard.py",
307
307
  "coord/serve_app.py",
308
+ "coord/skills/portal-followup/SKILL.md",
308
309
  "coord/skills/update-issue/SKILL.md",
309
310
  "coord/smoke.py",
310
311
  "coord/spend_ceiling.py",
@@ -428,6 +429,15 @@
428
429
  "tests/acceptance/ms-51/manifest.yml",
429
430
  "tests/acceptance/ms-51/mocks/home-active.html",
430
431
  "tests/acceptance/ms-51/tsconfig.json",
432
+ "tests/acceptance/ms-65/contract.md",
433
+ "tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen",
434
+ "tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen",
435
+ "tests/acceptance/ms-65/mocks/board-preview-tab.screen",
436
+ "tests/acceptance/ms-65/mocks/board-split-side-by-side.screen",
437
+ "tests/acceptance/ms-65/mocks/board-tab-context-menu.screen",
438
+ "tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen",
439
+ "tests/acceptance/ms-65/mocks/board-tabs-overflow.screen",
440
+ "tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen",
431
441
  "tests/acceptance/ms-example/mocks/home-active.html",
432
442
  "tests/conftest.py",
433
443
  "tests/fixtures/board-pipeline-basic.json",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.120",
3
+ "distance": 0,
4
+ "node": "g73a6cc8774d10c7a9a405ba25bd93f772ff445ab",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-17"
8
+ }
@@ -3500,10 +3500,14 @@ MILESTONE_CHAT_DENY_COMMANDS: list[str] = [
3500
3500
  "Bash(git push *)",
3501
3501
  "Bash(git commit *)",
3502
3502
  "Bash(git reset --hard *)",
3503
+ "Bash(git reset * --hard *)",
3503
3504
  "Bash(git branch -D *)",
3505
+ "Bash(git branch * -D *)",
3504
3506
  "Bash(git checkout -- .)",
3505
3507
  "Bash(git clean -f *)",
3508
+ "Bash(git clean * -f *)",
3506
3509
  "Bash(rm -rf *)",
3510
+ "Bash(rm -fr *)",
3507
3511
  "Bash(coord approve *)",
3508
3512
  "Bash(coord merge *)",
3509
3513
  "Bash(coord assign *)",
@@ -3575,11 +3579,19 @@ manually verify in the rendered mock.
3575
3579
  MOCK_AUTHOR_DENY_COMMANDS: list[str] = [
3576
3580
  "Bash(gh *)",
3577
3581
  "Bash(git push --force*)",
3582
+ # #2314: the entry above only matches `--force` IMMEDIATELY after
3583
+ # `push` — a `git push --quiet --force ...` with another flag pushed
3584
+ # in first would evade it.
3585
+ "Bash(git push * --force*)",
3578
3586
  "Bash(git reset --hard *)",
3587
+ "Bash(git reset * --hard *)",
3579
3588
  "Bash(git branch -D *)",
3589
+ "Bash(git branch * -D *)",
3580
3590
  "Bash(git checkout -- .)",
3581
3591
  "Bash(git clean -f *)",
3592
+ "Bash(git clean * -f *)",
3582
3593
  "Bash(rm -rf *)",
3594
+ "Bash(rm -fr *)",
3583
3595
  "Bash(coord approve *)",
3584
3596
  "Bash(coord merge *)",
3585
3597
  "Bash(coord assign *)",
@@ -3599,10 +3611,14 @@ NEW_ISSUE_CHAT_DENY_COMMANDS: list[str] = [
3599
3611
  "Bash(git push *)",
3600
3612
  "Bash(git commit *)",
3601
3613
  "Bash(git reset --hard *)",
3614
+ "Bash(git reset * --hard *)",
3602
3615
  "Bash(git branch -D *)",
3616
+ "Bash(git branch * -D *)",
3603
3617
  "Bash(git checkout -- .)",
3604
3618
  "Bash(git clean -f *)",
3619
+ "Bash(git clean * -f *)",
3605
3620
  "Bash(rm -rf *)",
3621
+ "Bash(rm -fr *)",
3606
3622
  ]
3607
3623
 
3608
3624
 
@@ -3637,6 +3653,46 @@ def build_deny_prompt(deny_commands: list[str]) -> str:
3637
3653
  )
3638
3654
 
3639
3655
 
3656
+ def bash_deny_pattern_matches(pattern: str, command: str) -> bool:
3657
+ """Whether *command* (a raw shell command string) is caught by a single
3658
+ ``Bash(...)`` deny *pattern*, using the same shell-glob semantics those
3659
+ patterns are written in throughout this module (``*`` matches any run of
3660
+ characters, including none, and including across what would look like an
3661
+ argv token boundary — this is a whole-string glob, not an argv-aware
3662
+ parse).
3663
+
3664
+ #2314: a worker evaded ``Bash(pip install -e *)`` simply by inserting
3665
+ another flag first (``pip install --user -e .``) — the pattern only
3666
+ matched ``-e`` IMMEDIATELY after ``install``. This function exists so
3667
+ that claim ("this deny list actually catches that evasion") is a
3668
+ testable fact rather than something read off the pattern text by eye —
3669
+ see the ``Bash(...)`` entries :data:`coord.config.DEFAULT_DENY_COMMANDS`
3670
+ pairs for exactly this reason, and ``tests/test_worker_safety.py`` for
3671
+ the regression tests built on top of this function.
3672
+
3673
+ Returns ``False`` for a *pattern* that isn't a ``Bash(...)`` rule at all
3674
+ (e.g. an ``Edit(...)``/``Write(...)`` path rule) — those constrain a
3675
+ different tool and never match a shell command string.
3676
+ """
3677
+ if not (pattern.startswith("Bash(") and pattern.endswith(")")):
3678
+ return False
3679
+ inner = pattern[5:-1]
3680
+ return fnmatch.fnmatchcase(command.strip(), inner)
3681
+
3682
+
3683
+ def find_denying_bash_pattern(command: str, deny_commands: list[str]) -> str | None:
3684
+ """The first pattern in *deny_commands* that blocks *command*, or ``None``.
3685
+
3686
+ Thin fold over :func:`bash_deny_pattern_matches` — a worker's own deny
3687
+ list is small (single digits to low tens of entries), so a linear scan
3688
+ needs no index.
3689
+ """
3690
+ for pattern in deny_commands:
3691
+ if bash_deny_pattern_matches(pattern, command):
3692
+ return pattern
3693
+ return None
3694
+
3695
+
3640
3696
  # #1315: sealed-oracle path prefix that only an independent authoring type
3641
3697
  # (``"mock-author"``/a future ``"test-author"``) may ever write to
3642
3698
  # (docs/ORACLE_LOOP.md sealing v1). ``coord.dispatch.dispatch`` already
@@ -300,49 +300,80 @@ def _warn_if_source_install_drift() -> None:
300
300
  pass
301
301
 
302
302
 
303
- def _warn_if_editable_checkout_moved() -> None:
304
- """#561/#601 backstop: when running from an EDITABLE checkout, warn loudly if
305
- its branch was moved off the default.
306
-
307
- A Build/`coord test`/smoke that git-checkout'd the base — or an interactive
308
- agent inspecting a branch in the live checkout — silently puts the running
309
- coordinator on that branch's code until restored (#561 incident: disabled
310
- guards; #601 incident: old code + retired local DB). This makes that state
311
- visible on every command instead of waiting for a verdict or manual restore.
303
+ def _editable_checkout_drift() -> tuple[Path, str] | None:
304
+ """Pure query behind both #561/#601's CLI warning and #2314's
305
+ drive-queue tick refusal (:mod:`coord.drive_queue`): is THIS process an
306
+ EDITABLE checkout of coord, and if so, is it on a branch other than the
307
+ default one?
308
+
309
+ A Build/`coord test`/smoke that git-checkout'd the base — or an
310
+ interactive agent inspecting a branch in the live checkout — silently
311
+ puts the running coordinator on that branch's code until restored (#561
312
+ incident: disabled guards; #601 incident: old code + retired local DB).
313
+
314
+ Returns ``(repo_root, shown)`` when drifted — ``shown`` is the branch
315
+ name formatted the way both callers print it (quoted, or
316
+ ``"(detached HEAD)"``) — or ``None`` when this is a non-editable/
317
+ site-packages install, isn't a git checkout at all, is cleanly on
318
+ ``main``/``master``, or the check itself couldn't be completed (git not
319
+ on PATH, no ``.git``, a timeout). Every failure mode here is read-only
320
+ and best-effort, so it degrades to "no drift detected" rather than
321
+ raising — a flaky read must never itself block a tick or crash a
322
+ command.
312
323
  """
313
324
  import subprocess # noqa: PLC0415
314
- import sys as _sys # noqa: PLC0415
315
325
 
316
- if "pytest" in _sys.modules:
317
- return # don't add startup noise to the test suite
318
326
  try:
319
327
  import coord as _coord # noqa: PLC0415
320
328
 
321
329
  coord_file = _coord.__file__ or ""
322
330
  if "site-packages" in coord_file:
323
- return # PyPI/snapshot install — moving a checkout can't affect it.
331
+ return None # PyPI/snapshot install — moving a checkout can't affect it.
324
332
  repo_root = Path(coord_file).resolve().parents[1]
325
333
  if not (repo_root / ".git").exists():
326
- return
334
+ return None
327
335
  head = subprocess.run(
328
336
  ["git", "rev-parse", "--abbrev-ref", "HEAD"],
329
337
  cwd=str(repo_root), capture_output=True, text=True, timeout=3,
330
338
  )
331
339
  if head.returncode != 0:
332
- return
340
+ return None
333
341
  branch = head.stdout.strip()
334
342
  if branch in ("main", "master"):
335
- return
343
+ return None
336
344
  shown = "(detached HEAD)" if branch == "HEAD" else f"'{branch}'"
337
- click.echo(
338
- f"⚠ coord: editable checkout {repo_root} is on {shown}, not the "
339
- "default branch — the running coordinator is on THAT code. A "
340
- "Build/smoke/test may have checked it out. Restore with: "
341
- f"git -C {repo_root} checkout main",
342
- err=True,
343
- )
344
- except Exception: # noqa: BLE001 — best-effort, never break the CLI
345
- pass
345
+ return (repo_root, shown)
346
+ except Exception: # noqa: BLE001 — best-effort, never break the caller
347
+ return None
348
+
349
+
350
+ def _warn_if_editable_checkout_moved() -> None:
351
+ """#561/#601 backstop: when running from an EDITABLE checkout, warn loudly if
352
+ its branch was moved off the default.
353
+
354
+ This makes that state visible on every command instead of waiting for a
355
+ verdict or manual restore. #2314 escalated the SAME underlying reading
356
+ (:func:`_editable_checkout_drift`) from advisory-only here to a hard
357
+ refusal inside the drive-queue tick gate — see
358
+ ``coord.drive_queue.plan_tick``'s ``editable_drift`` parameter — because
359
+ a warning nobody is watching an unattended tick's log for is not a gate.
360
+ This function stays as the interactive/human-facing half of that fix.
361
+ """
362
+ import sys as _sys # noqa: PLC0415
363
+
364
+ if "pytest" in _sys.modules:
365
+ return # don't add startup noise to the test suite
366
+ drift = _editable_checkout_drift()
367
+ if drift is None:
368
+ return
369
+ repo_root, shown = drift
370
+ click.echo(
371
+ f"⚠ coord: editable checkout {repo_root} is on {shown}, not the "
372
+ "default branch — the running coordinator is on THAT code. A "
373
+ "Build/smoke/test may have checked it out. Restore with: "
374
+ f"git -C {repo_root} checkout main",
375
+ err=True,
376
+ )
346
377
 
347
378
 
348
379
  @click.group(help="Multi-agent coordinator for Claude Code workers.")
@@ -1634,6 +1634,42 @@ def _fetch_cordons() -> dict[str, str]:
1634
1634
  return {}
1635
1635
 
1636
1636
 
1637
+ def _fetch_editable_drift() -> tuple[str, str] | None:
1638
+ """``(repo_root, shown)`` when THIS host's own `coord` is an editable
1639
+ checkout that has drifted off its default branch, else ``None`` (#2314).
1640
+
1641
+ Thin wrapper around ``coord.cli._editable_checkout_drift`` — the exact
1642
+ same read `coord.cli._warn_if_editable_checkout_moved` uses for its
1643
+ CLI-startup warning — reshaped to a plain ``(str, str)`` tuple so
1644
+ :func:`coord.drive_queue.plan_tick` (a pure function; see its module
1645
+ docstring) never has to import ``coord.cli`` or touch a ``Path``.
1646
+ Already fail-soft/best-effort at the source (see that function's
1647
+ docstring); this wrapper adds nothing on top beyond the reshape and the
1648
+ ``str(repo_root)`` conversion.
1649
+
1650
+ Same ``"pytest" in sys.modules`` guard as
1651
+ ``_warn_if_editable_checkout_moved`` — for the identical reason: this
1652
+ repo's OWN test suite runs from an editable checkout on a feature
1653
+ branch as a matter of course (that is what a worker's worktree is), so
1654
+ without the guard every CLI-level `drive-queue tick` test would trip
1655
+ this exact gate on itself. `coord.drive_queue.plan_tick`'s own tests
1656
+ (tests/test_drive_queue.py) exercise the real gate logic directly via
1657
+ its ``editable_drift`` parameter, unaffected by this guard.
1658
+ """
1659
+ import sys as _sys # noqa: PLC0415
1660
+
1661
+ if "pytest" in _sys.modules:
1662
+ return None
1663
+
1664
+ from coord.cli import _editable_checkout_drift # noqa: PLC0415
1665
+
1666
+ drift = _editable_checkout_drift()
1667
+ if drift is None:
1668
+ return None
1669
+ repo_root, shown = drift
1670
+ return (str(repo_root), shown)
1671
+
1672
+
1637
1673
  def _fetch_board_view() -> BoardView:
1638
1674
  """Board + live drive sessions, typed.
1639
1675
 
@@ -2316,6 +2352,13 @@ def drive_queue_tick(
2316
2352
  # a rollable state.
2317
2353
  cordons = _fetch_cordons()
2318
2354
 
2355
+ # #2314: is THIS host's own `coord` a drifted editable checkout?
2356
+ # Escalates `coord.cli._warn_if_editable_checkout_moved` from an
2357
+ # advisory-only startup warning (nothing unattended ever reads) to
2358
+ # an actual refusal — see `_editable_drift_alert` and `plan_tick`'s
2359
+ # `editable_drift` parameter for the gate itself.
2360
+ editable_drift = _fetch_editable_drift()
2361
+
2319
2362
  # #1794: the clock is the shell's to read, never `coord.drive_queue`'s.
2320
2363
  # It powers the startup grace window on both sides of the tick — a
2321
2364
  # drive launched seconds ago is `starting`, not dead, and cannot be
@@ -2342,6 +2385,7 @@ def drive_queue_tick(
2342
2385
  cordons=cordons,
2343
2386
  live_ci_gate=live_ci_gate,
2344
2387
  live_blocked_gate=live_blocked_gate,
2388
+ editable_drift=editable_drift,
2345
2389
  )
2346
2390
 
2347
2391
  if reconcile_only:
@@ -17,10 +17,16 @@ operator see and drive it without waiting for a tick:
17
17
  * ``requeue`` revives a row the drain retired after burning its retry budget.
18
18
 
19
19
  The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
20
- ``requeue``)
21
- read and write the daemon's own ``~/.coord/coord.db`` and are therefore
22
- **daemon-host commands**. Run from a thin client they operate on that box's
23
- empty local DB, which is not where the bridge lives.
20
+ ``requeue``) read and write the daemon's own ``~/.coord/coord.db`` and are
21
+ therefore **daemon-host commands**. Run from a thin client they used to silently
22
+ operate on that box's empty local DB, which is not where the bridge lives —
23
+ producing a normal-looking "nothing pending" instead of an error (#2336).
24
+ Every one of them now calls :func:`_refuse_if_thin_client` first, which
25
+ raises a loud, explicit error instead when ``board_service`` is configured
26
+ (i.e. this machine is a thin client per ``coord/client.py``'s bootstrap
27
+ contract) rather than silently reading the wrong box's empty tables. There is
28
+ no daemon-proxy for these yet (Option A in #2336 — a bigger lift, left for a
29
+ follow-up); this is the "fail loud instead of running wrong" half.
24
30
  """
25
31
 
26
32
  from __future__ import annotations
@@ -30,6 +36,7 @@ import json
30
36
  import click
31
37
 
32
38
  from coord.commands._common import _CONFIG_OPTION, _load_config
39
+ from coord.config import has_unexpanded_env_var
33
40
  from coord.portal_bridge import (
34
41
  PortalBridgeError,
35
42
  SUBMISSION_STATUSES,
@@ -37,6 +44,48 @@ from coord.portal_bridge import (
37
44
  )
38
45
 
39
46
 
47
+ def _refuse_if_thin_client(cmd_name: str) -> None:
48
+ """Refuse *cmd_name* when this machine isn't the daemon host (#2336).
49
+
50
+ ``sync``/``outbox``/``events``/``enqueue-*``/``requeue`` read and write
51
+ the daemon's own ``~/.coord/coord.db`` directly — there is no daemon
52
+ proxy for portal state yet (unlike ``coord status``/``coord log``/etc,
53
+ which already route through ``board_service`` when it's configured; see
54
+ ``coord/client.py``'s module docstring for the bootstrap contract). Run
55
+ on a machine that has ``board_service`` set in ``~/.coord/client.toml``
56
+ (a thin client, by definition — every other machine in the fleet that
57
+ isn't the daemon host), these commands would read/write that machine's
58
+ own empty local DB and report a normal-looking, silently wrong result
59
+ (2026-08-16 incident: a customer ``signoff.approved`` event sat
60
+ unnoticed on the daemon host for over an hour because every portal
61
+ command run from a thin client reported nothing pending).
62
+
63
+ Mirrors the guard already used for the same reason in
64
+ ``coord.commands.drive_queue``'s ``diagnose`` command (#615/#906), which
65
+ refuses rather than "diagnose an empty queue" on a thin client. The
66
+ local-vs-daemon decision goes through ``coord.board_service`` — the #749
67
+ facade that exists precisely so call sites stop hand-rolling
68
+ ``resolve_board_service()`` — rather than importing ``coord.client``
69
+ directly. ``resolve()`` and not ``is_remote()`` because the error names
70
+ the host the operator should ssh to, which needs the resolved URL.
71
+ """
72
+ from coord.board_service import resolve # noqa: PLC0415
73
+
74
+ svc = resolve()
75
+ if svc is None:
76
+ return
77
+ from urllib.parse import urlparse # noqa: PLC0415
78
+
79
+ host = urlparse(svc.url).hostname or svc.url
80
+ raise click.ClickException(
81
+ f"coord portal {cmd_name} must run on the daemon host ({host}) — "
82
+ "this machine's ~/.coord/coord.db is not where the bridge lives "
83
+ "(board_service is configured in ~/.coord/client.toml, making this "
84
+ "a thin client). Run it over `ssh` on the daemon host instead. "
85
+ "See coord/skills/portal-followup/SKILL.md."
86
+ )
87
+
88
+
40
89
  @click.group("portal")
41
90
  def portal_group() -> None:
42
91
  """coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
@@ -48,10 +97,20 @@ def portal_group() -> None:
48
97
  def portal_status(config_path, as_json: bool) -> None:
49
98
  """Show whether the portal bridge is configured, without sending anything."""
50
99
  cfg = _load_config(config_path).portal
100
+ # #2336: a non-empty-string check alone can't tell "resolved to a real
101
+ # secret" from "the ${VAR} placeholder was never expanded because the
102
+ # env var wasn't set in this shell" — both are non-empty strings. Reject
103
+ # either credential if it still carries an unexpanded placeholder.
104
+ credentials_set = bool(
105
+ cfg.bridge_client_id
106
+ and cfg.bridge_client_secret
107
+ and not has_unexpanded_env_var(cfg.bridge_client_id)
108
+ and not has_unexpanded_env_var(cfg.bridge_client_secret)
109
+ )
51
110
  payload = {
52
111
  "enabled": cfg.enabled,
53
112
  "base_url": cfg.base_url,
54
- "credentials_set": bool(cfg.bridge_client_id and cfg.bridge_client_secret),
113
+ "credentials_set": credentials_set,
55
114
  "timeout_secs": cfg.timeout_secs,
56
115
  "max_retries": cfg.max_retries,
57
116
  }
@@ -151,6 +210,8 @@ def portal_sync_once(config_path, as_json: bool) -> None:
151
210
 
152
211
  Daemon-host command: it reads and writes the daemon's ~/.coord/coord.db.
153
212
  """
213
+ _refuse_if_thin_client("sync")
214
+
154
215
  from coord import portal_sync as _sync # noqa: PLC0415
155
216
 
156
217
  config = _load_config(config_path)
@@ -198,6 +259,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
198
259
  refusing to announce something to the customer before the thing it
199
260
  announces has been confirmed applied.
200
261
  """
262
+ _refuse_if_thin_client("outbox")
263
+
201
264
  from coord import portal_store # noqa: PLC0415
202
265
  from coord.portal_sync import ordering_block_reason # noqa: PLC0415
203
266
 
@@ -277,6 +340,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
277
340
  @click.option("--limit", type=int, default=20, show_default=True)
278
341
  def portal_events(as_json: bool, limit: int) -> None:
279
342
  """List pulled, not-yet-consumed customer events (the inbound half)."""
343
+ _refuse_if_thin_client("events")
344
+
280
345
  from coord import portal_store # noqa: PLC0415
281
346
 
282
347
  events = portal_store.unhandled_events(limit=limit)
@@ -315,6 +380,8 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
315
380
  that would summon the customer to an empty screen — `awaiting-signoff`
316
381
  with no design round queued, `needs-input` with no question (#835).
317
382
  """
383
+ _refuse_if_thin_client("enqueue-status")
384
+
318
385
  from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
319
386
 
320
387
  try:
@@ -338,6 +405,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
338
405
  expected to carry whatever reference the customer's browser follows, plus
339
406
  a `round` number if this is not the first.
340
407
  """
408
+ _refuse_if_thin_client("enqueue-design-round")
409
+
341
410
  from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
342
411
 
343
412
  try:
@@ -361,6 +430,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
361
430
  @click.argument("question")
362
431
  def portal_enqueue_question(submission_id: str, question: str) -> None:
363
432
  """Queue an open question for SUBMISSION_ID (sent on the next sync)."""
433
+ _refuse_if_thin_client("enqueue-question")
434
+
364
435
  from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
365
436
 
366
437
  try:
@@ -389,6 +460,8 @@ def portal_requeue(submission_id: str, seq: int) -> None:
389
460
 
390
461
  Find the seq with `coord portal outbox --all`.
391
462
  """
463
+ _refuse_if_thin_client("requeue")
464
+
392
465
  from coord import portal_store # noqa: PLC0415
393
466
 
394
467
  row = portal_store.requeue(submission_id, seq)
@@ -73,15 +73,66 @@ def is_canonical_config_path(path: Path) -> bool:
73
73
 
74
74
 
75
75
  # Safety-by-default: repos without explicit worker_permissions get this deny-list.
76
+ #
77
+ # #2314: every ``Bash(<verb> <flag> *)`` entry only matches *flag* IMMEDIATELY
78
+ # after *verb* — a worker that inserted one more flag first (or swapped a
79
+ # combined short flag's letter order) sailed straight through undetected. The
80
+ # `git push`/`rm` entries below each pair the original adjacent form with a
81
+ # reordering-safe one (an interior ``*`` before the flag, or — for `rm` — the
82
+ # `-fr` letter-swap of `-rf`); this is the "audit other Bash(...) deny
83
+ # patterns for the same positional weakness" half of #2314, not exhaustive
84
+ # (it does not attempt to catch shell chaining/subshells, which is a
85
+ # different, much larger problem than argv flag position).
76
86
  DEFAULT_DENY_COMMANDS: list[str] = [
77
87
  "Bash(gh *)",
78
88
  "Bash(git push --force *)",
79
89
  "Bash(git push -f *)",
90
+ "Bash(git push * --force *)",
91
+ "Bash(git push * -f *)",
80
92
  "Bash(git reset --hard *)",
93
+ "Bash(git reset * --hard *)",
81
94
  "Bash(git branch -D *)",
95
+ "Bash(git branch * -D *)",
82
96
  "Bash(git checkout -- .)",
83
97
  "Bash(git clean -f *)",
98
+ "Bash(git clean * -f *)",
84
99
  "Bash(rm -rf *)",
100
+ "Bash(rm -fr *)",
101
+ # #2314: a worker ran `pip install --break-system-packages -e .` — an
102
+ # editable install of coord's own source re-links (or, combined with
103
+ # `--user`/`--break-system-packages`, outright shadows) the interpreter
104
+ # `coord` itself is running under, out from under this and every other
105
+ # session on the box (see coord/cli.py's
106
+ # `_warn_if_source_install_drift`/`_editable_checkout_drift`). The old
107
+ # single `Bash(pip install -e *)` entry only matched `-e` IMMEDIATELY
108
+ # after `install`, so putting any other flag first evaded it entirely.
109
+ # Every entry below is duplicated with a leading `*` (covers `python -m
110
+ # pip install ...` / `python3 -m pip install ...`, which reach the exact
111
+ # same installer) and, for `-e`/`--editable` specifically, ALSO with an
112
+ # interior `*` before the flag (covers it appearing anywhere in argv,
113
+ # not just first) — the adjacent form alone still catches
114
+ # `pip install -e --break-system-packages .` (the flag being pushed
115
+ # AFTER `-e` doesn't break the immediate `install -e` adjacency), but
116
+ # not `pip install --break-system-packages -e .` (something pushed
117
+ # BEFORE it).
118
+ "Bash(pip install -e *)",
119
+ "Bash(*pip install -e *)",
120
+ "Bash(pip install * -e *)",
121
+ "Bash(*pip install * -e *)",
122
+ "Bash(pip install --editable *)",
123
+ "Bash(*pip install --editable *)",
124
+ "Bash(pip install * --editable *)",
125
+ "Bash(*pip install * --editable *)",
126
+ # `--break-system-packages` / `--user` are denied INDEPENDENTLY of
127
+ # `-e`/`--editable` — either flag alone, on a perfectly ordinary
128
+ # non-editable `pip install`, still lets a worker write into (or
129
+ # reconfigure) the interpreter coord itself runs under. No adjacency
130
+ # requirement at all: both are boolean flags a real `pip install`
131
+ # invocation can place anywhere after `install`.
132
+ "Bash(pip install *--break-system-packages*)",
133
+ "Bash(*pip install *--break-system-packages*)",
134
+ "Bash(pip install *--user*)",
135
+ "Bash(*pip install *--user*)",
85
136
  ]
86
137
 
87
138
 
@@ -3321,6 +3372,31 @@ def _expand_env_vars(value: str) -> str:
3321
3372
  return _ENV_VAR_RE.sub(_replace, value)
3322
3373
 
3323
3374
 
3375
+ def has_unexpanded_env_var(value: str | None) -> bool:
3376
+ """Whether *value* still contains an unexpanded ``${VAR}`` placeholder.
3377
+
3378
+ #2336: :func:`_expand_env_vars` leaves an unset variable's placeholder
3379
+ untouched — ``${MISSING}`` stays the literal string ``"${MISSING}"`` —
3380
+ so a plain ``bool(value)`` check on the *result* can't tell "this
3381
+ resolved to a real secret" from "the env var was never set in this
3382
+ process's environment": both are non-empty strings. This is the
3383
+ "actually resolved" check the config's own env-var expansion needs a
3384
+ caller to run afterward — e.g. ``coord portal status``'s
3385
+ ``credentials_set`` used to report ``true`` for
3386
+ ``portal.bridge_client_id: "${BRIDGE_CLIENT_ID}"`` even when
3387
+ ``BRIDGE_CLIENT_ID`` was never exported into the shell the command ran
3388
+ in, which read as "credentials fine" while troubleshooting what was
3389
+ actually a missing-env-var problem.
3390
+
3391
+ ``None`` is treated as not-a-placeholder (``False``) — an unset field is
3392
+ a separate "not configured" state, distinct from "configured but the
3393
+ env var didn't resolve".
3394
+ """
3395
+ if value is None:
3396
+ return False
3397
+ return bool(_ENV_VAR_RE.search(value))
3398
+
3399
+
3324
3400
  #: Matches exactly what opencode's own ``OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX``
3325
3401
  #: parser (#2321) accepts as a *string form* of a number: one or more ASCII
3326
3402
  #: digits, nothing else — no sign, no decimal point, no whitespace, no
@@ -70,6 +70,13 @@ CONFLICT_FIX_DENY_COMMANDS = [
70
70
  "Bash(gh *)",
71
71
  "Bash(git push --force *)",
72
72
  "Bash(git push -f *)",
73
+ # #2314: the two entries above only match `--force`/`-f` IMMEDIATELY
74
+ # after `push` — a `--force-with-lease` push (the sanctioned, allowed
75
+ # form, see this module's own guidance above) must stay clear, but
76
+ # `git push --quiet --force ...` / `git push --quiet -f ...` (the flag
77
+ # pushed after some other one) must not evade the ban either.
78
+ "Bash(git push * --force *)",
79
+ "Bash(git push * -f *)",
73
80
  ]
74
81
 
75
82