code-coordinator 0.5.104__tar.gz → 0.5.106__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 (843) hide show
  1. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent.py +279 -0
  7. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/agent_ops.py +22 -0
  8. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/dispatch.py +16 -6
  9. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/repo.py +7 -4
  10. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/status.py +7 -1
  11. code_coordinator-0.5.106/coord/config_reload.py +102 -0
  12. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/merge_queue.py +121 -10
  13. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/repo_onboard.py +19 -8
  14. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/serve_app.py +13 -58
  15. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/AGENT_OPERATIONS.md +51 -7
  16. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent.py +420 -0
  17. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_repo_2220.py +9 -2
  18. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_merge_queue.py +109 -0
  19. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_onboard_2220.py +9 -2
  20. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/board.md +0 -0
  21. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/complete-session.md +0 -0
  22. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.claude/commands/coordinator.md +0 -0
  23. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/_lib.sh +0 -0
  24. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-checkout +0 -0
  25. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-commit +0 -0
  26. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.githooks/post-merge +0 -0
  27. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  28. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/coord-ci-acceptance.yml +0 -0
  29. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/auto-release.yml +0 -0
  30. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/cargo-test.yml +0 -0
  31. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/publish.yml +0 -0
  32. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/release-tui.yml +0 -0
  33. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.github/workflows/test.yml +0 -0
  34. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/.gitignore +0 -0
  35. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/CLAUDE.md +0 -0
  36. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/GOAL.md +0 -0
  37. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/LICENSE +0 -0
  38. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/MANIFEST.in +0 -0
  39. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/README.md +0 -0
  40. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/dependency_links.txt +0 -0
  41. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/entry_points.txt +0 -0
  42. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/requires.txt +0 -0
  43. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/code_coordinator.egg-info/top_level.txt +0 -0
  44. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/__init__.py +0 -0
  45. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/_board_mapping.py +0 -0
  46. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/acceptance.py +0 -0
  47. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/acceptance_drivers.py +0 -0
  48. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/client.py +0 -0
  68. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/merge.py +0 -0
  81. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/milestone.py +0 -0
  82. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/plan_followup.py +0 -0
  83. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/plans.py +0 -0
  84. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/portal.py +0 -0
  85. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/release.py +0 -0
  86. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/config.py +0 -0
  96. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/conflict_fix.py +0 -0
  97. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dao.py +0 -0
  98. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/__init__.py +0 -0
  99. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/fixture.py +0 -0
  100. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/index.html +0 -0
  101. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/server.py +0 -0
  102. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/terminal.py +0 -0
  103. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/.gitignore +0 -0
  104. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/components.json +0 -0
  105. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  106. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  107. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  108. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  109. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  110. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  111. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  112. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  113. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  114. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/index.html +0 -0
  115. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  116. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/sw.js +0 -0
  117. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  118. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  119. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  120. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  121. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  122. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  123. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  124. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  125. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  126. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  127. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/eslint.config.js +0 -0
  128. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/index.html +0 -0
  129. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  130. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/package-lock.json +0 -0
  131. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/package.json +0 -0
  132. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  133. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/playwright.config.ts +0 -0
  134. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/postcss.config.js +0 -0
  135. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  136. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  137. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  138. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/App.tsx +0 -0
  139. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/api/client.ts +0 -0
  140. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  141. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  142. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  143. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  144. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  145. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  146. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  147. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  148. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  149. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  150. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  151. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  152. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  153. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  154. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  155. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  156. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  157. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  158. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  159. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  160. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  161. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  162. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  163. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  164. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  165. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  166. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  167. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  168. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  169. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  170. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  171. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  172. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  173. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  174. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  175. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/index.css +0 -0
  176. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  177. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  178. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/main.tsx +0 -0
  179. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  180. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  181. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  182. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  183. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  184. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  185. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  186. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  187. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  188. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  189. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  190. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  191. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  192. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  193. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  194. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  195. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  196. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  197. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  198. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  199. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  200. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  201. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  202. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tailwind.config.js +0 -0
  203. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tsconfig.json +0 -0
  204. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  205. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dashboard/webapp/vite.config.ts +0 -0
  206. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/db.py +0 -0
  207. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dead_end.py +0 -0
  208. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/README.md +0 -0
  209. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-agent.service +0 -0
  210. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.service +0 -0
  211. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.sh +0 -0
  212. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-db-backup.timer +0 -0
  213. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-drive-queue.service +0 -0
  214. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-drive-queue.timer +0 -0
  215. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-notify.service +0 -0
  216. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-notify.timer +0 -0
  217. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-propagate.service +0 -0
  218. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-propagate.timer +0 -0
  219. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-window.service +0 -0
  220. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-release-window.timer +0 -0
  221. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-serve.service +0 -0
  222. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web-dist-build.service +0 -0
  223. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web-dist-build.timer +0 -0
  224. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy/coord-web.service +0 -0
  225. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy_manifest.py +0 -0
  226. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deploy_units.py +0 -0
  227. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/deps.py +0 -0
  228. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/diagnose.py +0 -0
  229. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dispatch.py +0 -0
  230. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/dist_name.py +0 -0
  231. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive.py +0 -0
  232. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive_queue.py +0 -0
  233. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/drive_state.py +0 -0
  234. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/events.py +0 -0
  235. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/failure_class.py +0 -0
  236. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/filelock.py +0 -0
  237. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/fleet_config_health.py +0 -0
  238. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/freshness.py +0 -0
  239. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_a.py +0 -0
  240. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_b.py +0 -0
  241. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gate_snapshot.py +0 -0
  242. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/gates.py +0 -0
  243. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/github_ops.py +0 -0
  244. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/goal.py +0 -0
  245. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/graph_health.py +0 -0
  246. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/__init__.py +0 -0
  247. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/aggregate.py +0 -0
  248. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/__init__.py +0 -0
  249. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/agent_install.py +0 -0
  250. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/cargo_targets.py +0 -0
  251. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/claude_binary.py +0 -0
  252. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/deploy_lane_facts.py +0 -0
  253. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/disk.py +0 -0
  254. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_board.py +0 -0
  255. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  256. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_phantom.py +0 -0
  257. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/fleet_unit_drift.py +0 -0
  258. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/graph.py +0 -0
  259. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/graphify_cli.py +0 -0
  260. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/index_lock.py +0 -0
  261. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/plan_usage.py +0 -0
  262. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/repo_state.py +0 -0
  263. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/spawned_coord.py +0 -0
  264. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/timer_active.py +0 -0
  265. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/toolchain.py +0 -0
  266. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/unit_drift.py +0 -0
  267. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/unit_enablement.py +0 -0
  268. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/checks/worktrees.py +0 -0
  269. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/cli.py +0 -0
  270. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/context.py +0 -0
  271. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/fleet_snapshot.py +0 -0
  272. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/models.py +0 -0
  273. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/pypi.py +0 -0
  274. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/registry.py +0 -0
  275. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/render.py +0 -0
  276. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/health/units.py +0 -0
  277. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/hooks.py +0 -0
  278. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/housekeeping.py +0 -0
  279. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/interactive.py +0 -0
  280. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/issue_store.py +0 -0
  281. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/liveness_auditor.py +0 -0
  282. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/machine_pause.py +0 -0
  283. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_chat.py +0 -0
  284. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_dispatch.py +0 -0
  285. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_gate.py +0 -0
  286. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/milestone_order.py +0 -0
  287. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/mock_author.py +0 -0
  288. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/models.py +0 -0
  289. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/network.py +0 -0
  290. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/new_issue_chat.py +0 -0
  291. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/__init__.py +0 -0
  292. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/baseline.py +0 -0
  293. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/cli.py +0 -0
  294. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/collect.py +0 -0
  295. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/digest.py +0 -0
  296. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/models.py +0 -0
  297. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/predicate.py +0 -0
  298. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/service.py +0 -0
  299. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/store.py +0 -0
  300. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notifier/transport.py +0 -0
  301. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/notify.py +0 -0
  302. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/openapi.py +0 -0
  303. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/overlap_fence.py +0 -0
  304. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/overlap_predict.py +0 -0
  305. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/parentage.py +0 -0
  306. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/parentage_github.py +0 -0
  307. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/pipeline.py +0 -0
  308. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/plan_parser.py +0 -0
  309. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/plans.py +0 -0
  310. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/platform_paths.py +0 -0
  311. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_bridge.py +0 -0
  312. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_store.py +0 -0
  313. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/portal_sync.py +0 -0
  314. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/pr_body_lint.py +0 -0
  315. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/prereqs.py +0 -0
  316. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/progress.py +0 -0
  317. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/__init__.py +0 -0
  318. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/base.py +0 -0
  319. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/claude.py +0 -0
  320. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/claude_pty.py +0 -0
  321. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/providers/opencode.py +0 -0
  322. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/queue_diagnose.py +0 -0
  323. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/reconcile.py +0 -0
  324. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/refine_chat.py +0 -0
  325. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_cordon.py +0 -0
  326. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_propagate.py +0 -0
  327. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_verify.py +0 -0
  328. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/release_window.py +0 -0
  329. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/repo_edit.py +0 -0
  330. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/review.py +0 -0
  333. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/skills/update-issue/SKILL.md +0 -0
  335. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/smoke.py +0 -0
  336. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/spend_ceiling.py +0 -0
  337. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/split_work.py +0 -0
  338. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/stage_projection.py +0 -0
  339. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/state.py +0 -0
  340. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_author.py +0 -0
  341. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_chat.py +0 -0
  342. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_orchestrator.py +0 -0
  343. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/test_report.py +0 -0
  344. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/tui_release.py +0 -0
  345. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage.py +0 -0
  346. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage_limits.py +0 -0
  347. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/usage_rollup.py +0 -0
  348. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coord/worker_events.py +0 -0
  349. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/coordinator.example.yml +0 -0
  350. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-agent.service +0 -0
  351. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.service +0 -0
  352. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.sh +0 -0
  353. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-db-backup.timer +0 -0
  354. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-drive-queue.service +0 -0
  355. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-drive-queue.timer +0 -0
  356. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-notify.service +0 -0
  357. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-notify.timer +0 -0
  358. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-propagate.service +0 -0
  359. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-propagate.timer +0 -0
  360. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-window.service +0 -0
  361. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-release-window.timer +0 -0
  362. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-serve.service +0 -0
  363. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.service +0 -0
  364. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.sh +0 -0
  365. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-dist-build.timer +0 -0
  366. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web-rollback.sh +0 -0
  367. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/coord-web.service +0 -0
  368. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/deploy/node-shim.sh +0 -0
  369. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ARCHITECTURE.md +0 -0
  370. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ARCH_SECURITY_GATES.md +0 -0
  371. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/COCKPIT.md +0 -0
  372. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CONTROL_CENTER.md +0 -0
  373. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/COST_DISCIPLINE.md +0 -0
  374. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CROSS_PLATFORM.md +0 -0
  375. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/CUSTOMER_PORTAL.md +0 -0
  376. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/DRIVE_QUEUE.md +0 -0
  377. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/EPHEMERAL_WORKERS.md +0 -0
  378. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/FORGE_MIGRATION.md +0 -0
  379. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/GRAPHIFY_SETUP.md +0 -0
  380. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ISSUE_GUIDANCE.md +0 -0
  381. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/MAC_MINI.md +0 -0
  382. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  383. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/NOTIFIER.md +0 -0
  384. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/OPENCODE_VERIFICATION.md +0 -0
  385. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/OPERATING_GOTCHAS.md +0 -0
  386. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/ORACLE_LOOP.md +0 -0
  387. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PHONE_WEBAPP.md +0 -0
  388. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PIPELINE_V2.md +0 -0
  389. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/PLATFORM_EVOLUTION.md +0 -0
  390. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/SECOND_BACKEND.md +0 -0
  391. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/STORE_SERVICE.md +0 -0
  392. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  393. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/WEB_CONTROL_CENTER.md +0 -0
  394. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/README.md +0 -0
  395. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/_tokens.css +0 -0
  396. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/issue-detail.html +0 -0
  397. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/pipeline-narrow.html +0 -0
  398. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/docs/mocks/web/pipeline-wide.html +0 -0
  399. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/graphify-out/.gitignore +0 -0
  400. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/install-agent.sh +0 -0
  401. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/pyproject.toml +0 -0
  402. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/audit_review_verdict_overrides.py +0 -0
  403. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  404. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/build-worker-image.sh +0 -0
  405. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/coordinator-machine.py +0 -0
  406. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/epic-down.sh +0 -0
  407. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/epic-up.sh +0 -0
  408. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/preflight.sh +0 -0
  409. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/provision-worker.sh +0 -0
  410. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  411. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  412. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/azure-workers/verify-github-token.sh +0 -0
  413. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/codegen.py +0 -0
  414. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/coord-test-runner.sh +0 -0
  415. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/next_release_tag.py +0 -0
  418. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/run_tests_in_populated_home.sh +0 -0
  419. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/run_tests_without_gh.sh +0 -0
  420. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/smoke_437_interactive.py +0 -0
  421. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_878_review_capture.py +0 -0
  422. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_release_published.py +0 -0
  423. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/scripts/verify_release_wheel.py +0 -0
  424. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/setup.cfg +0 -0
  425. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/SMOKE_SET.md +0 -0
  426. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/__init__.py +0 -0
  427. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  428. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/contract.md +0 -0
  429. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/manifest.yml +0 -0
  430. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  431. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  432. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  433. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  434. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/contract.md +0 -0
  440. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/manifest.yml +0 -0
  441. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  442. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  443. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  444. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  445. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  446. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  447. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  448. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  449. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  450. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  451. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/contract.md +0 -0
  452. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  453. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  454. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/manifest.yml +0 -0
  455. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  456. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-51/tsconfig.json +0 -0
  457. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  458. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/conftest.py +0 -0
  459. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/board-pipeline-basic.json +0 -0
  460. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  461. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  462. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  463. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/all_pass.json +0 -0
  464. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  465. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/mixed_fail.json +0 -0
  466. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  467. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  468. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/skip.json +0 -0
  469. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/playwright/truncated.json +0 -0
  470. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  471. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  472. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  473. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  474. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  475. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  476. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  477. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  478. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_acceptance.py +0 -0
  479. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_acceptance_drivers.py +0 -0
  480. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_api_error.py +0 -0
  481. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_app.py +0 -0
  482. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_branch_base.py +0 -0
  483. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_branch_capture.py +0 -0
  484. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_config_free_1712.py +0 -0
  485. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_deploy_units_endpoint.py +0 -0
  486. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_dirty_worktree.py +0 -0
  487. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_graph_self_heal.py +0 -0
  488. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_health_h3.py +0 -0
  489. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_idle_restart.py +0 -0
  490. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_push_failure.py +0 -0
  491. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_reap.py +0 -0
  492. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_repos_and_pull.py +0 -0
  493. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_restart_services_endpoint.py +0 -0
  494. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_startup_diagnostics.py +0 -0
  495. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_update.py +0 -0
  496. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_update_bluegreen.py +0 -0
  497. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_usage_limit.py +0 -0
  498. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_agent_zero_commit.py +0 -0
  499. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ambient_home_isolation.py +0 -0
  500. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_approve_reject_plan.py +0 -0
  501. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_approve_usage_gate.py +0 -0
  502. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_assignment_already_recorded_daemon.py +0 -0
  503. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_log.py +0 -0
  504. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_outcome.py +0 -0
  505. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_audit_query.py +0 -0
  506. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_auto_loop.py +0 -0
  507. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_auto_release_publish_2035.py +0 -0
  508. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_base_checkout_restore.py +0 -0
  509. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_block_log.py +0 -0
  510. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_cap_762.py +0 -0
  511. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_fixture.py +0 -0
  512. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_read_path.py +0 -0
  513. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_acceptance_gate_1950.py +0 -0
  522. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_parity_2091.py +0 -0
  523. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_ci_store.py +0 -0
  524. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_claim.py +0 -0
  525. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_acceptance.py +0 -0
  526. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign.py +0 -0
  527. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  528. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_interactive_remote.py +0 -0
  529. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_provider.py +0 -0
  530. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  531. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_audit.py +0 -0
  532. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_chat_continue.py +0 -0
  533. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_diagnose_config_provenance.py +0 -0
  534. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_diagnose_graph.py +0 -0
  535. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_drive.py +0 -0
  539. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_drive_queue.py +0 -0
  540. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_escalate.py +0 -0
  541. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_fix_headless_review.py +0 -0
  542. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_gate_a.py +0 -0
  543. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_install_drift.py +0 -0
  544. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_install_skills.py +0 -0
  545. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_issue_create_label.py +0 -0
  546. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_issue_reopen.py +0 -0
  547. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_merge.py +0 -0
  548. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_assign.py +0 -0
  549. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_capture.py +0 -0
  550. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_chat_add_child.py +0 -0
  551. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_dispatch.py +0 -0
  552. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_gate_b.py +0 -0
  553. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_gate_c.py +0 -0
  554. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_order.py +0 -0
  555. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  556. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_milestone_ship.py +0 -0
  557. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_network.py +0 -0
  558. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_new_issue_chat.py +0 -0
  559. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_plans.py +0 -0
  560. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_portal.py +0 -0
  561. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_pull_artifact.py +0 -0
  562. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_queue.py +0 -0
  563. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_reattach_sessions.py +0 -0
  564. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_refine_board.py +0 -0
  565. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_preflight.py +0 -0
  566. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_propagate.py +0 -0
  567. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_release_window.py +0 -0
  568. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_set_review_findings.py +0 -0
  570. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_advisory_terminal.py +0 -0
  571. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_merge_queue.py +0 -0
  572. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_provider.py +0 -0
  573. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_review_finalizing.py +0 -0
  574. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_test_failed_tag.py +0 -0
  575. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_status_usage_limit.py +0 -0
  576. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_sync_comments_873.py +0 -0
  577. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_test_plan.py +0 -0
  578. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_track.py +0 -0
  579. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_tui_update.py +0 -0
  580. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cli_wait.py +0 -0
  581. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_client_base_install.py +0 -0
  582. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_comments.py +0 -0
  583. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_completion_summary.py +0 -0
  584. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config.py +0 -0
  585. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_acceptance.py +0 -0
  586. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_audit.py +0 -0
  587. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_pricing.py +0 -0
  588. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  589. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_config_usage_gate.py +0 -0
  590. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_conflict_fix.py +0 -0
  591. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_conflict_fix_semantic.py +0 -0
  592. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test.py +0 -0
  593. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_baseline.py +0 -0
  594. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_routing.py +0 -0
  595. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_test_runner_toolchain.py +0 -0
  596. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coord_web_sse_restart_live.py +0 -0
  597. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_coordinator_machine.py +0 -0
  598. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_cross_platform_imports.py +0 -0
  599. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard.py +0 -0
  600. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_fixture.py +0 -0
  601. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_terminal.py +0 -0
  602. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dashboard_terminal_live.py +0 -0
  603. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_db.py +0 -0
  604. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dead_end.py +0 -0
  605. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_db_backup.py +0 -0
  606. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_web_dist.py +0 -0
  607. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_coord_web_rollback.py +0 -0
  608. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_drive_queue_unit.py +0 -0
  609. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_manifest.py +0 -0
  610. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_units_lane.py +0 -0
  611. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deploy_web_unit.py +0 -0
  612. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_deps.py +0 -0
  613. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_diagnose.py +0 -0
  614. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dispatch.py +0 -0
  615. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dispatch_target_validation.py +0 -0
  616. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_dist_name.py +0 -0
  617. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_done_housekeeping.py +0 -0
  618. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive.py +0 -0
  619. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_queue.py +0 -0
  620. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_state.py +0 -0
  621. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_drive_tmux.py +0 -0
  622. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_capability_detection.py +0 -0
  623. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  624. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_epic_up_image_provenance.py +0 -0
  625. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_errors.py +0 -0
  626. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_events.py +0 -0
  627. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_failure_class.py +0 -0
  628. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_filelock.py +0 -0
  629. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  630. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fix_of_force_override.py +0 -0
  631. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_config_health.py +0 -0
  632. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_health_probes.py +0 -0
  633. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_fleet_health_snapshot.py +0 -0
  634. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_freshness.py +0 -0
  635. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_a.py +0 -0
  636. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_b.py +0 -0
  637. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gate_snapshot_staleness.py +0 -0
  638. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gates.py +0 -0
  639. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  640. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_generated_types_fixture.py +0 -0
  641. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_github_ops.py +0 -0
  642. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_goal.py +0 -0
  643. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_graph_health.py +0 -0
  644. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_graph_selfheal_absent_2237.py +0 -0
  645. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_handoff.py +0 -0
  646. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_checks.py +0 -0
  647. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_cli.py +0 -0
  648. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_cli_graph.py +0 -0
  649. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_config.py +0 -0
  650. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_context.py +0 -0
  651. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_deploy_lane_facts.py +0 -0
  652. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_incident_regression.py +0 -0
  653. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_pypi.py +0 -0
  654. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_registry.py +0 -0
  655. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_timer_active.py +0 -0
  656. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_toolchain.py +0 -0
  657. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_unit_drift.py +0 -0
  658. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_health_unit_enablement.py +0 -0
  659. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_hooks.py +0 -0
  660. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_human_attended_437.py +0 -0
  661. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_init.py +0 -0
  662. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_integration.py +0 -0
  663. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_briefing_echo.py +0 -0
  664. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_prefill_state.py +0 -0
  665. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_session_relaunch.py +0 -0
  666. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_test_verdict_backstop.py +0 -0
  667. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_token_attribution.py +0 -0
  668. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_interactive_worktree.py +0 -0
  669. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_issue_store_seam.py +0 -0
  670. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_liveness_auditor.py +0 -0
  671. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_liveness_notify.py +0 -0
  672. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_machine_pause.py +0 -0
  673. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_merge_verify.py +0 -0
  674. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_chat.py +0 -0
  675. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_dispatch.py +0 -0
  676. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_gate.py +0 -0
  677. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_order.py +0 -0
  678. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_milestone_seam.py +0 -0
  679. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_mock_author.py +0 -0
  680. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_model_tiering.py +0 -0
  681. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_models.py +0 -0
  682. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_models_config_labels.py +0 -0
  683. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_needs_attention.py +0 -0
  684. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_network.py +0 -0
  685. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_new_issue_chat.py +0 -0
  686. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_next_release_tag.py +0 -0
  687. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_no_direct_gh_calls.py +0 -0
  688. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_node_shim.py +0 -0
  689. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_baseline.py +0 -0
  690. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_cli.py +0 -0
  691. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_collect.py +0 -0
  692. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_config.py +0 -0
  693. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_drive_seam.py +0 -0
  694. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_isolation.py +0 -0
  695. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_predicate.py +0 -0
  696. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_quiet_hours.py +0 -0
  697. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notifier_service.py +0 -0
  698. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notify.py +0 -0
  699. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_notify_drain.py +0 -0
  700. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_openapi.py +0 -0
  701. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_operational_defaults.py +0 -0
  702. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_overlap_fence.py +0 -0
  703. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_overlap_predict.py +0 -0
  704. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_packaged_deploy_units.py +0 -0
  705. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_parentage.py +0 -0
  706. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_paste_landed.py +0 -0
  707. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_pipeline.py +0 -0
  708. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_approve_plan_command.py +0 -0
  709. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_pr_command.py +0 -0
  710. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_followup_review_command.py +0 -0
  711. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_only.py +0 -0
  712. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_plan_parser.py +0 -0
  713. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_platform_paths.py +0 -0
  714. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_bridge.py +0 -0
  715. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_config.py +0 -0
  716. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_portal_sync.py +0 -0
  717. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_pr_body_lint.py +0 -0
  718. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_prereqs.py +0 -0
  719. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_production_db_guard.py +0 -0
  720. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_progress.py +0 -0
  721. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_provider_seam.py +0 -0
  722. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers.py +0 -0
  723. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers_config_labels.py +0 -0
  724. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_providers_pty.py +0 -0
  725. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_quiet_hours.py +0 -0
  726. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_quiet_hours_store_2146.py +0 -0
  727. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reap_merged_sessions.py +0 -0
  728. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reap_stale_interactive_tick.py +0 -0
  729. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_branch.py +0 -0
  730. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_completions.py +0 -0
  731. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_merges.py +0 -0
  732. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_no_agent_record.py +0 -0
  733. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reconcile_usage_limit_done.py +0 -0
  734. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_refine_chat.py +0 -0
  735. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_2101.py +0 -0
  736. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  737. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_cordon_deadlock_2240.py +0 -0
  738. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_propagate.py +0 -0
  739. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_unified_1242.py +0 -0
  740. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_verify.py +0 -0
  741. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_release_window.py +0 -0
  742. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_remote_auto_prune.py +0 -0
  743. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_remote_interactive_reaper.py +0 -0
  744. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_edit_2220.py +0 -0
  745. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_repo_graph_fleet_2237.py +0 -0
  746. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_report_result_push.py +0 -0
  747. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_reports.py +0 -0
  748. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry.py +0 -0
  749. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry_advisory_1606.py +0 -0
  750. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_retry_type_1636.py +0 -0
  751. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_revalidate.py +0 -0
  752. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review.py +0 -0
  753. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_end_review_without_verdict.py +0 -0
  754. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_parse_failure_diagnostic.py +0 -0
  755. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_reaffirm.py +0 -0
  756. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_state.py +0 -0
  757. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_backstop.py +0 -0
  758. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_override_audit.py +0 -0
  759. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_verdict_relay.py +0 -0
  760. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_review_zero_commits.py +0 -0
  761. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_scoped_review_wiring.py +0 -0
  762. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_scorecard.py +0 -0
  763. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_serve.py +0 -0
  764. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_serve_app_board_trim.py +0 -0
  765. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_session.py +0 -0
  766. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_slice_issue_attribution.py +0 -0
  767. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke.py +0 -0
  768. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke_live_checkout_restore.py +0 -0
  769. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_smoke_workflow.py +0 -0
  770. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_spend_ceiling.py +0 -0
  771. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_spend_ceiling_coordinator.py +0 -0
  772. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_split.py +0 -0
  773. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_split_work.py +0 -0
  774. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stage_projection.py +0 -0
  775. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stalled_pipeline.py +0 -0
  776. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_state.py +0 -0
  777. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_state_review_findings_daemon.py +0 -0
  778. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_status_fleet_footer.py +0 -0
  779. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stop_1567.py +0 -0
  780. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_stuck.py +0 -0
  781. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_terminal_command.py +0 -0
  782. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_author.py +0 -0
  783. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_chat.py +0 -0
  784. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_orchestrator.py +0 -0
  785. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_report.py +0 -0
  786. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_verdict_parsing.py +0 -0
  787. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_test_verdict_transcript_floor.py +0 -0
  788. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_board_audit.py +0 -0
  789. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_config_load_1080.py +0 -0
  790. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_thin_client_daemon_routing_906.py +0 -0
  791. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_tmux_host.py +0 -0
  792. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_tmux_session.py +0 -0
  793. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_transcript_floor.py +0 -0
  794. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage.py +0 -0
  795. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage_limits.py +0 -0
  796. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_usage_rollup.py +0 -0
  797. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_venv_live_install_2121.py +0 -0
  798. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_version_single_source.py +0 -0
  799. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_watch.py +0 -0
  800. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_events.py +0 -0
  801. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_image_pin_sync.py +0 -0
  802. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_safety.py +0 -0
  803. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worker_test_scoping.py +0 -0
  804. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worktree.py +0 -0
  805. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  806. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/Cargo.lock +0 -0
  807. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/Cargo.toml +0 -0
  808. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/cargo-config-local-quadraui.toml.example +0 -0
  809. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/audit.rs +0 -0
  810. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/chat.rs +0 -0
  811. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/data.rs +0 -0
  812. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/dialogs.rs +0 -0
  813. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/drive.rs +0 -0
  814. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/drive_queue.rs +0 -0
  815. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/escalation.rs +0 -0
  816. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/events.rs +0 -0
  817. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fixtures.rs +0 -0
  818. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_health.rs +0 -0
  819. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_sessions.rs +0 -0
  820. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/fleet_terminals.rs +0 -0
  821. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/format.rs +0 -0
  822. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/milestone_dag.rs +0 -0
  823. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/mod.rs +0 -0
  824. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/msv.rs +0 -0
  825. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/pipeline.rs +0 -0
  826. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/plans.rs +0 -0
  827. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/render.rs +0 -0
  828. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/reports.rs +0 -0
  829. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/sessions.rs +0 -0
  830. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/settings_ui.rs +0 -0
  831. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/sidebar.rs +0 -0
  832. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/terminal.rs +0 -0
  833. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/tests.rs +0 -0
  834. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/types.rs +0 -0
  835. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/app/workspace.rs +0 -0
  836. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/bin/gtk.rs +0 -0
  837. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/commands.rs +0 -0
  838. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/lib.rs +0 -0
  839. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/main.rs +0 -0
  840. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/src/settings.rs +0 -0
  841. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/tests/acceptance.rs +0 -0
  842. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/tui/tests/cli.rs +0 -0
  843. {code_coordinator-0.5.104 → code_coordinator-0.5.106}/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.104
3
+ Version: 0.5.106
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.104
3
+ Version: 0.5.106
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
@@ -53,6 +53,7 @@ coord/cli.py
53
53
  coord/client.py
54
54
  coord/comments.py
55
55
  coord/config.py
56
+ coord/config_reload.py
56
57
  coord/conflict_fix.py
57
58
  coord/dao.py
58
59
  coord/db.py
@@ -77,6 +77,7 @@
77
77
  "coord/commands/tui.py",
78
78
  "coord/comments.py",
79
79
  "coord/config.py",
80
+ "coord/config_reload.py",
80
81
  "coord/conflict_fix.py",
81
82
  "coord/dao.py",
82
83
  "coord/dashboard/__init__.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.104",
2
+ "tag": "0.5.106",
3
3
  "distance": 0,
4
- "node": "gafc1802780a563d8830320c477f8f5acd82577a6",
4
+ "node": "g254718dc492ab30f9a86d7fce65cb4a2156430b5",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-16"
@@ -26,6 +26,7 @@ from pathlib import Path
26
26
  from typing import TYPE_CHECKING, Any, Callable, Iterable
27
27
 
28
28
  from coord import cargo_cache
29
+ from coord.config_reload import reload_config_if_stale
29
30
  from coord.models import DELIVERABLE_ANALYSIS_LABEL
30
31
  from coord.platform_paths import default_coord_dir
31
32
 
@@ -4010,6 +4011,25 @@ WRITE_CAPABLE_SPEC_TYPES: frozenset[str] = frozenset({
4010
4011
  })
4011
4012
 
4012
4013
 
4014
+ def _config_mtime_of(config: "Any | None") -> float | None:
4015
+ """mtime of *config*'s backing ``coordinator.yml``, or None (#2299).
4016
+
4017
+ None whenever there is nothing to watch: config-free mode (no config at
4018
+ all), thin-client mode (the config came from the daemon's ``GET /config``
4019
+ and has no local ``path``), or a file that vanished between load and now.
4020
+ Every one of those cases makes :meth:`AgentServer._maybe_reload_config` a
4021
+ no-op, which is the correct degradation — an agent with no local file has
4022
+ nothing to re-read.
4023
+ """
4024
+ path = getattr(config, "path", None) if config is not None else None
4025
+ if path is None:
4026
+ return None
4027
+ try:
4028
+ return Path(path).stat().st_mtime
4029
+ except OSError:
4030
+ return None
4031
+
4032
+
4013
4033
  class AgentServer:
4014
4034
  """Owns assignment state and subprocesses. Thread-safe."""
4015
4035
 
@@ -4022,6 +4042,14 @@ class AgentServer:
4022
4042
  state_dir: Path = DEFAULT_STATE_DIR,
4023
4043
  worker_command: WorkerCommandBuilder | None = None,
4024
4044
  repo_paths: dict[str, str] | None = None,
4045
+ # RESTART-ONLY (#2299). These two are read by `_spawn` for every
4046
+ # worker, but they are *process* tuning (how the daemon forks and how
4047
+ # long it waits for first output), not fleet topology — they are NOT
4048
+ # refreshed by the config reload below. Changing
4049
+ # `concurrency.bash_wrap_spawn` / `concurrency.first_output_timeout`
4050
+ # in coordinator.yml still requires `systemctl --user restart
4051
+ # coord-agent`, as do the bind host/port (owned by uvicorn, which has
4052
+ # already bound the socket by the time any reload could run).
4025
4053
  bash_wrap_spawn: bool = True,
4026
4054
  first_output_timeout: float = _FIRST_OUTPUT_TIMEOUT,
4027
4055
  # #305: per-repo artifact glob patterns; repo_name → list of globs.
@@ -4091,11 +4119,51 @@ class AgentServer:
4091
4119
  # :mod:`coord.providers` at module load time — concrete instances
4092
4120
  # are duck-typed (``build_command``, ``initial_input``,
4093
4121
  # ``capabilities``, ``env``) at call sites.
4122
+ #
4123
+ # RESTART-ONLY (#2299): the registry is deliberately NOT refreshed by
4124
+ # the config reload. A running worker holds a provider resolved at
4125
+ # dispatch time (`_resolve_provider`), and `_reap` re-resolves the
4126
+ # SAME spec afterwards to pick a log parser — swapping the registry
4127
+ # underneath would let a live session's provider silently change
4128
+ # identity mid-flight (retargeting its model / log format), which is
4129
+ # exactly the "never mutate state a running worker depends on"
4130
+ # invariant this feature is bounded by. Adding or editing a provider
4131
+ # still needs a restart.
4094
4132
  self._providers: dict[str, object] = dict(providers or {})
4095
4133
  self._worktree_writable_settings_files = worktree_writable_settings_files
4096
4134
  self._health_config = health_config
4097
4135
  self.config_free_reason = config_free_reason
4098
4136
 
4137
+ # ── #2299: hot config reload ────────────────────────────────────────
4138
+ # The agent used to freeze every config-derived field above at process
4139
+ # start, so adding a repo to coordinator.yml required `systemctl --user
4140
+ # restart coord-agent` on every machine that should serve it — the one
4141
+ # action that also kills live workers, which in practice meant waiting
4142
+ # for the whole fleet to go quiet before a repo could be onboarded at
4143
+ # all. Worse, the skew was silent and asymmetric: `coord config`,
4144
+ # `coord status` and `coord assign --dry-run` all read the *file* and
4145
+ # reported the repo as supported while `assign()` refused every single
4146
+ # dispatch for it.
4147
+ #
4148
+ # `_maybe_reload_config` closes that, driven off the existing /health
4149
+ # poll and the dispatch path (no new timer, no background thread).
4150
+ # `_config_mtime` is seeded here from the file we were built from so
4151
+ # the first poll after startup is a no-op stat(), not a redundant
4152
+ # reparse.
4153
+ self._config_mtime: float | None = _config_mtime_of(health_config)
4154
+ # Serializes reload attempts so two concurrent /health polls (or a
4155
+ # poll racing a dispatch) can't both parse the file and apply
4156
+ # overlapping swaps. Held across stat + parse + apply. Lock order is
4157
+ # always `_config_reload_lock` → `_lock`; nothing takes them the other
4158
+ # way round.
4159
+ self._config_reload_lock = threading.Lock()
4160
+ # Observability for /health: how many times the on-disk config was
4161
+ # successfully re-read into this process, and when. In-memory only —
4162
+ # it exists to answer "did this agent pick up my edit?" without an
4163
+ # SSH + journalctl, which is the question #2299 was really about.
4164
+ self._config_reloads: int = 0
4165
+ self._config_reloaded_at: float | None = None
4166
+
4099
4167
  self._lock = threading.Lock()
4100
4168
  self._assignments: dict[str, AgentAssignment] = {}
4101
4169
  self._processes: dict[str, subprocess.Popen] = {}
@@ -4227,9 +4295,198 @@ class AgentServer:
4227
4295
  self.log_dir.mkdir(parents=True, exist_ok=True)
4228
4296
  self._load_state()
4229
4297
 
4298
+ # ── #2299: hot config reload ────────────────────────────────────────────
4299
+
4300
+ #: Config-derived state that a reload refreshes, versus the state it must
4301
+ #: leave alone. Kept as a docstring-adjacent constant so the *decision*
4302
+ #: (issue #2299's "needs a decision, not an assumption" list) is recorded
4303
+ #: in the code rather than only in the issue thread.
4304
+ #:
4305
+ #: HOT (refreshed on the next health poll / dispatch):
4306
+ #: * ``repos`` — the point of the feature; gates ``assign()``
4307
+ #: and is what ``/health`` advertises.
4308
+ #: * ``repo_paths`` — resolved per dispatch.
4309
+ #: * ``artifact_paths`` — read when a finished worker's artifacts are
4310
+ #: stashed.
4311
+ #: * ``build_commands`` — read just before that stash.
4312
+ #: * ``capabilities`` — published in ``/health``; the coordinator does
4313
+ #: smoke/review routing from that published list,
4314
+ #: and nothing in the *worker* path reads it, so a
4315
+ #: capability that disappears simply stops
4316
+ #: attracting new work (degrade) instead of
4317
+ #: stranding anything in flight.
4318
+ #:
4319
+ #: RESTART-ONLY (documented at their assignment sites in ``__init__``):
4320
+ #: * ``providers`` — a live worker holds a resolved provider.
4321
+ #: * ``bash_wrap_spawn`` / ``first_output_timeout`` — process tuning.
4322
+ #: * bind host/port — uvicorn has already bound the socket.
4323
+ _RELOADABLE_FIELDS = (
4324
+ "repos",
4325
+ "repo_paths",
4326
+ "artifact_paths",
4327
+ "build_commands",
4328
+ "capabilities",
4329
+ )
4330
+
4331
+ def _maybe_reload_config(self) -> bool:
4332
+ """Re-read ``coordinator.yml`` if it changed on disk; return True if applied.
4333
+
4334
+ This is #2299's whole mechanism. It reuses the board daemon's #1081
4335
+ helper (:func:`coord.config_reload.reload_config_if_stale`) rather than
4336
+ inventing a second one, so the malformed-edit behaviour is identical by
4337
+ construction: a bad hand-edit is logged and swallowed, the agent keeps
4338
+ running on the last-good config, and the tracked mtime still advances
4339
+ so the bad edit is not re-parsed on every subsequent poll.
4340
+
4341
+ Cheap enough to call on the hot paths that already exist (``health()``
4342
+ and ``assign()``): the steady-state cost is one ``stat()`` under an
4343
+ uncontended lock — no new timer and no background thread.
4344
+
4345
+ Fail-soft in every direction. A missing/thin-client config, a vanished
4346
+ file, a malformed edit, or a config whose ``machines:`` list no longer
4347
+ contains this machine all leave the agent exactly as it was.
4348
+ """
4349
+ cfg = self._health_config
4350
+ if cfg is None or getattr(cfg, "path", None) is None:
4351
+ # Config-free (docs/EPHEMERAL_WORKERS.md) or thin-client mode —
4352
+ # there is no local file to watch. Both are legitimate; neither
4353
+ # can drift against a file it doesn't have.
4354
+ return False
4355
+
4356
+ with self._config_reload_lock:
4357
+ # Re-read under the lock: a concurrent caller may already have
4358
+ # applied this same edit while we waited, in which case
4359
+ # `_config_mtime` has moved past it and the helper no-ops.
4360
+ cfg = self._health_config
4361
+ reloaded, mtime = reload_config_if_stale(
4362
+ cfg,
4363
+ self._config_mtime,
4364
+ log_name=__name__,
4365
+ label="coord agent",
4366
+ )
4367
+ self._config_mtime = mtime
4368
+ if reloaded is cfg:
4369
+ return False
4370
+
4371
+ machine = next(
4372
+ (m for m in reloaded.machines if m.name == self.machine_name), None
4373
+ )
4374
+ if machine is None:
4375
+ # The edit removed/renamed this machine. Adopting a config
4376
+ # that doesn't describe us would mean publishing an empty repo
4377
+ # list and refusing every dispatch — a far worse outcome than
4378
+ # staying on the last-good snapshot until an operator notices.
4379
+ # `_config_mtime` has still advanced, so this logs once per
4380
+ # edit rather than once per poll.
4381
+ _log.warning(
4382
+ "coord agent: %s reloaded but no longer declares machine "
4383
+ "%r (has: %s); keeping the previous config",
4384
+ reloaded.path,
4385
+ self.machine_name,
4386
+ [m.name for m in reloaded.machines],
4387
+ )
4388
+ return False
4389
+
4390
+ self._apply_reloaded_config(reloaded, machine)
4391
+ return True
4392
+
4393
+ def _apply_reloaded_config(self, cfg: "Any", machine: "Any") -> None:
4394
+ """Swap the reloadable fields in place, pinning anything in flight.
4395
+
4396
+ The invariant from #2299: *a reload must never mutate state a running
4397
+ worker depends on.* In-flight assignments keep the values they started
4398
+ with; the new config governs the next dispatch onward.
4399
+
4400
+ Concretely, any repo with a PENDING or RUNNING assignment is "pinned":
4401
+ its ``repo_paths`` / ``artifact_paths`` / ``build_commands`` entries
4402
+ keep their pre-reload values (including *absence* — a repo that had no
4403
+ build command before must not acquire one halfway through a worker's
4404
+ leg, or the pre-stash build would run a command the worker never
4405
+ expected). The pin lifts as soon as that assignment reaches a terminal
4406
+ state and the next reload runs.
4407
+
4408
+ ``repos`` and ``capabilities`` are replaced wholesale: they gate and
4409
+ advertise *new* work only, so removing a repo correctly means "take no
4410
+ more dispatches for it", not "abandon the worker already running".
4411
+
4412
+ Every field is *rebound* to a freshly-built list/dict rather than
4413
+ mutated in place, so the many unsynchronized readers elsewhere in this
4414
+ class (``_servable_repos``, ``_stash_artifacts``, ``assign``, ...) see
4415
+ either the whole old value or the whole new one — never a half-updated
4416
+ dict.
4417
+ """
4418
+ new_repos = list(machine.repos)
4419
+ new_capabilities = list(machine.capabilities)
4420
+ new_repo_paths = dict(machine.repo_paths or {})
4421
+ new_artifact_paths: dict[str, list[str]] = {
4422
+ r.name: list(r.artifact_paths) for r in cfg.repos if r.artifact_paths
4423
+ }
4424
+ new_build_commands: dict[str, str] = {
4425
+ r.name: r.build_command for r in cfg.repos if r.build_command
4426
+ }
4427
+
4428
+ def _pin(old: dict, new: dict, keys: "Iterable[str]") -> None:
4429
+ """Restore *old*'s entry for each pinned key — including absence."""
4430
+ for key in keys:
4431
+ if key in old:
4432
+ new[key] = old[key]
4433
+ else:
4434
+ new.pop(key, None)
4435
+
4436
+ with self._lock:
4437
+ in_flight = {
4438
+ a.spec.repo_name
4439
+ for a in self._assignments.values()
4440
+ if a.status in (PENDING, RUNNING)
4441
+ }
4442
+ _pin(self.repo_paths, new_repo_paths, in_flight)
4443
+ _pin(self.artifact_paths, new_artifact_paths, in_flight)
4444
+ _pin(self.build_commands, new_build_commands, in_flight)
4445
+
4446
+ added = [r for r in new_repos if r not in self.repos]
4447
+ removed = [r for r in self.repos if r not in new_repos]
4448
+ caps_changed = new_capabilities != self.capabilities
4449
+
4450
+ self.repos = new_repos
4451
+ self.capabilities = new_capabilities
4452
+ self.repo_paths = new_repo_paths
4453
+ self.artifact_paths = new_artifact_paths
4454
+ self.build_commands = new_build_commands
4455
+ self._health_config = cfg
4456
+ self._config_reloads += 1
4457
+ self._config_reloaded_at = time.time()
4458
+
4459
+ # The H-1 block in /health is built from `_health_config`'s checkouts,
4460
+ # so a stale cache would keep reporting the pre-reload repo set for up
4461
+ # to a full TTL after the swap — exactly the skew this issue is about,
4462
+ # just moved one layer down.
4463
+ self._local_health_cache = None
4464
+
4465
+ _log.info(
4466
+ "coord agent: applied config reload from %s — repos=%s "
4467
+ "(added=%s removed=%s) capabilities=%s%s",
4468
+ getattr(cfg, "path", None),
4469
+ new_repos,
4470
+ added or "[]",
4471
+ removed or "[]",
4472
+ new_capabilities if caps_changed else "unchanged",
4473
+ (
4474
+ f" (pinned in-flight repos: {sorted(in_flight)})"
4475
+ if in_flight
4476
+ else ""
4477
+ ),
4478
+ )
4479
+
4230
4480
  # ── Public API ──────────────────────────────────────────────────────────
4231
4481
 
4232
4482
  def health(self) -> dict:
4483
+ # #2299: the health poll IS the reload tick. The coordinator polls
4484
+ # every agent's /health continuously, so piggybacking here means a
4485
+ # coordinator.yml edit lands within one poll with no new timer, and —
4486
+ # critically — the `repos` list published below is the post-reload one,
4487
+ # so `coord repo doctor`'s `machines.agent_repo_skew` clears itself
4488
+ # instead of instructing an operator to restart a busy agent.
4489
+ self._maybe_reload_config()
4233
4490
  with self._lock:
4234
4491
  active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
4235
4492
  completed = sum(
@@ -4240,6 +4497,9 @@ class AgentServer:
4240
4497
  worktree_bytes = self._cached_worktree_bytes()
4241
4498
  artifact_bytes = self._cached_artifact_bytes()
4242
4499
  servable_repos, degraded_repos = self._servable_repos()
4500
+ # #2299: the coordinator.yml this agent re-reads on every poll, or
4501
+ # None when there is nothing local to watch (config-free / thin-client).
4502
+ watched_config = getattr(self._health_config, "path", None)
4243
4503
  return {
4244
4504
  "machine": self.machine_name,
4245
4505
  "capabilities": self.capabilities,
@@ -4309,6 +4569,18 @@ class AgentServer:
4309
4569
  "skipped_active": self._graph_heal_skipped_active,
4310
4570
  "last_skip_at": self._graph_heal_last_skip_at,
4311
4571
  },
4572
+ # #2299: is this agent actually watching a coordinator.yml, and
4573
+ # has it picked anything up? `watching` is None for a
4574
+ # config-free/thin-client agent (nothing local to re-read), which
4575
+ # is the one case where a restart IS still the only way to change
4576
+ # the repo list. Lets an operator answer "did my edit land?"
4577
+ # from `coord doctor` instead of SSH + journalctl — the whole
4578
+ # complaint in #2299 was that the skew was invisible from outside.
4579
+ "config_reload": {
4580
+ "watching": str(watched_config) if watched_config else None,
4581
+ "reloads": self._config_reloads,
4582
+ "last_reload_at": self._config_reloaded_at,
4583
+ },
4312
4584
  }
4313
4585
 
4314
4586
  def _cached_local_health(self) -> dict:
@@ -5614,6 +5886,13 @@ class AgentServer:
5614
5886
 
5615
5887
  def assign(self, spec: AssignmentSpec) -> AgentAssignment:
5616
5888
  """Accept an assignment and spawn the worker. Returns immediately."""
5889
+ # #2299: refresh from coordinator.yml before the repo gate below.
5890
+ # /health already reloads on every poll, but gating dispatch on
5891
+ # "someone happened to poll first" would make repo onboarding depend
5892
+ # on poll timing; this costs one stat() in the steady state and makes
5893
+ # the guarantee unconditional — the dispatch that arrives after the
5894
+ # edit is served, full stop.
5895
+ self._maybe_reload_config()
5617
5896
  if self.repos and spec.repo_name not in self.repos:
5618
5897
  raise ValueError(
5619
5898
  f"this agent does not handle repo {spec.repo_name!r} "
@@ -323,6 +323,28 @@ def _resolve_agent_startup(
323
323
  f"coord agent: config source={source} machine={machine.name} "
324
324
  f"capabilities={list(machine.capabilities)}"
325
325
  )
326
+ # #2299: say up front whether this process will notice a coordinator.yml
327
+ # edit, because the answer differs by deployment and the failure mode of
328
+ # guessing wrong is silent. An agent with a local file re-reads it on the
329
+ # next /health poll; a thin client has no local file to watch and its repo
330
+ # list really is fixed for the life of the process. Naming the
331
+ # restart-only fields here means the journal answers "do I need to
332
+ # restart?" without anyone having to remember the issue thread.
333
+ if cfg.path is not None:
334
+ notices.append(
335
+ f"coord agent: watching {cfg.path} for edits — repos, repo_paths, "
336
+ "capabilities, artifact_paths and build_command are re-read on the "
337
+ "next /health poll, no restart needed (#2299). RESTART-ONLY: "
338
+ "providers, concurrency (bash_wrap_spawn/first_output_timeout), "
339
+ "and the bind host/port."
340
+ )
341
+ else:
342
+ notices.append(
343
+ "coord agent: NOTICE config came from the daemon, not a local "
344
+ "file — there is nothing on this machine to re-read, so this "
345
+ "agent's repo list IS fixed until it restarts (#2299)."
346
+ )
347
+
326
348
  if not machine.capabilities:
327
349
  # Declaring no capabilities is legal, but it means dispatch_smoke can
328
350
  # never pick this machine for capability-gated work — say so once at
@@ -104,9 +104,14 @@ def _repo_capability_refusal(
104
104
  ``assign()``'s ``machine_obj.can_work_on(repo)`` check (just above this
105
105
  call site) only ever reads ``coordinator.yml`` — which the operator can
106
106
  edit any time — never the agent process actually running on that
107
- machine. A repo added to config after the agent started stays invisible
108
- to it until a full ``systemctl --user restart coord-agent`` (there is no
109
- partial re-read today). Every pre-flight surface an operator would
107
+ machine. A repo added to config used to stay invisible to a running
108
+ agent until a full ``systemctl --user restart coord-agent``; since #2299
109
+ the agent re-reads its own ``coordinator.yml`` on the next ``/health``
110
+ poll, so the remaining ways the two can disagree are a *stale file* on
111
+ that machine, a malformed edit the agent refused to adopt, or an agent
112
+ too old to reload — all of which this refusal still catches, because it
113
+ compares against live ``/health`` rather than trusting either side.
114
+ Every pre-flight surface an operator would
110
115
  check before spending a dispatch reads config too: ``coord config``,
111
116
  ``coord status``, and — worst of all — ``coord assign ... --dry-run``,
112
117
  which is the documented way to sanity-check a dispatch before paying
@@ -169,9 +174,14 @@ def _repo_capability_refusal(
169
174
  return (
170
175
  f"{machine_obj.name!r} rejected the assignment: this agent does "
171
176
  f"not handle repo {repo!r} (supported: {live_repos}) — "
172
- f"coordinator.yml lists it, but the live agent process hasn't "
173
- f"re-read its config since {repo!r} was added (#2219). Restart "
174
- f"coord-agent on {machine_obj.name!r} to pick it up, then retry."
177
+ f"coordinator.yml lists it, but the live agent process is running "
178
+ f"on a different repo list (#2219). Agents re-read coordinator.yml "
179
+ f"on their own /health poll since #2299, so retry in a moment "
180
+ f"first; if it persists, that machine's own copy of the config is "
181
+ f"stale (`git pull` the settings checkout on "
182
+ f"{machine_obj.name!r}), the edit is malformed (its journal will "
183
+ f"say `failed to reload`), or the agent predates #2299 "
184
+ f"(`coord agent update`)."
175
185
  )
176
186
 
177
187
 
@@ -273,10 +273,13 @@ def repo_add( # noqa: PLR0913 — one option per thing the command can set
273
273
  f"{machine} — this is the worker WORKTREE BASE"
274
274
  )
275
275
  click.echo(
276
- " 3. RESTART coord-agent on each of those machines. The repo list is "
277
- "frozen at process start (#2219), so a running agent will refuse every "
278
- "dispatch for this repo while config says it is supported. This cannot "
279
- "run while headless workers are live."
276
+ " 3. `git pull` the settings checkout on each of those machines. "
277
+ "Since #2299 a running coord-agent re-reads its own coordinator.yml "
278
+ "on the next /health poll and serves the repo with NO restart — but "
279
+ "it can only re-read the file that is actually on ITS disk. No "
280
+ "restart needed (and none wanted: it kills live workers). If "
281
+ "`coord repo doctor` still flags agent_repo_skew a poll later, check "
282
+ "`journalctl --user -u coord-agent` for a `failed to reload` line."
280
283
  )
281
284
  click.echo(
282
285
  " 4. add a CLAUDE.md to the repo — the Test agent auto-loads it and "
@@ -885,7 +885,13 @@ def _health_vs_config_lines(machine, health: dict) -> list[tuple[bool, str]]:
885
885
  "it hasn't re-read them; a dispatch to any of "
886
886
  f"{stale} on this machine will be refused despite `coord "
887
887
  "config`/`coord status` showing it as supported (#2219). "
888
- "Restart coord-agent on this machine to pick it up.",
888
+ "Agents re-read coordinator.yml on their own /health poll "
889
+ "since #2299, so re-check in a moment before doing anything: "
890
+ "a gap that persists means this machine's copy of the config "
891
+ "is stale (`git pull` the settings checkout HERE), the edit "
892
+ "is malformed (`journalctl --user -u coord-agent` will say "
893
+ "`failed to reload`), or this agent predates #2299 "
894
+ "(`coord agent update`).",
889
895
  ))
890
896
  for repo in drifted:
891
897
  if repo in degraded:
@@ -0,0 +1,102 @@
1
+ """Shared mtime-guarded ``coordinator.yml`` reload (#1081, lifted in #2299).
2
+
3
+ Every long-lived coord process (``coord serve``, ``coord agent``) parses
4
+ ``coordinator.yml`` exactly once, at startup, and then runs on that in-memory
5
+ snapshot forever. That is fine until an operator edits the file: from then on
6
+ the *file* and the *process* disagree, and nothing on the operator's side says
7
+ so — ``coord config``/``coord status``/``coord assign --dry-run`` all read the
8
+ file and cheerfully agree with the edit while the daemon quietly keeps acting
9
+ on the pre-edit snapshot.
10
+
11
+ :func:`reload_config_if_stale` is the one mechanism that closes that gap. It
12
+ was written for the board daemon in #1081 (``coord/serve_app.py``) and lifted
13
+ here verbatim in #2299 so the agent could reuse it rather than grow a second,
14
+ subtly-different copy. The behaviour is unchanged from #1081; only the logger
15
+ name and the human-facing prefix are parameterised, so each caller's journal
16
+ lines still read as that daemon's.
17
+
18
+ The contract, in one line: **a bad hand-edit must never take a running daemon
19
+ down, and must never be retried in a loop.**
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import logging
25
+ from typing import TYPE_CHECKING
26
+
27
+ if TYPE_CHECKING: # pragma: no cover - typing only
28
+ from coord.config import Config
29
+
30
+ __all__ = ["reload_config_if_stale"]
31
+
32
+
33
+ def reload_config_if_stale(
34
+ current: "Config",
35
+ last_mtime: float | None,
36
+ *,
37
+ log_name: str = "coord.serve",
38
+ label: str = "coord serve",
39
+ ) -> tuple["Config", float | None]:
40
+ """Re-parse *current*'s backing ``coordinator.yml`` if it changed on disk (#1081).
41
+
42
+ A daemon's in-memory ``Config`` is otherwise fixed at process startup, so
43
+ a hand-edit to ``coordinator.yml`` on the daemon host silently diverges
44
+ from the file until a restart — even though ``GET /config`` (which serves
45
+ the raw bytes fresh every request) shows the new content immediately. This
46
+ closes that gap for the daemon's *own* decisions by tracking the file's
47
+ mtime and swapping in a freshly-parsed ``Config`` whenever a caller
48
+ notices it moved.
49
+
50
+ Returns ``(config, mtime)`` — either *current* unchanged (no backing path,
51
+ a ``stat()`` failure, or no on-disk change since *last_mtime*) or a
52
+ freshly-loaded ``Config`` paired with its new mtime. A malformed hand-edit
53
+ (invalid YAML, a validation error, a permissions change, a TOCTOU race
54
+ where the file vanishes between our ``stat()`` and ``load()``'s read, or a
55
+ bad-encoding write caught mid-edit) is logged and swallowed rather than
56
+ raised into a request handler or the tick loop — the daemon keeps serving
57
+ the last-good config. *last_mtime* still advances past a bad edit so it
58
+ isn't re-parsed (and re-logged) on every subsequent call; it will be
59
+ retried once the file changes again (e.g. the edit is fixed).
60
+
61
+ *log_name* / *label* only affect the journal lines (``coord.serve`` /
62
+ ``"coord serve"`` for the board daemon, ``coord.agent`` / ``"coord
63
+ agent"`` for the agent) — the reload semantics are identical for every
64
+ caller by construction, which is the entire point of sharing this.
65
+ """
66
+ path = current.path
67
+ if path is None:
68
+ return current, last_mtime
69
+ try:
70
+ mtime = path.stat().st_mtime
71
+ except OSError:
72
+ return current, last_mtime
73
+ if last_mtime is not None and mtime <= last_mtime:
74
+ return current, last_mtime
75
+
76
+ from coord.config import load as _load_coordinator_config # noqa: PLC0415
77
+
78
+ log = logging.getLogger(log_name)
79
+ try:
80
+ reloaded = _load_coordinator_config(path)
81
+ except Exception as e: # noqa: BLE001 — a tick must never crash the daemon
82
+ # Broad on purpose (#1081 review): load() isn't guaranteed to only raise
83
+ # ConfigError — a TOCTOU race (file deleted/replaced between our stat()
84
+ # and load()'s own read), a permissions change (OSError), a bad-encoding
85
+ # write caught mid-edit (UnicodeDecodeError), or a malformed structure
86
+ # tripping an un-validated code path deeper in the parser (AttributeError/
87
+ # TypeError/KeyError) can all surface here. Swallowing them matches every
88
+ # other tick-loop guard in the callers — an uncaught exception from this
89
+ # helper would otherwise either 500 a /board (or /health) request or,
90
+ # worse, permanently kill a bare `asyncio.create_task(...)` task with no
91
+ # supervisor to restart it.
92
+ log.warning(
93
+ "%s: %s changed on disk but failed to reload (%s: %s); "
94
+ "keeping last-good config until the file is fixed",
95
+ label,
96
+ path,
97
+ type(e).__name__,
98
+ e,
99
+ )
100
+ return current, mtime
101
+ log.info("%s: reloaded %s (on-disk change detected)", label, path)
102
+ return reloaded, mtime