code-coordinator 0.5.71__tar.gz → 0.5.72__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 (817) hide show
  1. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/status.py +27 -5
  5. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/graph_health.py +83 -4
  6. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/graph.py +55 -6
  7. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_diagnose_graph.py +91 -0
  8. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_graph_health.py +79 -0
  9. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_checks.py +59 -1
  10. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_cli_graph.py +3 -1
  11. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_incident_regression.py +4 -2
  12. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/workflows/cargo-test.yml +0 -0
  23. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/workflows/release-tui.yml +0 -0
  25. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/.gitignore +0 -0
  27. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/GOAL.md +0 -0
  29. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/LICENSE +0 -0
  30. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/README.md +0 -0
  32. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agent.py +0 -0
  43. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agent_app.py +0 -0
  44. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/board_bool_guard.py +0 -0
  51. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/client.py +0 -0
  62. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/chat.py +0 -0
  68. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/dispatch.py +0 -0
  69. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/dispatch_workers.py +0 -0
  70. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/drive.py +0 -0
  71. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/drive_queue.py +0 -0
  72. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/release.py +0 -0
  82. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/report.py +0 -0
  83. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/review.py +0 -0
  84. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/scorecard.py +0 -0
  85. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/sessions.py +0 -0
  86. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/setup.py +0 -0
  87. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/config.py +0 -0
  92. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/conflict_fix.py +0 -0
  93. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dao.py +0 -0
  94. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/__init__.py +0 -0
  95. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/fixture.py +0 -0
  96. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/index.html +0 -0
  97. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/server.py +0 -0
  98. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/terminal.py +0 -0
  99. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/.gitignore +0 -0
  100. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/components.json +0 -0
  101. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  102. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  103. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  104. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  105. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  106. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  107. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  108. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  109. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  110. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/index.html +0 -0
  111. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  112. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/sw.js +0 -0
  113. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  114. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  115. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  116. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  117. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  118. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  119. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  120. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  121. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  122. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  123. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/eslint.config.js +0 -0
  124. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/index.html +0 -0
  125. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  126. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/package-lock.json +0 -0
  127. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/package.json +0 -0
  128. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  129. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/playwright.config.ts +0 -0
  130. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/postcss.config.js +0 -0
  131. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  132. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  133. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  134. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/App.tsx +0 -0
  135. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/api/client.ts +0 -0
  136. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  137. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  138. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  139. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  140. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  141. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  142. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  143. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  144. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  145. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  146. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  147. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  148. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  149. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  150. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  151. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  152. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  153. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  154. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  155. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  156. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  157. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  158. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  159. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  160. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  161. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  162. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  163. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  164. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  165. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  166. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  167. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  168. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  169. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  170. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  171. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/index.css +0 -0
  172. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  173. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  174. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/main.tsx +0 -0
  175. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  176. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  177. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  178. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  179. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  180. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  181. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  182. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  183. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  184. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  185. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  186. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  187. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  188. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  189. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  190. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  191. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  192. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  193. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  194. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  195. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  196. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  197. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  198. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/tailwind.config.js +0 -0
  199. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/tsconfig.json +0 -0
  200. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  201. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dashboard/webapp/vite.config.ts +0 -0
  202. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/db.py +0 -0
  203. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dead_end.py +0 -0
  204. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/README.md +0 -0
  205. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-agent.service +0 -0
  206. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-db-backup.service +0 -0
  207. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-db-backup.sh +0 -0
  208. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-db-backup.timer +0 -0
  209. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-drive-queue.service +0 -0
  210. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-drive-queue.timer +0 -0
  211. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-notify.service +0 -0
  212. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-notify.timer +0 -0
  213. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-release-propagate.service +0 -0
  214. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-release-propagate.timer +0 -0
  215. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-release-window.service +0 -0
  216. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-release-window.timer +0 -0
  217. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-serve.service +0 -0
  218. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-web-dist-build.service +0 -0
  219. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-web-dist-build.timer +0 -0
  220. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy/coord-web.service +0 -0
  221. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy_manifest.py +0 -0
  222. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deploy_units.py +0 -0
  223. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/deps.py +0 -0
  224. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/diagnose.py +0 -0
  225. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dispatch.py +0 -0
  226. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/dist_name.py +0 -0
  227. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/drive.py +0 -0
  228. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/drive_queue.py +0 -0
  229. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/events.py +0 -0
  231. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/__init__.py +0 -0
  242. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/aggregate.py +0 -0
  243. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/__init__.py +0 -0
  244. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/agent_install.py +0 -0
  245. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/cargo_targets.py +0 -0
  246. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/claude_binary.py +0 -0
  247. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/deploy_lane_facts.py +0 -0
  248. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/disk.py +0 -0
  249. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/fleet_board.py +0 -0
  250. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  251. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/fleet_phantom.py +0 -0
  252. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/fleet_unit_drift.py +0 -0
  253. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/plan_usage.py +0 -0
  254. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/repo_state.py +0 -0
  255. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/spawned_coord.py +0 -0
  256. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/timer_active.py +0 -0
  257. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/toolchain.py +0 -0
  258. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/unit_drift.py +0 -0
  259. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/unit_enablement.py +0 -0
  260. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/checks/worktrees.py +0 -0
  261. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/cli.py +0 -0
  262. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/context.py +0 -0
  263. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/fleet_snapshot.py +0 -0
  264. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/models.py +0 -0
  265. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/pypi.py +0 -0
  266. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/registry.py +0 -0
  267. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/render.py +0 -0
  268. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/health/units.py +0 -0
  269. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/hooks.py +0 -0
  270. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/housekeeping.py +0 -0
  271. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/interactive.py +0 -0
  272. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/issue_store.py +0 -0
  273. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/liveness_auditor.py +0 -0
  274. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/machine_pause.py +0 -0
  275. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/merge_queue.py +0 -0
  276. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/milestone_chat.py +0 -0
  277. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/milestone_dispatch.py +0 -0
  278. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/milestone_gate.py +0 -0
  279. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/milestone_order.py +0 -0
  280. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/mock_author.py +0 -0
  281. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/models.py +0 -0
  282. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/network.py +0 -0
  283. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/new_issue_chat.py +0 -0
  284. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/__init__.py +0 -0
  285. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/baseline.py +0 -0
  286. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/cli.py +0 -0
  287. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/collect.py +0 -0
  288. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/digest.py +0 -0
  289. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/models.py +0 -0
  290. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/predicate.py +0 -0
  291. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/service.py +0 -0
  292. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/store.py +0 -0
  293. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notifier/transport.py +0 -0
  294. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/notify.py +0 -0
  295. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/openapi.py +0 -0
  296. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/overlap_fence.py +0 -0
  297. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/parentage.py +0 -0
  298. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/parentage_github.py +0 -0
  299. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/pipeline.py +0 -0
  300. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/plan_parser.py +0 -0
  301. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/plans.py +0 -0
  302. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/platform_paths.py +0 -0
  303. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/portal_bridge.py +0 -0
  304. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/pr_body_lint.py +0 -0
  305. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/prereqs.py +0 -0
  306. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/progress.py +0 -0
  307. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/providers/__init__.py +0 -0
  308. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/providers/base.py +0 -0
  309. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/providers/claude.py +0 -0
  310. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/providers/claude_pty.py +0 -0
  311. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/providers/opencode.py +0 -0
  312. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/reconcile.py +0 -0
  313. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/refine_chat.py +0 -0
  314. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/release_cordon.py +0 -0
  315. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/release_propagate.py +0 -0
  316. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/release_verify.py +0 -0
  317. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/release_window.py +0 -0
  318. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/reports.py +0 -0
  319. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/revalidate.py +0 -0
  320. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/review.py +0 -0
  321. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/scorecard.py +0 -0
  322. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/serve_app.py +0 -0
  323. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/skills/update-issue/SKILL.md +0 -0
  324. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/smoke.py +0 -0
  325. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/spend_ceiling.py +0 -0
  326. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/split_work.py +0 -0
  327. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/stage_projection.py +0 -0
  328. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/state.py +0 -0
  329. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/test_author.py +0 -0
  330. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/test_chat.py +0 -0
  331. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/test_orchestrator.py +0 -0
  332. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/test_report.py +0 -0
  333. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/tui_release.py +0 -0
  334. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/usage.py +0 -0
  335. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/usage_limits.py +0 -0
  336. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/usage_rollup.py +0 -0
  337. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coord/worker_events.py +0 -0
  338. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/coordinator.example.yml +0 -0
  339. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-agent.service +0 -0
  340. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-db-backup.service +0 -0
  341. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-db-backup.sh +0 -0
  342. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-db-backup.timer +0 -0
  343. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-drive-queue.service +0 -0
  344. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-drive-queue.timer +0 -0
  345. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-notify.service +0 -0
  346. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-notify.timer +0 -0
  347. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-release-propagate.service +0 -0
  348. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-release-propagate.timer +0 -0
  349. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-release-window.service +0 -0
  350. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-release-window.timer +0 -0
  351. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-serve.service +0 -0
  352. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-web-dist-build.service +0 -0
  353. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-web-dist-build.sh +0 -0
  354. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-web-dist-build.timer +0 -0
  355. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-web-rollback.sh +0 -0
  356. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/coord-web.service +0 -0
  357. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/deploy/node-shim.sh +0 -0
  358. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/AGENT_OPERATIONS.md +0 -0
  359. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/ARCHITECTURE.md +0 -0
  360. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/ARCH_SECURITY_GATES.md +0 -0
  361. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/COCKPIT.md +0 -0
  362. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/CONTROL_CENTER.md +0 -0
  363. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/CROSS_PLATFORM.md +0 -0
  364. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/CUSTOMER_PORTAL.md +0 -0
  365. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/DRIVE_QUEUE.md +0 -0
  366. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/EPHEMERAL_WORKERS.md +0 -0
  367. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/FORGE_MIGRATION.md +0 -0
  368. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/GRAPHIFY_SETUP.md +0 -0
  369. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/ISSUE_GUIDANCE.md +0 -0
  370. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/MAC_MINI.md +0 -0
  371. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  372. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/NOTIFIER.md +0 -0
  373. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/OPENCODE_VERIFICATION.md +0 -0
  374. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/OPERATING_GOTCHAS.md +0 -0
  375. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/mocks/web/README.md +0 -0
  384. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/mocks/web/_tokens.css +0 -0
  385. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/mocks/web/issue-detail.html +0 -0
  386. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/mocks/web/pipeline-narrow.html +0 -0
  387. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/docs/mocks/web/pipeline-wide.html +0 -0
  388. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/graphify-out/.gitignore +0 -0
  389. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/install-agent.sh +0 -0
  390. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/pyproject.toml +0 -0
  391. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/audit_review_verdict_overrides.py +0 -0
  392. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  393. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/build-worker-image.sh +0 -0
  394. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/coordinator-machine.py +0 -0
  395. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/epic-down.sh +0 -0
  396. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/epic-up.sh +0 -0
  397. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/preflight.sh +0 -0
  398. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/provision-worker.sh +0 -0
  399. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  400. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  401. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/azure-workers/verify-github-token.sh +0 -0
  402. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/codegen.py +0 -0
  403. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/coord-test-runner.sh +0 -0
  404. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/drive-batch.sh +0 -0
  405. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/next_release_tag.py +0 -0
  407. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/run_tests_in_populated_home.sh +0 -0
  408. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/run_tests_without_gh.sh +0 -0
  409. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/verify_878_review_capture.py +0 -0
  411. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/verify_release_published.py +0 -0
  412. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/scripts/verify_release_wheel.py +0 -0
  413. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/setup.cfg +0 -0
  414. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/SMOKE_SET.md +0 -0
  415. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/__init__.py +0 -0
  416. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  417. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/contract.md +0 -0
  418. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/manifest.yml +0 -0
  419. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  420. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  421. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  422. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  423. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-37/conftest.py +0 -0
  424. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-37/contract.md +0 -0
  425. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-37/manifest.yml +0 -0
  426. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  427. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  428. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/contract.md +0 -0
  429. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/manifest.yml +0 -0
  430. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  431. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  432. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  433. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  434. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  435. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  436. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  437. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  438. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  439. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  440. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/contract.md +0 -0
  441. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  442. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  443. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/manifest.yml +0 -0
  444. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-51/tsconfig.json +0 -0
  446. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  452. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/all_pass.json +0 -0
  453. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  454. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/mixed_fail.json +0 -0
  455. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  456. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  457. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/skip.json +0 -0
  458. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/playwright/truncated.json +0 -0
  459. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  460. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  461. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  462. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  463. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_graph_self_heal.py +0 -0
  478. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_health_h3.py +0 -0
  479. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_idle_restart.py +0 -0
  480. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_push_failure.py +0 -0
  481. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_reap.py +0 -0
  482. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_repos_and_pull.py +0 -0
  483. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_restart_services_endpoint.py +0 -0
  484. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_startup_diagnostics.py +0 -0
  485. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_update.py +0 -0
  486. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_update_bluegreen.py +0 -0
  487. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_usage_limit.py +0 -0
  488. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_agent_zero_commit.py +0 -0
  489. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_ambient_home_isolation.py +0 -0
  490. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_approve_reject_plan.py +0 -0
  491. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_approve_usage_gate.py +0 -0
  492. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_assignment_already_recorded_daemon.py +0 -0
  493. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_audit_log.py +0 -0
  494. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_audit_outcome.py +0 -0
  495. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_audit_query.py +0 -0
  496. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_auto_loop.py +0 -0
  497. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_auto_release_publish_2035.py +0 -0
  498. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_base_checkout_restore.py +0 -0
  499. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_cap_762.py +0 -0
  500. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_fixture.py +0 -0
  501. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_read_path.py +0 -0
  502. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_service.py +0 -0
  503. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_state.py +0 -0
  504. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_board_wire.py +0 -0
  505. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_brain.py +0 -0
  506. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_branch_model.py +0 -0
  507. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_bug_intake.py +0 -0
  508. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_build_worker_image_env_update.py +0 -0
  509. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cargo_cache.py +0 -0
  510. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_ci_acceptance_gate_1950.py +0 -0
  511. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_ci_parity_2091.py +0 -0
  512. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_ci_store.py +0 -0
  513. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_claim.py +0 -0
  514. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_audit.py +0 -0
  520. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_chat_continue.py +0 -0
  521. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_diagnose_config_provenance.py +0 -0
  522. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_doctor.py +0 -0
  523. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_doctor_config_free_1801.py +0 -0
  524. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  525. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_drive.py +0 -0
  526. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_drive_queue.py +0 -0
  527. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_escalate.py +0 -0
  528. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_fix_headless_review.py +0 -0
  529. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_gate_a.py +0 -0
  530. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_install_drift.py +0 -0
  531. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_install_skills.py +0 -0
  532. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_issue_create_label.py +0 -0
  533. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_issue_reopen.py +0 -0
  534. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_merge.py +0 -0
  535. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_assign.py +0 -0
  536. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_capture.py +0 -0
  537. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_chat_add_child.py +0 -0
  538. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_dispatch.py +0 -0
  539. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_gate_b.py +0 -0
  540. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_gate_c.py +0 -0
  541. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_order.py +0 -0
  542. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  543. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_milestone_ship.py +0 -0
  544. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_network.py +0 -0
  545. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_new_issue_chat.py +0 -0
  546. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_plans.py +0 -0
  547. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_portal.py +0 -0
  548. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_pull_artifact.py +0 -0
  549. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_queue.py +0 -0
  550. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_reattach_sessions.py +0 -0
  551. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_refine_board.py +0 -0
  552. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_release_preflight.py +0 -0
  553. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_release_propagate.py +0 -0
  554. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_release_window.py +0 -0
  555. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_scorecard.py +0 -0
  556. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_set_review_findings.py +0 -0
  557. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_advisory_terminal.py +0 -0
  558. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_merge_queue.py +0 -0
  559. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_provider.py +0 -0
  560. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_review_finalizing.py +0 -0
  561. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_test_failed_tag.py +0 -0
  562. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_status_usage_limit.py +0 -0
  563. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_sync_comments_873.py +0 -0
  564. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_test_plan.py +0 -0
  565. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_track.py +0 -0
  566. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_tui_update.py +0 -0
  567. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cli_wait.py +0 -0
  568. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_client_base_install.py +0 -0
  569. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_comments.py +0 -0
  570. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_completion_summary.py +0 -0
  571. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_config.py +0 -0
  572. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_config_acceptance.py +0 -0
  573. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_config_audit.py +0 -0
  574. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_config_pricing.py +0 -0
  575. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_config_usage_gate.py +0 -0
  576. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_conflict_fix.py +0 -0
  577. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_conflict_fix_semantic.py +0 -0
  578. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coord_test.py +0 -0
  579. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coord_test_runner_baseline.py +0 -0
  580. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coord_test_runner_routing.py +0 -0
  581. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coord_test_runner_toolchain.py +0 -0
  582. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coord_web_sse_restart_live.py +0 -0
  583. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_coordinator_machine.py +0 -0
  584. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_cross_platform_imports.py +0 -0
  585. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dashboard.py +0 -0
  586. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dashboard_fixture.py +0 -0
  587. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dashboard_terminal.py +0 -0
  588. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dashboard_terminal_live.py +0 -0
  589. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_db.py +0 -0
  590. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dead_end.py +0 -0
  591. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_coord_db_backup.py +0 -0
  592. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_coord_web_dist.py +0 -0
  593. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_coord_web_rollback.py +0 -0
  594. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_drive_queue_unit.py +0 -0
  595. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_manifest.py +0 -0
  596. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_units_lane.py +0 -0
  597. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deploy_web_unit.py +0 -0
  598. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_deps.py +0 -0
  599. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_diagnose.py +0 -0
  600. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dispatch.py +0 -0
  601. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dispatch_target_validation.py +0 -0
  602. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_dist_name.py +0 -0
  603. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_done_housekeeping.py +0 -0
  604. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_drive.py +0 -0
  605. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_drive_queue.py +0 -0
  606. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_drive_state.py +0 -0
  607. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_drive_tmux.py +0 -0
  608. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_epic_up_capability_detection.py +0 -0
  609. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  610. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_epic_up_image_provenance.py +0 -0
  611. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_errors.py +0 -0
  612. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_events.py +0 -0
  613. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_failure_class.py +0 -0
  614. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_filelock.py +0 -0
  615. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  616. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_fix_of_force_override.py +0 -0
  617. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_fleet_config_health.py +0 -0
  618. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_fleet_health_probes.py +0 -0
  619. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_fleet_health_snapshot.py +0 -0
  620. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_freshness.py +0 -0
  621. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_gate_a.py +0 -0
  622. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_gate_b.py +0 -0
  623. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_gate_snapshot_staleness.py +0 -0
  624. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_gates.py +0 -0
  625. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_generated_types_fixture.py +0 -0
  626. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_github_ops.py +0 -0
  627. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_goal.py +0 -0
  628. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_handoff.py +0 -0
  629. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_cli.py +0 -0
  630. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_pypi.py +0 -0
  634. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_registry.py +0 -0
  635. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_timer_active.py +0 -0
  636. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_toolchain.py +0 -0
  637. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_unit_drift.py +0 -0
  638. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_health_unit_enablement.py +0 -0
  639. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_hooks.py +0 -0
  640. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_human_attended_437.py +0 -0
  641. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_init.py +0 -0
  642. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_integration.py +0 -0
  643. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_briefing_echo.py +0 -0
  644. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_prefill_state.py +0 -0
  645. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_session_relaunch.py +0 -0
  646. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_test_verdict_backstop.py +0 -0
  647. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_token_attribution.py +0 -0
  648. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_interactive_worktree.py +0 -0
  649. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_issue_store_seam.py +0 -0
  650. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_liveness_auditor.py +0 -0
  651. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_liveness_notify.py +0 -0
  652. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_machine_pause.py +0 -0
  653. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_merge_queue.py +0 -0
  654. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_merge_verify.py +0 -0
  655. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_milestone_chat.py +0 -0
  656. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_milestone_dispatch.py +0 -0
  657. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_milestone_gate.py +0 -0
  658. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_milestone_order.py +0 -0
  659. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_milestone_seam.py +0 -0
  660. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_mock_author.py +0 -0
  661. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_model_tiering.py +0 -0
  662. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_models.py +0 -0
  663. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_models_config_labels.py +0 -0
  664. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_needs_attention.py +0 -0
  665. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_network.py +0 -0
  666. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_new_issue_chat.py +0 -0
  667. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_next_release_tag.py +0 -0
  668. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_no_direct_gh_calls.py +0 -0
  669. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_node_shim.py +0 -0
  670. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_baseline.py +0 -0
  671. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_cli.py +0 -0
  672. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_collect.py +0 -0
  673. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_config.py +0 -0
  674. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_drive_seam.py +0 -0
  675. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_isolation.py +0 -0
  676. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_predicate.py +0 -0
  677. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_quiet_hours.py +0 -0
  678. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notifier_service.py +0 -0
  679. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notify.py +0 -0
  680. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_notify_drain.py +0 -0
  681. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_openapi.py +0 -0
  682. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_operational_defaults.py +0 -0
  683. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_overlap_fence.py +0 -0
  684. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_packaged_deploy_units.py +0 -0
  685. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_parentage.py +0 -0
  686. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_paste_landed.py +0 -0
  687. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_pipeline.py +0 -0
  688. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_plan_followup_approve_plan_command.py +0 -0
  689. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_plan_followup_pr_command.py +0 -0
  690. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_plan_followup_review_command.py +0 -0
  691. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_plan_only.py +0 -0
  692. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_plan_parser.py +0 -0
  693. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_platform_paths.py +0 -0
  694. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_portal_bridge.py +0 -0
  695. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_portal_config.py +0 -0
  696. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_pr_body_lint.py +0 -0
  697. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_prereqs.py +0 -0
  698. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_production_db_guard.py +0 -0
  699. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_progress.py +0 -0
  700. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_provider_seam.py +0 -0
  701. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_providers.py +0 -0
  702. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_providers_config_labels.py +0 -0
  703. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_providers_pty.py +0 -0
  704. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_quiet_hours.py +0 -0
  705. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_quiet_hours_store_2146.py +0 -0
  706. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reap_merged_sessions.py +0 -0
  707. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reap_stale_interactive_tick.py +0 -0
  708. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reconcile_branch.py +0 -0
  709. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reconcile_completions.py +0 -0
  710. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reconcile_merges.py +0 -0
  711. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reconcile_usage_limit_done.py +0 -0
  712. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_refine_chat.py +0 -0
  713. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_release_cordon_2101.py +0 -0
  714. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_release_propagate.py +0 -0
  715. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_release_unified_1242.py +0 -0
  716. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_release_verify.py +0 -0
  717. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_release_window.py +0 -0
  718. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_remote_auto_prune.py +0 -0
  719. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_remote_interactive_reaper.py +0 -0
  720. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_report_result_push.py +0 -0
  721. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_reports.py +0 -0
  722. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_retry.py +0 -0
  723. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_retry_advisory_1606.py +0 -0
  724. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_retry_type_1636.py +0 -0
  725. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_revalidate.py +0 -0
  726. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review.py +0 -0
  727. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_end_review_without_verdict.py +0 -0
  728. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_parse_failure_diagnostic.py +0 -0
  729. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_reaffirm.py +0 -0
  730. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_state.py +0 -0
  731. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_verdict_backstop.py +0 -0
  732. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_verdict_override_audit.py +0 -0
  733. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_verdict_relay.py +0 -0
  734. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_review_zero_commits.py +0 -0
  735. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_scoped_review_wiring.py +0 -0
  736. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_scorecard.py +0 -0
  737. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_serve.py +0 -0
  738. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_serve_app_board_trim.py +0 -0
  739. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_session.py +0 -0
  740. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_slice_issue_attribution.py +0 -0
  741. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_smoke.py +0 -0
  742. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_smoke_live_checkout_restore.py +0 -0
  743. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_smoke_workflow.py +0 -0
  744. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_spend_ceiling.py +0 -0
  745. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_spend_ceiling_coordinator.py +0 -0
  746. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_split.py +0 -0
  747. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_split_work.py +0 -0
  748. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_stage_projection.py +0 -0
  749. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_stalled_pipeline.py +0 -0
  750. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_state.py +0 -0
  751. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_state_review_findings_daemon.py +0 -0
  752. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_status_fleet_footer.py +0 -0
  753. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_stop_1567.py +0 -0
  754. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_stuck.py +0 -0
  755. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_terminal_command.py +0 -0
  756. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_author.py +0 -0
  757. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_chat.py +0 -0
  758. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_orchestrator.py +0 -0
  759. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_report.py +0 -0
  760. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_verdict_parsing.py +0 -0
  761. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_test_verdict_transcript_floor.py +0 -0
  762. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_thin_client_board_audit.py +0 -0
  763. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_thin_client_config_load_1080.py +0 -0
  764. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_thin_client_daemon_routing_906.py +0 -0
  765. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_tmux_host.py +0 -0
  766. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_tmux_session.py +0 -0
  767. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_transcript_floor.py +0 -0
  768. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_usage.py +0 -0
  769. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_usage_limits.py +0 -0
  770. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_usage_rollup.py +0 -0
  771. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_venv_live_install_2121.py +0 -0
  772. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_version_single_source.py +0 -0
  773. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_watch.py +0 -0
  774. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worker_events.py +0 -0
  775. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worker_image_pin_sync.py +0 -0
  776. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worker_safety.py +0 -0
  777. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worker_test_scoping.py +0 -0
  778. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worktree.py +0 -0
  779. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  780. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/Cargo.lock +0 -0
  781. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/Cargo.toml +0 -0
  782. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/cargo-config-local-quadraui.toml.example +0 -0
  783. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/audit.rs +0 -0
  784. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/chat.rs +0 -0
  785. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/data.rs +0 -0
  786. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/dialogs.rs +0 -0
  787. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/drive.rs +0 -0
  788. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/drive_queue.rs +0 -0
  789. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/escalation.rs +0 -0
  790. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/events.rs +0 -0
  791. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/fixtures.rs +0 -0
  792. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/fleet_health.rs +0 -0
  793. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/fleet_sessions.rs +0 -0
  794. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/fleet_terminals.rs +0 -0
  795. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/format.rs +0 -0
  796. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/milestone_dag.rs +0 -0
  797. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/mod.rs +0 -0
  798. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/msv.rs +0 -0
  799. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/pipeline.rs +0 -0
  800. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/plans.rs +0 -0
  801. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/render.rs +0 -0
  802. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/reports.rs +0 -0
  803. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/sessions.rs +0 -0
  804. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/settings_ui.rs +0 -0
  805. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/sidebar.rs +0 -0
  806. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/terminal.rs +0 -0
  807. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/tests.rs +0 -0
  808. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/types.rs +0 -0
  809. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/app/workspace.rs +0 -0
  810. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/bin/gtk.rs +0 -0
  811. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/commands.rs +0 -0
  812. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/lib.rs +0 -0
  813. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/main.rs +0 -0
  814. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/src/settings.rs +0 -0
  815. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/tests/acceptance.rs +0 -0
  816. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/tui/tests/cli.rs +0 -0
  817. {code_coordinator-0.5.71 → code_coordinator-0.5.72}/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.71
3
+ Version: 0.5.72
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.71
3
+ Version: 0.5.72
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.71",
2
+ "tag": "0.5.72",
3
3
  "distance": 0,
4
- "node": "g61fe32cffef6c91f2bf3f8b2535b211f0c81996c",
4
+ "node": "gf89a7326b4afe98af0d76d9cbafabea51928013f",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -1464,6 +1464,15 @@ def _diagnose_graph_health(config_path: Path) -> None:
1464
1464
  checks ``core.hooksPath``, the one-time per-machine setting that decides
1465
1465
  whether worktrees on this box get a linked graph at all.
1466
1466
 
1467
+ #2211: also reports HEAD vs ``origin/<default_branch>``, alongside the
1468
+ existing graph-vs-HEAD comparison. The base checkout is fetched but
1469
+ never pulled by design (worktrees always branch from a fresh
1470
+ ``origin/<default>``, so a stale base never breaks dispatch) — which
1471
+ means a graph can match HEAD exactly while HEAD itself sits arbitrarily
1472
+ far behind the remote, and the graph-vs-HEAD check alone reports a clean
1473
+ ``✓ in sync`` for it. This never fetches or pulls; it only reads whatever
1474
+ ``origin/<default_branch>`` the last fetch left behind.
1475
+
1467
1476
  Local-machine only, same scope as ``--orphan-worktrees``: it inspects the
1468
1477
  checkouts named in ``coordinator.yml`` that actually exist here.
1469
1478
  """
@@ -1476,7 +1485,7 @@ def _diagnose_graph_health(config_path: Path) -> None:
1476
1485
  cfg = _load_config(config_path)
1477
1486
 
1478
1487
  seen: set[Path] = set()
1479
- checkouts: list[tuple[str, Path]] = []
1488
+ checkouts: list[tuple[str, Path, str]] = []
1480
1489
  for machine in cfg.machines:
1481
1490
  for repo_cfg in cfg.repos:
1482
1491
  rp = machine.repo_path(repo_cfg.name)
@@ -1486,16 +1495,20 @@ def _diagnose_graph_health(config_path: Path) -> None:
1486
1495
  if path in seen or not (path / ".git").exists():
1487
1496
  continue
1488
1497
  seen.add(path)
1489
- checkouts.append((repo_cfg.name, path))
1498
+ checkouts.append((repo_cfg.name, path, repo_cfg.default_branch or "main"))
1490
1499
 
1491
1500
  if not checkouts:
1492
1501
  click.echo("no local checkouts from coordinator.yml exist on this machine.")
1493
1502
  return
1494
1503
 
1495
1504
  stale_count = 0
1496
- for repo_name, path in checkouts:
1505
+ origin_behind_count = 0
1506
+ for repo_name, path, default_branch in checkouts:
1497
1507
  click.echo(f"── {repo_name}")
1498
- st = graph_status(path)
1508
+ # #2211: default_branch drives the HEAD-vs-origin comparison
1509
+ # alongside the existing graph-vs-HEAD one — never fetches, only
1510
+ # reads whatever `origin/<default_branch>` the last fetch left.
1511
+ st = graph_status(path, default_branch)
1499
1512
  for line in format_status_lines(st):
1500
1513
  click.echo(f" {line}")
1501
1514
  if st.stale:
@@ -1504,11 +1517,20 @@ def _diagnose_graph_health(config_path: Path) -> None:
1504
1517
  " fix: run `graphify update .` in the checkout "
1505
1518
  "(the hooks skip rebase/merge/cherry-pick and reset --hard)"
1506
1519
  )
1520
+ if st.origin_behind:
1521
+ origin_behind_count += 1
1522
+ click.echo(
1523
+ f" fix: HEAD is behind origin/{default_branch} — the base "
1524
+ "checkout is fetched but never auto-pulled (by design; "
1525
+ "checkouts are sometimes deliberately parked). Review and "
1526
+ "pull by hand if it isn't."
1527
+ )
1507
1528
  ok, detail = hooks_path_status(path)
1508
1529
  click.echo(f" {'✓' if ok else '⚠'} {detail}")
1509
1530
 
1510
1531
  click.echo(
1511
- f"GRAPH_HEALTH: checkouts={len(checkouts)} stale={stale_count}"
1532
+ f"GRAPH_HEALTH: checkouts={len(checkouts)} stale={stale_count} "
1533
+ f"origin_behind={origin_behind_count}"
1512
1534
  )
1513
1535
 
1514
1536
 
@@ -81,6 +81,16 @@ class GraphStatus:
81
81
  built_sha: str | None = None
82
82
  head_sha: str | None = None
83
83
  in_sync: bool = False
84
+ # HEAD vs origin/<default_branch> — the axis graph<->HEAD alone cannot see
85
+ # (#2211). The base checkout is fetched but never pulled by design (see
86
+ # module docstring), so HEAD can sit arbitrarily far behind origin while
87
+ # graph == HEAD reports a clean bill of health. ``default_branch`` is the
88
+ # branch name the comparison used; ``origin_sha`` / ``commits_behind_origin``
89
+ # are ``None`` when it could not be determined (no remote, ref never
90
+ # fetched, or the git call failed) rather than treated as "0 behind".
91
+ default_branch: str | None = None
92
+ origin_sha: str | None = None
93
+ commits_behind_origin: int | None = None
84
94
  age_seconds: float | None = None
85
95
  # mtime of graphify-out/manifest.json — the last time graphify *checked* the
86
96
  # graph against the working tree, whether or not it rewrote anything.
@@ -122,6 +132,19 @@ class GraphStatus:
122
132
  *unknown* — an unknown is reported separately, not counted as drift."""
123
133
  return self.stamp_behind and not self.verified_current
124
134
 
135
+ @property
136
+ def origin_behind(self) -> bool:
137
+ """HEAD (of the checkout that owns the graph) is behind
138
+ ``origin/<default_branch>`` by at least one commit — i.e. the graph
139
+ may match HEAD exactly and still describe stale code, because HEAD
140
+ itself is stale relative to the remote (#2211).
141
+
142
+ False — not True — when this could not be proven (no remote, the ref
143
+ was never fetched, or the git call failed): mirrors ``stale``'s rule
144
+ that an unknown must never be counted as drift.
145
+ """
146
+ return bool(self.commits_behind_origin)
147
+
125
148
 
126
149
  def read_built_sha(report_path: Path) -> str | None:
127
150
  """The commit ``GRAPH_REPORT.md`` says the graph was built from."""
@@ -161,6 +184,22 @@ def _head_committed_at(repo_path: Path) -> float | None:
161
184
  return None
162
185
 
163
186
 
187
+ def _commits_ahead(repo_path: Path, base: str, ahead_of: str) -> int | None:
188
+ """Count of commits reachable from *ahead_of* that are not in *base*
189
+ (``git rev-list --count base..ahead_of``).
190
+
191
+ Best-effort like the rest of this module: ``None`` (never raised) when
192
+ git can't answer — an unproven comparison must not be reported as drift.
193
+ """
194
+ out = _git_out(repo_path, "rev-list", "--count", f"{base}..{ahead_of}")
195
+ if out is None:
196
+ return None
197
+ try:
198
+ return int(out)
199
+ except ValueError:
200
+ return None
201
+
202
+
164
203
  def _shas_agree(built: str, head: str) -> bool:
165
204
  """Compare on the shorter of the two — the report abbreviates (8 chars by
166
205
  default) while ``git rev-parse HEAD`` is full-length."""
@@ -170,12 +209,20 @@ def _shas_agree(built: str, head: str) -> bool:
170
209
  return built[:n].lower() == head[:n].lower()
171
210
 
172
211
 
173
- def graph_status(repo_path: Path) -> GraphStatus:
212
+ def graph_status(repo_path: Path, default_branch: str = "main") -> GraphStatus:
174
213
  """Freshness of the graphify graph for the checkout at *repo_path*.
175
214
 
176
215
  Read-only and best-effort: a missing graph, a missing report, or a repo
177
216
  git can't read all return a populated :class:`GraphStatus` with
178
217
  ``unknown_reason`` set rather than raising.
218
+
219
+ *default_branch* names the branch to compare HEAD against on
220
+ ``origin`` (#2211) — pass the repo's configured default branch
221
+ (``coordinator.yml``'s ``default_branch``, "main" if unset). Never
222
+ fetches: it only reads whatever ``origin/<default_branch>`` the last
223
+ ``git fetch`` left behind, so a checkout that was never fetched or has
224
+ no ``origin`` remote simply leaves ``origin_sha``/``commits_behind_origin``
225
+ unset rather than reporting drift it can't prove.
179
226
  """
180
227
  st = GraphStatus(repo_path=repo_path)
181
228
  out_dir = repo_path / "graphify-out"
@@ -213,6 +260,7 @@ def graph_status(repo_path: Path) -> GraphStatus:
213
260
  owner = st.link_target.parent if (st.is_symlink and st.link_target) else repo_path
214
261
  st.head_sha = _head_sha(owner)
215
262
  st.head_committed_at = _head_committed_at(owner)
263
+ st.default_branch = default_branch
216
264
 
217
265
  if not st.built_sha:
218
266
  st.unknown_reason = "GRAPH_REPORT.md has no 'Built from commit' line"
@@ -220,6 +268,15 @@ def graph_status(repo_path: Path) -> GraphStatus:
220
268
  st.unknown_reason = f"could not read HEAD of {owner}"
221
269
  else:
222
270
  st.in_sync = _shas_agree(st.built_sha, st.head_sha)
271
+
272
+ # HEAD vs origin/<default_branch> — independent of the graph<->HEAD
273
+ # comparison above. Best-effort: no remote, or the ref not fetched yet,
274
+ # just leaves this unset (see docstring).
275
+ if st.head_sha:
276
+ origin_sha = _git_out(owner, "rev-parse", f"origin/{default_branch}")
277
+ if origin_sha:
278
+ st.origin_sha = origin_sha
279
+ st.commits_behind_origin = _commits_ahead(owner, st.head_sha, origin_sha)
223
280
  return st
224
281
 
225
282
 
@@ -326,17 +383,39 @@ def format_status_lines(st: GraphStatus) -> list[str]:
326
383
  if st.is_symlink:
327
384
  lines.append(f"↳ {where}/graphify-out → {st.link_target} (linked worktree)")
328
385
 
386
+ # #2211: graph == HEAD only proves the graph matches the checkout's own
387
+ # HEAD — it says nothing about whether that HEAD itself is stale relative
388
+ # to origin (the base checkout is fetched but never pulled, by design;
389
+ # see module docstring). Shared by both "graph matches HEAD" branches
390
+ # below so a genuinely-current-but-unpushed-tracking checkout doesn't
391
+ # report a false ✓.
392
+ origin_note = ""
393
+ if st.origin_behind:
394
+ n = st.commits_behind_origin or 0
395
+ origin_note = (
396
+ f" — HEAD is {n} commit{'' if n == 1 else 's'} behind "
397
+ f"origin/{st.default_branch}; the graph describes stale code "
398
+ f"(fix: review + pull — not automatic, see #2211)"
399
+ )
400
+
329
401
  if st.unknown_reason:
330
402
  lines.append(f"? {where}: freshness unknown — {st.unknown_reason}")
331
403
  elif st.in_sync:
332
- lines.append(f"✓ {where}: graph in sync (built from {st.built_sha})")
404
+ if origin_note:
405
+ lines.append(
406
+ f"⚠ {where}: graph matches HEAD (built from {st.built_sha}){origin_note}"
407
+ )
408
+ else:
409
+ lines.append(f"✓ {where}: graph in sync (built from {st.built_sha})")
333
410
  elif st.verified_current:
334
411
  # Stamp behind, but graphify has re-checked the tree since HEAD landed
335
412
  # and found no topology change — the graph content is current.
413
+ mark = "⚠" if origin_note else "✓"
336
414
  lines.append(
337
- f" {where}: graph content current — stamp says {st.built_sha} "
415
+ f"{mark} {where}: graph content current — stamp says {st.built_sha} "
338
416
  f"(HEAD {(st.head_sha or '')[:8]}), but verified against the tree "
339
- f"since; graphify leaves outputs untouched when topology is unchanged"
417
+ f"since; graphify leaves outputs untouched when topology is "
418
+ f"unchanged{origin_note}"
340
419
  )
341
420
  else:
342
421
  lines.append(
@@ -23,6 +23,14 @@ longer HEAD. That is the 2026-07-30 vimcode incident: 128.8h stale, hooks
23
23
  disabled, and nothing in the fleet said so. Age escalates a
24
24
  hooks-working checkout from WARN to CRIT at ``graph_stale_crit_hours``;
25
25
  hooks-disabled skips straight to CRIT because time cannot fix it.
26
+
27
+ **graph == HEAD is not the whole story (#2211).** ``status.stale`` only
28
+ compares the graph to this checkout's OWN HEAD. The base checkout is fetched
29
+ but never pulled (see ``coord.graph_health``'s module docstring), so HEAD can
30
+ sit arbitrarily far behind ``origin/<default_branch>`` while the graph
31
+ matches it exactly — a confidently-correct-looking graph of stale code. This
32
+ module reports that as its own WARN (``status.origin_behind``), independent
33
+ of and never overriding ``status.stale``'s verdict.
26
34
  """
27
35
 
28
36
  from __future__ import annotations
@@ -79,7 +87,10 @@ def probe_graph(ctx: HealthContext) -> list[CheckResult]:
79
87
  results: list[CheckResult] = []
80
88
 
81
89
  for checkout in ctx.checkouts:
82
- status = graph_status(checkout.path)
90
+ # #2211: default_branch drives the HEAD-vs-origin comparison
91
+ # alongside the existing graph-vs-HEAD one. Never fetches — only
92
+ # reads whatever origin/<default_branch> the last `git fetch` left.
93
+ status = graph_status(checkout.path, checkout.default_branch)
83
94
  hooks_ok, hooks_detail = hooks_path_status(checkout.path)
84
95
 
85
96
  values = {
@@ -91,6 +102,10 @@ def probe_graph(ctx: HealthContext) -> list[CheckResult]:
91
102
  "verified_current": status.verified_current,
92
103
  "built_sha": status.built_sha,
93
104
  "head_sha": status.head_sha,
105
+ "default_branch": status.default_branch,
106
+ "origin_sha": status.origin_sha,
107
+ "commits_behind_origin": status.commits_behind_origin,
108
+ "origin_behind": status.origin_behind,
94
109
  "age_seconds": status.age_seconds,
95
110
  "age_hours": (
96
111
  round(status.age_seconds / 3600.0, 1) if status.age_seconds is not None else None
@@ -153,11 +168,35 @@ def probe_graph(ctx: HealthContext) -> list[CheckResult]:
153
168
  else f", {commits_behind} commit{'' if commits_behind == 1 else 's'} behind"
154
169
  )
155
170
 
171
+ # #2211: graph == HEAD only proves the graph matches this checkout's
172
+ # OWN HEAD — it says nothing about whether HEAD itself is behind
173
+ # origin. The base checkout is fetched but never pulled by design
174
+ # (see coord.graph_health module docstring), so this must be judged
175
+ # independently of `status.stale`, not folded into it.
176
+ origin_suffix = (
177
+ ""
178
+ if not status.origin_behind
179
+ else (
180
+ f", {status.commits_behind_origin} commit"
181
+ f"{'' if status.commits_behind_origin == 1 else 's'} behind "
182
+ f"origin/{status.default_branch}"
183
+ )
184
+ )
185
+
156
186
  if not status.stale:
157
- severity = Severity.OK
158
- headroom = f"in sync ({(status.built_sha or '')[:8]}), {age_text} old"
159
- if status.verified_current and status.stamp_behind:
160
- headroom = f"content current (stamp {(status.built_sha or '')[:8]}), {age_text} old"
187
+ if status.origin_behind:
188
+ severity = Severity.WARN
189
+ headroom = (
190
+ f"graph matches HEAD ({(status.built_sha or '')[:8]}){origin_suffix} "
191
+ "— describes stale code"
192
+ )
193
+ else:
194
+ severity = Severity.OK
195
+ headroom = f"in sync ({(status.built_sha or '')[:8]}), {age_text} old"
196
+ if status.verified_current and status.stamp_behind:
197
+ headroom = (
198
+ f"content current (stamp {(status.built_sha or '')[:8]}), {age_text} old"
199
+ )
161
200
  elif not hooks_ok:
162
201
  severity = Severity.CRIT
163
202
  headroom = f"{age_text} stale{commits_suffix}, hooks disabled -> will not self-heal"
@@ -172,7 +211,17 @@ def probe_graph(ctx: HealthContext) -> list[CheckResult]:
172
211
  headroom = f"stale, {age_text} old{commits_suffix} (HEAD {(status.head_sha or '')[:8]})"
173
212
 
174
213
  detail = ""
175
- if severity is not Severity.OK:
214
+ if not status.stale and status.origin_behind:
215
+ # Not a graph problem — `graphify update` would rebuild from the
216
+ # same stale HEAD. Naming a `git pull` here deliberately, but not
217
+ # running one: automatic pulls are unsafe for a base checkout
218
+ # (see coord.graph_health module docstring — deliberately-parked
219
+ # branches, stale .git/index.lock, etc).
220
+ detail = (
221
+ f"fix: review, then pull {checkout.path} to catch it up to "
222
+ f"origin/{status.default_branch} (not automatic)"
223
+ )
224
+ elif severity is not Severity.OK:
176
225
  detail = f"fix: graphify update {checkout.path}"
177
226
  if not hooks_ok:
178
227
  detail = f"{detail} — {hooks_detail}"
@@ -47,6 +47,36 @@ def _repo_with_graph(root: Path, *, built_sha: str | None = None) -> Path:
47
47
  return root
48
48
 
49
49
 
50
+ def _add_empty_commits(repo: Path, n: int, *, prefix: str = "extra") -> None:
51
+ for i in range(n):
52
+ _git("commit", "-q", "--allow-empty", "-m", f"{prefix}-{i}", cwd=repo)
53
+
54
+
55
+ def _repo_behind_origin(root: Path, tmp_path: Path, *, behind_by: int) -> Path:
56
+ """A repo whose graph matches its OWN HEAD, but whose HEAD sits
57
+ *behind_by* commits behind ``origin/main`` — the exact shape a base
58
+ checkout accumulates over time, because the agent fetches but
59
+ deliberately never pulls it (``coord/agent.py``, see
60
+ ``coord.graph_health``'s module docstring for why).
61
+
62
+ ``behind_by=0`` gives a checkout that is in sync on both axes.
63
+ """
64
+ repo = _repo_with_graph(root)
65
+ caught_up_at = _git("rev-parse", "HEAD", cwd=repo).stdout.strip()
66
+ bare = tmp_path / "origin.git"
67
+ _git("init", "-q", "-b", "main", "--bare", str(bare), cwd=tmp_path)
68
+ _git("remote", "add", "origin", str(bare), cwd=repo)
69
+ _git("push", "-q", "origin", "HEAD:refs/heads/main", cwd=repo)
70
+ if behind_by:
71
+ _add_empty_commits(repo, behind_by)
72
+ _git("push", "-q", "origin", "HEAD:refs/heads/main", cwd=repo)
73
+ _git("reset", "-q", "--hard", caught_up_at, cwd=repo)
74
+ # The agent's own behaviour (fetch, never pull) — populates
75
+ # refs/remotes/origin/main without moving HEAD.
76
+ _git("fetch", "-q", "origin", cwd=repo)
77
+ return repo
78
+
79
+
50
80
  def _config_for(tmp_path: Path, repo_path: Path) -> Path:
51
81
  cfg = tmp_path / "coordinator.yml"
52
82
  cfg.write_text(
@@ -123,3 +153,64 @@ def test_handles_a_machine_whose_checkout_is_absent(tmp_path: Path) -> None:
123
153
  out = _run(cfg)
124
154
 
125
155
  assert "no local checkouts" in out
156
+
157
+
158
+ # ── #2211: graph == HEAD says nothing about HEAD == origin ──────────────────
159
+ #
160
+ # The agent fetches the base checkout but deliberately never pulls it (see
161
+ # coord.graph_health's module docstring) — worktrees always branch from a
162
+ # freshly-fetched origin/<default>, so a stale base never breaks dispatch.
163
+ # But graphify indexes the base checkout's working tree, not origin, so a
164
+ # graph that matches a stale HEAD used to report a clean '✓ in sync' with no
165
+ # way to tell the checkout was ever behind the remote at all.
166
+
167
+
168
+ def test_reports_stale_relative_to_origin_when_graph_matches_a_stale_head(
169
+ tmp_path: Path,
170
+ ) -> None:
171
+ """The exact regression: graph == HEAD, but HEAD is behind origin/main.
172
+ Must NOT render as '✓ in sync' — that is the confidently-correct-looking-
173
+ graph-of-the-past failure mode the issue is about. Must also make no
174
+ writes: HEAD is unchanged after the check runs."""
175
+ repo = _repo_behind_origin(tmp_path / "api", tmp_path, behind_by=3)
176
+ head_before = _git("rev-parse", "HEAD", cwd=repo).stdout.strip()
177
+
178
+ out = _run(_config_for(tmp_path, repo))
179
+
180
+ assert "graph in sync" not in out, (
181
+ "graph == HEAD must not be reported as fully in sync when HEAD "
182
+ "itself is behind origin"
183
+ )
184
+ assert "3 commits behind origin/main" in out
185
+ assert "STALE" not in out, "the graph really does match HEAD — not today's drift"
186
+
187
+ head_after = _git("rev-parse", "HEAD", cwd=repo).stdout.strip()
188
+ assert head_after == head_before, "the check must never write to the checkout"
189
+
190
+
191
+ def test_reports_in_sync_when_head_matches_both_graph_and_origin(
192
+ tmp_path: Path,
193
+ ) -> None:
194
+ """A checkout in sync on both axes — graph == HEAD == origin — still
195
+ reports the plain '✓ in sync' with no origin-drift warning."""
196
+ repo = _repo_behind_origin(tmp_path / "api", tmp_path, behind_by=0)
197
+
198
+ out = _run(_config_for(tmp_path, repo))
199
+
200
+ assert "graph in sync" in out
201
+ assert "behind origin" not in out
202
+ assert "GRAPH_HEALTH: checkouts=1 stale=0 origin_behind=0" in out
203
+
204
+
205
+ def test_graph_vs_head_drift_still_reports_stale_regardless_of_origin(
206
+ tmp_path: Path,
207
+ ) -> None:
208
+ """graph != HEAD must still render as today's STALE, unchanged — the
209
+ origin axis is additive, never a replacement for the existing check."""
210
+ repo = _repo_behind_origin(tmp_path / "api", tmp_path, behind_by=0)
211
+ _git("commit", "-q", "--allow-empty", "-m", "moves HEAD past the graph", cwd=repo)
212
+
213
+ out = _run(_config_for(tmp_path, repo))
214
+
215
+ assert "STALE" in out
216
+ assert "GRAPH_HEALTH: checkouts=1 stale=1" in out
@@ -433,6 +433,85 @@ def test_unknown_freshness_is_not_counted_as_stale(tmp_path: Path) -> None:
433
433
  assert st.stale is False
434
434
 
435
435
 
436
+ # ── #2211: HEAD vs origin/<default_branch> ───────────────────────────────────
437
+
438
+
439
+ def _repo_behind_origin(tmp_path: Path, *, behind_by: int) -> Path:
440
+ """A repo whose graph matches its OWN HEAD, but whose HEAD sits
441
+ *behind_by* commits behind ``origin/main`` — never fetched-and-pulled,
442
+ only fetched (the agent's own behaviour, see module docstring)."""
443
+ repo = _make_repo(tmp_path / "repo", with_hooks=False)
444
+ _seed_graph(repo, built_sha=_head(repo)[:8])
445
+ caught_up_at = _head(repo)
446
+ bare = tmp_path / "origin.git"
447
+ _git("init", "-q", "-b", "main", "--bare", str(bare), cwd=tmp_path)
448
+ _git("remote", "add", "origin", str(bare), cwd=repo)
449
+ _git("push", "-q", "origin", "HEAD:refs/heads/main", cwd=repo)
450
+ if behind_by:
451
+ for i in range(behind_by):
452
+ _git("commit", "-q", "--allow-empty", "-m", f"extra-{i}", cwd=repo)
453
+ _git("push", "-q", "origin", "HEAD:refs/heads/main", cwd=repo)
454
+ _git("reset", "-q", "--hard", caught_up_at, cwd=repo)
455
+ _git("fetch", "-q", "origin", cwd=repo)
456
+ return repo
457
+
458
+
459
+ def test_graph_status_reports_origin_behind_when_head_matches_the_graph(
460
+ tmp_path: Path,
461
+ ) -> None:
462
+ """The exact #2211 regression: graph == HEAD (``in_sync`` True, ``stale``
463
+ False) tells you nothing about HEAD vs origin — that's a separate axis
464
+ this must expose, not fold into ``stale``."""
465
+ repo = _repo_behind_origin(tmp_path, behind_by=5)
466
+
467
+ st = graph_status(repo, "main")
468
+ assert st.in_sync is True, "graph really does match this checkout's own HEAD"
469
+ assert st.stale is False, "stale is strictly the graph<->HEAD comparison, unchanged"
470
+ assert st.commits_behind_origin == 5
471
+ assert st.origin_behind is True
472
+
473
+
474
+ def test_graph_status_origin_in_sync_when_head_matches_origin_too(
475
+ tmp_path: Path,
476
+ ) -> None:
477
+ repo = _repo_behind_origin(tmp_path, behind_by=0)
478
+
479
+ st = graph_status(repo, "main")
480
+ assert st.in_sync is True
481
+ assert st.commits_behind_origin == 0
482
+ assert st.origin_behind is False
483
+
484
+
485
+ def test_graph_status_origin_behind_is_unknown_not_false_without_a_remote(
486
+ tmp_path: Path,
487
+ ) -> None:
488
+ """No ``origin`` remote at all (a local-only repo, e.g. most fixtures in
489
+ this file) must not be reported as "0 commits behind" — that would be a
490
+ fabricated fact. It must stay unproven, hence ``origin_behind`` False for
491
+ a different reason: we simply couldn't check."""
492
+ repo = _make_repo(tmp_path / "repo", with_hooks=False)
493
+ _seed_graph(repo, built_sha=_head(repo)[:8])
494
+
495
+ st = graph_status(repo, "main")
496
+ assert st.origin_sha is None
497
+ assert st.commits_behind_origin is None
498
+ assert st.origin_behind is False
499
+
500
+
501
+ def test_graph_status_makes_no_writes(tmp_path: Path) -> None:
502
+ """Read-only by design (#2211's acceptance bar): no fetch, no pull — HEAD
503
+ must be exactly what it was before the check ran."""
504
+ repo = _repo_behind_origin(tmp_path, behind_by=5)
505
+ before = _head(repo)
506
+
507
+ graph_status(repo, "main")
508
+
509
+ assert _head(repo) == before
510
+ # Working tree/index likewise untouched.
511
+ status = _git("status", "--porcelain", cwd=repo).stdout
512
+ assert status == ""
513
+
514
+
436
515
  def test_hooks_path_status_flags_an_unset_hooks_path(tmp_path: Path) -> None:
437
516
  """The repo ships the bootstrap but this checkout hasn't opted in."""
438
517
  repo = _make_repo(tmp_path / "repo", with_hooks=True)
@@ -629,7 +629,9 @@ def _graph_status(**kwargs):
629
629
 
630
630
 
631
631
  def _fake_graph(monkeypatch, status, hooks: tuple[bool, str]) -> None:
632
- monkeypatch.setattr("coord.graph_health.graph_status", lambda p: status)
632
+ monkeypatch.setattr(
633
+ "coord.graph_health.graph_status", lambda p, default_branch="main": status
634
+ )
633
635
  monkeypatch.setattr("coord.graph_health.hooks_path_status", lambda p: hooks)
634
636
 
635
637
 
@@ -785,6 +787,62 @@ def test_graph_in_sync_never_computes_commit_distance(tmp_path, monkeypatch) ->
785
787
  assert result.values["commits_behind"] is None
786
788
 
787
789
 
790
+ def test_graph_matches_head_but_head_behind_origin_is_warn(tmp_path, monkeypatch) -> None:
791
+ """#2211: graph == HEAD (in_sync True, stale False) alone used to render
792
+ OK/"in sync" — a confidently-correct-looking graph of stale code, because
793
+ the base checkout is fetched but never pulled. This axis is independent
794
+ of `stale` and must WARN even though the graph<->HEAD comparison is
795
+ clean."""
796
+ _fake_graph(
797
+ monkeypatch,
798
+ _graph_status(present=True, built_sha="abc12345", head_sha="abc12345",
799
+ in_sync=True, age_seconds=3600.0,
800
+ default_branch="main", commits_behind_origin=7),
801
+ (True, "core.hooksPath=.githooks"),
802
+ )
803
+ ctx = make_ctx(tmp_path, checkouts=(_checkout(tmp_path),))
804
+ (result,) = graph.probe_graph(ctx)
805
+ assert result.severity is Severity.WARN
806
+ assert "7 commit" in result.headroom
807
+ assert "origin/main" in result.headroom
808
+ assert "in sync" not in result.headroom
809
+ assert result.values["origin_behind"] is True
810
+ assert "pull" in result.detail
811
+
812
+
813
+ def test_graph_in_sync_on_both_axes_stays_ok(tmp_path, monkeypatch) -> None:
814
+ """The companion case: HEAD matches both the graph and origin — still a
815
+ plain OK, no origin-drift warning."""
816
+ _fake_graph(
817
+ monkeypatch,
818
+ _graph_status(present=True, built_sha="abc12345", head_sha="abc12345",
819
+ in_sync=True, age_seconds=3600.0,
820
+ default_branch="main", commits_behind_origin=0),
821
+ (True, "core.hooksPath=.githooks"),
822
+ )
823
+ ctx = make_ctx(tmp_path, checkouts=(_checkout(tmp_path),))
824
+ (result,) = graph.probe_graph(ctx)
825
+ assert result.severity is Severity.OK
826
+ assert "in sync" in result.headroom
827
+
828
+
829
+ def test_graph_stale_takes_precedence_over_origin_drift(tmp_path, monkeypatch) -> None:
830
+ """When the graph itself is stale (graph != HEAD), that's still reported
831
+ exactly as before — the origin axis is additive, never a replacement,
832
+ and must not soften or relabel an existing STALE/CRIT/WARN verdict."""
833
+ _fake_graph(
834
+ monkeypatch,
835
+ _graph_status(present=True, built_sha="aaaa1111", head_sha="bbbb2222",
836
+ in_sync=False, age_seconds=100 * 3600.0,
837
+ default_branch="main", commits_behind_origin=7),
838
+ (True, "core.hooksPath=.githooks"),
839
+ )
840
+ ctx = make_ctx(tmp_path, checkouts=(_checkout(tmp_path),))
841
+ (result,) = graph.probe_graph(ctx)
842
+ assert result.severity is Severity.CRIT
843
+ assert "stale" in result.headroom
844
+
845
+
788
846
  # ── plan usage ───────────────────────────────────────────────────────────────
789
847
 
790
848
 
@@ -26,7 +26,9 @@ def _run(*args):
26
26
 
27
27
  def _stub(monkeypatch, tmp_path, *, status, hooks=(True, "core.hooksPath=.githooks")):
28
28
  """Wire ``coord health`` to one fake checkout and one scripted graph_status."""
29
- monkeypatch.setattr("coord.graph_health.graph_status", lambda p: status)
29
+ monkeypatch.setattr(
30
+ "coord.graph_health.graph_status", lambda p, default_branch="main": status
31
+ )
30
32
  monkeypatch.setattr("coord.graph_health.hooks_path_status", lambda p: hooks)
31
33
 
32
34
  thresholds = HealthConfig()
@@ -213,7 +213,7 @@ def test_vimcode_graph_128h_stale_with_hooks_disabled_is_crit_at_defaults(
213
213
  ) -> None:
214
214
  monkeypatch.setattr(
215
215
  "coord.graph_health.graph_status",
216
- lambda p: _stale_graph_status(VIMCODE_GRAPH_STALE_HOURS),
216
+ lambda p, default_branch="main": _stale_graph_status(VIMCODE_GRAPH_STALE_HOURS),
217
217
  )
218
218
  monkeypatch.setattr(
219
219
  "coord.graph_health.hooks_path_status",
@@ -249,7 +249,9 @@ def test_hooks_disabled_makes_a_stale_graph_crit_at_any_age(
249
249
  clears. With them disabled it is a permanent wrong answer, so age is
250
250
  irrelevant — this is the distinction the incident turned on.
251
251
  """
252
- monkeypatch.setattr("coord.graph_health.graph_status", lambda p: _stale_graph_status(1.0))
252
+ monkeypatch.setattr(
253
+ "coord.graph_health.graph_status", lambda p, default_branch="main": _stale_graph_status(1.0)
254
+ )
253
255
  monkeypatch.setattr(
254
256
  "coord.graph_health.hooks_path_status", lambda p: (False, "core.hooksPath is unset")
255
257
  )