code-coordinator 0.5.92__tar.gz → 0.5.94__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 (840) hide show
  1. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/_common.py +72 -3
  7. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/release.py +32 -6
  8. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/config.py +21 -0
  9. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_cordon.py +110 -7
  10. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_propagate.py +8 -0
  11. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config.py +48 -0
  12. code_coordinator-0.5.94/tests/test_config_snapshot_noncanonical_2208.py +299 -0
  13. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dist_name.py +8 -1
  14. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers.py +39 -3
  15. code_coordinator-0.5.94/tests/test_release_cordon_daemon_leads_2176.py +313 -0
  16. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_cordon_deadlock_2240.py +10 -2
  17. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_verify.py +115 -0
  18. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_version_single_source.py +15 -4
  19. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/board.md +0 -0
  20. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/complete-session.md +0 -0
  21. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.claude/commands/coordinator.md +0 -0
  22. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/_lib.sh +0 -0
  23. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-checkout +0 -0
  24. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-commit +0 -0
  25. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.githooks/post-merge +0 -0
  26. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/coord-ci-acceptance.yml +0 -0
  28. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/cargo-test.yml +0 -0
  30. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/release-tui.yml +0 -0
  32. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/.gitignore +0 -0
  34. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/GOAL.md +0 -0
  36. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/LICENSE +0 -0
  37. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/README.md +0 -0
  39. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/block_log.py +0 -0
  56. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/client.py +0 -0
  68. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/repo.py +0 -0
  87. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/status.py +0 -0
  93. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/conflict_fix.py +0 -0
  98. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dao.py +0 -0
  99. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/__init__.py +0 -0
  100. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/fixture.py +0 -0
  101. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/index.html +0 -0
  102. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/server.py +0 -0
  103. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/terminal.py +0 -0
  104. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/.gitignore +0 -0
  105. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/components.json +0 -0
  106. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  107. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  108. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  109. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  110. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  111. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  112. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  113. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  114. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  115. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/index.html +0 -0
  116. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  117. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/sw.js +0 -0
  118. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  119. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  120. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  121. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  122. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  123. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  124. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  125. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  126. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  127. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  128. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/eslint.config.js +0 -0
  129. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/index.html +0 -0
  130. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  131. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/package-lock.json +0 -0
  132. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/package.json +0 -0
  133. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  134. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/playwright.config.ts +0 -0
  135. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/postcss.config.js +0 -0
  136. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  137. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  138. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  139. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/App.tsx +0 -0
  140. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/client.ts +0 -0
  141. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  142. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  143. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  144. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  145. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  146. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  147. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  148. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  149. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  150. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  151. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  152. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  153. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  154. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  155. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  156. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  157. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  158. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  159. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  160. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  161. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  162. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  163. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  164. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  165. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  166. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  167. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  168. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  169. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  170. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  171. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  172. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  173. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  174. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  175. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  176. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/index.css +0 -0
  177. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  178. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  179. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/main.tsx +0 -0
  180. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  181. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  182. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  183. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  184. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  185. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  186. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  187. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  188. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  189. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  190. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  191. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  192. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  193. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  194. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  195. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  196. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  197. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  198. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  199. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  200. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  201. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  202. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  203. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tailwind.config.js +0 -0
  204. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.json +0 -0
  205. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  206. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dashboard/webapp/vite.config.ts +0 -0
  207. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/db.py +0 -0
  208. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dead_end.py +0 -0
  209. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/README.md +0 -0
  210. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-agent.service +0 -0
  211. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.service +0 -0
  212. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.sh +0 -0
  213. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-db-backup.timer +0 -0
  214. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.service +0 -0
  215. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-drive-queue.timer +0 -0
  216. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-notify.service +0 -0
  217. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-notify.timer +0 -0
  218. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.service +0 -0
  219. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-propagate.timer +0 -0
  220. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.service +0 -0
  221. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-release-window.timer +0 -0
  222. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-serve.service +0 -0
  223. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.service +0 -0
  224. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web-dist-build.timer +0 -0
  225. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy/coord-web.service +0 -0
  226. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy_manifest.py +0 -0
  227. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deploy_units.py +0 -0
  228. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/deps.py +0 -0
  229. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/diagnose.py +0 -0
  230. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dispatch.py +0 -0
  231. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/dist_name.py +0 -0
  232. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive.py +0 -0
  233. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive_queue.py +0 -0
  234. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/drive_state.py +0 -0
  235. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/events.py +0 -0
  236. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/failure_class.py +0 -0
  237. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/filelock.py +0 -0
  238. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/fleet_config_health.py +0 -0
  239. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/freshness.py +0 -0
  240. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_a.py +0 -0
  241. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_b.py +0 -0
  242. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gate_snapshot.py +0 -0
  243. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/gates.py +0 -0
  244. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/github_ops.py +0 -0
  245. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/goal.py +0 -0
  246. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/graph_health.py +0 -0
  247. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/__init__.py +0 -0
  248. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/aggregate.py +0 -0
  249. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/__init__.py +0 -0
  250. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/agent_install.py +0 -0
  251. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/cargo_targets.py +0 -0
  252. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/claude_binary.py +0 -0
  253. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/deploy_lane_facts.py +0 -0
  254. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/disk.py +0 -0
  255. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_board.py +0 -0
  256. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  257. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_phantom.py +0 -0
  258. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/fleet_unit_drift.py +0 -0
  259. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/graph.py +0 -0
  260. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/graphify_cli.py +0 -0
  261. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/index_lock.py +0 -0
  262. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/plan_usage.py +0 -0
  263. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/repo_state.py +0 -0
  264. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/spawned_coord.py +0 -0
  265. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/timer_active.py +0 -0
  266. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/toolchain.py +0 -0
  267. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/unit_drift.py +0 -0
  268. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/unit_enablement.py +0 -0
  269. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/checks/worktrees.py +0 -0
  270. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/cli.py +0 -0
  271. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/context.py +0 -0
  272. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/fleet_snapshot.py +0 -0
  273. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/models.py +0 -0
  274. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/pypi.py +0 -0
  275. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/registry.py +0 -0
  276. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/render.py +0 -0
  277. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/health/units.py +0 -0
  278. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/hooks.py +0 -0
  279. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/housekeeping.py +0 -0
  280. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/interactive.py +0 -0
  281. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/issue_store.py +0 -0
  282. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/liveness_auditor.py +0 -0
  283. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/machine_pause.py +0 -0
  284. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/merge_queue.py +0 -0
  285. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_chat.py +0 -0
  286. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_dispatch.py +0 -0
  287. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_gate.py +0 -0
  288. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/milestone_order.py +0 -0
  289. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/mock_author.py +0 -0
  290. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/models.py +0 -0
  291. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/network.py +0 -0
  292. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/new_issue_chat.py +0 -0
  293. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/__init__.py +0 -0
  294. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/baseline.py +0 -0
  295. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/cli.py +0 -0
  296. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/collect.py +0 -0
  297. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/digest.py +0 -0
  298. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/models.py +0 -0
  299. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/predicate.py +0 -0
  300. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/service.py +0 -0
  301. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/store.py +0 -0
  302. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notifier/transport.py +0 -0
  303. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/notify.py +0 -0
  304. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/openapi.py +0 -0
  305. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/overlap_fence.py +0 -0
  306. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/overlap_predict.py +0 -0
  307. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/parentage.py +0 -0
  308. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/parentage_github.py +0 -0
  309. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/pipeline.py +0 -0
  310. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/plan_parser.py +0 -0
  311. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/plans.py +0 -0
  312. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/platform_paths.py +0 -0
  313. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_bridge.py +0 -0
  314. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_store.py +0 -0
  315. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/portal_sync.py +0 -0
  316. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/pr_body_lint.py +0 -0
  317. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/prereqs.py +0 -0
  318. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/progress.py +0 -0
  319. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/__init__.py +0 -0
  320. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/base.py +0 -0
  321. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/claude.py +0 -0
  322. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/claude_pty.py +0 -0
  323. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/providers/opencode.py +0 -0
  324. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/reconcile.py +0 -0
  325. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/refine_chat.py +0 -0
  326. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_verify.py +0 -0
  327. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/release_window.py +0 -0
  328. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/repo_edit.py +0 -0
  329. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/repo_onboard.py +0 -0
  330. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/review.py +0 -0
  333. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/serve_app.py +0 -0
  335. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/state.py +0 -0
  341. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coord/worker_events.py +0 -0
  350. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/coordinator.example.yml +0 -0
  351. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-agent.service +0 -0
  352. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.service +0 -0
  353. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.sh +0 -0
  354. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-db-backup.timer +0 -0
  355. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-drive-queue.service +0 -0
  356. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-drive-queue.timer +0 -0
  357. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-notify.service +0 -0
  358. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-notify.timer +0 -0
  359. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-propagate.service +0 -0
  360. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-propagate.timer +0 -0
  361. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-window.service +0 -0
  362. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-release-window.timer +0 -0
  363. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-serve.service +0 -0
  364. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.service +0 -0
  365. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.sh +0 -0
  366. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-dist-build.timer +0 -0
  367. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web-rollback.sh +0 -0
  368. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/coord-web.service +0 -0
  369. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/deploy/node-shim.sh +0 -0
  370. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/AGENT_OPERATIONS.md +0 -0
  371. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ARCHITECTURE.md +0 -0
  372. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ARCH_SECURITY_GATES.md +0 -0
  373. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/COCKPIT.md +0 -0
  374. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/COST_DISCIPLINE.md +0 -0
  376. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CROSS_PLATFORM.md +0 -0
  377. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/CUSTOMER_PORTAL.md +0 -0
  378. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/DRIVE_QUEUE.md +0 -0
  379. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/EPHEMERAL_WORKERS.md +0 -0
  380. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/FORGE_MIGRATION.md +0 -0
  381. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/GRAPHIFY_SETUP.md +0 -0
  382. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ISSUE_GUIDANCE.md +0 -0
  383. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/MAC_MINI.md +0 -0
  384. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  385. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/NOTIFIER.md +0 -0
  386. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/OPENCODE_VERIFICATION.md +0 -0
  387. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/OPERATING_GOTCHAS.md +0 -0
  388. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/ORACLE_LOOP.md +0 -0
  389. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PHONE_WEBAPP.md +0 -0
  390. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PIPELINE_V2.md +0 -0
  391. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/PLATFORM_EVOLUTION.md +0 -0
  392. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/SECOND_BACKEND.md +0 -0
  393. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/STORE_SERVICE.md +0 -0
  394. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  395. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/WEB_CONTROL_CENTER.md +0 -0
  396. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/README.md +0 -0
  397. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/_tokens.css +0 -0
  398. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/issue-detail.html +0 -0
  399. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-narrow.html +0 -0
  400. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/docs/mocks/web/pipeline-wide.html +0 -0
  401. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/graphify-out/.gitignore +0 -0
  402. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/install-agent.sh +0 -0
  403. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/pyproject.toml +0 -0
  404. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/audit_review_verdict_overrides.py +0 -0
  405. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  406. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/build-worker-image.sh +0 -0
  407. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/coordinator-machine.py +0 -0
  408. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/epic-down.sh +0 -0
  409. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/epic-up.sh +0 -0
  410. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/preflight.sh +0 -0
  411. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/provision-worker.sh +0 -0
  412. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  413. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  414. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/azure-workers/verify-github-token.sh +0 -0
  415. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/codegen.py +0 -0
  416. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/coord-test-runner.sh +0 -0
  417. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/run_tests_in_populated_home.sh +0 -0
  421. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/run_tests_without_gh.sh +0 -0
  422. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/smoke_437_interactive.py +0 -0
  423. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_878_review_capture.py +0 -0
  424. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_release_published.py +0 -0
  425. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/scripts/verify_release_wheel.py +0 -0
  426. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/setup.cfg +0 -0
  427. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/SMOKE_SET.md +0 -0
  428. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/__init__.py +0 -0
  429. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  430. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/contract.md +0 -0
  431. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/manifest.yml +0 -0
  432. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  433. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  434. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  435. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  436. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/conftest.py +0 -0
  437. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/contract.md +0 -0
  438. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/manifest.yml +0 -0
  439. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  440. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  441. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/contract.md +0 -0
  442. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/manifest.yml +0 -0
  443. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  444. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  445. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  446. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  447. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  448. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  449. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  450. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  451. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  452. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  453. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/contract.md +0 -0
  454. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  455. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  456. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/manifest.yml +0 -0
  457. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  458. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-51/tsconfig.json +0 -0
  459. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  460. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/conftest.py +0 -0
  461. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-basic.json +0 -0
  462. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  463. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  464. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  465. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/all_pass.json +0 -0
  466. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  467. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/mixed_fail.json +0 -0
  468. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  469. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  470. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/skip.json +0 -0
  471. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/playwright/truncated.json +0 -0
  472. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  473. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  474. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  475. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  476. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  477. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  478. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  479. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  480. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_acceptance.py +0 -0
  481. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_acceptance_drivers.py +0 -0
  482. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent.py +0 -0
  483. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_api_error.py +0 -0
  484. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_app.py +0 -0
  485. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_branch_base.py +0 -0
  486. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_branch_capture.py +0 -0
  487. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_config_free_1712.py +0 -0
  488. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_deploy_units_endpoint.py +0 -0
  489. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_dirty_worktree.py +0 -0
  490. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_graph_self_heal.py +0 -0
  491. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_health_h3.py +0 -0
  492. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_idle_restart.py +0 -0
  493. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_push_failure.py +0 -0
  494. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_reap.py +0 -0
  495. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_repos_and_pull.py +0 -0
  496. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_restart_services_endpoint.py +0 -0
  497. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_startup_diagnostics.py +0 -0
  498. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_update.py +0 -0
  499. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_update_bluegreen.py +0 -0
  500. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_usage_limit.py +0 -0
  501. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_agent_zero_commit.py +0 -0
  502. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ambient_home_isolation.py +0 -0
  503. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_approve_reject_plan.py +0 -0
  504. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_approve_usage_gate.py +0 -0
  505. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_assignment_already_recorded_daemon.py +0 -0
  506. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_log.py +0 -0
  507. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_outcome.py +0 -0
  508. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_audit_query.py +0 -0
  509. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_auto_loop.py +0 -0
  510. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_auto_release_publish_2035.py +0 -0
  511. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_base_checkout_restore.py +0 -0
  512. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_block_log.py +0 -0
  513. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_cap_762.py +0 -0
  514. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_fixture.py +0 -0
  515. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_read_path.py +0 -0
  516. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_service.py +0 -0
  517. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_state.py +0 -0
  518. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_board_wire.py +0 -0
  519. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_brain.py +0 -0
  520. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_branch_model.py +0 -0
  521. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_bug_intake.py +0 -0
  522. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_build_worker_image_env_update.py +0 -0
  523. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cargo_cache.py +0 -0
  524. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_acceptance_gate_1950.py +0 -0
  525. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_parity_2091.py +0 -0
  526. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_ci_store.py +0 -0
  527. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_claim.py +0 -0
  528. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_acceptance.py +0 -0
  529. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign.py +0 -0
  530. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  531. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_interactive_remote.py +0 -0
  532. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_provider.py +0 -0
  533. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  534. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_audit.py +0 -0
  535. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_chat_continue.py +0 -0
  536. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_diagnose_config_provenance.py +0 -0
  537. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_diagnose_graph.py +0 -0
  538. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor.py +0 -0
  539. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_free_1801.py +0 -0
  540. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  541. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_drive.py +0 -0
  542. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_drive_queue.py +0 -0
  543. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_escalate.py +0 -0
  544. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_fix_headless_review.py +0 -0
  545. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_gate_a.py +0 -0
  546. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_install_drift.py +0 -0
  547. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_install_skills.py +0 -0
  548. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_issue_create_label.py +0 -0
  549. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_issue_reopen.py +0 -0
  550. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_merge.py +0 -0
  551. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_assign.py +0 -0
  552. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_capture.py +0 -0
  553. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_chat_add_child.py +0 -0
  554. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_dispatch.py +0 -0
  555. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_b.py +0 -0
  556. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_gate_c.py +0 -0
  557. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_order.py +0 -0
  558. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  559. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_milestone_ship.py +0 -0
  560. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_network.py +0 -0
  561. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_new_issue_chat.py +0 -0
  562. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_plans.py +0 -0
  563. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_portal.py +0 -0
  564. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_pull_artifact.py +0 -0
  565. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_queue.py +0 -0
  566. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_reattach_sessions.py +0 -0
  567. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_refine_board.py +0 -0
  568. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_preflight.py +0 -0
  569. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_propagate.py +0 -0
  570. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_release_window.py +0 -0
  571. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_repo_2220.py +0 -0
  572. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_scorecard.py +0 -0
  573. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_set_review_findings.py +0 -0
  574. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_advisory_terminal.py +0 -0
  575. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_merge_queue.py +0 -0
  576. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_provider.py +0 -0
  577. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_review_finalizing.py +0 -0
  578. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_test_failed_tag.py +0 -0
  579. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_status_usage_limit.py +0 -0
  580. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_sync_comments_873.py +0 -0
  581. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_test_plan.py +0 -0
  582. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_track.py +0 -0
  583. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_tui_update.py +0 -0
  584. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cli_wait.py +0 -0
  585. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_client_base_install.py +0 -0
  586. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_comments.py +0 -0
  587. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_completion_summary.py +0 -0
  588. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_acceptance.py +0 -0
  589. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_audit.py +0 -0
  590. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_pricing.py +0 -0
  591. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_config_usage_gate.py +0 -0
  592. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_conflict_fix.py +0 -0
  593. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_conflict_fix_semantic.py +0 -0
  594. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test.py +0 -0
  595. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_baseline.py +0 -0
  596. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_routing.py +0 -0
  597. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_test_runner_toolchain.py +0 -0
  598. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coord_web_sse_restart_live.py +0 -0
  599. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_coordinator_machine.py +0 -0
  600. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_cross_platform_imports.py +0 -0
  601. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard.py +0 -0
  602. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_fixture.py +0 -0
  603. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_terminal.py +0 -0
  604. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dashboard_terminal_live.py +0 -0
  605. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_db.py +0 -0
  606. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dead_end.py +0 -0
  607. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_db_backup.py +0 -0
  608. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_dist.py +0 -0
  609. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_coord_web_rollback.py +0 -0
  610. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_drive_queue_unit.py +0 -0
  611. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_manifest.py +0 -0
  612. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_units_lane.py +0 -0
  613. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deploy_web_unit.py +0 -0
  614. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_deps.py +0 -0
  615. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_diagnose.py +0 -0
  616. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dispatch.py +0 -0
  617. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_dispatch_target_validation.py +0 -0
  618. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_done_housekeeping.py +0 -0
  619. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive.py +0 -0
  620. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_queue.py +0 -0
  621. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_state.py +0 -0
  622. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_drive_tmux.py +0 -0
  623. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_capability_detection.py +0 -0
  624. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  625. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_epic_up_image_provenance.py +0 -0
  626. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_errors.py +0 -0
  627. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_events.py +0 -0
  628. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_failure_class.py +0 -0
  629. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_filelock.py +0 -0
  630. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  631. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fix_of_force_override.py +0 -0
  632. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_config_health.py +0 -0
  633. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_health_probes.py +0 -0
  634. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_fleet_health_snapshot.py +0 -0
  635. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_freshness.py +0 -0
  636. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_a.py +0 -0
  637. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_b.py +0 -0
  638. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gate_snapshot_staleness.py +0 -0
  639. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gates.py +0 -0
  640. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  641. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_generated_types_fixture.py +0 -0
  642. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_github_ops.py +0 -0
  643. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_goal.py +0 -0
  644. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_graph_health.py +0 -0
  645. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_graph_selfheal_absent_2237.py +0 -0
  646. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_handoff.py +0 -0
  647. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_checks.py +0 -0
  648. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_cli.py +0 -0
  649. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_cli_graph.py +0 -0
  650. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_config.py +0 -0
  651. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_context.py +0 -0
  652. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_deploy_lane_facts.py +0 -0
  653. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_incident_regression.py +0 -0
  654. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_pypi.py +0 -0
  655. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_registry.py +0 -0
  656. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_timer_active.py +0 -0
  657. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_toolchain.py +0 -0
  658. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_unit_drift.py +0 -0
  659. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_health_unit_enablement.py +0 -0
  660. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_hooks.py +0 -0
  661. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_human_attended_437.py +0 -0
  662. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_init.py +0 -0
  663. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_integration.py +0 -0
  664. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_briefing_echo.py +0 -0
  665. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_prefill_state.py +0 -0
  666. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_session_relaunch.py +0 -0
  667. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_test_verdict_backstop.py +0 -0
  668. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_token_attribution.py +0 -0
  669. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_interactive_worktree.py +0 -0
  670. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_issue_store_seam.py +0 -0
  671. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_liveness_auditor.py +0 -0
  672. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_liveness_notify.py +0 -0
  673. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_machine_pause.py +0 -0
  674. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_merge_queue.py +0 -0
  675. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_merge_verify.py +0 -0
  676. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_chat.py +0 -0
  677. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_dispatch.py +0 -0
  678. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_gate.py +0 -0
  679. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_order.py +0 -0
  680. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_milestone_seam.py +0 -0
  681. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_mock_author.py +0 -0
  682. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_model_tiering.py +0 -0
  683. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_models.py +0 -0
  684. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_models_config_labels.py +0 -0
  685. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_needs_attention.py +0 -0
  686. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_network.py +0 -0
  687. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_new_issue_chat.py +0 -0
  688. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_next_release_tag.py +0 -0
  689. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_no_direct_gh_calls.py +0 -0
  690. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_node_shim.py +0 -0
  691. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_baseline.py +0 -0
  692. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_cli.py +0 -0
  693. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_collect.py +0 -0
  694. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_config.py +0 -0
  695. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_drive_seam.py +0 -0
  696. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_isolation.py +0 -0
  697. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_predicate.py +0 -0
  698. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_quiet_hours.py +0 -0
  699. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notifier_service.py +0 -0
  700. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notify.py +0 -0
  701. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_notify_drain.py +0 -0
  702. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_openapi.py +0 -0
  703. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_operational_defaults.py +0 -0
  704. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_overlap_fence.py +0 -0
  705. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_overlap_predict.py +0 -0
  706. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_packaged_deploy_units.py +0 -0
  707. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_parentage.py +0 -0
  708. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_paste_landed.py +0 -0
  709. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_pipeline.py +0 -0
  710. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_approve_plan_command.py +0 -0
  711. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_pr_command.py +0 -0
  712. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_followup_review_command.py +0 -0
  713. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_only.py +0 -0
  714. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_plan_parser.py +0 -0
  715. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_platform_paths.py +0 -0
  716. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_bridge.py +0 -0
  717. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_config.py +0 -0
  718. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_portal_sync.py +0 -0
  719. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_pr_body_lint.py +0 -0
  720. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_prereqs.py +0 -0
  721. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_production_db_guard.py +0 -0
  722. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_progress.py +0 -0
  723. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_provider_seam.py +0 -0
  724. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers_config_labels.py +0 -0
  725. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_providers_pty.py +0 -0
  726. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_quiet_hours.py +0 -0
  727. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_quiet_hours_store_2146.py +0 -0
  728. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reap_merged_sessions.py +0 -0
  729. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reap_stale_interactive_tick.py +0 -0
  730. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_branch.py +0 -0
  731. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_completions.py +0 -0
  732. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_merges.py +0 -0
  733. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reconcile_usage_limit_done.py +0 -0
  734. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_refine_chat.py +0 -0
  735. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_cordon_2101.py +0 -0
  736. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_propagate.py +0 -0
  737. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_unified_1242.py +0 -0
  738. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_release_window.py +0 -0
  739. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_remote_auto_prune.py +0 -0
  740. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_remote_interactive_reaper.py +0 -0
  741. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_edit_2220.py +0 -0
  742. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_graph_fleet_2237.py +0 -0
  743. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_repo_onboard_2220.py +0 -0
  744. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_report_result_push.py +0 -0
  745. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_reports.py +0 -0
  746. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry.py +0 -0
  747. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry_advisory_1606.py +0 -0
  748. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_retry_type_1636.py +0 -0
  749. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_revalidate.py +0 -0
  750. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review.py +0 -0
  751. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_end_review_without_verdict.py +0 -0
  752. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_parse_failure_diagnostic.py +0 -0
  753. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_reaffirm.py +0 -0
  754. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_state.py +0 -0
  755. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_backstop.py +0 -0
  756. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_override_audit.py +0 -0
  757. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_verdict_relay.py +0 -0
  758. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_review_zero_commits.py +0 -0
  759. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_scoped_review_wiring.py +0 -0
  760. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_scorecard.py +0 -0
  761. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_serve.py +0 -0
  762. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_serve_app_board_trim.py +0 -0
  763. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_session.py +0 -0
  764. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_slice_issue_attribution.py +0 -0
  765. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke.py +0 -0
  766. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke_live_checkout_restore.py +0 -0
  767. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_smoke_workflow.py +0 -0
  768. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_spend_ceiling.py +0 -0
  769. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_spend_ceiling_coordinator.py +0 -0
  770. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_split.py +0 -0
  771. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_split_work.py +0 -0
  772. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stage_projection.py +0 -0
  773. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stalled_pipeline.py +0 -0
  774. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_state.py +0 -0
  775. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_state_review_findings_daemon.py +0 -0
  776. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_status_fleet_footer.py +0 -0
  777. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stop_1567.py +0 -0
  778. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_stuck.py +0 -0
  779. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_terminal_command.py +0 -0
  780. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_author.py +0 -0
  781. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_chat.py +0 -0
  782. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_orchestrator.py +0 -0
  783. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_report.py +0 -0
  784. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_verdict_parsing.py +0 -0
  785. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_test_verdict_transcript_floor.py +0 -0
  786. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_board_audit.py +0 -0
  787. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_config_load_1080.py +0 -0
  788. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_thin_client_daemon_routing_906.py +0 -0
  789. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_tmux_host.py +0 -0
  790. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_tmux_session.py +0 -0
  791. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_transcript_floor.py +0 -0
  792. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage.py +0 -0
  793. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage_limits.py +0 -0
  794. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_usage_rollup.py +0 -0
  795. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_venv_live_install_2121.py +0 -0
  796. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_watch.py +0 -0
  797. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_events.py +0 -0
  798. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_image_pin_sync.py +0 -0
  799. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_safety.py +0 -0
  800. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worker_test_scoping.py +0 -0
  801. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worktree.py +0 -0
  802. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  803. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/Cargo.lock +0 -0
  804. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/Cargo.toml +0 -0
  805. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/cargo-config-local-quadraui.toml.example +0 -0
  806. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/drive.rs +0 -0
  811. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/drive_queue.rs +0 -0
  812. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/escalation.rs +0 -0
  813. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/events.rs +0 -0
  814. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fixtures.rs +0 -0
  815. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_health.rs +0 -0
  816. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_sessions.rs +0 -0
  817. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/fleet_terminals.rs +0 -0
  818. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/format.rs +0 -0
  819. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/milestone_dag.rs +0 -0
  820. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/mod.rs +0 -0
  821. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/msv.rs +0 -0
  822. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/pipeline.rs +0 -0
  823. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/plans.rs +0 -0
  824. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/render.rs +0 -0
  825. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/reports.rs +0 -0
  826. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/sessions.rs +0 -0
  827. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/settings_ui.rs +0 -0
  828. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/sidebar.rs +0 -0
  829. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/terminal.rs +0 -0
  830. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/tests.rs +0 -0
  831. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/types.rs +0 -0
  832. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/app/workspace.rs +0 -0
  833. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/bin/gtk.rs +0 -0
  834. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/commands.rs +0 -0
  835. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/lib.rs +0 -0
  836. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/main.rs +0 -0
  837. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/src/settings.rs +0 -0
  838. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/tests/acceptance.rs +0 -0
  839. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/tui/tests/cli.rs +0 -0
  840. {code_coordinator-0.5.92 → code_coordinator-0.5.94}/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.92
3
+ Version: 0.5.94
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.92
3
+ Version: 0.5.94
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
@@ -529,6 +529,7 @@ tests/test_config.py
529
529
  tests/test_config_acceptance.py
530
530
  tests/test_config_audit.py
531
531
  tests/test_config_pricing.py
532
+ tests/test_config_snapshot_noncanonical_2208.py
532
533
  tests/test_config_usage_gate.py
533
534
  tests/test_conflict_fix.py
534
535
  tests/test_conflict_fix_semantic.py
@@ -676,6 +677,7 @@ tests/test_reconcile_merges.py
676
677
  tests/test_reconcile_usage_limit_done.py
677
678
  tests/test_refine_chat.py
678
679
  tests/test_release_cordon_2101.py
680
+ tests/test_release_cordon_daemon_leads_2176.py
679
681
  tests/test_release_cordon_deadlock_2240.py
680
682
  tests/test_release_propagate.py
681
683
  tests/test_release_unified_1242.py
@@ -559,6 +559,7 @@
559
559
  "tests/test_config_acceptance.py",
560
560
  "tests/test_config_audit.py",
561
561
  "tests/test_config_pricing.py",
562
+ "tests/test_config_snapshot_noncanonical_2208.py",
562
563
  "tests/test_config_usage_gate.py",
563
564
  "tests/test_conflict_fix.py",
564
565
  "tests/test_conflict_fix_semantic.py",
@@ -706,6 +707,7 @@
706
707
  "tests/test_reconcile_usage_limit_done.py",
707
708
  "tests/test_refine_chat.py",
708
709
  "tests/test_release_cordon_2101.py",
710
+ "tests/test_release_cordon_daemon_leads_2176.py",
709
711
  "tests/test_release_cordon_deadlock_2240.py",
710
712
  "tests/test_release_propagate.py",
711
713
  "tests/test_release_unified_1242.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.92",
2
+ "tag": "0.5.94",
3
3
  "distance": 0,
4
- "node": "g7d880a1fd7fca3a73143f80edb90e5e9ebffef63",
4
+ "node": "gc872293016c9a4132c83fff7881956b707aacbf7",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -27,7 +27,13 @@ from typing import TYPE_CHECKING
27
27
 
28
28
  import click
29
29
 
30
- from coord.config import Config, ConfigError, load, resolve_config_path
30
+ from coord.config import (
31
+ Config,
32
+ ConfigError,
33
+ is_canonical_config_path,
34
+ load,
35
+ resolve_config_path,
36
+ )
31
37
 
32
38
  if TYPE_CHECKING: # pragma: no cover — typing only
33
39
  from collections.abc import Iterator
@@ -100,7 +106,55 @@ _CONFIG_OPTION = click.option(
100
106
  )
101
107
 
102
108
 
103
- def _save_config_snapshot(config: Config) -> None:
109
+ def _note_withheld_snapshot(config: Config, config_path: Path) -> None:
110
+ """Tell the operator that the #2208 guard just withheld a snapshot — but
111
+ only when withholding it actually changed the outcome.
112
+
113
+ Silence is what turned the original incident into an hour of
114
+ misdiagnosis: the fleet's ``machines`` table said ``ci-runner`` and
115
+ nothing anywhere said why. So when a non-canonical ``--config`` would
116
+ have *replaced a populated table with a different fleet* — the exact
117
+ shape of that incident — say so on stderr.
118
+
119
+ Everything else stays quiet, and that restraint is load-bearing rather
120
+ than cosmetic. ``--config <tmpfile>`` is the normal way to run coord
121
+ against a scratch config: CI stubs, the config *validator* in
122
+ ``scripts/azure-workers/coordinator-machine.py``, and every one of this
123
+ repo's ~110 CLI test modules. Emitting a note on each of those would
124
+ have made the guard a per-invocation nag, and — because Click's
125
+ ``CliRunner`` folds stderr into ``result.output`` — would have corrupted
126
+ the machine-readable stdout of commands like ``coord plans --json`` and
127
+ ``coord scorecard --json`` for anyone parsing combined output.
128
+
129
+ A skip with nothing to clobber (empty table, or a table that already
130
+ matches) withheld nothing observable, so it warrants no words.
131
+ """
132
+ try:
133
+ from coord.db import get_connection
134
+ conn = get_connection()
135
+ existing = [
136
+ str(row[0])
137
+ for row in conn.execute("SELECT name FROM machines ORDER BY name")
138
+ ]
139
+ except Exception: # noqa: BLE001 — advisory only; never break the command
140
+ return
141
+ if not existing:
142
+ # Nothing to protect: no snapshot has ever landed here (a fresh
143
+ # host, or a CI runner whose DB only exists for this one command).
144
+ return
145
+ if existing == sorted(m.name for m in config.machines):
146
+ # The override names the same fleet — the write would have been a
147
+ # no-op, so the skip cost the operator nothing.
148
+ return
149
+ click.echo(
150
+ f"note: --config points at a non-canonical path ({config_path}); "
151
+ f"leaving the shared machines/pipeline snapshot untouched (#2208). "
152
+ f"Fleet machines on record: {', '.join(existing)}.",
153
+ err=True,
154
+ )
155
+
156
+
157
+ def _save_config_snapshot(config: Config, config_path: Path | None = None) -> None:
104
158
  """Persist machine + pipeline metadata to the DB so dashboards can read it.
105
159
 
106
160
  Writes:
@@ -111,6 +165,13 @@ def _save_config_snapshot(config: Config) -> None:
111
165
 
112
166
  The pipeline keys let the TUI Pipeline panel pick up coordinator.yml
113
167
  settings without having to parse YAML itself.
168
+
169
+ *config_path* is the file *config* was actually loaded from. When given
170
+ and it is not the canonical resolution (see
171
+ ``coord.config.is_canonical_config_path``), the write is skipped
172
+ entirely — see the #2208 guard below. Callers that omit it (mainly
173
+ direct unit tests exercising the write itself) get the pre-#2208
174
+ behavior: always write.
114
175
  """
115
176
  # #584: a thin client (board_service configured) must not create/write a
116
177
  # local DB — the daemon/host owns the config snapshot. On the host
@@ -118,6 +179,14 @@ def _save_config_snapshot(config: Config) -> None:
118
179
  from coord.client import resolve_board_service
119
180
  if resolve_board_service() is not None:
120
181
  return
182
+ # #2208: an explicit `--config <file>` pointed away from the fleet's real
183
+ # config (a scratch fixture, a CI-only stub) must not be treated as a
184
+ # request to redefine the shared `machines` table — that table is global
185
+ # state every client's `/board` and the TUI read, not something a single
186
+ # throwaway invocation should own.
187
+ if config_path is not None and not is_canonical_config_path(config_path):
188
+ _note_withheld_snapshot(config, config_path)
189
+ return
121
190
  conn = None
122
191
  try:
123
192
  from coord.db import get_connection
@@ -270,7 +339,7 @@ def _load_config(path: Path | None) -> Config:
270
339
  except ConfigError as e:
271
340
  click.echo(f"error: {e}", err=True)
272
341
  sys.exit(2)
273
- _save_config_snapshot(cfg)
342
+ _save_config_snapshot(cfg, path)
274
343
  return cfg
275
344
 
276
345
 
@@ -694,11 +694,25 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
694
694
  )
695
695
  current = rp.hosts_already_current(_lane_versions_by_host(before), record.target_version)
696
696
 
697
+ # #2176: resolved here, ahead of cordoning, so the cordon plan can honour
698
+ # the same daemon-leads invariant the roll itself is bound by (see below).
699
+ # Purely a derivation from data already in hand (`machine_health`) — this
700
+ # does not move the "unorderable fleet" REFUSAL, which stays below the
701
+ # deferral branch on purpose (see its own comment).
702
+ daemon_name = _daemon_machine_name(config, daemon_host_override, machine_health)
703
+
697
704
  # ── 3b. cordon the hosts that are behind, so they DRAIN (#2101) ──────
698
705
  #
699
706
  # Before the deferral return below, on purpose: cordoning is the thing
700
707
  # that turns "no window" into "a window in a few minutes". A run that
701
708
  # defers without cordoning has changed nothing about why it deferred.
709
+ #
710
+ # #2176: a non-daemon host with no busy signal of its own is exempted
711
+ # while the daemon host is itself busy and behind — see `plan_cordons`'s
712
+ # `daemon_host` handling. It cannot roll ahead of a busy daemon host
713
+ # regardless of its own drain state (the daemon-leads invariant below),
714
+ # so cordoning it protects nothing and just spends fleet capacity for an
715
+ # unbounded wait.
702
716
  record.cordons = _apply_cordons(
703
717
  hosts=hosts,
704
718
  report=before,
@@ -712,6 +726,7 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
712
726
  state_dir=state_dir,
713
727
  max_deferrals=cordon_max_deferrals,
714
728
  release_cooldown=cordon_cooldown,
729
+ daemon_host=daemon_name,
715
730
  )
716
731
 
717
732
  if fully_busy and not force:
@@ -722,12 +737,12 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
722
737
  # meets a fleet that is actually draining.
723
738
  _finish(rp.STATUS_DEFERRED, 0)
724
739
 
725
- # #2101: resolved AFTER the deferral above, deliberately. This refusal is
726
- # about the ORDER a roll happens in; a run that is going to roll nothing
727
- # has no order to get wrong, and turning "the fleet is busy" into a
728
- # `failed` record (exit 1, systemd marks the unit failed) would teach an
729
- # operator to ignore the one signal that matters.
730
- daemon_name = _daemon_machine_name(config, daemon_host_override, machine_health)
740
+ # #2101: this refusal is checked AFTER the deferral above, deliberately.
741
+ # This refusal is about the ORDER a roll happens in; a run that is going
742
+ # to roll nothing has no order to get wrong, and turning "the fleet is
743
+ # busy" into a `failed` record (exit 1, systemd marks the unit failed)
744
+ # would teach an operator to ignore the one signal that matters.
745
+ # (`daemon_name` itself was resolved earlier, before cordoning — #2176.)
731
746
  if daemon_name is None and len(hosts) > 1:
732
747
  # #2052 fault 2: this used to warn and roll in coordinator.yml order.
733
748
  # It then briefly put the daemon host BEHIND both its callers during a
@@ -1082,6 +1097,7 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1082
1097
  state_dir: Path | None = None,
1083
1098
  max_deferrals: int | None = None,
1084
1099
  release_cooldown: float | None = None,
1100
+ daemon_host: str | None = None,
1085
1101
  ) -> dict:
1086
1102
  """Plan and apply this run's cordons. Returns the journal fragment.
1087
1103
 
@@ -1090,6 +1106,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1090
1106
  Failing the whole propagation because the cordon could not be renewed
1091
1107
  would make #2101's fix strictly worse than not having it.
1092
1108
 
1109
+ *daemon_host* (#2176) lets :func:`~coord.release_cordon.plan_cordons`
1110
+ exempt a non-daemon host with no busy signal of its own from cordoning
1111
+ while the daemon host is itself busy and behind — see that function's
1112
+ docstring for the reasoning. ``None`` (an unorderable fleet) disables
1113
+ the exemption and falls back to cordoning every behind host, same as
1114
+ before #2176.
1115
+
1093
1116
  #2240: *state_dir* is where the propagation journal lives, and the journal
1094
1117
  is where "how many runs in a row has this cordon now deferred?" is stored
1095
1118
  — the process holding the answer in memory is restarted by the roll it is
@@ -1162,10 +1185,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1162
1185
  if release_cooldown is None
1163
1186
  else release_cooldown
1164
1187
  ),
1188
+ daemon_host=daemon_host,
1165
1189
  )
1166
1190
  for line in plan.render():
1167
1191
  click.echo(line)
1168
1192
  outcome.cooling_seconds = plan.cooling_seconds
1193
+ outcome.collateral_spared = list(plan.collateral_spared)
1194
+ outcome.blocked_behind = plan.blocked_behind
1169
1195
  if plan.released is not None:
1170
1196
  outcome.released = plan.released.to_dict()
1171
1197
  # stderr as well as stdout: on the timer host this line IS the
@@ -51,6 +51,27 @@ def resolve_config_path() -> Path:
51
51
  return candidate
52
52
  return USER_CONFIG_PATH
53
53
 
54
+
55
+ def is_canonical_config_path(path: Path) -> bool:
56
+ """Whether *path* is what :func:`resolve_config_path` resolves to *right now*.
57
+
58
+ #2208: a coord command run with an explicit ``--config <file>`` pointed
59
+ somewhere other than the fleet's real config — a scratch fixture, a
60
+ CI-only stub someone wrote specifically so ``coord.config.load()`` has
61
+ something to parse — is not a request to redefine the fleet. This gates
62
+ the shared machines/pipeline DB snapshot (``_save_config_snapshot`` in
63
+ ``coord/commands/_common.py``): only a *path* that matches the ordinary
64
+ resolution order ($COORD_CONFIG → ``~/.coord/coordinator.yml`` →
65
+ ``./coordinator.yml``) counts as canonical and is allowed to overwrite
66
+ that shared table. An explicit ``--config`` that happens to name the
67
+ same file the default resolution would have picked still counts as
68
+ canonical — this only catches a genuine *override*.
69
+ """
70
+ candidate = Path(path).expanduser().resolve()
71
+ canonical = resolve_config_path().expanduser().resolve()
72
+ return candidate == canonical
73
+
74
+
54
75
  # Safety-by-default: repos without explicit worker_permissions get this deny-list.
55
76
  DEFAULT_DENY_COMMANDS: list[str] = [
56
77
  "Bash(gh *)",
@@ -142,6 +142,35 @@ and #2082 is the cost of tolerating that. The threshold is a knob
142
142
  (``coord release propagate --cordon-after N``) precisely so a future cadence
143
143
  change does not need a code change. Trap F.
144
144
 
145
+ CORDON-EVERY-BEHIND-HOST DOES NOT COVER A HOST THAT CANNOT ROLL EITHER WAY
146
+ ----------------------------------------------------------------------------
147
+ Observed 2026-08-13 00:18 UTC: one busy signal, on dellserver, and the fleet
148
+ cordoned all three machines anyway. elitebook and precision reported
149
+ ``online • idle`` throughout and stayed cordoned — launch-blocked — for
150
+ 34+ minutes, unable to accept the very review dispatch #2240 needed.
151
+
152
+ The cordon-every-behind-host rule above is correct for a host whose OWN
153
+ draining is what a run is waiting on: skip it and it never drains, and a run
154
+ that defers without cordoning defers again in 20 minutes for the same
155
+ reason. It does not cover a host that has no busy signal against it AND is
156
+ blocked from rolling by the daemon-leads invariant (see
157
+ :mod:`coord.release_propagate`'s LANE ORDER section) rather than by its own
158
+ work — nothing may roll ahead of a busy daemon host, so such a host cannot
159
+ roll regardless of how drained it gets. Cordoning it protects nothing: its
160
+ drained state cannot be consumed until the daemon host rolls first, which
161
+ may be unbounded (any drive on the daemon host reproduces this, not just a
162
+ wedged one).
163
+
164
+ :func:`plan_cordons`'s *daemon_host* parameter is the fix: while the daemon
165
+ host is itself busy and behind, only it (and any host with its own busy
166
+ signal) is cordoned. Everyone else stays uncordoned and dispatchable —
167
+ released immediately if a previous run already cordoned them — until the
168
+ daemon host becomes rollable, at which point ordinary drain-everyone-behind
169
+ resumes. :attr:`CordonPlan.collateral_spared` /
170
+ :attr:`CordonPlan.blocked_behind` name exactly who was spared and why, so
171
+ the next puzzle like this one is one line of output, not a 40-minute read of
172
+ `/board`.
173
+
145
174
  PURITY
146
175
  ------
147
176
  Nothing here reads the clock, the filesystem, the network or the DB — same
@@ -618,6 +647,17 @@ class CordonPlan:
618
647
  #: recorded rather than silent, because "no cordons planned" and "cordons
619
648
  #: suppressed on purpose" are the same output otherwise.
620
649
  cooling_seconds: float = 0.0
650
+ #: #2176: behind hosts this run deliberately did NOT cordon (and, if
651
+ #: already cordoned, released) because they have no busy signal of their
652
+ #: own and cannot roll ahead of `blocked_behind` anyway. Reported
653
+ #: separately from `uncordon` (which is "proven current") so the journal
654
+ #: and CLI output can name them as collateral rather than as a drain that
655
+ #: completed.
656
+ collateral_spared: tuple[str, ...] = ()
657
+ #: #2176: the daemon host these hosts are spared on account of — set
658
+ #: exactly when `collateral_spared` is non-empty. The single fact that
659
+ #: would have turned a 40-minute puzzle into one line of output.
660
+ blocked_behind: str | None = None
621
661
 
622
662
  @property
623
663
  def empty(self) -> bool:
@@ -627,6 +667,7 @@ class CordonPlan:
627
667
  or self.escalations
628
668
  or self.expired
629
669
  or self.released
670
+ or self.collateral_spared
630
671
  )
631
672
 
632
673
  def to_dict(self) -> dict:
@@ -638,6 +679,8 @@ class CordonPlan:
638
679
  "unknown": list(self.unknown),
639
680
  "released": self.released.to_dict() if self.released else None,
640
681
  "cooling_seconds": self.cooling_seconds,
682
+ "collateral_spared": list(self.collateral_spared),
683
+ "blocked_behind": self.blocked_behind,
641
684
  }
642
685
 
643
686
  def render(self) -> list[str]:
@@ -645,6 +688,14 @@ class CordonPlan:
645
688
  lines: list[str] = []
646
689
  for item in self.cordon:
647
690
  lines.append(f" ⊘ cordon {item.machine}: {item.describe()}")
691
+ if self.collateral_spared:
692
+ lines.append(
693
+ " · "
694
+ + ", ".join(sorted(self.collateral_spared))
695
+ + f": left uncordoned — blocked behind daemon host "
696
+ f"{self.blocked_behind} either way, cordoning would not help "
697
+ "(#2176)"
698
+ )
648
699
  for name in self.uncordon:
649
700
  lines.append(f" ✓ uncordon {name}: up to date, work may resume")
650
701
  for name in self.expired:
@@ -748,12 +799,15 @@ def plan_cordons(
748
799
  pressure: DeferralPressure | None = None,
749
800
  max_deferrals: int = DEFAULT_MAX_DEFERRALS,
750
801
  release_cooldown: float = DEFAULT_RELEASE_COOLDOWN_SECONDS,
802
+ daemon_host: str | None = None,
751
803
  ) -> CordonPlan:
752
804
  """Decide this run's cordon writes. Pure.
753
805
 
754
806
  *existing* is the store as read (expired records included — this function
755
807
  is what notices they lapsed). *busy_reasons* maps a host to why it is not
756
- yet drained, purely so an escalation can say what is holding it.
808
+ yet drained, purely so an escalation can say what is holding it — and
809
+ (#2176) so this function can tell a genuinely busy host from an idle one
810
+ when deciding who is collateral.
757
811
 
758
812
  ``enabled=False`` (``coord release propagate --no-cordon``) plans no new
759
813
  cordons but STILL clears the ones this owner already set: turning the
@@ -772,6 +826,21 @@ def plan_cordons(
772
826
  Proven-current hosts are uncordoned in every one of these branches: that
773
827
  is never the wrong move, and skipping it during a cooldown would leave a
774
828
  rolled host cordoned for the length of the cooldown.
829
+
830
+ *daemon_host* (#2176) is the machine `coord release propagate` will roll
831
+ first (see `coord.release_propagate`'s LANE ORDER section) — the
832
+ daemon-leads invariant means no OTHER host's python lane may roll ahead
833
+ of it while it is itself busy and behind. A behind host with no busy
834
+ signal of its own is therefore collateral, not protected, by a cordon
835
+ while that holds: it cannot roll either way, so draining it buys nothing
836
+ and just spends fleet capacity for a wait that is unbounded from its own
837
+ perspective (#2067 made quiescence per-host; this closes the cordon's
838
+ matching gap). Such a host is left uncordoned — and released immediately
839
+ if a previous run already cordoned it — until the daemon host is
840
+ rollable (quiescent, or already on the target), at which point ordinary
841
+ drain-everyone-behind resumes exactly as before #2176. A host that is
842
+ itself busy is cordoned regardless: its own drain is still the thing
843
+ being waited on, whatever the daemon host is doing.
775
844
  """
776
845
  records = _as_records(existing)
777
846
  live = {name: c for name, c in records.items() if c.active(now)}
@@ -782,11 +851,30 @@ def plan_cordons(
782
851
  if not enabled:
783
852
  return CordonPlan(uncordon=tuple(sorted(live)), expired=expired)
784
853
 
785
- # Uncordon: PROVEN current, and nothing else. A host whose version could
786
- # not be read keeps whatever cordon it has until that cordon EXPIRES —
787
- # clearing on "we couldn't read the version" would open the fleet up
788
- # mid-roll on the strength of one failed HTTP call.
789
- to_uncordon = tuple(sorted(name for name in live if name in drift.current))
854
+ # ── #2176: who is collateral to a busy, behind daemon host ────────────
855
+ daemon_blocked = bool(
856
+ daemon_host
857
+ and (busy_reasons or {}).get(daemon_host)
858
+ and daemon_host not in drift.current
859
+ )
860
+ collateral = frozenset(
861
+ host
862
+ for host in drift.behind
863
+ if daemon_blocked and host != daemon_host and not (busy_reasons or {}).get(host)
864
+ )
865
+ blocked_behind = daemon_host if collateral else None
866
+
867
+ # Uncordon: PROVEN current, plus (#2176) any collateral host a previous
868
+ # run already cordoned — "spared" means dispatchable now, not "merely not
869
+ # renewed". A host whose version could not be read otherwise keeps
870
+ # whatever cordon it has until that cordon EXPIRES — clearing on "we
871
+ # couldn't read the version" would open the fleet up mid-roll on the
872
+ # strength of one failed HTTP call.
873
+ to_uncordon = tuple(
874
+ sorted(
875
+ {name for name in live if name in drift.current} | (collateral & set(live))
876
+ )
877
+ )
790
878
 
791
879
  # ── #2240: the deadlock bound ────────────────────────────────────────
792
880
  pressure = pressure or DeferralPressure()
@@ -797,6 +885,8 @@ def plan_cordons(
797
885
  expired=expired,
798
886
  cooling_seconds=cooling,
799
887
  unknown=tuple(sorted(drift.undecided & set(live))),
888
+ collateral_spared=tuple(sorted(collateral)),
889
+ blocked_behind=blocked_behind,
800
890
  )
801
891
  if max_deferrals > 0 and pressure.consecutive >= max_deferrals:
802
892
  return CordonPlan(
@@ -809,11 +899,13 @@ def plan_cordons(
809
899
  cooldown_seconds=release_cooldown,
810
900
  target_version=target_version,
811
901
  ),
902
+ collateral_spared=tuple(sorted(collateral)),
903
+ blocked_behind=blocked_behind,
812
904
  )
813
905
 
814
906
  to_cordon: list[Cordon] = []
815
907
  escalations: list[DrainEscalation] = []
816
- for host in sorted(drift.behind):
908
+ for host in sorted(drift.behind - collateral):
817
909
  previous = live.get(host)
818
910
  created = previous.created_at if previous and previous.created_at else now
819
911
  to_cordon.append(
@@ -844,6 +936,8 @@ def plan_cordons(
844
936
  escalations=tuple(escalations),
845
937
  expired=expired,
846
938
  unknown=tuple(sorted(drift.undecided & set(live))),
939
+ collateral_spared=tuple(sorted(collateral)),
940
+ blocked_behind=blocked_behind,
847
941
  )
848
942
 
849
943
 
@@ -883,6 +977,13 @@ class CordonOutcome:
883
977
  #: out of the newest record instead of every caller of
884
978
  #: :func:`describe_deferral_pressure` assuming the default.
885
979
  max_deferrals: int = DEFAULT_MAX_DEFERRALS
980
+ #: #2176: behind hosts this run spared (or actively released) because
981
+ #: they have no busy signal of their own and cannot roll ahead of a busy,
982
+ #: behind daemon host anyway. Mirrors `CordonPlan.collateral_spared`.
983
+ collateral_spared: list[str] = field(default_factory=list)
984
+ #: #2176: the daemon host `collateral_spared` was spared on account of.
985
+ #: Mirrors `CordonPlan.blocked_behind`.
986
+ blocked_behind: str | None = None
886
987
 
887
988
  def to_dict(self) -> dict:
888
989
  return {
@@ -896,4 +997,6 @@ class CordonOutcome:
896
997
  "cooling_seconds": self.cooling_seconds,
897
998
  "pressure": dict(self.pressure),
898
999
  "max_deferrals": self.max_deferrals,
1000
+ "collateral_spared": list(self.collateral_spared),
1001
+ "blocked_behind": self.blocked_behind,
899
1002
  }
@@ -1247,6 +1247,14 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
1247
1247
  )
1248
1248
  if cordons.get("uncordoned"):
1249
1249
  lines.append(" uncordoned: " + ", ".join(cordons["uncordoned"]))
1250
+ # #2176: name the collateral hosts AND the single host they're collateral
1251
+ # to — the fact that would have turned a 40-minute puzzle into one line.
1252
+ if cordons.get("collateral_spared"):
1253
+ lines.append(
1254
+ " spared (blocked behind daemon host "
1255
+ f"{cordons.get('blocked_behind')} anyway): "
1256
+ + ", ".join(cordons["collateral_spared"])
1257
+ )
1250
1258
  if cordons.get("expired"):
1251
1259
  lines.append(
1252
1260
  " cordons that lapsed on their own: " + ", ".join(cordons["expired"])
@@ -498,6 +498,54 @@ def test_load_with_no_arg_resolves_default(tmp_path, monkeypatch) -> None:
498
498
  assert [r.name for r in cfg.repos] == ["api"]
499
499
 
500
500
 
501
+ # ── is_canonical_config_path (#2208) ─────────────────────────────────────────
502
+
503
+
504
+ def test_is_canonical_config_path_true_for_the_resolved_default(tmp_path, monkeypatch) -> None:
505
+ from coord import config as cfgmod
506
+
507
+ monkeypatch.delenv("COORD_CONFIG", raising=False)
508
+ home_cfg = tmp_path / "home.yml"
509
+ home_cfg.write_text("x")
510
+ monkeypatch.setattr(cfgmod, "USER_CONFIG_PATH", home_cfg)
511
+ monkeypatch.setattr(cfgmod, "DEFAULT_CONFIG_PATH", tmp_path / "absent-cwd.yml")
512
+
513
+ assert cfgmod.is_canonical_config_path(home_cfg) is True
514
+ # An equivalent (non-normalized) spelling of the same file still counts.
515
+ assert cfgmod.is_canonical_config_path(tmp_path / "." / "home.yml") is True
516
+
517
+
518
+ def test_is_canonical_config_path_false_for_a_scratch_override(tmp_path, monkeypatch) -> None:
519
+ """#2208: a throwaway --config pointed elsewhere is NOT canonical, even
520
+ though coord.config.load() parses it fine."""
521
+ from coord import config as cfgmod
522
+
523
+ monkeypatch.delenv("COORD_CONFIG", raising=False)
524
+ home_cfg = tmp_path / "home.yml"
525
+ home_cfg.write_text("x")
526
+ monkeypatch.setattr(cfgmod, "USER_CONFIG_PATH", home_cfg)
527
+ monkeypatch.setattr(cfgmod, "DEFAULT_CONFIG_PATH", tmp_path / "absent-cwd.yml")
528
+
529
+ scratch = tmp_path / "mini2.yml"
530
+ scratch.write_text("machines:\n - name: ci-runner\n host: ci-runner\n")
531
+
532
+ assert cfgmod.is_canonical_config_path(scratch) is False
533
+
534
+
535
+ def test_is_canonical_config_path_respects_coord_config_env(tmp_path, monkeypatch) -> None:
536
+ """When $COORD_CONFIG is set, THAT is the canonical path for this
537
+ environment — matching it counts as canonical, same as any other
538
+ ordinary (non-override) resolution."""
539
+ from coord import config as cfgmod
540
+
541
+ env_file = tmp_path / "env.yml"
542
+ env_file.write_text("x")
543
+ monkeypatch.setenv("COORD_CONFIG", str(env_file))
544
+
545
+ assert cfgmod.is_canonical_config_path(env_file) is True
546
+ assert cfgmod.is_canonical_config_path(tmp_path / "other.yml") is False
547
+
548
+
501
549
  # ── PipelineConfig helpers ──────────────────────────────────────────────────
502
550
 
503
551