code-coordinator 0.5.65__tar.gz → 0.5.66__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 (816) hide show
  1. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent_app.py +16 -6
  5. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/release.py +107 -2
  6. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy_units.py +92 -28
  7. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/timer_active.py +13 -3
  8. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/AGENT_OPERATIONS.md +23 -0
  9. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_deploy_units_endpoint.py +75 -6
  10. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_propagate.py +215 -0
  11. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_units_lane.py +142 -13
  12. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/cargo-test.yml +0 -0
  23. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/release-tui.yml +0 -0
  25. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/.gitignore +0 -0
  27. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/GOAL.md +0 -0
  29. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/LICENSE +0 -0
  30. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/README.md +0 -0
  32. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent.py +0 -0
  43. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/client.py +0 -0
  61. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/merge.py +0 -0
  76. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/milestone.py +0 -0
  77. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/plan_followup.py +0 -0
  78. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/plans.py +0 -0
  79. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/portal.py +0 -0
  80. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/report.py +0 -0
  81. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/review.py +0 -0
  82. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/scorecard.py +0 -0
  83. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/sessions.py +0 -0
  84. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/setup.py +0 -0
  85. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/status.py +0 -0
  86. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/terminal.py +0 -0
  87. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/test_gate.py +0 -0
  88. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/commands/tui.py +0 -0
  89. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/comments.py +0 -0
  90. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/config.py +0 -0
  91. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/conflict_fix.py +0 -0
  92. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dao.py +0 -0
  93. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/__init__.py +0 -0
  94. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/fixture.py +0 -0
  95. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/index.html +0 -0
  96. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/server.py +0 -0
  97. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/terminal.py +0 -0
  98. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/.gitignore +0 -0
  99. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/components.json +0 -0
  100. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  101. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  102. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  103. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  104. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  105. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  106. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  107. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  108. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  109. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/index.html +0 -0
  110. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  111. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/sw.js +0 -0
  112. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  113. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  114. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  115. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  116. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  117. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  118. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  119. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  120. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  121. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  122. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/eslint.config.js +0 -0
  123. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/index.html +0 -0
  124. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  125. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/package-lock.json +0 -0
  126. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/package.json +0 -0
  127. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  128. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/playwright.config.ts +0 -0
  129. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/postcss.config.js +0 -0
  130. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  131. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  132. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  133. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/App.tsx +0 -0
  134. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/client.ts +0 -0
  135. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  136. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  137. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  138. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  139. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  140. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  141. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  142. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  143. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  144. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  145. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  146. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  147. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  148. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  149. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  150. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  151. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  152. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  153. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  154. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  155. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  156. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  157. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  158. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  159. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  160. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  161. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  162. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  163. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  164. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  165. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  166. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  167. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  168. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  169. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  170. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/index.css +0 -0
  171. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  172. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  173. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/main.tsx +0 -0
  174. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  175. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  176. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  177. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  178. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  179. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  180. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  181. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  182. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  183. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  184. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  185. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  186. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  187. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  188. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  189. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  190. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  191. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  192. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  193. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  194. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  195. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  196. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  197. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tailwind.config.js +0 -0
  198. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.json +0 -0
  199. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  200. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dashboard/webapp/vite.config.ts +0 -0
  201. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/db.py +0 -0
  202. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dead_end.py +0 -0
  203. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/README.md +0 -0
  204. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-agent.service +0 -0
  205. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.service +0 -0
  206. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.sh +0 -0
  207. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-db-backup.timer +0 -0
  208. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.service +0 -0
  209. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-drive-queue.timer +0 -0
  210. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-notify.service +0 -0
  211. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-notify.timer +0 -0
  212. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.service +0 -0
  213. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-propagate.timer +0 -0
  214. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.service +0 -0
  215. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-release-window.timer +0 -0
  216. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-serve.service +0 -0
  217. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.service +0 -0
  218. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web-dist-build.timer +0 -0
  219. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy/coord-web.service +0 -0
  220. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deploy_manifest.py +0 -0
  221. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/deps.py +0 -0
  222. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/diagnose.py +0 -0
  223. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dispatch.py +0 -0
  224. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/dist_name.py +0 -0
  225. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive.py +0 -0
  226. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive_queue.py +0 -0
  227. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/drive_state.py +0 -0
  228. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/events.py +0 -0
  229. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/failure_class.py +0 -0
  230. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/filelock.py +0 -0
  231. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/fleet_config_health.py +0 -0
  232. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/freshness.py +0 -0
  233. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_a.py +0 -0
  234. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_b.py +0 -0
  235. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gate_snapshot.py +0 -0
  236. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/gates.py +0 -0
  237. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/github_ops.py +0 -0
  238. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/goal.py +0 -0
  239. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/graph_health.py +0 -0
  240. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/__init__.py +0 -0
  241. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/aggregate.py +0 -0
  242. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/__init__.py +0 -0
  243. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/agent_install.py +0 -0
  244. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/cargo_targets.py +0 -0
  245. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/claude_binary.py +0 -0
  246. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/deploy_lane_facts.py +0 -0
  247. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/disk.py +0 -0
  248. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_board.py +0 -0
  249. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  250. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_phantom.py +0 -0
  251. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/fleet_unit_drift.py +0 -0
  252. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/graph.py +0 -0
  253. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/plan_usage.py +0 -0
  254. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/repo_state.py +0 -0
  255. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/spawned_coord.py +0 -0
  256. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/toolchain.py +0 -0
  257. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/unit_drift.py +0 -0
  258. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/unit_enablement.py +0 -0
  259. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/checks/worktrees.py +0 -0
  260. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/cli.py +0 -0
  261. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/context.py +0 -0
  262. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/fleet_snapshot.py +0 -0
  263. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/models.py +0 -0
  264. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/pypi.py +0 -0
  265. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/registry.py +0 -0
  266. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/render.py +0 -0
  267. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/health/units.py +0 -0
  268. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/hooks.py +0 -0
  269. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/housekeeping.py +0 -0
  270. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/interactive.py +0 -0
  271. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/issue_store.py +0 -0
  272. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/liveness_auditor.py +0 -0
  273. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/machine_pause.py +0 -0
  274. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/merge_queue.py +0 -0
  275. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_chat.py +0 -0
  276. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_dispatch.py +0 -0
  277. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_gate.py +0 -0
  278. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/milestone_order.py +0 -0
  279. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/mock_author.py +0 -0
  280. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/models.py +0 -0
  281. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/network.py +0 -0
  282. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/new_issue_chat.py +0 -0
  283. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/__init__.py +0 -0
  284. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/baseline.py +0 -0
  285. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/cli.py +0 -0
  286. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/collect.py +0 -0
  287. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/digest.py +0 -0
  288. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/models.py +0 -0
  289. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/predicate.py +0 -0
  290. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/service.py +0 -0
  291. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/store.py +0 -0
  292. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notifier/transport.py +0 -0
  293. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/notify.py +0 -0
  294. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/openapi.py +0 -0
  295. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/overlap_fence.py +0 -0
  296. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/parentage.py +0 -0
  297. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/parentage_github.py +0 -0
  298. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/pipeline.py +0 -0
  299. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/plan_parser.py +0 -0
  300. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/plans.py +0 -0
  301. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/platform_paths.py +0 -0
  302. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/portal_bridge.py +0 -0
  303. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/pr_body_lint.py +0 -0
  304. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/prereqs.py +0 -0
  305. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/progress.py +0 -0
  306. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/__init__.py +0 -0
  307. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/base.py +0 -0
  308. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/claude.py +0 -0
  309. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/claude_pty.py +0 -0
  310. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/providers/opencode.py +0 -0
  311. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/reconcile.py +0 -0
  312. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/refine_chat.py +0 -0
  313. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_cordon.py +0 -0
  314. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_propagate.py +0 -0
  315. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_verify.py +0 -0
  316. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/release_window.py +0 -0
  317. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/reports.py +0 -0
  318. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/revalidate.py +0 -0
  319. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/review.py +0 -0
  320. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/scorecard.py +0 -0
  321. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/serve_app.py +0 -0
  322. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/skills/update-issue/SKILL.md +0 -0
  323. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/smoke.py +0 -0
  324. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/spend_ceiling.py +0 -0
  325. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/split_work.py +0 -0
  326. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/stage_projection.py +0 -0
  327. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/state.py +0 -0
  328. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_author.py +0 -0
  329. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_chat.py +0 -0
  330. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_orchestrator.py +0 -0
  331. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/test_report.py +0 -0
  332. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/tui_release.py +0 -0
  333. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage.py +0 -0
  334. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage_limits.py +0 -0
  335. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/usage_rollup.py +0 -0
  336. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coord/worker_events.py +0 -0
  337. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/coordinator.example.yml +0 -0
  338. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-agent.service +0 -0
  339. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.service +0 -0
  340. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.sh +0 -0
  341. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-db-backup.timer +0 -0
  342. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-drive-queue.service +0 -0
  343. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-drive-queue.timer +0 -0
  344. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-notify.service +0 -0
  345. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-notify.timer +0 -0
  346. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-propagate.service +0 -0
  347. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-propagate.timer +0 -0
  348. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-window.service +0 -0
  349. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-release-window.timer +0 -0
  350. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-serve.service +0 -0
  351. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.service +0 -0
  352. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.sh +0 -0
  353. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-dist-build.timer +0 -0
  354. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web-rollback.sh +0 -0
  355. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/coord-web.service +0 -0
  356. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/deploy/node-shim.sh +0 -0
  357. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ARCHITECTURE.md +0 -0
  358. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ARCH_SECURITY_GATES.md +0 -0
  359. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/COCKPIT.md +0 -0
  360. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CONTROL_CENTER.md +0 -0
  361. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CROSS_PLATFORM.md +0 -0
  362. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/CUSTOMER_PORTAL.md +0 -0
  363. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/DRIVE_QUEUE.md +0 -0
  364. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/EPHEMERAL_WORKERS.md +0 -0
  365. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/FORGE_MIGRATION.md +0 -0
  366. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/GRAPHIFY_SETUP.md +0 -0
  367. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ISSUE_GUIDANCE.md +0 -0
  368. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/MAC_MINI.md +0 -0
  369. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  370. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/NOTIFIER.md +0 -0
  371. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/OPENCODE_VERIFICATION.md +0 -0
  372. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/OPERATING_GOTCHAS.md +0 -0
  373. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/README.md +0 -0
  382. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/_tokens.css +0 -0
  383. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/issue-detail.html +0 -0
  384. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-narrow.html +0 -0
  385. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/docs/mocks/web/pipeline-wide.html +0 -0
  386. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/graphify-out/.gitignore +0 -0
  387. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/install-agent.sh +0 -0
  388. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/pyproject.toml +0 -0
  389. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/audit_review_verdict_overrides.py +0 -0
  390. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  391. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/build-worker-image.sh +0 -0
  392. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/coordinator-machine.py +0 -0
  393. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/epic-down.sh +0 -0
  394. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/epic-up.sh +0 -0
  395. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/preflight.sh +0 -0
  396. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/provision-worker.sh +0 -0
  397. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  398. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  399. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/azure-workers/verify-github-token.sh +0 -0
  400. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/codegen.py +0 -0
  401. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/coord-test-runner.sh +0 -0
  402. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/drive-batch.sh +0 -0
  403. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/gen_board_fixture.py +0 -0
  404. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/next_release_tag.py +0 -0
  405. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/run_tests_in_populated_home.sh +0 -0
  406. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/run_tests_without_gh.sh +0 -0
  407. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/smoke_437_interactive.py +0 -0
  408. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_878_review_capture.py +0 -0
  409. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_release_published.py +0 -0
  410. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/scripts/verify_release_wheel.py +0 -0
  411. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/setup.cfg +0 -0
  412. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/SMOKE_SET.md +0 -0
  413. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/__init__.py +0 -0
  414. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  415. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/contract.md +0 -0
  416. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/manifest.yml +0 -0
  417. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  418. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  419. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  420. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  421. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/conftest.py +0 -0
  422. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/contract.md +0 -0
  423. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/manifest.yml +0 -0
  424. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  425. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  426. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/contract.md +0 -0
  427. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/manifest.yml +0 -0
  428. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  429. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  430. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  431. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  432. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  433. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  434. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  435. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  436. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  437. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  438. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/contract.md +0 -0
  439. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  440. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  441. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/manifest.yml +0 -0
  442. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-51/tsconfig.json +0 -0
  444. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/conftest.py +0 -0
  446. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-basic.json +0 -0
  447. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  448. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  449. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  450. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/all_pass.json +0 -0
  451. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  452. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/mixed_fail.json +0 -0
  453. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  454. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  455. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/skip.json +0 -0
  456. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/playwright/truncated.json +0 -0
  457. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  458. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  459. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  460. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  461. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  462. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  463. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  464. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  465. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_acceptance.py +0 -0
  466. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_acceptance_drivers.py +0 -0
  467. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent.py +0 -0
  468. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_api_error.py +0 -0
  469. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_app.py +0 -0
  470. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_branch_base.py +0 -0
  471. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_branch_capture.py +0 -0
  472. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_config_free_1712.py +0 -0
  473. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_dirty_worktree.py +0 -0
  474. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_graph_self_heal.py +0 -0
  475. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_health_h3.py +0 -0
  476. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_idle_restart.py +0 -0
  477. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_push_failure.py +0 -0
  478. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_reap.py +0 -0
  479. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_repos_and_pull.py +0 -0
  480. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_restart_services_endpoint.py +0 -0
  481. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_startup_diagnostics.py +0 -0
  482. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_update.py +0 -0
  483. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_update_bluegreen.py +0 -0
  484. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_usage_limit.py +0 -0
  485. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_agent_zero_commit.py +0 -0
  486. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ambient_home_isolation.py +0 -0
  487. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_approve_reject_plan.py +0 -0
  488. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_approve_usage_gate.py +0 -0
  489. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_assignment_already_recorded_daemon.py +0 -0
  490. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_log.py +0 -0
  491. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_outcome.py +0 -0
  492. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_audit_query.py +0 -0
  493. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_auto_loop.py +0 -0
  494. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_auto_release_publish_2035.py +0 -0
  495. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_base_checkout_restore.py +0 -0
  496. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_cap_762.py +0 -0
  497. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_fixture.py +0 -0
  498. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_read_path.py +0 -0
  499. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_service.py +0 -0
  500. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_state.py +0 -0
  501. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_board_wire.py +0 -0
  502. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_brain.py +0 -0
  503. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_branch_model.py +0 -0
  504. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_bug_intake.py +0 -0
  505. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_build_worker_image_env_update.py +0 -0
  506. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cargo_cache.py +0 -0
  507. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ci_acceptance_gate_1950.py +0 -0
  508. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_ci_store.py +0 -0
  509. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_claim.py +0 -0
  510. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_acceptance.py +0 -0
  511. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign.py +0 -0
  512. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  513. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_interactive_remote.py +0 -0
  514. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_assign_provider.py +0 -0
  515. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_audit.py +0 -0
  516. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_chat_continue.py +0 -0
  517. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_diagnose_config_provenance.py +0 -0
  518. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_diagnose_graph.py +0 -0
  519. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor.py +0 -0
  520. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_free_1801.py +0 -0
  521. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  522. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_drive.py +0 -0
  523. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_drive_queue.py +0 -0
  524. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_escalate.py +0 -0
  525. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_fix_headless_review.py +0 -0
  526. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_gate_a.py +0 -0
  527. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_install_drift.py +0 -0
  528. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_install_skills.py +0 -0
  529. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_issue_create_label.py +0 -0
  530. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_issue_reopen.py +0 -0
  531. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_merge.py +0 -0
  532. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_assign.py +0 -0
  533. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_capture.py +0 -0
  534. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_chat_add_child.py +0 -0
  535. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_dispatch.py +0 -0
  536. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_b.py +0 -0
  537. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_gate_c.py +0 -0
  538. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_order.py +0 -0
  539. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  540. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_milestone_ship.py +0 -0
  541. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_network.py +0 -0
  542. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_new_issue_chat.py +0 -0
  543. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_plans.py +0 -0
  544. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_portal.py +0 -0
  545. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_pull_artifact.py +0 -0
  546. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_queue.py +0 -0
  547. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_reattach_sessions.py +0 -0
  548. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_refine_board.py +0 -0
  549. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_preflight.py +0 -0
  550. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_release_window.py +0 -0
  551. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_scorecard.py +0 -0
  552. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_set_review_findings.py +0 -0
  553. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_advisory_terminal.py +0 -0
  554. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_merge_queue.py +0 -0
  555. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_provider.py +0 -0
  556. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_review_finalizing.py +0 -0
  557. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_test_failed_tag.py +0 -0
  558. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_status_usage_limit.py +0 -0
  559. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_sync_comments_873.py +0 -0
  560. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_test_plan.py +0 -0
  561. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_track.py +0 -0
  562. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_tui_update.py +0 -0
  563. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cli_wait.py +0 -0
  564. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_client_base_install.py +0 -0
  565. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_comments.py +0 -0
  566. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_completion_summary.py +0 -0
  567. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config.py +0 -0
  568. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_acceptance.py +0 -0
  569. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_audit.py +0 -0
  570. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_pricing.py +0 -0
  571. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_config_usage_gate.py +0 -0
  572. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_conflict_fix.py +0 -0
  573. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_conflict_fix_semantic.py +0 -0
  574. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test.py +0 -0
  575. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_baseline.py +0 -0
  576. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_routing.py +0 -0
  577. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_test_runner_toolchain.py +0 -0
  578. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coord_web_sse_restart_live.py +0 -0
  579. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_coordinator_machine.py +0 -0
  580. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_cross_platform_imports.py +0 -0
  581. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard.py +0 -0
  582. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_fixture.py +0 -0
  583. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_terminal.py +0 -0
  584. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dashboard_terminal_live.py +0 -0
  585. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_db.py +0 -0
  586. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dead_end.py +0 -0
  587. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_db_backup.py +0 -0
  588. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_dist.py +0 -0
  589. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_coord_web_rollback.py +0 -0
  590. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_drive_queue_unit.py +0 -0
  591. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_manifest.py +0 -0
  592. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deploy_web_unit.py +0 -0
  593. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_deps.py +0 -0
  594. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_diagnose.py +0 -0
  595. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dispatch.py +0 -0
  596. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dispatch_target_validation.py +0 -0
  597. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_dist_name.py +0 -0
  598. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_done_housekeeping.py +0 -0
  599. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive.py +0 -0
  600. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_queue.py +0 -0
  601. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_state.py +0 -0
  602. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_drive_tmux.py +0 -0
  603. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_capability_detection.py +0 -0
  604. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  605. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_epic_up_image_provenance.py +0 -0
  606. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_errors.py +0 -0
  607. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_events.py +0 -0
  608. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_failure_class.py +0 -0
  609. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_filelock.py +0 -0
  610. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  611. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fix_of_force_override.py +0 -0
  612. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_config_health.py +0 -0
  613. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_health_probes.py +0 -0
  614. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_fleet_health_snapshot.py +0 -0
  615. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_freshness.py +0 -0
  616. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_a.py +0 -0
  617. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_b.py +0 -0
  618. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gate_snapshot_staleness.py +0 -0
  619. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_gates.py +0 -0
  620. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_goal.py +0 -0
  623. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_graph_health.py +0 -0
  624. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_handoff.py +0 -0
  625. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_checks.py +0 -0
  626. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_cli.py +0 -0
  627. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_cli_graph.py +0 -0
  628. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_config.py +0 -0
  629. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_context.py +0 -0
  630. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_deploy_lane_facts.py +0 -0
  631. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_incident_regression.py +0 -0
  632. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_pypi.py +0 -0
  633. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_registry.py +0 -0
  634. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_timer_active.py +0 -0
  635. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_toolchain.py +0 -0
  636. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_unit_drift.py +0 -0
  637. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_health_unit_enablement.py +0 -0
  638. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_hooks.py +0 -0
  639. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_human_attended_437.py +0 -0
  640. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_init.py +0 -0
  641. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_integration.py +0 -0
  642. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_briefing_echo.py +0 -0
  643. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_prefill_state.py +0 -0
  644. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_session_relaunch.py +0 -0
  645. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_test_verdict_backstop.py +0 -0
  646. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_token_attribution.py +0 -0
  647. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_interactive_worktree.py +0 -0
  648. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_issue_store_seam.py +0 -0
  649. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_liveness_auditor.py +0 -0
  650. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_liveness_notify.py +0 -0
  651. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_machine_pause.py +0 -0
  652. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_merge_queue.py +0 -0
  653. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_merge_verify.py +0 -0
  654. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_chat.py +0 -0
  655. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_dispatch.py +0 -0
  656. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_gate.py +0 -0
  657. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_order.py +0 -0
  658. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_milestone_seam.py +0 -0
  659. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_mock_author.py +0 -0
  660. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_model_tiering.py +0 -0
  661. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_models.py +0 -0
  662. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_models_config_labels.py +0 -0
  663. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_needs_attention.py +0 -0
  664. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_network.py +0 -0
  665. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_new_issue_chat.py +0 -0
  666. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_next_release_tag.py +0 -0
  667. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_no_direct_gh_calls.py +0 -0
  668. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_node_shim.py +0 -0
  669. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_baseline.py +0 -0
  670. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_cli.py +0 -0
  671. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_collect.py +0 -0
  672. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_config.py +0 -0
  673. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_drive_seam.py +0 -0
  674. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_isolation.py +0 -0
  675. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_predicate.py +0 -0
  676. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_quiet_hours.py +0 -0
  677. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notifier_service.py +0 -0
  678. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notify.py +0 -0
  679. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_notify_drain.py +0 -0
  680. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_openapi.py +0 -0
  681. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_operational_defaults.py +0 -0
  682. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_overlap_fence.py +0 -0
  683. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_packaged_deploy_units.py +0 -0
  684. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_parentage.py +0 -0
  685. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_paste_landed.py +0 -0
  686. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_pipeline.py +0 -0
  687. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_approve_plan_command.py +0 -0
  688. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_pr_command.py +0 -0
  689. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_followup_review_command.py +0 -0
  690. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_only.py +0 -0
  691. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_plan_parser.py +0 -0
  692. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_platform_paths.py +0 -0
  693. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_portal_bridge.py +0 -0
  694. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_portal_config.py +0 -0
  695. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_pr_body_lint.py +0 -0
  696. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_prereqs.py +0 -0
  697. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_production_db_guard.py +0 -0
  698. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_progress.py +0 -0
  699. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_provider_seam.py +0 -0
  700. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers.py +0 -0
  701. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers_config_labels.py +0 -0
  702. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_providers_pty.py +0 -0
  703. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_quiet_hours_store_2146.py +0 -0
  705. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reap_merged_sessions.py +0 -0
  706. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reap_stale_interactive_tick.py +0 -0
  707. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_merges.py +0 -0
  710. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_propagate.py +0 -0
  714. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_verify.py +0 -0
  716. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_release_window.py +0 -0
  717. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_remote_auto_prune.py +0 -0
  718. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_remote_interactive_reaper.py +0 -0
  719. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_report_result_push.py +0 -0
  720. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_reports.py +0 -0
  721. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_serve.py +0 -0
  737. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_serve_app_board_trim.py +0 -0
  738. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_session.py +0 -0
  739. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_slice_issue_attribution.py +0 -0
  740. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke.py +0 -0
  741. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke_live_checkout_restore.py +0 -0
  742. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_smoke_workflow.py +0 -0
  743. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_spend_ceiling.py +0 -0
  744. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_spend_ceiling_coordinator.py +0 -0
  745. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_split.py +0 -0
  746. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_split_work.py +0 -0
  747. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stage_projection.py +0 -0
  748. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stalled_pipeline.py +0 -0
  749. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_state.py +0 -0
  750. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_state_review_findings_daemon.py +0 -0
  751. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_status_fleet_footer.py +0 -0
  752. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stop_1567.py +0 -0
  753. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_stuck.py +0 -0
  754. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_terminal_command.py +0 -0
  755. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_author.py +0 -0
  756. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_chat.py +0 -0
  757. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_orchestrator.py +0 -0
  758. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_report.py +0 -0
  759. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_verdict_parsing.py +0 -0
  760. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_test_verdict_transcript_floor.py +0 -0
  761. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_board_audit.py +0 -0
  762. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_config_load_1080.py +0 -0
  763. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_thin_client_daemon_routing_906.py +0 -0
  764. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_tmux_host.py +0 -0
  765. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_tmux_session.py +0 -0
  766. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage.py +0 -0
  768. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage_limits.py +0 -0
  769. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_usage_rollup.py +0 -0
  770. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_venv_live_install_2121.py +0 -0
  771. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_version_single_source.py +0 -0
  772. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_watch.py +0 -0
  773. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_events.py +0 -0
  774. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_image_pin_sync.py +0 -0
  775. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_safety.py +0 -0
  776. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worker_test_scoping.py +0 -0
  777. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worktree.py +0 -0
  778. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  779. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/Cargo.lock +0 -0
  780. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/Cargo.toml +0 -0
  781. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/cargo-config-local-quadraui.toml.example +0 -0
  782. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/audit.rs +0 -0
  783. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/chat.rs +0 -0
  784. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/data.rs +0 -0
  785. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/dialogs.rs +0 -0
  786. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/drive.rs +0 -0
  787. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/drive_queue.rs +0 -0
  788. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/escalation.rs +0 -0
  789. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/events.rs +0 -0
  790. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fixtures.rs +0 -0
  791. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_health.rs +0 -0
  792. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_sessions.rs +0 -0
  793. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/fleet_terminals.rs +0 -0
  794. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/format.rs +0 -0
  795. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/milestone_dag.rs +0 -0
  796. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/mod.rs +0 -0
  797. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/msv.rs +0 -0
  798. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/pipeline.rs +0 -0
  799. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/plans.rs +0 -0
  800. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/render.rs +0 -0
  801. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/reports.rs +0 -0
  802. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/sessions.rs +0 -0
  803. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/settings_ui.rs +0 -0
  804. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/sidebar.rs +0 -0
  805. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/terminal.rs +0 -0
  806. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/tests.rs +0 -0
  807. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/types.rs +0 -0
  808. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/app/workspace.rs +0 -0
  809. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/bin/gtk.rs +0 -0
  810. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/commands.rs +0 -0
  811. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/lib.rs +0 -0
  812. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/main.rs +0 -0
  813. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/src/settings.rs +0 -0
  814. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/tests/acceptance.rs +0 -0
  815. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/tui/tests/cli.rs +0 -0
  816. {code_coordinator-0.5.65 → code_coordinator-0.5.66}/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.65
3
+ Version: 0.5.66
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.65
3
+ Version: 0.5.66
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,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.65",
2
+ "tag": "0.5.66",
3
3
  "distance": 0,
4
- "node": "g58dde32efe3e0c9e230599f9c2fa0eeb9f41671a",
4
+ "node": "g2a4b596d92f5df37f20c5e4da4b887658112a74f",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -1463,13 +1463,23 @@ def build_app(
1463
1463
  installed, and keeps a ``.bak`` of each — see
1464
1464
  :mod:`coord.deploy_units` for why both are deliberate.
1465
1465
 
1466
- Also asserts every installed *timer* is enabled and running
1466
+ Also asserts every installed *timer* is enabled
1467
1467
  (:func:`coord.deploy_units.enable_timers`, #2082): refreshing a
1468
1468
  timer's content has never implied enabling it, and that gap is
1469
1469
  exactly how ``coord-release-propagate.timer`` reached this host with
1470
1470
  matching content and sat disabled for a day with nothing noticing.
1471
- ``enable --now`` is idempotent, so this runs on every call, not just
1472
- when content changed — an already-enabled timer is untouched.
1471
+ This runs on every non-dry-run call, not just when content changed —
1472
+ an already-enabled timer's *enablement* is untouched (idempotent).
1473
+
1474
+ It does **not**, as of #2124, force a start (``--now``) on a timer
1475
+ that is already enabled: that used to restart a timer an operator
1476
+ had deliberately stopped moments earlier — the exact window the
1477
+ documented manual-roll sequence exists to create — because ``enable
1478
+ --now`` cannot tell "never enabled" (#2082's actual bug) apart from
1479
+ "enabled, but stopped on purpose" (never a bug at all). See
1480
+ :func:`coord.deploy_units.enable_timers` for how it now tells the
1481
+ two apart, and ``timers_enabled[<unit>]["changed"]`` below for
1482
+ which case each timer landed in.
1473
1483
  """
1474
1484
  from coord import deploy_units as du # noqa: PLC0415
1475
1485
  from coord.brain import AGENT_PORT # noqa: PLC0415
@@ -1504,10 +1514,10 @@ def build_app(
1504
1514
  if not dry_run:
1505
1515
  timer_results = du.enable_timers(report)
1506
1516
  payload["timers_enabled"] = {
1507
- name: {"ok": ok, "detail": detail}
1508
- for name, (ok, detail) in timer_results.items()
1517
+ name: {"ok": ok, "changed": changed, "detail": detail}
1518
+ for name, (ok, changed, detail) in timer_results.items()
1509
1519
  }
1510
- if any(not ok for ok, _ in timer_results.values()):
1520
+ if any(not ok for ok, _changed, _detail in timer_results.values()):
1511
1521
  payload["ok"] = False
1512
1522
  return JSONResponse(payload, status_code=200 if payload.get("ok") else 500)
1513
1523
 
@@ -16,6 +16,7 @@ via setuptools-scm). It does not push, tag, or modify anything itself.
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ import re
19
20
  import subprocess
20
21
  import sys
21
22
  from pathlib import Path
@@ -1339,7 +1340,26 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
1339
1340
  Returns ``ok=None`` when this host offers no channel for the lane at all
1340
1341
  (see :func:`_roll_tui` and #2052): the run is not accountable for a lane
1341
1342
  it was structurally unable to roll.
1343
+
1344
+ Also names every timer whose *enablement* state this call changed
1345
+ (#2124 item 3) — and, separately, every timer it deliberately left
1346
+ alone because it was already enabled (see
1347
+ :func:`coord.deploy_units.enable_timers`) — so "the queue came back
1348
+ mid-roll" (or, after this fix, "it didn't") is legible in this output
1349
+ rather than reconstructed afterwards from journal timestamps.
1350
+
1351
+ ``ok`` (#2124 review) reflects every way ``agent_app.py``'s
1352
+ ``deploy_units`` endpoint can fail, not just a failed timer: a unit
1353
+ whose install itself failed (``action == "failed"`` — e.g. an unreadable
1354
+ installed unit file, :mod:`coord.deploy_units` lines ~249/264/284), a
1355
+ top-level ``error``, or a ``daemon-reload`` that was attempted and
1356
+ failed. Before this check existed, ``ok`` was derived from
1357
+ ``failed_timers`` alone, so any of those three could return HTTP 500
1358
+ with ``payload["ok"]=False`` and still be recorded here as a green
1359
+ lane — exactly the "unconfirmed success" defect #2096 exists to catch.
1342
1360
  """
1361
+ from coord.deploy_units import ACTION_FAILED # noqa: PLC0415
1362
+
1343
1363
  status, body, error = _post(
1344
1364
  f"http://{machine.host}:{agent_port}/deploy-units", {}, timeout=30.0
1345
1365
  )
@@ -1352,11 +1372,24 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
1352
1372
  # gate to revert everything else this run got right (#2052).
1353
1373
  return None, ("agent has no /deploy-units yet (predates #1835) — "
1354
1374
  "the next propagation will roll this lane")
1355
- if status != 200:
1375
+ # The endpoint (`agent_app.py`'s `deploy_units`) returns HTTP 500 — with
1376
+ # the SAME body shape as 200 — whenever a daemon-reload or a single
1377
+ # timer's enablement fails. That is exactly the partial-failure path
1378
+ # this function exists to narrate in detail, so a 500 *with a `units`
1379
+ # body* must still be parsed below rather than treated as opaque. A 500
1380
+ # WITHOUT a `units` body is a different, genuinely-unexpected failure
1381
+ # (an unhandled exception, a proxy error, ...) and must still
1382
+ # short-circuit, or a real crash would be misread as "nothing to
1383
+ # report" / a false-positive success.
1384
+ if status != 200 and not (status == 500 and "units" in body):
1356
1385
  return False, str(body.get("error") or body.get("summary") or f"HTTP {status}")
1357
1386
  units = body.get("units") or []
1358
1387
  changed = [u.get("name") for u in units if u.get("action") == "updated"]
1359
1388
  new = [u.get("name") for u in units if u.get("action") == "new"]
1389
+ failed_units = {
1390
+ (u.get("name") or "?"): (u.get("detail") or "?")
1391
+ for u in units if u.get("action") == ACTION_FAILED
1392
+ }
1360
1393
  parts = []
1361
1394
  parts.append(f"{len(changed)} unit(s) refreshed" if changed else "units already current")
1362
1395
  if body.get("reloaded"):
@@ -1366,7 +1399,79 @@ def _roll_units(machine, *, agent_port: int) -> tuple[bool | None, str]:
1366
1399
  f"{len(new)} packaged unit(s) NOT installed here ({', '.join(sorted(map(str, new)))}) "
1367
1400
  "— a release does not decide which services a host runs"
1368
1401
  )
1369
- return True, "; ".join(parts)
1402
+ if failed_units:
1403
+ parts.append(
1404
+ "FAILED to install unit(s): "
1405
+ + ", ".join(f"{u} ({detail})" for u, detail in sorted(failed_units.items()))
1406
+ )
1407
+
1408
+ # A daemon-reload is only attempted when a unit's bytes actually
1409
+ # changed (`agent_app.py`'s `deploy_units`); "not reloaded" is a
1410
+ # failure only when the report itself says a reload was attempted
1411
+ # (`body["changed"]`, `InstallReport.changed`) — absent that, "not
1412
+ # reloaded" just means there was nothing to reload, never a failure.
1413
+ reload_failed = bool(body.get("changed")) and not body.get("reloaded")
1414
+ if reload_failed:
1415
+ parts.append(
1416
+ "daemon-reload FAILED: " + str(body.get("reload_detail") or "?")
1417
+ )
1418
+
1419
+ top_level_error = body.get("error")
1420
+ if top_level_error:
1421
+ parts.append(f"deploy-units error: {top_level_error}")
1422
+
1423
+ timers = body.get("timers_enabled") or {}
1424
+ started = sorted(
1425
+ name for name, r in timers.items()
1426
+ if isinstance(r, dict) and r.get("ok") and r.get("changed")
1427
+ )
1428
+ # Held timers (confirmed already-enabled, left alone) split on the
1429
+ # confirmed `ActiveState` carried in `enable_timers`'s own detail text
1430
+ # (coord/deploy_units.py's `already enabled (ActiveState=...)` branch)
1431
+ # — NOT on `changed` alone, which is equally true for the #2124 case
1432
+ # (operator stopped it) and for the routine, overwhelmingly common case
1433
+ # of a timer that was never touched because it is already enabled AND
1434
+ # already running. Reporting "left stopped as-is" for the latter names
1435
+ # a state (stopped) this call never confirmed — the #2124 review's
1436
+ # reporting-accuracy fix.
1437
+ held_stopped = []
1438
+ held_other = []
1439
+ for name, r in timers.items():
1440
+ if not (isinstance(r, dict) and r.get("ok") and not r.get("changed")):
1441
+ continue
1442
+ match = re.search(r"ActiveState=(\w+)", r.get("detail") or "")
1443
+ if match and match.group(1) == "inactive":
1444
+ held_stopped.append(name)
1445
+ else:
1446
+ held_other.append(name)
1447
+ held_stopped.sort()
1448
+ held_other.sort()
1449
+ failed_timers = {
1450
+ name: (r.get("detail") or "?")
1451
+ for name, r in timers.items() if isinstance(r, dict) and not r.get("ok")
1452
+ }
1453
+ if started:
1454
+ parts.append(f"enabled timer(s): {', '.join(started)}")
1455
+ if held_stopped:
1456
+ # Confirmed inactive (ActiveState=inactive) and deliberately left
1457
+ # alone — the #2124 fix in one word: a timer an operator stopped is
1458
+ # still here.
1459
+ parts.append(
1460
+ f"left stopped as-is (already enabled, #2124): {', '.join(held_stopped)}"
1461
+ )
1462
+ if held_other:
1463
+ # Already enabled and left alone, but NOT confirmed stopped — most
1464
+ # commonly a timer that is already enabled and already running
1465
+ # normally. Reported distinctly so it never gets read as "the
1466
+ # timer I stopped is still stopped" for a timer nobody stopped.
1467
+ parts.append(f"already enabled (unchanged): {', '.join(held_other)}")
1468
+ if failed_timers:
1469
+ parts.append(
1470
+ "FAILED to enable timer(s): "
1471
+ + ", ".join(f"{u} ({detail})" for u, detail in sorted(failed_timers.items()))
1472
+ )
1473
+ ok = not (failed_units or reload_failed or top_level_error or failed_timers)
1474
+ return ok, "; ".join(parts)
1370
1475
 
1371
1476
 
1372
1477
  def _roll_tui(
@@ -65,6 +65,13 @@ from coord.health.checks.unit_drift import (
65
65
  packaged_unit_dir,
66
66
  )
67
67
 
68
+ # Same reuse rule as above, one module over: `timer_active` is the DETECTOR
69
+ # for "is this timer actually enabled" (#2082); `enable_timers` below is the
70
+ # FIXER for the identical question (#2124). Querying state through its own
71
+ # `_timer_states` — rather than a second `systemctl --user show` parser here
72
+ # — is what keeps those two answers from being able to drift apart.
73
+ from coord.health.checks.timer_active import _INACTIVE_STATES, _timer_states
74
+
68
75
  #: Placeholder -> how to fill it, given the host facts we actually know.
69
76
  #: ``unit_drift`` renders these as *shell* text for a copy-pasteable remedy
70
77
  #: (``$(hostname -s)``); here they must be real values, so the mapping is
@@ -326,45 +333,102 @@ _PRESENT_ACTIONS = frozenset({ACTION_UNCHANGED, ACTION_UPDATED})
326
333
 
327
334
  def enable_timers(
328
335
  report: InstallReport, *, runner=None, timeout: float = 30.0,
329
- ) -> dict[str, tuple[bool, str]]:
330
- """``systemctl --user enable --now <unit>`` for every installed timer in
331
- *report* (#2082).
336
+ ) -> dict[str, tuple[bool, bool, str]]:
337
+ """Assert every installed timer in *report* is *enabled* (#2082)
338
+ without forcing a *stopped* one back to running (#2124).
332
339
 
333
340
  #2082: ``coord-release-propagate.timer`` reached three hosts'
334
341
  ``~/.config/systemd/user/`` and sat there — :func:`install_units`
335
342
  refreshed its *content* on every release, but nothing ever ran
336
- ``enable --now`` on it, and nothing noticed because a disabled timer's
337
- file looks byte-for-byte identical to an active one's (see
338
- :mod:`coord.health.checks.timer_active`, the detector for exactly this).
339
-
340
- A ``.timer`` unit is different from a ``.service`` here: which
341
- *services* a host runs is a one-time topology choice
342
- (``install-agent.sh``, or a human at machine setup see this module's
343
- docstring), never something a routine refresh should override. A timer
344
- that exists at all has no reason to exist disabled — its whole job is to
345
- fire on a schedule with nobody watching, so "installed but not enabled"
346
- is invisible from the outside and would otherwise self-heal never.
347
- Applying this on every deploy makes enablement an assertion this lane
348
- re-checks every time it runs, the same way :func:`install_units`
349
- re-asserts content every time it runs.
350
-
351
- Both ``enable`` and ``--now`` are idempotent — an already-enabled,
352
- already-active timer is untouched so calling this on every deploy is a
353
- correctness check, not a state change, in the common case. Scoped to
354
- units *this* report found actually installed (:data:`_PRESENT_ACTIONS`),
355
- matching the deploy step's own "only touch what this host already runs"
356
- rule.
343
+ ``systemctl --user enable`` on it, and nothing noticed because a
344
+ disabled timer's file looks byte-for-byte identical to an active one's
345
+ (see :mod:`coord.health.checks.timer_active`, the detector for exactly
346
+ this). The fix that shipped for #2082 was ``enable --now`` on every
347
+ installed timer, every deploy and ``--now`` is the collision #2124
348
+ reports: it also **starts** a timer an operator deliberately stopped,
349
+ five minutes earlier, to create the very quiescence window the deploy
350
+ calling this function is running inside of. The daemon host rolls
351
+ first, so that operator's window closes mid-roll, not after it.
352
+
353
+ #2082 and #2124 turn out to be two different questions systemd already
354
+ answers separately, and this function's whole fix is asking the right
355
+ one of them *first*:
356
+
357
+ * **Persistent enablement** (``UnitFileState`` — ``enabled`` vs.
358
+ ``disabled``/``linked``/``masked``, :data:`_INACTIVE_STATES`) is what
359
+ #2082 was actually missing. It is a one-time fact that only becomes
360
+ false again if something explicitly disables the unit ``systemctl
361
+ --user stop`` never touches it.
362
+ * **Current run state** (``ActiveState``) is what an operator's
363
+ deliberate ``stop`` changes, and it is *never* this function's business
364
+ to override: a timer already carrying ``UnitFileState=enabled`` has
365
+ already had its #2082 assertion satisfied by some earlier deploy (or
366
+ this one), so nothing here re-starts it. ``enable`` alone is not even
367
+ called in that case — no subprocess invocation touches the unit at
368
+ all, so there is no risk of this idempotent-by-design call itself
369
+ having a side effect an operator did not ask for.
370
+
371
+ So: a timer whose queried ``UnitFileState`` is *not* one of
372
+ :data:`_INACTIVE_STATES` is left completely alone, whatever its
373
+ ``ActiveState`` — that is the acceptance case "a timer stopped by an
374
+ operator is still down after a deploy". A timer that *is* in one of
375
+ those states (never enabled at all, or masked) is the actual #2082
376
+ defect and gets ``enable --now`` exactly as before — there is no
377
+ operator intent to preserve for a timer that has never run, and leaving
378
+ it disabled is the invisible-self-heals-never failure #2082 closed.
379
+
380
+ State is queried once, in a single batched ``systemctl --user show``
381
+ (:func:`coord.health.checks.timer_active._timer_states` — the same
382
+ query the detector itself uses, so the detector and this fixer cannot
383
+ silently disagree about what "enabled" means), scoped to units *this*
384
+ report found actually installed (:data:`_PRESENT_ACTIONS`), matching the
385
+ deploy step's own "only touch what this host already runs" rule.
386
+
387
+ Returns ``{unit: (ok, changed, detail)}``. ``changed`` is true only when
388
+ this call is confirmed to have moved the unit's state — never true for
389
+ the "already enabled, left alone" branch (no subprocess call was made to
390
+ confirm anything), and never true for a failed ``enable --now`` either
391
+ (an attempt that failed is not a confirmed change) — the deploy's
392
+ caller uses this to name, precisely, which timers it actually touched
393
+ (#2124 item 3) rather than reporting a state it did not confirm.
357
394
  """
358
395
  import subprocess # noqa: PLC0415
359
396
 
360
397
  run = runner or subprocess.run
361
- out: dict[str, tuple[bool, str]] = {}
398
+ out: dict[str, tuple[bool, bool, str]] = {}
362
399
  timers = sorted(
363
400
  u.name
364
401
  for u in report.units
365
402
  if u.name.endswith(".timer") and u.action in _PRESENT_ACTIONS
366
403
  )
404
+ if not timers:
405
+ return out
406
+
407
+ states = _timer_states(tuple(timers), runner=run, timeout=timeout)
408
+
367
409
  for name in timers:
410
+ fields = states.get(name) or {}
411
+ file_state = fields.get("UnitFileState", "")
412
+ if file_state and file_state not in _INACTIVE_STATES:
413
+ # Already enabled (#2082's assertion already holds for this
414
+ # unit) — leave its run state exactly as it is. No systemctl
415
+ # call at all, so the report below can only ever say what was
416
+ # actually queried, never what this call assumed.
417
+ active = fields.get("ActiveState") or "unknown"
418
+ out[name] = (
419
+ True,
420
+ False,
421
+ f"already enabled (ActiveState={active}) — left its current "
422
+ "run state alone; a timer an operator stopped stays stopped "
423
+ "across a deploy (#2124)",
424
+ )
425
+ continue
426
+
427
+ # Never enabled at all — disabled/linked/masked, or unreadable (no
428
+ # systemd, or the batched query above failed and this unit simply
429
+ # has no entry). This is the actual #2082 defect: no operator ever
430
+ # ran `stop` on a timer that was never running, so forcing a start
431
+ # here has no operator intent to override.
368
432
  try:
369
433
  proc = run(
370
434
  ["systemctl", "--user", "enable", "--now", name],
@@ -373,12 +437,12 @@ def enable_timers(
373
437
  timeout=timeout,
374
438
  )
375
439
  except FileNotFoundError:
376
- out[name] = (False, "systemctl not found (no systemd on this host)")
440
+ out[name] = (False, False, "systemctl not found (no systemd on this host)")
377
441
  continue
378
442
  except Exception as exc: # noqa: BLE001 — must never crash a deploy
379
- out[name] = (False, f"{type(exc).__name__}: {exc}")
443
+ out[name] = (False, False, f"{type(exc).__name__}: {exc}")
380
444
  continue
381
445
  ok = getattr(proc, "returncode", 1) == 0
382
446
  detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
383
- out[name] = (ok, detail or ("enabled" if ok else "enable failed"))
447
+ out[name] = (ok, ok, detail or ("enabled" if ok else "enable failed"))
384
448
  return out
@@ -65,7 +65,9 @@ _INACTIVE_STATES = frozenset(
65
65
  )
66
66
 
67
67
 
68
- def _timer_states(units: tuple[str, ...]) -> dict[str, dict[str, str]]:
68
+ def _timer_states(
69
+ units: tuple[str, ...], *, runner=None, timeout: float = _SYSTEMCTL_TIMEOUT,
70
+ ) -> dict[str, dict[str, str]]:
69
71
  """One ``systemctl --user show`` call for every timer in *units*.
70
72
 
71
73
  Batched into a single subprocess the same way
@@ -74,6 +76,13 @@ def _timer_states(units: tuple[str, ...]) -> dict[str, dict[str, str]]:
74
76
  subprocess, not N. Returns ``{}`` when there is no systemd on this host
75
77
  (macOS, a container, a thin client) — that is "no data", handled by the
76
78
  caller, not a crash.
79
+
80
+ *runner*/*timeout* are injectable (default: ``subprocess.run`` and this
81
+ module's own budget) so :mod:`coord.deploy_units` can reuse this exact
82
+ query — rather than re-implementing "is this timer already enabled" a
83
+ second time — for its own ``enable --now`` vs. leave-it-alone decision
84
+ (#2124). Two independent readings of the same systemd state is how a
85
+ detector and its fixer end up disagreeing about what "enabled" means.
77
86
  """
78
87
  if not units:
79
88
  return {}
@@ -88,12 +97,13 @@ def _timer_states(units: tuple[str, ...]) -> dict[str, dict[str, str]]:
88
97
  "--property=SubState",
89
98
  *units,
90
99
  ]
100
+ run = runner or subprocess.run
91
101
  try:
92
- proc = subprocess.run(
102
+ proc = run(
93
103
  argv,
94
104
  capture_output=True,
95
105
  text=True,
96
- timeout=_SYSTEMCTL_TIMEOUT,
106
+ timeout=timeout,
97
107
  check=False,
98
108
  )
99
109
  except (OSError, subprocess.SubprocessError):
@@ -760,6 +760,29 @@ coord release propagate --daemon-host dellserver
760
760
  systemctl --user start coord-drive-queue.timer
761
761
  ```
762
762
 
763
+ **#2124 (fixed 2026-08-13):** step 3 used to undo step 1. `coord release
764
+ propagate`'s own `deploy/**` lane (`POST /deploy-units`) asserts every
765
+ installed timer is enabled (#2082 — a *different* bug: a timer nobody ever
766
+ ran `systemctl --user enable` on at all). #2082's fix was `enable --now`,
767
+ and `--now` **starts** a timer unconditionally — so step 3 restarted the
768
+ timer step 1 had just stopped, on dellserver first (the daemon-leads
769
+ invariant), while precision and elitebook were still mid-roll: the exact
770
+ gap this sequence exists to hold open. `enable` and `--now` are idempotent,
771
+ so this was invisible for every roll where nobody had deliberately stopped
772
+ a timer, and only bit the one sequence documented above.
773
+
774
+ Fixed: `coord.deploy_units.enable_timers` now asks systemd whether a timer
775
+ is already enabled *before* deciding what to do. `systemctl --user stop`
776
+ never changes a unit's persistent enablement, only its current run state —
777
+ so a timer already `enabled` is left exactly as it is, whatever its run
778
+ state, and only a timer that was never enabled at all still gets `enable
779
+ --now`. Reaching for `systemctl --user mask` instead of `stop` is no longer
780
+ necessary; the sequence above is safe to run literally as written. The
781
+ `deploy/**` lane's own output now names which timers it started and which
782
+ it left alone (`coord release propagate`'s per-lane line for this host), so
783
+ "did step 3 leave my stopped timer alone" is directly checkable in the run
784
+ output rather than something to reconstruct from journal timestamps.
785
+
763
786
  **#2110 (fixed 2026-08-11):** stopping the timer used to deadlock this
764
787
  sequence. The reconciler that moves a completed entry from `running` to
765
788
  `done` runs inside `coord drive-queue tick`; with the timer stopped, no tick
@@ -139,17 +139,42 @@ def test_the_endpoint_enables_installed_timers(client, lane_with_timer, monkeypa
139
139
 
140
140
  def _fake_enable(report, **_kwargs):
141
141
  calls.append(sorted(u.name for u in report.units if u.name.endswith(".timer")))
142
- return {"coord-agent.timer": (True, "enabled")}
142
+ return {"coord-agent.timer": (True, True, "enabled")}
143
143
 
144
144
  monkeypatch.setattr(du, "enable_timers", _fake_enable)
145
145
 
146
146
  resp = client.post("/deploy-units", json={})
147
147
  assert resp.status_code == 200
148
148
  body = resp.json()
149
- assert body["timers_enabled"] == {"coord-agent.timer": {"ok": True, "detail": "enabled"}}
149
+ assert body["timers_enabled"] == {
150
+ "coord-agent.timer": {"ok": True, "changed": True, "detail": "enabled"}
151
+ }
150
152
  assert calls == [["coord-agent.timer"]]
151
153
 
152
154
 
155
+ def test_the_endpoint_reports_a_timer_it_left_alone(client, lane_with_timer, monkeypatch):
156
+ """#2124: a timer `enable_timers` found already enabled (e.g. stopped by
157
+ an operator on purpose) is reported with `changed: False` — the signal
158
+ `coord release propagate`'s own output (`_roll_units`) uses to name it
159
+ as held rather than started."""
160
+ monkeypatch.setattr(
161
+ du, "enable_timers",
162
+ lambda report, **k: {
163
+ "coord-agent.timer": (True, False, "already enabled (ActiveState=inactive)"),
164
+ },
165
+ )
166
+ resp = client.post("/deploy-units", json={})
167
+ assert resp.status_code == 200
168
+ body = resp.json()
169
+ assert body["ok"] is True
170
+ assert body["timers_enabled"] == {
171
+ "coord-agent.timer": {
172
+ "ok": True, "changed": False,
173
+ "detail": "already enabled (ActiveState=inactive)",
174
+ }
175
+ }
176
+
177
+
153
178
  def test_a_dry_run_never_enables_timers(client, lane_with_timer, monkeypatch):
154
179
  calls: list = []
155
180
  monkeypatch.setattr(
@@ -164,20 +189,25 @@ def test_a_dry_run_never_enables_timers(client, lane_with_timer, monkeypatch):
164
189
  def test_a_failed_timer_enable_fails_the_response(client, lane_with_timer, monkeypatch):
165
190
  monkeypatch.setattr(
166
191
  du, "enable_timers",
167
- lambda report, **k: {"coord-agent.timer": (False, "enable failed")},
192
+ lambda report, **k: {"coord-agent.timer": (False, False, "enable failed")},
168
193
  )
169
194
  resp = client.post("/deploy-units", json={})
170
195
  assert resp.status_code == 500
171
196
  body = resp.json()
172
197
  assert body["ok"] is False
173
198
  assert body["timers_enabled"]["coord-agent.timer"]["ok"] is False
199
+ assert body["timers_enabled"]["coord-agent.timer"]["changed"] is False
174
200
 
175
201
 
176
202
  def test_the_real_enable_timers_is_exercised_end_to_end(client, lane_with_timer, monkeypatch):
177
203
  """No monkeypatch of `enable_timers` itself here — only the subprocess
178
204
  boundary — so this exercises the real wiring from HTTP request through
179
205
  `install_units` to the actual `systemctl --user enable --now` argv,
180
- which is the thing that was silently never happening before #2082."""
206
+ which is the thing that was silently never happening before #2082.
207
+ `coord-agent.timer` has no prior state as far as this fake is
208
+ concerned (empty `show` output), which `enable_timers` (#2124) must
209
+ read the same way it reads genuinely never-enabled: go ahead and
210
+ enable it."""
181
211
  calls: list = []
182
212
 
183
213
  def _fake_run(argv, **_kwargs):
@@ -193,8 +223,47 @@ def test_the_real_enable_timers_is_exercised_end_to_end(client, lane_with_timer,
193
223
  monkeypatch.setattr(subprocess, "run", _fake_run)
194
224
  resp = client.post("/deploy-units", json={})
195
225
  assert resp.status_code == 200
196
- assert resp.json()["timers_enabled"] == {"coord-agent.timer": {"ok": True, "detail": "enabled"}}
197
- assert calls == [["systemctl", "--user", "enable", "--now", "coord-agent.timer"]]
226
+ assert resp.json()["timers_enabled"] == {
227
+ "coord-agent.timer": {"ok": True, "changed": True, "detail": "enabled"}
228
+ }
229
+ assert calls[0][:3] == ["systemctl", "--user", "show"]
230
+ assert calls[-1] == ["systemctl", "--user", "enable", "--now", "coord-agent.timer"]
231
+
232
+
233
+ def test_the_real_enable_timers_leaves_a_stopped_timer_stopped_end_to_end(
234
+ client, lane_with_timer, monkeypatch
235
+ ):
236
+ """#2124's acceptance shape, exercised through the same real wiring as
237
+ the test above: `coord-agent.timer` is already enabled but its
238
+ `ActiveState` is `inactive` — exactly what `systemctl --user stop`
239
+ leaves behind. No `enable`/`start` call may reach systemd for it."""
240
+ calls: list = []
241
+
242
+ def _fake_run(argv, **_kwargs):
243
+ calls.append(list(argv))
244
+
245
+ class _Proc:
246
+ returncode = 0
247
+ stdout = ""
248
+ stderr = ""
249
+
250
+ if len(argv) > 2 and argv[2] == "show":
251
+ _Proc.stdout = (
252
+ "Id=coord-agent.timer\n"
253
+ "UnitFileState=enabled\n"
254
+ "ActiveState=inactive\n"
255
+ "SubState=dead\n"
256
+ )
257
+ return _Proc()
258
+
259
+ monkeypatch.setattr(subprocess, "run", _fake_run)
260
+ resp = client.post("/deploy-units", json={})
261
+ assert resp.status_code == 200
262
+ body = resp.json()["timers_enabled"]["coord-agent.timer"]
263
+ assert body["ok"] is True
264
+ assert body["changed"] is False
265
+ assert "ActiveState=inactive" in body["detail"]
266
+ assert all(argv[2] != "enable" for argv in calls)
198
267
 
199
268
 
200
269
  def test_a_bodyless_post_is_accepted(client, lane):