code-coordinator 0.5.105__tar.gz → 0.5.107__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.105 → code_coordinator-0.5.107}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent.py +279 -0
  7. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/auto_loop.py +133 -13
  8. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/agent_ops.py +22 -0
  9. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/dispatch.py +16 -6
  10. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/repo.py +7 -4
  11. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/status.py +7 -1
  12. code_coordinator-0.5.107/coord/config_reload.py +102 -0
  13. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notify.py +24 -2
  14. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/repo_onboard.py +19 -8
  15. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/serve_app.py +13 -58
  16. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/AGENT_OPERATIONS.md +51 -7
  17. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent.py +420 -0
  18. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_auto_loop.py +184 -0
  19. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_repo_2220.py +9 -2
  20. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_onboard_2220.py +9 -2
  21. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stalled_pipeline.py +162 -0
  22. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/board.md +0 -0
  23. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/complete-session.md +0 -0
  24. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.claude/commands/coordinator.md +0 -0
  25. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/_lib.sh +0 -0
  26. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-checkout +0 -0
  27. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-commit +0 -0
  28. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.githooks/post-merge +0 -0
  29. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  30. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/coord-ci-acceptance.yml +0 -0
  31. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/auto-release.yml +0 -0
  32. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/cargo-test.yml +0 -0
  33. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/publish.yml +0 -0
  34. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/release-tui.yml +0 -0
  35. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.github/workflows/test.yml +0 -0
  36. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/.gitignore +0 -0
  37. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/CLAUDE.md +0 -0
  38. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/GOAL.md +0 -0
  39. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/LICENSE +0 -0
  40. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/MANIFEST.in +0 -0
  41. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/README.md +0 -0
  42. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/dependency_links.txt +0 -0
  43. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/entry_points.txt +0 -0
  44. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/requires.txt +0 -0
  45. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/code_coordinator.egg-info/top_level.txt +0 -0
  46. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/__init__.py +0 -0
  47. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/_board_mapping.py +0 -0
  48. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/acceptance.py +0 -0
  49. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/acceptance_drivers.py +0 -0
  50. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent_app.py +0 -0
  51. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agent_update.py +0 -0
  52. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/.gitignore +0 -0
  53. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/agents/work.md +0 -0
  54. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/agents/opencode/routing.jsonc +0 -0
  55. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/audit.py +0 -0
  56. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/block_log.py +0 -0
  57. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_bool_guard.py +0 -0
  58. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_service.py +0 -0
  59. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/board_wire.py +0 -0
  60. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/brain.py +0 -0
  61. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/branch_model.py +0 -0
  62. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/bug_intake.py +0 -0
  63. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/cargo_cache.py +0 -0
  64. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/ci_github.py +0 -0
  65. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/client.py +0 -0
  69. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/__init__.py +0 -0
  70. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/_common.py +0 -0
  71. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/acceptance.py +0 -0
  72. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/config.py +0 -0
  97. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/conflict_fix.py +0 -0
  98. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dao.py +0 -0
  99. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/__init__.py +0 -0
  100. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/fixture.py +0 -0
  101. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/index.html +0 -0
  102. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/server.py +0 -0
  103. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/terminal.py +0 -0
  104. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/.gitignore +0 -0
  105. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/components.json +0 -0
  106. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  107. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  108. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  109. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  110. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  111. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  112. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  113. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  114. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  115. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/index.html +0 -0
  116. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  117. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/sw.js +0 -0
  118. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  119. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  120. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  121. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  122. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  123. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  124. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  125. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  126. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  127. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  128. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/eslint.config.js +0 -0
  129. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/index.html +0 -0
  130. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  131. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/package-lock.json +0 -0
  132. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/package.json +0 -0
  133. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  134. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/playwright.config.ts +0 -0
  135. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/postcss.config.js +0 -0
  136. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  137. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  138. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  139. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/App.tsx +0 -0
  140. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/api/client.ts +0 -0
  141. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  142. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  143. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  144. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  145. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  146. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  147. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  148. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  149. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  150. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  151. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  152. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  153. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  154. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  155. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  156. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  157. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  158. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  159. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  160. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  161. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  162. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  163. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  164. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  165. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  166. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  167. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  168. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  169. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  170. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  171. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  172. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  173. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  174. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  175. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  176. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/index.css +0 -0
  177. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  178. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  179. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/main.tsx +0 -0
  180. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  181. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  182. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  183. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  184. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  185. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  186. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  187. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  188. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  189. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  190. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  191. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  192. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  193. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  194. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  195. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  196. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  197. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  198. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  199. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  200. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  201. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  202. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  203. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tailwind.config.js +0 -0
  204. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tsconfig.json +0 -0
  205. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  206. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dashboard/webapp/vite.config.ts +0 -0
  207. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/db.py +0 -0
  208. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dead_end.py +0 -0
  209. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/README.md +0 -0
  210. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-agent.service +0 -0
  211. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.service +0 -0
  212. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.sh +0 -0
  213. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-db-backup.timer +0 -0
  214. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-drive-queue.service +0 -0
  215. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-drive-queue.timer +0 -0
  216. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-notify.service +0 -0
  217. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-notify.timer +0 -0
  218. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-propagate.service +0 -0
  219. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-propagate.timer +0 -0
  220. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-window.service +0 -0
  221. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-release-window.timer +0 -0
  222. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-serve.service +0 -0
  223. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web-dist-build.service +0 -0
  224. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web-dist-build.timer +0 -0
  225. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy/coord-web.service +0 -0
  226. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy_manifest.py +0 -0
  227. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deploy_units.py +0 -0
  228. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/deps.py +0 -0
  229. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/diagnose.py +0 -0
  230. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dispatch.py +0 -0
  231. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/dist_name.py +0 -0
  232. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive.py +0 -0
  233. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive_queue.py +0 -0
  234. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/drive_state.py +0 -0
  235. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/events.py +0 -0
  236. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/failure_class.py +0 -0
  237. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/filelock.py +0 -0
  238. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/fleet_config_health.py +0 -0
  239. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/freshness.py +0 -0
  240. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_a.py +0 -0
  241. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_b.py +0 -0
  242. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gate_snapshot.py +0 -0
  243. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/gates.py +0 -0
  244. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/github_ops.py +0 -0
  245. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/goal.py +0 -0
  246. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/graph_health.py +0 -0
  247. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/__init__.py +0 -0
  248. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/aggregate.py +0 -0
  249. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/__init__.py +0 -0
  250. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/agent_install.py +0 -0
  251. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/cargo_targets.py +0 -0
  252. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/claude_binary.py +0 -0
  253. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/deploy_lane_facts.py +0 -0
  254. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/disk.py +0 -0
  255. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_board.py +0 -0
  256. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  257. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_phantom.py +0 -0
  258. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/fleet_unit_drift.py +0 -0
  259. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/graph.py +0 -0
  260. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/graphify_cli.py +0 -0
  261. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/index_lock.py +0 -0
  262. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/plan_usage.py +0 -0
  263. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/repo_state.py +0 -0
  264. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/spawned_coord.py +0 -0
  265. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/timer_active.py +0 -0
  266. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/toolchain.py +0 -0
  267. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/unit_drift.py +0 -0
  268. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/unit_enablement.py +0 -0
  269. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/checks/worktrees.py +0 -0
  270. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/cli.py +0 -0
  271. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/context.py +0 -0
  272. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/fleet_snapshot.py +0 -0
  273. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/models.py +0 -0
  274. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/pypi.py +0 -0
  275. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/registry.py +0 -0
  276. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/render.py +0 -0
  277. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/health/units.py +0 -0
  278. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/hooks.py +0 -0
  279. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/housekeeping.py +0 -0
  280. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/interactive.py +0 -0
  281. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/issue_store.py +0 -0
  282. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/liveness_auditor.py +0 -0
  283. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/machine_pause.py +0 -0
  284. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/merge_queue.py +0 -0
  285. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_chat.py +0 -0
  286. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_dispatch.py +0 -0
  287. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_gate.py +0 -0
  288. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/milestone_order.py +0 -0
  289. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/mock_author.py +0 -0
  290. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/models.py +0 -0
  291. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/network.py +0 -0
  292. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/new_issue_chat.py +0 -0
  293. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/__init__.py +0 -0
  294. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/baseline.py +0 -0
  295. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/cli.py +0 -0
  296. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/collect.py +0 -0
  297. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/digest.py +0 -0
  298. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/models.py +0 -0
  299. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/predicate.py +0 -0
  300. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/service.py +0 -0
  301. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/store.py +0 -0
  302. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/notifier/transport.py +0 -0
  303. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/openapi.py +0 -0
  304. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/overlap_fence.py +0 -0
  305. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/overlap_predict.py +0 -0
  306. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/parentage.py +0 -0
  307. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/parentage_github.py +0 -0
  308. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/pipeline.py +0 -0
  309. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/plan_parser.py +0 -0
  310. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/plans.py +0 -0
  311. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/platform_paths.py +0 -0
  312. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_bridge.py +0 -0
  313. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_store.py +0 -0
  314. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/portal_sync.py +0 -0
  315. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/pr_body_lint.py +0 -0
  316. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/prereqs.py +0 -0
  317. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/progress.py +0 -0
  318. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/__init__.py +0 -0
  319. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/base.py +0 -0
  320. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/claude.py +0 -0
  321. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/claude_pty.py +0 -0
  322. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/providers/opencode.py +0 -0
  323. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/queue_diagnose.py +0 -0
  324. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/reconcile.py +0 -0
  325. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/refine_chat.py +0 -0
  326. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_cordon.py +0 -0
  327. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_propagate.py +0 -0
  328. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_verify.py +0 -0
  329. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/release_window.py +0 -0
  330. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/repo_edit.py +0 -0
  331. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/reports.py +0 -0
  332. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/revalidate.py +0 -0
  333. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/review.py +0 -0
  334. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/scorecard.py +0 -0
  335. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/state.py +0 -0
  341. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coord/worker_events.py +0 -0
  350. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/coordinator.example.yml +0 -0
  351. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-agent.service +0 -0
  352. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.service +0 -0
  353. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.sh +0 -0
  354. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-db-backup.timer +0 -0
  355. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-drive-queue.service +0 -0
  356. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-drive-queue.timer +0 -0
  357. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-notify.service +0 -0
  358. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-notify.timer +0 -0
  359. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-propagate.service +0 -0
  360. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-propagate.timer +0 -0
  361. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-window.service +0 -0
  362. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-release-window.timer +0 -0
  363. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-serve.service +0 -0
  364. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.service +0 -0
  365. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.sh +0 -0
  366. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-dist-build.timer +0 -0
  367. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web-rollback.sh +0 -0
  368. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/coord-web.service +0 -0
  369. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/deploy/node-shim.sh +0 -0
  370. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ARCHITECTURE.md +0 -0
  371. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ARCH_SECURITY_GATES.md +0 -0
  372. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/COCKPIT.md +0 -0
  373. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CONTROL_CENTER.md +0 -0
  374. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/COST_DISCIPLINE.md +0 -0
  375. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CROSS_PLATFORM.md +0 -0
  376. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/CUSTOMER_PORTAL.md +0 -0
  377. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/DRIVE_QUEUE.md +0 -0
  378. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/EPHEMERAL_WORKERS.md +0 -0
  379. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/FORGE_MIGRATION.md +0 -0
  380. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/GRAPHIFY_SETUP.md +0 -0
  381. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ISSUE_GUIDANCE.md +0 -0
  382. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/MAC_MINI.md +0 -0
  383. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  384. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/NOTIFIER.md +0 -0
  385. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/OPENCODE_VERIFICATION.md +0 -0
  386. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/OPERATING_GOTCHAS.md +0 -0
  387. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/ORACLE_LOOP.md +0 -0
  388. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PHONE_WEBAPP.md +0 -0
  389. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PIPELINE_V2.md +0 -0
  390. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/PLATFORM_EVOLUTION.md +0 -0
  391. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/SECOND_BACKEND.md +0 -0
  392. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/STORE_SERVICE.md +0 -0
  393. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  394. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/WEB_CONTROL_CENTER.md +0 -0
  395. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/README.md +0 -0
  396. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/_tokens.css +0 -0
  397. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/issue-detail.html +0 -0
  398. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/pipeline-narrow.html +0 -0
  399. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/docs/mocks/web/pipeline-wide.html +0 -0
  400. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/graphify-out/.gitignore +0 -0
  401. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/install-agent.sh +0 -0
  402. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/pyproject.toml +0 -0
  403. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/audit_review_verdict_overrides.py +0 -0
  404. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  405. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/build-worker-image.sh +0 -0
  406. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/coordinator-machine.py +0 -0
  407. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/epic-down.sh +0 -0
  408. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/epic-up.sh +0 -0
  409. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/preflight.sh +0 -0
  410. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/provision-worker.sh +0 -0
  411. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  412. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  413. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/azure-workers/verify-github-token.sh +0 -0
  414. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/codegen.py +0 -0
  415. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/coord-test-runner.sh +0 -0
  416. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/drive-batch.sh +0 -0
  417. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/gen_board_fixture.py +0 -0
  418. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/next_release_tag.py +0 -0
  419. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/run_tests_in_populated_home.sh +0 -0
  420. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/run_tests_without_gh.sh +0 -0
  421. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/smoke_437_interactive.py +0 -0
  422. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_878_review_capture.py +0 -0
  423. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_release_published.py +0 -0
  424. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/scripts/verify_release_wheel.py +0 -0
  425. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/setup.cfg +0 -0
  426. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/SMOKE_SET.md +0 -0
  427. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/__init__.py +0 -0
  428. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  429. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/contract.md +0 -0
  430. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/manifest.yml +0 -0
  431. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  432. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  433. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  434. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  435. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/conftest.py +0 -0
  436. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/contract.md +0 -0
  437. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/manifest.yml +0 -0
  438. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  439. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  440. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/contract.md +0 -0
  441. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/manifest.yml +0 -0
  442. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  443. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  444. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  445. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  446. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  447. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  448. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  449. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  450. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  451. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  452. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/contract.md +0 -0
  453. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  454. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  455. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/manifest.yml +0 -0
  456. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  457. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-51/tsconfig.json +0 -0
  458. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  459. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/conftest.py +0 -0
  460. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/board-pipeline-basic.json +0 -0
  461. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  462. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  463. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  464. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/all_pass.json +0 -0
  465. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  466. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/mixed_fail.json +0 -0
  467. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  468. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  469. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/skip.json +0 -0
  470. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/playwright/truncated.json +0 -0
  471. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  472. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  473. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  474. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  475. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  476. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  477. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  478. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  479. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_acceptance.py +0 -0
  480. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_acceptance_drivers.py +0 -0
  481. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_api_error.py +0 -0
  482. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_app.py +0 -0
  483. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_branch_base.py +0 -0
  484. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_branch_capture.py +0 -0
  485. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_config_free_1712.py +0 -0
  486. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_deploy_units_endpoint.py +0 -0
  487. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_dirty_worktree.py +0 -0
  488. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_graph_self_heal.py +0 -0
  489. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_health_h3.py +0 -0
  490. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_idle_restart.py +0 -0
  491. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_push_failure.py +0 -0
  492. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_reap.py +0 -0
  493. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_repos_and_pull.py +0 -0
  494. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_restart_services_endpoint.py +0 -0
  495. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_startup_diagnostics.py +0 -0
  496. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_update.py +0 -0
  497. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_update_bluegreen.py +0 -0
  498. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_usage_limit.py +0 -0
  499. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_agent_zero_commit.py +0 -0
  500. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ambient_home_isolation.py +0 -0
  501. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_approve_reject_plan.py +0 -0
  502. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_approve_usage_gate.py +0 -0
  503. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_assignment_already_recorded_daemon.py +0 -0
  504. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_log.py +0 -0
  505. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_outcome.py +0 -0
  506. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_audit_query.py +0 -0
  507. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_auto_release_publish_2035.py +0 -0
  508. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_base_checkout_restore.py +0 -0
  509. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_block_log.py +0 -0
  510. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_cap_762.py +0 -0
  511. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_fixture.py +0 -0
  512. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_read_path.py +0 -0
  513. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_acceptance_gate_1950.py +0 -0
  522. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_parity_2091.py +0 -0
  523. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_ci_store.py +0 -0
  524. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_claim.py +0 -0
  525. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_acceptance.py +0 -0
  526. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign.py +0 -0
  527. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  528. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_interactive_remote.py +0 -0
  529. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_provider.py +0 -0
  530. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  531. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_audit.py +0 -0
  532. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_chat_continue.py +0 -0
  533. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_diagnose_config_provenance.py +0 -0
  534. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_diagnose_graph.py +0 -0
  535. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_drive.py +0 -0
  539. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_drive_queue.py +0 -0
  540. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_escalate.py +0 -0
  541. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_fix_headless_review.py +0 -0
  542. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_gate_a.py +0 -0
  543. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_install_drift.py +0 -0
  544. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_install_skills.py +0 -0
  545. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_issue_create_label.py +0 -0
  546. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_issue_reopen.py +0 -0
  547. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_merge.py +0 -0
  548. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_assign.py +0 -0
  549. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_capture.py +0 -0
  550. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_chat_add_child.py +0 -0
  551. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_dispatch.py +0 -0
  552. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_gate_b.py +0 -0
  553. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_gate_c.py +0 -0
  554. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_order.py +0 -0
  555. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  556. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_milestone_ship.py +0 -0
  557. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_network.py +0 -0
  558. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_new_issue_chat.py +0 -0
  559. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_plans.py +0 -0
  560. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_portal.py +0 -0
  561. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_pull_artifact.py +0 -0
  562. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_queue.py +0 -0
  563. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_reattach_sessions.py +0 -0
  564. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_refine_board.py +0 -0
  565. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_preflight.py +0 -0
  566. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_propagate.py +0 -0
  567. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_release_window.py +0 -0
  568. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_set_review_findings.py +0 -0
  570. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_advisory_terminal.py +0 -0
  571. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_merge_queue.py +0 -0
  572. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_provider.py +0 -0
  573. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_review_finalizing.py +0 -0
  574. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_test_failed_tag.py +0 -0
  575. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_status_usage_limit.py +0 -0
  576. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_sync_comments_873.py +0 -0
  577. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_test_plan.py +0 -0
  578. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_track.py +0 -0
  579. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_tui_update.py +0 -0
  580. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cli_wait.py +0 -0
  581. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_client_base_install.py +0 -0
  582. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_comments.py +0 -0
  583. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_completion_summary.py +0 -0
  584. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config.py +0 -0
  585. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_acceptance.py +0 -0
  586. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_audit.py +0 -0
  587. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_pricing.py +0 -0
  588. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  589. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_config_usage_gate.py +0 -0
  590. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_conflict_fix.py +0 -0
  591. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_conflict_fix_semantic.py +0 -0
  592. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test.py +0 -0
  593. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_baseline.py +0 -0
  594. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_routing.py +0 -0
  595. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_test_runner_toolchain.py +0 -0
  596. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coord_web_sse_restart_live.py +0 -0
  597. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_coordinator_machine.py +0 -0
  598. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_cross_platform_imports.py +0 -0
  599. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard.py +0 -0
  600. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_fixture.py +0 -0
  601. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_terminal.py +0 -0
  602. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dashboard_terminal_live.py +0 -0
  603. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_db.py +0 -0
  604. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dead_end.py +0 -0
  605. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_db_backup.py +0 -0
  606. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_web_dist.py +0 -0
  607. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_coord_web_rollback.py +0 -0
  608. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_drive_queue_unit.py +0 -0
  609. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_manifest.py +0 -0
  610. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_units_lane.py +0 -0
  611. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deploy_web_unit.py +0 -0
  612. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_deps.py +0 -0
  613. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_diagnose.py +0 -0
  614. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dispatch.py +0 -0
  615. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dispatch_target_validation.py +0 -0
  616. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_dist_name.py +0 -0
  617. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_done_housekeeping.py +0 -0
  618. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive.py +0 -0
  619. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_queue.py +0 -0
  620. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_state.py +0 -0
  621. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_drive_tmux.py +0 -0
  622. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_capability_detection.py +0 -0
  623. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  624. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_epic_up_image_provenance.py +0 -0
  625. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_errors.py +0 -0
  626. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_events.py +0 -0
  627. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_failure_class.py +0 -0
  628. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_filelock.py +0 -0
  629. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  630. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fix_of_force_override.py +0 -0
  631. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_config_health.py +0 -0
  632. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_health_probes.py +0 -0
  633. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_fleet_health_snapshot.py +0 -0
  634. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_freshness.py +0 -0
  635. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_a.py +0 -0
  636. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_b.py +0 -0
  637. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gate_snapshot_staleness.py +0 -0
  638. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gates.py +0 -0
  639. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  640. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_generated_types_fixture.py +0 -0
  641. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_github_ops.py +0 -0
  642. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_goal.py +0 -0
  643. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_graph_health.py +0 -0
  644. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_graph_selfheal_absent_2237.py +0 -0
  645. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_handoff.py +0 -0
  646. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_checks.py +0 -0
  647. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_cli.py +0 -0
  648. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_cli_graph.py +0 -0
  649. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_config.py +0 -0
  650. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_context.py +0 -0
  651. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_deploy_lane_facts.py +0 -0
  652. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_incident_regression.py +0 -0
  653. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_pypi.py +0 -0
  654. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_registry.py +0 -0
  655. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_timer_active.py +0 -0
  656. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_toolchain.py +0 -0
  657. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_unit_drift.py +0 -0
  658. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_health_unit_enablement.py +0 -0
  659. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_hooks.py +0 -0
  660. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_human_attended_437.py +0 -0
  661. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_init.py +0 -0
  662. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_integration.py +0 -0
  663. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_briefing_echo.py +0 -0
  664. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_prefill_state.py +0 -0
  665. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_session_relaunch.py +0 -0
  666. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_test_verdict_backstop.py +0 -0
  667. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_token_attribution.py +0 -0
  668. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_interactive_worktree.py +0 -0
  669. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_issue_store_seam.py +0 -0
  670. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_liveness_auditor.py +0 -0
  671. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_liveness_notify.py +0 -0
  672. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_machine_pause.py +0 -0
  673. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_merge_queue.py +0 -0
  674. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_merge_verify.py +0 -0
  675. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_chat.py +0 -0
  676. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_dispatch.py +0 -0
  677. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_gate.py +0 -0
  678. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_order.py +0 -0
  679. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_milestone_seam.py +0 -0
  680. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_mock_author.py +0 -0
  681. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_model_tiering.py +0 -0
  682. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_models.py +0 -0
  683. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_models_config_labels.py +0 -0
  684. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_needs_attention.py +0 -0
  685. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_network.py +0 -0
  686. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_new_issue_chat.py +0 -0
  687. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_next_release_tag.py +0 -0
  688. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_no_direct_gh_calls.py +0 -0
  689. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_node_shim.py +0 -0
  690. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_baseline.py +0 -0
  691. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_cli.py +0 -0
  692. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_collect.py +0 -0
  693. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_config.py +0 -0
  694. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_drive_seam.py +0 -0
  695. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_isolation.py +0 -0
  696. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_predicate.py +0 -0
  697. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_quiet_hours.py +0 -0
  698. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notifier_service.py +0 -0
  699. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notify.py +0 -0
  700. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_notify_drain.py +0 -0
  701. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_openapi.py +0 -0
  702. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_operational_defaults.py +0 -0
  703. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_overlap_fence.py +0 -0
  704. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_overlap_predict.py +0 -0
  705. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_packaged_deploy_units.py +0 -0
  706. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_parentage.py +0 -0
  707. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_paste_landed.py +0 -0
  708. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_pipeline.py +0 -0
  709. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_approve_plan_command.py +0 -0
  710. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_pr_command.py +0 -0
  711. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_followup_review_command.py +0 -0
  712. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_only.py +0 -0
  713. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_plan_parser.py +0 -0
  714. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_platform_paths.py +0 -0
  715. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_bridge.py +0 -0
  716. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_config.py +0 -0
  717. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_portal_sync.py +0 -0
  718. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_pr_body_lint.py +0 -0
  719. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_prereqs.py +0 -0
  720. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_production_db_guard.py +0 -0
  721. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_progress.py +0 -0
  722. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_provider_seam.py +0 -0
  723. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers.py +0 -0
  724. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers_config_labels.py +0 -0
  725. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_providers_pty.py +0 -0
  726. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_quiet_hours.py +0 -0
  727. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_quiet_hours_store_2146.py +0 -0
  728. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reap_merged_sessions.py +0 -0
  729. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reap_stale_interactive_tick.py +0 -0
  730. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_branch.py +0 -0
  731. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_completions.py +0 -0
  732. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_merges.py +0 -0
  733. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_no_agent_record.py +0 -0
  734. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reconcile_usage_limit_done.py +0 -0
  735. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_refine_chat.py +0 -0
  736. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_2101.py +0 -0
  737. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  738. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_cordon_deadlock_2240.py +0 -0
  739. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_propagate.py +0 -0
  740. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_unified_1242.py +0 -0
  741. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_verify.py +0 -0
  742. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_release_window.py +0 -0
  743. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_remote_auto_prune.py +0 -0
  744. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_remote_interactive_reaper.py +0 -0
  745. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_edit_2220.py +0 -0
  746. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_repo_graph_fleet_2237.py +0 -0
  747. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_report_result_push.py +0 -0
  748. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_reports.py +0 -0
  749. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry.py +0 -0
  750. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry_advisory_1606.py +0 -0
  751. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_retry_type_1636.py +0 -0
  752. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_revalidate.py +0 -0
  753. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review.py +0 -0
  754. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_end_review_without_verdict.py +0 -0
  755. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_parse_failure_diagnostic.py +0 -0
  756. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_reaffirm.py +0 -0
  757. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_state.py +0 -0
  758. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_backstop.py +0 -0
  759. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_override_audit.py +0 -0
  760. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_verdict_relay.py +0 -0
  761. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_review_zero_commits.py +0 -0
  762. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_scoped_review_wiring.py +0 -0
  763. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_scorecard.py +0 -0
  764. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_serve.py +0 -0
  765. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_serve_app_board_trim.py +0 -0
  766. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_session.py +0 -0
  767. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_slice_issue_attribution.py +0 -0
  768. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke.py +0 -0
  769. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke_live_checkout_restore.py +0 -0
  770. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_smoke_workflow.py +0 -0
  771. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_spend_ceiling.py +0 -0
  772. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_spend_ceiling_coordinator.py +0 -0
  773. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_split.py +0 -0
  774. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_split_work.py +0 -0
  775. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stage_projection.py +0 -0
  776. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_state.py +0 -0
  777. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_state_review_findings_daemon.py +0 -0
  778. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_status_fleet_footer.py +0 -0
  779. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stop_1567.py +0 -0
  780. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_stuck.py +0 -0
  781. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_terminal_command.py +0 -0
  782. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_author.py +0 -0
  783. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_chat.py +0 -0
  784. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_orchestrator.py +0 -0
  785. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_report.py +0 -0
  786. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_verdict_parsing.py +0 -0
  787. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_test_verdict_transcript_floor.py +0 -0
  788. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_board_audit.py +0 -0
  789. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_config_load_1080.py +0 -0
  790. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_thin_client_daemon_routing_906.py +0 -0
  791. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_tmux_host.py +0 -0
  792. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_tmux_session.py +0 -0
  793. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_transcript_floor.py +0 -0
  794. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage.py +0 -0
  795. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage_limits.py +0 -0
  796. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_usage_rollup.py +0 -0
  797. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_venv_live_install_2121.py +0 -0
  798. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_version_single_source.py +0 -0
  799. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_watch.py +0 -0
  800. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_events.py +0 -0
  801. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_image_pin_sync.py +0 -0
  802. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_safety.py +0 -0
  803. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worker_test_scoping.py +0 -0
  804. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worktree.py +0 -0
  805. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  806. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/Cargo.lock +0 -0
  807. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/Cargo.toml +0 -0
  808. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/cargo-config-local-quadraui.toml.example +0 -0
  809. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/audit.rs +0 -0
  810. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/chat.rs +0 -0
  811. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/data.rs +0 -0
  812. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/dialogs.rs +0 -0
  813. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/drive.rs +0 -0
  814. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/drive_queue.rs +0 -0
  815. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/escalation.rs +0 -0
  816. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/events.rs +0 -0
  817. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fixtures.rs +0 -0
  818. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_health.rs +0 -0
  819. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_sessions.rs +0 -0
  820. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/fleet_terminals.rs +0 -0
  821. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/format.rs +0 -0
  822. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/milestone_dag.rs +0 -0
  823. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/mod.rs +0 -0
  824. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/msv.rs +0 -0
  825. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/pipeline.rs +0 -0
  826. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/plans.rs +0 -0
  827. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/render.rs +0 -0
  828. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/reports.rs +0 -0
  829. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/sessions.rs +0 -0
  830. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/settings_ui.rs +0 -0
  831. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/sidebar.rs +0 -0
  832. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/terminal.rs +0 -0
  833. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/tests.rs +0 -0
  834. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/types.rs +0 -0
  835. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/app/workspace.rs +0 -0
  836. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/bin/gtk.rs +0 -0
  837. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/commands.rs +0 -0
  838. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/lib.rs +0 -0
  839. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/main.rs +0 -0
  840. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/src/settings.rs +0 -0
  841. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/tests/acceptance.rs +0 -0
  842. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/tui/tests/cli.rs +0 -0
  843. {code_coordinator-0.5.105 → code_coordinator-0.5.107}/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.105
3
+ Version: 0.5.107
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.105
3
+ Version: 0.5.107
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.105",
2
+ "tag": "0.5.107",
3
3
  "distance": 0,
4
- "node": "ge1d2140a49bec59697930f77304b2c0f62eef7c1",
4
+ "node": "gd8477c280ee82a9279e982ed0b3aea53dc089761",
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} "
@@ -43,7 +43,7 @@ import httpx
43
43
  from coord.config import Config
44
44
  from coord.dispatch import AGENT_PORT
45
45
  from coord import github_ops
46
- from coord.models import Assignment, Board
46
+ from coord.models import SEALED_PATH_AUTHOR_TYPES, Assignment, Board
47
47
  from coord.review import (
48
48
  ReviewFindings,
49
49
  blocking_findings_confirmed_absent,
@@ -64,7 +64,16 @@ log = logging.getLogger(__name__)
64
64
  # ``coord.notify``'s fix-completion detector doesn't hardcode ``"work"`` and
65
65
  # silently miss a newer fix-dispatch type — the same class of bug as #1141
66
66
  # ("test-author was never added to WORK_LIKE_TYPES").
67
- FIX_DISPATCH_TYPES: frozenset[str] = frozenset({"work", "test-author"})
67
+ #
68
+ # #2302: "mock-author" (Gate A) is the same class of bug repeating — a
69
+ # request-changes fix for a mock-author row dispatched as plain "work",
70
+ # which trips coord/review.py's sealed-path tamper rule on every round
71
+ # (the fix worker isn't authorized to write tests/acceptance/ms-NN/, but
72
+ # that's exactly where the diff has to land) until max_review_iterations
73
+ # burns out. `_dispatch_fix` derives `fix_type` from
74
+ # ``coord.models.SEALED_PATH_AUTHOR_TYPES`` rather than a hardcoded string
75
+ # so this set — and this one — never drift from it again.
76
+ FIX_DISPATCH_TYPES: frozenset[str] = frozenset({"work"}) | SEALED_PATH_AUTHOR_TYPES
68
77
 
69
78
 
70
79
  # Every :class:`LoopAction` kind whose production means the in-memory board was
@@ -816,9 +825,16 @@ def _build_fix_briefing(
816
825
  instructions instead — "make the acceptance suite pass" is actively
817
826
  wrong guidance for an oracle that must stay RED until the real
818
827
  implementation lands.
828
+
829
+ #2302: a ``type="mock-author"`` source row (Gate A) gets its own
830
+ variant for the same reason one level up the pipeline — the diff is a
831
+ specification (``contract.md`` + rendered mocks), not an
832
+ implementation, so "run tests, make them pass" is equally wrong there.
819
833
  """
820
834
  if work.type == "test-author":
821
835
  return _build_test_author_fix_briefing(work, findings, iteration, max_iter)
836
+ if work.type == "mock-author":
837
+ return _build_mock_author_fix_briefing(work, findings, iteration, max_iter)
822
838
 
823
839
  lines: list[str] = [
824
840
  f"# Fix assignment (iteration {iteration}/{max_iter}): {work.issue_title}",
@@ -929,6 +945,93 @@ def _build_test_author_fix_briefing(
929
945
  return "\n".join(lines)
930
946
 
931
947
 
948
+ def _build_mock_author_fix_briefing(
949
+ work: Assignment,
950
+ findings,
951
+ iteration: int,
952
+ max_iter: int,
953
+ ) -> str:
954
+ """Fix briefing for a ``type="mock-author"`` slice (#2302, Gate A).
955
+
956
+ The diff here is a SPECIFICATION — ``contract.md`` plus rendered
957
+ ``tests/acceptance/ms-NN/mocks/*`` — not an implementation. There is no
958
+ suite to run, so "run the tests and make them pass" (the generic fix
959
+ instruction) is actively wrong guidance, the same shape #1176 already
960
+ fixed for ``test-author``. Findings on a Gate A review are almost
961
+ always an internal-consistency defect: a mock depicting an end state
962
+ that the contract's own stated rules cannot produce from the narrated
963
+ input sequence — so the contract and the mocks must be reconciled to
964
+ agree with each other in BOTH directions, not just patched locally.
965
+ The dispatcher pairs this briefing with a bare ``type="mock-author"``
966
+ dispatch (see ``_dispatch_fix``) — ``agent.py``'s own
967
+ ``elif spec.type == "mock-author"`` branch supplies
968
+ ``MOCK_AUTHOR_SYSTEM_PROMPT`` and its deny-list on its own, so no
969
+ explicit ``system_prompt``/``deny_commands`` injection is needed here
970
+ the way ``test-author`` (which has no such branch) requires.
971
+ """
972
+ lines: list[str] = [
973
+ f"# Gate A fix (iteration {iteration}/{max_iter}): {work.issue_title}",
974
+ "",
975
+ (
976
+ f"You are the independent mock-author fixing review findings "
977
+ f"against the Gate A contract and mocks for issue "
978
+ f"#{work.issue_number}."
979
+ ),
980
+ (
981
+ f"Work on branch `{work.branch or '(check your git branches)'}` — "
982
+ "**do not change the branch name**."
983
+ ),
984
+ "",
985
+ "## Reviewer findings to address",
986
+ "",
987
+ findings.body.strip(),
988
+ "",
989
+ "## Instructions",
990
+ "",
991
+ (
992
+ "1. Read the reviewer findings above carefully. Your diff is a "
993
+ "SPECIFICATION (`contract.md` + rendered `mocks/*`), not an "
994
+ "implementation — there is no suite to run and nothing to make "
995
+ "pass. Findings on a Gate A review are almost always an "
996
+ "internal-consistency defect: a mock depicting an end state "
997
+ "that the contract's own stated rules cannot produce from the "
998
+ "narrated input sequence."
999
+ ),
1000
+ (
1001
+ "2. Fix **every** issue identified by the reviewer so the "
1002
+ "contract and the mocks agree with each other in BOTH "
1003
+ "directions — every rule the contract states must be reachable "
1004
+ "from the mocks' narrated sequence, and every state the mocks "
1005
+ "depict must be producible by the contract's stated rules."
1006
+ ),
1007
+ "3. Stay on the **same branch** — push your fixes to the existing branch.",
1008
+ (
1009
+ "4. Do NOT touch any file outside `tests/acceptance/ms-NN/`. "
1010
+ "Touching anything outside that directory is a mandatory "
1011
+ "`request-changes` for this assignment type — you are pinning "
1012
+ "the milestone's contract, not implementing it."
1013
+ ),
1014
+ (
1015
+ f"5. This is fix iteration {iteration} of {max_iter} allowed. "
1016
+ "Address all findings completely so the next review can approve."
1017
+ ),
1018
+ "",
1019
+ (
1020
+ "STATUS: reading review findings → reconciling contract and mocks "
1021
+ "→ confidence: high"
1022
+ ),
1023
+ "",
1024
+ ]
1025
+ if work.briefing and work.briefing.strip():
1026
+ lines += [
1027
+ "## Original mock-author briefing",
1028
+ "",
1029
+ work.briefing.strip(),
1030
+ "",
1031
+ ]
1032
+ return "\n".join(lines)
1033
+
1034
+
932
1035
  def _dispatch_fix(
933
1036
  work: Assignment,
934
1037
  briefing: str,
@@ -945,11 +1048,18 @@ def _dispatch_fix(
945
1048
  Prefers the same machine as the original worker (the branch is already
946
1049
  checked out there). Falls back to any capable machine.
947
1050
 
948
- #1176: the dispatched type mirrors ``work.type`` for ``"test-author"``
949
- (with ``TEST_AUTHOR_SYSTEM_PROMPT`` + its deny-list, since the fix needs
950
- the same acceptance-path authorization and independence rules as the
951
- original test-author dispatch); every other source type still gets the
952
- long-standing plain ``"work"`` fix.
1051
+ #1176/#2302: the dispatched type mirrors ``work.type`` for any
1052
+ :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` member (``"test-author"``,
1053
+ ``"mock-author"``) — those types are the ones ``coord/review.py``
1054
+ inverts its sealed-path tamper rule for, so a fix that needs to write
1055
+ back into ``tests/acceptance/ms-NN/`` must carry the same type as the
1056
+ row it's fixing or every round trips "TAMPER DETECTED" until the
1057
+ iteration cap burns out. ``test-author`` additionally needs
1058
+ ``TEST_AUTHOR_SYSTEM_PROMPT`` + its deny-list injected explicitly since
1059
+ ``agent.py`` has no dispatch-table branch for it; ``mock-author``
1060
+ doesn't — ``agent.py``'s own ``elif spec.type == "mock-author"`` branch
1061
+ supplies its system prompt and deny-list unconditionally. Every other
1062
+ source type still gets the long-standing plain ``"work"`` fix.
953
1063
 
954
1064
  Returns the new Assignment (already added to ``board.active``), or None
955
1065
  on failure.
@@ -1016,12 +1126,16 @@ def _dispatch_fix(
1016
1126
  if repo is None:
1017
1127
  return None
1018
1128
 
1019
- # #1176: preserve the source row's type for a test-author slice fix —
1020
- # dispatching `type="work"` sends a plain worker that is forbidden from
1021
- # (and never given the system prompt authorizing) exactly the
1022
- # `tests/acceptance/**` path it needs to fix. Every other source type
1023
- # (including today's "work") keeps the long-standing "work" fix.
1024
- fix_type = "test-author" if work.type == "test-author" else "work"
1129
+ # #1176/#2302: preserve the source row's type for a sealed-path-author
1130
+ # slice fix (test-author, mock-author) — dispatching `type="work"`
1131
+ # sends a plain worker that is forbidden from (and never given the
1132
+ # system prompt authorizing) exactly the `tests/acceptance/**` path it
1133
+ # needs to fix. Derived from SEALED_PATH_AUTHOR_TYPES rather than a
1134
+ # hardcoded string so this stays in sync with that set — see the
1135
+ # FIX_DISPATCH_TYPES comment above for the class of bug that guards
1136
+ # against. Every other source type (including today's "work") keeps
1137
+ # the long-standing "work" fix.
1138
+ fix_type = work.type if work.type in SEALED_PATH_AUTHOR_TYPES else "work"
1025
1139
 
1026
1140
  payload = {
1027
1141
  "repo_name": work.repo_name,
@@ -1054,6 +1168,12 @@ def _dispatch_fix(
1054
1168
  # stay-RED rules a test-author session needs.
1055
1169
  payload["system_prompt"] = TEST_AUTHOR_SYSTEM_PROMPT
1056
1170
  payload["deny_commands"] = test_author_deny_commands(config, work.repo_name)
1171
+ # #2302: no analogous branch for `fix_type == "mock-author"` — unlike
1172
+ # test-author, `agent.py`'s `elif spec.type == "mock-author"` branch
1173
+ # already supplies `MOCK_AUTHOR_SYSTEM_PROMPT` and unconditionally
1174
+ # appends `MOCK_AUTHOR_DENY_COMMANDS` regardless of `spec.deny_commands`,
1175
+ # so injecting either here would be redundant with what the agent-side
1176
+ # dispatch table already does purely from `type="mock-author"`.
1057
1177
  # Escalated model per bounce iteration (None when pipeline
1058
1178
  # .escalate_fix_model is disabled — preserves today's no-model behaviour).
1059
1179
  # The board record keeps the alias for legibility; the wire payload is
@@ -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