code-coordinator 0.5.81__tar.gz → 0.5.83__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 (829) hide show
  1. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/CLAUDE.md +19 -3
  2. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/SOURCES.txt +6 -3
  5. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/scm_file_list.json +3 -0
  6. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent.py +266 -33
  8. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent_app.py +80 -0
  9. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/claim.py +14 -10
  10. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/dispatch.py +16 -0
  11. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/repo.py +131 -5
  12. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/status.py +50 -6
  13. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/comments.py +64 -0
  14. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dao.py +5 -1
  15. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/server.py +15 -0
  16. code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +1 -1
  17. code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +1 -1
  18. code_coordinator-0.5.81/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js → code_coordinator-0.5.83/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +34 -34
  19. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/index.html +1 -1
  20. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/sw.js +1 -1
  21. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/events.ts +14 -4
  22. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/diagnose.py +27 -0
  23. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dispatch.py +24 -0
  24. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive.py +58 -1
  25. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive_queue.py +47 -0
  26. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/drive_state.py +7 -1
  27. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/graph_health.py +269 -8
  28. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/graph.py +15 -1
  29. code_coordinator-0.5.83/coord/health/checks/graphify_cli.py +87 -0
  30. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/models.py +41 -1
  31. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notify.py +34 -1
  32. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/reconcile.py +53 -0
  33. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/repo_onboard.py +400 -9
  34. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/state.py +36 -0
  35. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ARCHITECTURE.md +32 -6
  36. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/GRAPHIFY_SETUP.md +30 -0
  37. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent.py +86 -0
  38. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_dirty_worktree.py +28 -0
  39. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_graph_self_heal.py +11 -2
  40. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_zero_commit.py +270 -0
  41. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_claim.py +18 -0
  42. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard.py +51 -0
  43. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_diagnose.py +42 -0
  44. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive.py +58 -1
  45. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_queue.py +104 -0
  46. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_state.py +2 -1
  47. code_coordinator-0.5.83/tests/test_graph_selfheal_absent_2237.py +212 -0
  48. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_checks.py +74 -0
  49. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_context.py +4 -0
  50. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_models.py +20 -0
  51. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notify.py +135 -0
  52. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_branch.py +163 -0
  53. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_completions.py +21 -0
  54. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_merges.py +42 -0
  55. code_coordinator-0.5.83/tests/test_repo_graph_fleet_2237.py +632 -0
  56. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_repo_onboard_2220.py +9 -1
  57. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry_advisory_1606.py +22 -0
  58. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/pipeline.rs +15 -0
  59. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/tests.rs +25 -0
  60. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/board.md +0 -0
  61. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/complete-session.md +0 -0
  62. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.claude/commands/coordinator.md +0 -0
  63. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/_lib.sh +0 -0
  64. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-checkout +0 -0
  65. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-commit +0 -0
  66. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.githooks/post-merge +0 -0
  67. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  68. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/coord-ci-acceptance.yml +0 -0
  69. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/auto-release.yml +0 -0
  70. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/cargo-test.yml +0 -0
  71. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/publish.yml +0 -0
  72. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/release-tui.yml +0 -0
  73. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.github/workflows/test.yml +0 -0
  74. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/.gitignore +0 -0
  75. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/GOAL.md +0 -0
  76. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/LICENSE +0 -0
  77. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/MANIFEST.in +0 -0
  78. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/README.md +0 -0
  79. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/dependency_links.txt +0 -0
  80. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/entry_points.txt +0 -0
  81. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/requires.txt +0 -0
  82. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/code_coordinator.egg-info/top_level.txt +0 -0
  83. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/__init__.py +0 -0
  84. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/_board_mapping.py +0 -0
  85. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/acceptance.py +0 -0
  86. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/acceptance_drivers.py +0 -0
  87. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agent_update.py +0 -0
  88. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/.gitignore +0 -0
  89. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/agents/work.md +0 -0
  90. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/agents/opencode/routing.jsonc +0 -0
  91. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/audit.py +0 -0
  92. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/auto_loop.py +0 -0
  93. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_bool_guard.py +0 -0
  94. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_service.py +0 -0
  95. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/board_wire.py +0 -0
  96. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/brain.py +0 -0
  97. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/branch_model.py +0 -0
  98. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/bug_intake.py +0 -0
  99. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/cargo_cache.py +0 -0
  100. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/ci_github.py +0 -0
  101. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/ci_store.py +0 -0
  102. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/cli.py +0 -0
  103. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/client.py +0 -0
  104. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/__init__.py +0 -0
  105. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/_common.py +0 -0
  106. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/acceptance.py +0 -0
  107. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/agent_ops.py +0 -0
  108. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/audit.py +0 -0
  109. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/chat.py +0 -0
  110. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/dispatch_workers.py +0 -0
  111. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/drive.py +0 -0
  112. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/drive_queue.py +0 -0
  113. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/gate_a.py +0 -0
  114. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/gates.py +0 -0
  115. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/issues.py +0 -0
  116. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/lifecycle.py +0 -0
  117. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/merge.py +0 -0
  118. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/milestone.py +0 -0
  119. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/plan_followup.py +0 -0
  120. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/plans.py +0 -0
  121. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/portal.py +0 -0
  122. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/release.py +0 -0
  123. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/report.py +0 -0
  124. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/review.py +0 -0
  125. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/scorecard.py +0 -0
  126. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/sessions.py +0 -0
  127. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/setup.py +0 -0
  128. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/terminal.py +0 -0
  129. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/test_gate.py +0 -0
  130. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/commands/tui.py +0 -0
  131. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/config.py +0 -0
  132. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/conflict_fix.py +0 -0
  133. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/__init__.py +0 -0
  134. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/fixture.py +0 -0
  135. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/index.html +0 -0
  136. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/terminal.py +0 -0
  137. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/.gitignore +0 -0
  138. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/components.json +0 -0
  139. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  140. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  141. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  142. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  143. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  144. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  145. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  146. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  147. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  148. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  149. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  150. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  151. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  152. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  153. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  154. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  155. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  156. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/eslint.config.js +0 -0
  157. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/index.html +0 -0
  158. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  159. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/package-lock.json +0 -0
  160. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/package.json +0 -0
  161. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  162. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/playwright.config.ts +0 -0
  163. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/postcss.config.js +0 -0
  164. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  165. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  166. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  167. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/App.tsx +0 -0
  168. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/api/client.ts +0 -0
  169. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  170. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  171. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  172. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  173. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  174. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  175. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  176. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  177. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  178. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  179. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  180. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  181. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  182. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  183. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  184. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  185. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  186. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  187. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  188. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  189. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  190. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  191. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  192. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  193. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  194. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  195. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  196. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  197. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  198. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  199. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  200. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  201. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  202. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  203. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  204. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/index.css +0 -0
  205. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  206. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  207. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/main.tsx +0 -0
  208. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  209. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  210. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  211. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  212. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  213. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  214. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  215. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  216. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  217. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  218. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  219. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  220. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  221. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  222. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  223. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  224. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  225. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  226. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  227. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  228. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  229. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  230. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tailwind.config.js +0 -0
  231. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tsconfig.json +0 -0
  232. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  233. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dashboard/webapp/vite.config.ts +0 -0
  234. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/db.py +0 -0
  235. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dead_end.py +0 -0
  236. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/README.md +0 -0
  237. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-agent.service +0 -0
  238. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.service +0 -0
  239. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.sh +0 -0
  240. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-db-backup.timer +0 -0
  241. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-drive-queue.service +0 -0
  242. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-drive-queue.timer +0 -0
  243. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-notify.service +0 -0
  244. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-notify.timer +0 -0
  245. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-propagate.service +0 -0
  246. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-propagate.timer +0 -0
  247. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-window.service +0 -0
  248. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-release-window.timer +0 -0
  249. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-serve.service +0 -0
  250. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web-dist-build.service +0 -0
  251. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web-dist-build.timer +0 -0
  252. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy/coord-web.service +0 -0
  253. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy_manifest.py +0 -0
  254. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deploy_units.py +0 -0
  255. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/deps.py +0 -0
  256. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/dist_name.py +0 -0
  257. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/events.py +0 -0
  258. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/failure_class.py +0 -0
  259. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/filelock.py +0 -0
  260. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/fleet_config_health.py +0 -0
  261. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/freshness.py +0 -0
  262. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_a.py +0 -0
  263. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_b.py +0 -0
  264. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gate_snapshot.py +0 -0
  265. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/gates.py +0 -0
  266. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/github_ops.py +0 -0
  267. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/goal.py +0 -0
  268. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/__init__.py +0 -0
  269. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/aggregate.py +0 -0
  270. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/__init__.py +0 -0
  271. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/agent_install.py +0 -0
  272. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/cargo_targets.py +0 -0
  273. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/claude_binary.py +0 -0
  274. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/deploy_lane_facts.py +0 -0
  275. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/disk.py +0 -0
  276. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_board.py +0 -0
  277. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  278. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_phantom.py +0 -0
  279. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/fleet_unit_drift.py +0 -0
  280. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/plan_usage.py +0 -0
  281. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/repo_state.py +0 -0
  282. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/spawned_coord.py +0 -0
  283. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/timer_active.py +0 -0
  284. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/toolchain.py +0 -0
  285. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/unit_drift.py +0 -0
  286. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/unit_enablement.py +0 -0
  287. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/checks/worktrees.py +0 -0
  288. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/cli.py +0 -0
  289. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/context.py +0 -0
  290. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/fleet_snapshot.py +0 -0
  291. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/models.py +0 -0
  292. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/pypi.py +0 -0
  293. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/registry.py +0 -0
  294. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/render.py +0 -0
  295. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/health/units.py +0 -0
  296. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/hooks.py +0 -0
  297. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/housekeeping.py +0 -0
  298. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/interactive.py +0 -0
  299. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/issue_store.py +0 -0
  300. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/liveness_auditor.py +0 -0
  301. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/machine_pause.py +0 -0
  302. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/merge_queue.py +0 -0
  303. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_chat.py +0 -0
  304. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_dispatch.py +0 -0
  305. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_gate.py +0 -0
  306. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/milestone_order.py +0 -0
  307. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/mock_author.py +0 -0
  308. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/network.py +0 -0
  309. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/new_issue_chat.py +0 -0
  310. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/__init__.py +0 -0
  311. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/baseline.py +0 -0
  312. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/cli.py +0 -0
  313. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/collect.py +0 -0
  314. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/digest.py +0 -0
  315. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/models.py +0 -0
  316. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/predicate.py +0 -0
  317. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/service.py +0 -0
  318. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/store.py +0 -0
  319. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/notifier/transport.py +0 -0
  320. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/openapi.py +0 -0
  321. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/overlap_fence.py +0 -0
  322. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/parentage.py +0 -0
  323. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/parentage_github.py +0 -0
  324. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/pipeline.py +0 -0
  325. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/plan_parser.py +0 -0
  326. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/plans.py +0 -0
  327. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/platform_paths.py +0 -0
  328. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/portal_bridge.py +0 -0
  329. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/pr_body_lint.py +0 -0
  330. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/prereqs.py +0 -0
  331. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/progress.py +0 -0
  332. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/__init__.py +0 -0
  333. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/base.py +0 -0
  334. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/claude.py +0 -0
  335. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/claude_pty.py +0 -0
  336. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/providers/opencode.py +0 -0
  337. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/refine_chat.py +0 -0
  338. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_cordon.py +0 -0
  339. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_propagate.py +0 -0
  340. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_verify.py +0 -0
  341. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/release_window.py +0 -0
  342. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/repo_edit.py +0 -0
  343. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/reports.py +0 -0
  344. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/revalidate.py +0 -0
  345. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/review.py +0 -0
  346. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/scorecard.py +0 -0
  347. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/serve_app.py +0 -0
  348. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/skills/update-issue/SKILL.md +0 -0
  349. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/smoke.py +0 -0
  350. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/spend_ceiling.py +0 -0
  351. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/split_work.py +0 -0
  352. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/stage_projection.py +0 -0
  353. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_author.py +0 -0
  354. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_chat.py +0 -0
  355. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_orchestrator.py +0 -0
  356. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/test_report.py +0 -0
  357. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/tui_release.py +0 -0
  358. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage.py +0 -0
  359. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage_limits.py +0 -0
  360. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/usage_rollup.py +0 -0
  361. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coord/worker_events.py +0 -0
  362. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/coordinator.example.yml +0 -0
  363. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-agent.service +0 -0
  364. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.service +0 -0
  365. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.sh +0 -0
  366. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-db-backup.timer +0 -0
  367. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-drive-queue.service +0 -0
  368. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-drive-queue.timer +0 -0
  369. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-notify.service +0 -0
  370. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-notify.timer +0 -0
  371. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-propagate.service +0 -0
  372. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-propagate.timer +0 -0
  373. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-window.service +0 -0
  374. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-release-window.timer +0 -0
  375. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-serve.service +0 -0
  376. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.service +0 -0
  377. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.sh +0 -0
  378. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-dist-build.timer +0 -0
  379. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web-rollback.sh +0 -0
  380. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/coord-web.service +0 -0
  381. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/deploy/node-shim.sh +0 -0
  382. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/AGENT_OPERATIONS.md +0 -0
  383. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ARCH_SECURITY_GATES.md +0 -0
  384. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/COCKPIT.md +0 -0
  385. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CONTROL_CENTER.md +0 -0
  386. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/COST_DISCIPLINE.md +0 -0
  387. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CROSS_PLATFORM.md +0 -0
  388. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/CUSTOMER_PORTAL.md +0 -0
  389. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/DRIVE_QUEUE.md +0 -0
  390. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/EPHEMERAL_WORKERS.md +0 -0
  391. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/FORGE_MIGRATION.md +0 -0
  392. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ISSUE_GUIDANCE.md +0 -0
  393. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/MAC_MINI.md +0 -0
  394. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  395. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/NOTIFIER.md +0 -0
  396. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/OPENCODE_VERIFICATION.md +0 -0
  397. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/OPERATING_GOTCHAS.md +0 -0
  398. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/ORACLE_LOOP.md +0 -0
  399. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PHONE_WEBAPP.md +0 -0
  400. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PIPELINE_V2.md +0 -0
  401. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/PLATFORM_EVOLUTION.md +0 -0
  402. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/SECOND_BACKEND.md +0 -0
  403. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/STORE_SERVICE.md +0 -0
  404. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  405. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/WEB_CONTROL_CENTER.md +0 -0
  406. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/README.md +0 -0
  407. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/_tokens.css +0 -0
  408. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/issue-detail.html +0 -0
  409. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/pipeline-narrow.html +0 -0
  410. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/docs/mocks/web/pipeline-wide.html +0 -0
  411. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/graphify-out/.gitignore +0 -0
  412. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/install-agent.sh +0 -0
  413. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/pyproject.toml +0 -0
  414. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/audit_review_verdict_overrides.py +0 -0
  415. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  416. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/build-worker-image.sh +0 -0
  417. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/coordinator-machine.py +0 -0
  418. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/epic-down.sh +0 -0
  419. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/epic-up.sh +0 -0
  420. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/preflight.sh +0 -0
  421. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/provision-worker.sh +0 -0
  422. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  423. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  424. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/azure-workers/verify-github-token.sh +0 -0
  425. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/codegen.py +0 -0
  426. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/coord-test-runner.sh +0 -0
  427. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/drive-batch.sh +0 -0
  428. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/gen_board_fixture.py +0 -0
  429. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/next_release_tag.py +0 -0
  430. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/run_tests_in_populated_home.sh +0 -0
  431. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/run_tests_without_gh.sh +0 -0
  432. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/smoke_437_interactive.py +0 -0
  433. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_878_review_capture.py +0 -0
  434. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_release_published.py +0 -0
  435. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/scripts/verify_release_wheel.py +0 -0
  436. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/setup.cfg +0 -0
  437. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/SMOKE_SET.md +0 -0
  438. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/__init__.py +0 -0
  439. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  440. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/contract.md +0 -0
  441. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/manifest.yml +0 -0
  442. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  443. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  444. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  445. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  446. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/conftest.py +0 -0
  447. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/contract.md +0 -0
  448. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/manifest.yml +0 -0
  449. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  450. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  451. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/contract.md +0 -0
  452. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/manifest.yml +0 -0
  453. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  454. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  455. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  456. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  457. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  458. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  459. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  460. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  461. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  462. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  463. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/contract.md +0 -0
  464. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  465. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  466. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/manifest.yml +0 -0
  467. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  468. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-51/tsconfig.json +0 -0
  469. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  470. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/conftest.py +0 -0
  471. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/board-pipeline-basic.json +0 -0
  472. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  473. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  474. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  475. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/all_pass.json +0 -0
  476. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  477. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/mixed_fail.json +0 -0
  478. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  479. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  480. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/skip.json +0 -0
  481. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/playwright/truncated.json +0 -0
  482. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  483. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  484. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  485. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  486. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  487. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  488. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  489. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  490. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_acceptance.py +0 -0
  491. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_acceptance_drivers.py +0 -0
  492. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_api_error.py +0 -0
  493. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_app.py +0 -0
  494. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_branch_base.py +0 -0
  495. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_branch_capture.py +0 -0
  496. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_config_free_1712.py +0 -0
  497. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_deploy_units_endpoint.py +0 -0
  498. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_health_h3.py +0 -0
  499. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_idle_restart.py +0 -0
  500. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_push_failure.py +0 -0
  501. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_reap.py +0 -0
  502. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_repos_and_pull.py +0 -0
  503. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_restart_services_endpoint.py +0 -0
  504. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_startup_diagnostics.py +0 -0
  505. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_update.py +0 -0
  506. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_update_bluegreen.py +0 -0
  507. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_agent_usage_limit.py +0 -0
  508. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ambient_home_isolation.py +0 -0
  509. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_approve_reject_plan.py +0 -0
  510. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_approve_usage_gate.py +0 -0
  511. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_assignment_already_recorded_daemon.py +0 -0
  512. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_log.py +0 -0
  513. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_outcome.py +0 -0
  514. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_audit_query.py +0 -0
  515. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_auto_loop.py +0 -0
  516. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_auto_release_publish_2035.py +0 -0
  517. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_base_checkout_restore.py +0 -0
  518. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_cap_762.py +0 -0
  519. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_fixture.py +0 -0
  520. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_read_path.py +0 -0
  521. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_service.py +0 -0
  522. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_state.py +0 -0
  523. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_board_wire.py +0 -0
  524. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_brain.py +0 -0
  525. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_branch_model.py +0 -0
  526. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_bug_intake.py +0 -0
  527. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_build_worker_image_env_update.py +0 -0
  528. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cargo_cache.py +0 -0
  529. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_acceptance_gate_1950.py +0 -0
  530. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_parity_2091.py +0 -0
  531. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_ci_store.py +0 -0
  532. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_diagnose_config_provenance.py +0 -0
  541. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_diagnose_graph.py +0 -0
  542. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor.py +0 -0
  543. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor_config_free_1801.py +0 -0
  544. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  545. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_drive.py +0 -0
  546. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_drive_queue.py +0 -0
  547. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_escalate.py +0 -0
  548. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_fix_headless_review.py +0 -0
  549. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_gate_a.py +0 -0
  550. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_install_drift.py +0 -0
  551. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_install_skills.py +0 -0
  552. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_issue_create_label.py +0 -0
  553. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_issue_reopen.py +0 -0
  554. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_merge.py +0 -0
  555. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_assign.py +0 -0
  556. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_capture.py +0 -0
  557. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_chat_add_child.py +0 -0
  558. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_dispatch.py +0 -0
  559. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_gate_b.py +0 -0
  560. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_gate_c.py +0 -0
  561. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_order.py +0 -0
  562. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  563. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_milestone_ship.py +0 -0
  564. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_network.py +0 -0
  565. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_new_issue_chat.py +0 -0
  566. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_plans.py +0 -0
  567. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_portal.py +0 -0
  568. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_pull_artifact.py +0 -0
  569. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_queue.py +0 -0
  570. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_reattach_sessions.py +0 -0
  571. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_refine_board.py +0 -0
  572. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_preflight.py +0 -0
  573. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_propagate.py +0 -0
  574. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_release_window.py +0 -0
  575. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_repo_2220.py +0 -0
  576. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_scorecard.py +0 -0
  577. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_set_review_findings.py +0 -0
  578. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_advisory_terminal.py +0 -0
  579. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_merge_queue.py +0 -0
  580. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_provider.py +0 -0
  581. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_review_finalizing.py +0 -0
  582. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_test_failed_tag.py +0 -0
  583. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_status_usage_limit.py +0 -0
  584. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_sync_comments_873.py +0 -0
  585. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_test_plan.py +0 -0
  586. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_track.py +0 -0
  587. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_tui_update.py +0 -0
  588. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cli_wait.py +0 -0
  589. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_client_base_install.py +0 -0
  590. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_comments.py +0 -0
  591. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_completion_summary.py +0 -0
  592. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config.py +0 -0
  593. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_acceptance.py +0 -0
  594. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_audit.py +0 -0
  595. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_pricing.py +0 -0
  596. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_config_usage_gate.py +0 -0
  597. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_conflict_fix.py +0 -0
  598. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_conflict_fix_semantic.py +0 -0
  599. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test.py +0 -0
  600. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_baseline.py +0 -0
  601. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_routing.py +0 -0
  602. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_test_runner_toolchain.py +0 -0
  603. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coord_web_sse_restart_live.py +0 -0
  604. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_coordinator_machine.py +0 -0
  605. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_cross_platform_imports.py +0 -0
  606. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_fixture.py +0 -0
  607. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_terminal.py +0 -0
  608. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dashboard_terminal_live.py +0 -0
  609. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_db.py +0 -0
  610. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dead_end.py +0 -0
  611. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_db_backup.py +0 -0
  612. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_web_dist.py +0 -0
  613. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_coord_web_rollback.py +0 -0
  614. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_drive_queue_unit.py +0 -0
  615. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_manifest.py +0 -0
  616. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_units_lane.py +0 -0
  617. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deploy_web_unit.py +0 -0
  618. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_deps.py +0 -0
  619. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dispatch.py +0 -0
  620. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dispatch_target_validation.py +0 -0
  621. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_dist_name.py +0 -0
  622. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_done_housekeeping.py +0 -0
  623. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_drive_tmux.py +0 -0
  624. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_capability_detection.py +0 -0
  625. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  626. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_epic_up_image_provenance.py +0 -0
  627. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_errors.py +0 -0
  628. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_events.py +0 -0
  629. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_failure_class.py +0 -0
  630. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_filelock.py +0 -0
  631. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  632. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fix_of_force_override.py +0 -0
  633. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_config_health.py +0 -0
  634. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_health_probes.py +0 -0
  635. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_fleet_health_snapshot.py +0 -0
  636. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_freshness.py +0 -0
  637. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_a.py +0 -0
  638. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_b.py +0 -0
  639. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gate_snapshot_staleness.py +0 -0
  640. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gates.py +0 -0
  641. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  642. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_generated_types_fixture.py +0 -0
  643. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_github_ops.py +0 -0
  644. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_goal.py +0 -0
  645. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_graph_health.py +0 -0
  646. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_handoff.py +0 -0
  647. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_cli.py +0 -0
  648. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_cli_graph.py +0 -0
  649. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_config.py +0 -0
  650. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_deploy_lane_facts.py +0 -0
  651. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_incident_regression.py +0 -0
  652. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_pypi.py +0 -0
  653. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_registry.py +0 -0
  654. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_timer_active.py +0 -0
  655. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_toolchain.py +0 -0
  656. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_unit_drift.py +0 -0
  657. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_health_unit_enablement.py +0 -0
  658. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_hooks.py +0 -0
  659. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_human_attended_437.py +0 -0
  660. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_init.py +0 -0
  661. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_integration.py +0 -0
  662. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_briefing_echo.py +0 -0
  663. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_prefill_state.py +0 -0
  664. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_session_relaunch.py +0 -0
  665. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_test_verdict_backstop.py +0 -0
  666. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_token_attribution.py +0 -0
  667. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_interactive_worktree.py +0 -0
  668. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_issue_store_seam.py +0 -0
  669. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_liveness_auditor.py +0 -0
  670. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_liveness_notify.py +0 -0
  671. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_machine_pause.py +0 -0
  672. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_merge_queue.py +0 -0
  673. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_merge_verify.py +0 -0
  674. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_chat.py +0 -0
  675. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_dispatch.py +0 -0
  676. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_gate.py +0 -0
  677. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_order.py +0 -0
  678. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_milestone_seam.py +0 -0
  679. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_mock_author.py +0 -0
  680. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_model_tiering.py +0 -0
  681. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_models_config_labels.py +0 -0
  682. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_needs_attention.py +0 -0
  683. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_network.py +0 -0
  684. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_new_issue_chat.py +0 -0
  685. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_next_release_tag.py +0 -0
  686. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_no_direct_gh_calls.py +0 -0
  687. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_node_shim.py +0 -0
  688. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_baseline.py +0 -0
  689. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_cli.py +0 -0
  690. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_collect.py +0 -0
  691. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_config.py +0 -0
  692. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_drive_seam.py +0 -0
  693. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_isolation.py +0 -0
  694. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_predicate.py +0 -0
  695. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_quiet_hours.py +0 -0
  696. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notifier_service.py +0 -0
  697. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_notify_drain.py +0 -0
  698. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_openapi.py +0 -0
  699. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_operational_defaults.py +0 -0
  700. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_overlap_fence.py +0 -0
  701. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_packaged_deploy_units.py +0 -0
  702. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_parentage.py +0 -0
  703. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_paste_landed.py +0 -0
  704. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_pipeline.py +0 -0
  705. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_approve_plan_command.py +0 -0
  706. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_pr_command.py +0 -0
  707. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_followup_review_command.py +0 -0
  708. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_only.py +0 -0
  709. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_plan_parser.py +0 -0
  710. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_platform_paths.py +0 -0
  711. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_portal_bridge.py +0 -0
  712. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_portal_config.py +0 -0
  713. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_pr_body_lint.py +0 -0
  714. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_prereqs.py +0 -0
  715. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_production_db_guard.py +0 -0
  716. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_progress.py +0 -0
  717. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_provider_seam.py +0 -0
  718. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers.py +0 -0
  719. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers_config_labels.py +0 -0
  720. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_providers_pty.py +0 -0
  721. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_quiet_hours.py +0 -0
  722. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_quiet_hours_store_2146.py +0 -0
  723. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reap_merged_sessions.py +0 -0
  724. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reap_stale_interactive_tick.py +0 -0
  725. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reconcile_usage_limit_done.py +0 -0
  726. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_refine_chat.py +0 -0
  727. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_cordon_2101.py +0 -0
  728. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_propagate.py +0 -0
  729. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_unified_1242.py +0 -0
  730. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_verify.py +0 -0
  731. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_release_window.py +0 -0
  732. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_remote_auto_prune.py +0 -0
  733. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_remote_interactive_reaper.py +0 -0
  734. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_repo_edit_2220.py +0 -0
  735. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_report_result_push.py +0 -0
  736. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_reports.py +0 -0
  737. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry.py +0 -0
  738. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_retry_type_1636.py +0 -0
  739. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_revalidate.py +0 -0
  740. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review.py +0 -0
  741. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_end_review_without_verdict.py +0 -0
  742. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_parse_failure_diagnostic.py +0 -0
  743. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_reaffirm.py +0 -0
  744. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_state.py +0 -0
  745. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_backstop.py +0 -0
  746. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_override_audit.py +0 -0
  747. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_verdict_relay.py +0 -0
  748. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_review_zero_commits.py +0 -0
  749. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_scoped_review_wiring.py +0 -0
  750. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_scorecard.py +0 -0
  751. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_serve.py +0 -0
  752. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_serve_app_board_trim.py +0 -0
  753. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_session.py +0 -0
  754. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_slice_issue_attribution.py +0 -0
  755. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke.py +0 -0
  756. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke_live_checkout_restore.py +0 -0
  757. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_smoke_workflow.py +0 -0
  758. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_spend_ceiling.py +0 -0
  759. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_spend_ceiling_coordinator.py +0 -0
  760. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_split.py +0 -0
  761. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_split_work.py +0 -0
  762. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stage_projection.py +0 -0
  763. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stalled_pipeline.py +0 -0
  764. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_state.py +0 -0
  765. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_state_review_findings_daemon.py +0 -0
  766. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_status_fleet_footer.py +0 -0
  767. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stop_1567.py +0 -0
  768. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_stuck.py +0 -0
  769. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_terminal_command.py +0 -0
  770. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_author.py +0 -0
  771. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_chat.py +0 -0
  772. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_orchestrator.py +0 -0
  773. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_report.py +0 -0
  774. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_verdict_parsing.py +0 -0
  775. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_test_verdict_transcript_floor.py +0 -0
  776. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_board_audit.py +0 -0
  777. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_config_load_1080.py +0 -0
  778. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_thin_client_daemon_routing_906.py +0 -0
  779. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_tmux_host.py +0 -0
  780. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_tmux_session.py +0 -0
  781. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_transcript_floor.py +0 -0
  782. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage.py +0 -0
  783. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage_limits.py +0 -0
  784. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_usage_rollup.py +0 -0
  785. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_venv_live_install_2121.py +0 -0
  786. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_version_single_source.py +0 -0
  787. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_watch.py +0 -0
  788. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_events.py +0 -0
  789. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_image_pin_sync.py +0 -0
  790. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_safety.py +0 -0
  791. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worker_test_scoping.py +0 -0
  792. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worktree.py +0 -0
  793. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  794. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/Cargo.lock +0 -0
  795. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/Cargo.toml +0 -0
  796. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/cargo-config-local-quadraui.toml.example +0 -0
  797. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/audit.rs +0 -0
  798. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/chat.rs +0 -0
  799. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/data.rs +0 -0
  800. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/dialogs.rs +0 -0
  801. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/drive.rs +0 -0
  802. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/drive_queue.rs +0 -0
  803. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/escalation.rs +0 -0
  804. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/events.rs +0 -0
  805. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fixtures.rs +0 -0
  806. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_health.rs +0 -0
  807. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_sessions.rs +0 -0
  808. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/fleet_terminals.rs +0 -0
  809. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/format.rs +0 -0
  810. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/milestone_dag.rs +0 -0
  811. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/mod.rs +0 -0
  812. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/msv.rs +0 -0
  813. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/plans.rs +0 -0
  814. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/render.rs +0 -0
  815. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/reports.rs +0 -0
  816. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/sessions.rs +0 -0
  817. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/settings_ui.rs +0 -0
  818. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/sidebar.rs +0 -0
  819. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/terminal.rs +0 -0
  820. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/types.rs +0 -0
  821. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/app/workspace.rs +0 -0
  822. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/bin/gtk.rs +0 -0
  823. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/commands.rs +0 -0
  824. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/lib.rs +0 -0
  825. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/main.rs +0 -0
  826. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/src/settings.rs +0 -0
  827. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/acceptance.rs +0 -0
  828. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/cli.rs +0 -0
  829. {code_coordinator-0.5.81 → code_coordinator-0.5.83}/tui/tests/fixtures/board_sample.json +0 -0
@@ -42,13 +42,29 @@ bootstrap only runs where `core.hooksPath` is set: `git config core.hooksPath
42
42
  rebase/merge/cherry-pick (so the merge agent's proactive rebase never rebuilds),
43
43
  nothing fires at all for `git reset --hard`, every failure path is a silent
44
44
  `exit 0` behind a detached 600s-timeout background process, concurrent triggers
45
- coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is a permanent
46
- off-switch once the graph is purged. Treat the hooks as an optimization and check
45
+ coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is an off-switch
46
+ once the graph is purged. Treat the hooks as an optimization and check
47
47
  freshness instead — `GRAPH_REPORT.md` records its source commit, and
48
48
  **`coord diagnose --graph`** compares that to HEAD for every local checkout (and
49
49
  flags an unset `core.hooksPath`). If it reports STALE, `graphify update .` in that
50
50
  checkout.
51
51
 
52
+ **It mostly heals itself now (#1729, #2237).** Each agent's health tick rebuilds
53
+ a checkout whose graph is stale *or absent* — so `rm -rf graphify-out/` is no
54
+ longer permanent — subject to four guards: idle machines only, base checkouts
55
+ only (never a linked worktree), once per HEAD (a build that cannot succeed is
56
+ never a retry loop), and never `--force`. What it cannot do is anything
57
+ versioned: `.githooks/` are tracked files, so porting them to a repo is a PR
58
+ against that repo.
59
+
60
+ **`coord repo doctor <repo>`** reports graph readiness **per machine** (folded
61
+ from each agent's `/health`, no extra round trip) — the operator's laptop is
62
+ usually not where the workers run. `--fix` performs the machine-local half
63
+ (`graphify update .` where absent, `core.hooksPath` where unset) on every
64
+ machine that clones the repo; it is idempotent, never writes a tracked file,
65
+ and refuses on a repo whose `.githooks/` were never ported. A repo with no
66
+ graph on *any* machine that runs workers is CRIT and fails the gate.
67
+
52
68
  Setting this up on a new machine: [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md).
53
69
 
54
70
  ## Architecture
@@ -155,7 +171,7 @@ One line each — the reasoning behind them is in
155
171
  - **`coordinator.yml` is the single source of truth** for repo topology, machine capabilities, dependencies, concurrency limits, review settings, smoke-test rules, and the pipeline gate order (`pipeline.default_gates`). It lives in `~/.coord/`, **not** the repo checkout.
156
172
  - **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
157
173
  - **Claim detection prevents duplicate work.** Before dispatching, the coordinator checks the board for active assignments and the remote for `issue-{N}-*` branches.
158
- - **Conflict rules are inferred, not configured.** The brain reads issue bodies and infers which files will be touched.
174
+ - **Conflict rules are inferred, not configured** and only on the `coord plan` path. Overlap avoidance is a line in the planning brain's *prompt*, not a mechanism; the drive queue bypasses the brain entirely, so unattended work gets no file-overlap check. There is no `file_groups`/`exclusive_files` config.
159
175
  - **Adversarial reviews are rule-enforcing, not rubber-stamping.** On worker completion a fresh `claude -p` session on a *different* machine reviews the PR diff against this file and the review checklist, with zero shared context with the worker — that's the whole point.
160
176
  - **The pipeline order is `Work → Test → Review → Merge`.** Test precedes Review; the headless auto-loop holds review dispatch until there is a `passed`/`skipped` test verdict.
161
177
  - **Merge is gated on CI checks (#240).** `coord merge` refuses when a check failed or is still running — and a PR with *zero* reported checks is not automatically clear either (#1904).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.81
3
+ Version: 0.5.83
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.81
3
+ Version: 0.5.83
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
@@ -187,10 +187,10 @@ coord/dashboard/webapp/dist/index.html
187
187
  coord/dashboard/webapp/dist/manifest.webmanifest
188
188
  coord/dashboard/webapp/dist/sw.js
189
189
  coord/dashboard/webapp/dist/workbox-e4022e15.js
190
- coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js
190
+ coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js
191
191
  coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css
192
- coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js
193
- coord/dashboard/webapp/dist/assets/index-DltfZR5f.js
192
+ coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js
193
+ coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js
194
194
  coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css
195
195
  coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js
196
196
  coord/dashboard/webapp/dist/icons/icon-192.png
@@ -311,6 +311,7 @@ coord/health/checks/fleet_deploy_lanes.py
311
311
  coord/health/checks/fleet_phantom.py
312
312
  coord/health/checks/fleet_unit_drift.py
313
313
  coord/health/checks/graph.py
314
+ coord/health/checks/graphify_cli.py
314
315
  coord/health/checks/plan_usage.py
315
316
  coord/health/checks/repo_state.py
316
317
  coord/health/checks/spawned_coord.py
@@ -577,6 +578,7 @@ tests/test_generated_types_fixture.py
577
578
  tests/test_github_ops.py
578
579
  tests/test_goal.py
579
580
  tests/test_graph_health.py
581
+ tests/test_graph_selfheal_absent_2237.py
580
582
  tests/test_handoff.py
581
583
  tests/test_health_checks.py
582
584
  tests/test_health_cli.py
@@ -673,6 +675,7 @@ tests/test_release_window.py
673
675
  tests/test_remote_auto_prune.py
674
676
  tests/test_remote_interactive_reaper.py
675
677
  tests/test_repo_edit_2220.py
678
+ tests/test_repo_graph_fleet_2237.py
676
679
  tests/test_repo_onboard_2220.py
677
680
  tests/test_report_result_push.py
678
681
  tests/test_reports.py
@@ -225,6 +225,7 @@
225
225
  "coord/health/checks/fleet_phantom.py",
226
226
  "coord/health/checks/fleet_unit_drift.py",
227
227
  "coord/health/checks/graph.py",
228
+ "coord/health/checks/graphify_cli.py",
228
229
  "coord/health/checks/plan_usage.py",
229
230
  "coord/health/checks/repo_state.py",
230
231
  "coord/health/checks/spawned_coord.py",
@@ -607,6 +608,7 @@
607
608
  "tests/test_github_ops.py",
608
609
  "tests/test_goal.py",
609
610
  "tests/test_graph_health.py",
611
+ "tests/test_graph_selfheal_absent_2237.py",
610
612
  "tests/test_handoff.py",
611
613
  "tests/test_health_checks.py",
612
614
  "tests/test_health_cli.py",
@@ -703,6 +705,7 @@
703
705
  "tests/test_remote_auto_prune.py",
704
706
  "tests/test_remote_interactive_reaper.py",
705
707
  "tests/test_repo_edit_2220.py",
708
+ "tests/test_repo_graph_fleet_2237.py",
706
709
  "tests/test_repo_onboard_2220.py",
707
710
  "tests/test_report_result_push.py",
708
711
  "tests/test_reports.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.81",
2
+ "tag": "0.5.83",
3
3
  "distance": 0,
4
- "node": "gf5568b98773fd08c6165236df1c398d57ecc9260",
4
+ "node": "gc65c7e49837d7f4990a4606d987a975642e709ae",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -82,6 +82,21 @@ CANCELLED = "cancelled"
82
82
  # would loop forever on "already implemented" reports); not a clean DONE
83
83
  # either. Human should review and decide whether to re-dispatch or close.
84
84
  ADVISORY = "advisory"
85
+ # #2234: a NARROWER shape of the #448 zero-commit exit — the worker's own
86
+ # final message shows it stopped because a STANDING repo rule (CLAUDE.md's
87
+ # "only the coordinator writes docs", or similar) makes the dispatched
88
+ # deliverable something no worker can complete, ever, on any attempt (see
89
+ # `_looks_like_policy_refusal`). This is deliberately a status distinct from
90
+ # ADVISORY, not a sub-case reported through it: every downstream consumer of
91
+ # ADVISORY (`coord drive`'s bounded retry, the queue's attempt budget, the
92
+ # terminal `blocked` bucket a human must `remove`) exists to handle "the
93
+ # worker got stuck or found nothing to do" — a condition retrying might fix.
94
+ # A policy refusal is the OPPOSITE: the worker did exactly the right thing,
95
+ # and retrying is guaranteed to reproduce the identical, correct refusal.
96
+ # Landing it in ADVISORY's bucket is what #2234 exists to stop — the #2195
97
+ # incident spent two drive attempts ($0.11 x 2, plus the overnight slot) and
98
+ # a terminal `blocked` rediscovering a rule that was never going to change.
99
+ REFUSED_POLICY = "refused_policy"
85
100
 
86
101
  # #448: spec types that are expected to push commits, so a clean exit with
87
102
  # zero commits is interesting (advisory). Review/smoke workers commit
@@ -167,6 +182,54 @@ _COMPLETED_HISTORY_CAP = 25
167
182
  # within an operator's normal polling cadence.
168
183
  _ADVISORY_TERMINAL_CHECK_COOLDOWN_S = 300.0
169
184
 
185
+ # #2234: markers that show up when a worker's OWN final message explains
186
+ # that it stopped because of a STANDING repo rule — not because it got stuck
187
+ # or ran out of turns. Matched only against the worker's own account (see
188
+ # `_looks_like_policy_refusal`), never against the briefing or issue body,
189
+ # which quote the same rules on every single dispatch and would false-
190
+ # positive on every assignment if matched directly. `claude.md` is the one
191
+ # filename standing worker-facing rules live in across this repo (see
192
+ # CLAUDE.md's own "Rules for workers" section, "Only the coordinator writes
193
+ # docs"); the rest are lifted verbatim from that same rule's text, which is
194
+ # the shape that triggered this issue (claude-coordinator#2195: an issue
195
+ # whose entire deliverable was a doc edit, dispatched to a worker that
196
+ # correctly refused and stopped). Deliberately permissive rather than
197
+ # requiring an exact quote — a weak/cheap model's terse refusal ("Confirmed:
198
+ # the rule exists verbatim at CLAUDE.md line 156...", the actual #2195
199
+ # transcript) may cite the rule without repeating "must not"/"forbidden"
200
+ # verbatim.
201
+ _POLICY_REFUSAL_MARKERS = (
202
+ "claude.md",
203
+ "files_forbidden",
204
+ "repo rule",
205
+ "repo's rule",
206
+ "coordinator work",
207
+ "only the coordinator",
208
+ "coordinator-only",
209
+ "should never have been dispatched",
210
+ )
211
+
212
+
213
+ def _looks_like_policy_refusal(text: str | None) -> bool:
214
+ """#2234: does *text* — the worker's own final message — read as a
215
+ refusal grounded in a STANDING repo-rule prohibition, rather than a
216
+ stuck/incomplete session?
217
+
218
+ Only ever consulted on the zero-commit/clean-exit shape (`_reap` calls
219
+ this exactly where it would otherwise set `zero_commit_reason` — see
220
+ below): a worker that pushed real commits never reaches this check, so a
221
+ successful run that happens to mention `CLAUDE.md` in passing (e.g.
222
+ "per CLAUDE.md I ran the build before committing") carries no risk of
223
+ being reclassified. Within that already-narrow shape, an ordinary
224
+ `STUCK:`-style report (out of turns, couldn't find the code, a flaky
225
+ test) mentions none of :data:`_POLICY_REFUSAL_MARKERS`, so it is left
226
+ exactly as ADVISORY as it always was.
227
+ """
228
+ if not text:
229
+ return False
230
+ lowered = text.lower()
231
+ return any(marker in lowered for marker in _POLICY_REFUSAL_MARKERS)
232
+
170
233
 
171
234
  # ── Reap tuning ───────────────────────────────────────────────────────────────
172
235
  # claude-cli sometimes does not exit after emitting its final
@@ -715,36 +778,20 @@ def _is_linked_worktree(repo_path: Path) -> bool:
715
778
  def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool, str]:
716
779
  """Run ``graphify update .`` in *repo_path* (#1729, H-6's self-heal).
717
780
 
718
- Deliberately the plain, no-flags command graphify's own hooks run (see
719
- ``docs/GRAPHIFY_SETUP.md``) **never** ``--force``: that flag exists
720
- only to defeat graphify's node-count refusal guard, and defeating it
721
- automatically is exactly what turns a visible stall into silent
722
- corruption of the graph agents navigate by (#1729 guard 4).
781
+ Thin delegate to :func:`coord.graph_health.run_graphify_update` (#2237),
782
+ which is the single place that decides what command coord shells out to
783
+ and with which flags ``coord repo doctor --fix`` repairs checkouts on
784
+ every machine through the same function, and two copies of "the command
785
+ graphify's hooks run, never ``--force``" is exactly the split-brain that
786
+ would let one of them quietly acquire the flag that caused the
787
+ 2026-08-02 incident.
723
788
 
724
- Returns ``(ok, detail)``. ``ok`` is False on a non-zero exit, a missing
725
- ``graphify`` binary, or a timeout — the caller treats all three the
726
- same way: surface the reason on the health check and remember this
727
- HEAD as attempted so the next tick does not retry it (guard 3).
789
+ Kept as a module-level name here because it is the seam the self-heal
790
+ tests patch. Returns ``(ok, detail)``.
728
791
  """
729
- try:
730
- result = subprocess.run(
731
- ["graphify", "update", "."],
732
- cwd=str(repo_path),
733
- capture_output=True,
734
- text=True,
735
- timeout=timeout,
736
- )
737
- except FileNotFoundError:
738
- return False, "graphify: command not found on this machine's PATH"
739
- except subprocess.TimeoutExpired:
740
- return False, f"graphify update . timed out after {timeout:.0f}s"
741
- except OSError as exc:
742
- return False, f"graphify update . failed to start: {exc}"
792
+ from coord.graph_health import run_graphify_update # noqa: PLC0415
743
793
 
744
- if result.returncode != 0:
745
- reason = (result.stderr or result.stdout or "").strip()
746
- return False, reason or f"graphify update . exited {result.returncode}"
747
- return True, (result.stdout or "").strip()
794
+ return run_graphify_update(repo_path, timeout=timeout)
748
795
 
749
796
 
750
797
  # #2212: count how many Bash commands in a worker's leg invoked `graphify` —
@@ -2941,6 +2988,16 @@ class AgentAssignment:
2941
2988
  # (a normal work assignment's deliverable is the diff itself, already
2942
2989
  # visible on the PR — restating the transcript there would be noise).
2943
2990
  result_text: str | None = None
2991
+ # #2234: the worker's own final message when `_reap` classifies a clean
2992
+ # (exit_code==0), 0-commit exit as a policy refusal (`status ==
2993
+ # REFUSED_POLICY`) rather than the #448 ADVISORY default — see
2994
+ # `_looks_like_policy_refusal`. `None` on every other outcome, including
2995
+ # an ordinary zero-commit ADVISORY (no marker matched) and the #2188
2996
+ # analysis-deliverable success shape (mutually exclusive with this one:
2997
+ # both are decided in the same `_ahead == 0` branch of `_reap`, and only
2998
+ # one of `analysis_deliverable`/`zero_commit_reason`/this field is ever
2999
+ # set for a given assignment).
3000
+ policy_refusal_reason: str | None = None
2944
3001
 
2945
3002
  def to_dict(self) -> dict:
2946
3003
  d = asdict(self)
@@ -4151,6 +4208,21 @@ class AgentServer:
4151
4208
  # already follows.
4152
4209
  self._graph_rebuild_in_progress: set[str] = set()
4153
4210
 
4211
+ # #2237 item 7: guard 1 (the idle-gate) skips the whole self-heal
4212
+ # pass whenever this machine has a RUNNING assignment. Sensible —
4213
+ # a rebuild during a worker's leg fights it for CPU — but it means
4214
+ # the BUSIEST machine in the fleet gets the FEWEST heal windows,
4215
+ # which is the opposite of where drift accumulates. Nothing recorded
4216
+ # that, so "this machine never gets an idle window" was
4217
+ # indistinguishable from "this machine never needed a heal".
4218
+ # Measure before changing the guard: these two counters ride
4219
+ # /health's `graph_self_heal` block so the ratio is observable, and
4220
+ # only if it turns out to be common does the guard need replacing
4221
+ # with a heal window.
4222
+ self._graph_heal_skipped_active: int = 0
4223
+ self._graph_heal_last_skip_at: float | None = None
4224
+ self._graph_heal_passes: int = 0
4225
+
4154
4226
  self.state_dir.mkdir(parents=True, exist_ok=True)
4155
4227
  self.log_dir.mkdir(parents=True, exist_ok=True)
4156
4228
  self._load_state()
@@ -4163,7 +4235,7 @@ class AgentServer:
4163
4235
  completed = sum(
4164
4236
  1
4165
4237
  for a in self._assignments.values()
4166
- if a.status in (DONE, FAILED, CANCELLED, ADVISORY)
4238
+ if a.status in (DONE, FAILED, CANCELLED, ADVISORY, REFUSED_POLICY)
4167
4239
  )
4168
4240
  worktree_bytes = self._cached_worktree_bytes()
4169
4241
  artifact_bytes = self._cached_artifact_bytes()
@@ -4224,6 +4296,19 @@ class AgentServer:
4224
4296
  # block (`_cached_local_health`'s own try/except) rather than
4225
4297
  # omitting the key, so an old/new client can always find it.
4226
4298
  "health": self._cached_local_health(),
4299
+ # #2237 item 7: how often the graph self-heal pass has actually
4300
+ # run on this machine, and how often guard 1 (the idle-gate)
4301
+ # turned it away because an assignment was RUNNING. The busiest
4302
+ # host in the fleet is the one most likely to drift AND the least
4303
+ # likely to be idle, so "never healed" and "never needed healing"
4304
+ # were indistinguishable until this. Cheap, in-memory, resets on
4305
+ # agent restart — it exists to answer "is the idle-gate starving
4306
+ # this machine", not to be a durable metric.
4307
+ "graph_self_heal": {
4308
+ "passes": self._graph_heal_passes,
4309
+ "skipped_active": self._graph_heal_skipped_active,
4310
+ "last_skip_at": self._graph_heal_last_skip_at,
4311
+ },
4227
4312
  }
4228
4313
 
4229
4314
  def _cached_local_health(self) -> dict:
@@ -4288,6 +4373,19 @@ class AgentServer:
4288
4373
  """React to the ``graph`` check's STATE verdict instead of chasing
4289
4374
  the git events that produced it (#1729, H-6).
4290
4375
 
4376
+ Covers a **missing** graph as well as a stale one (#2237 item 5).
4377
+ Ongoing drift was already handled here; absence was not, because
4378
+ ``graph_status`` returns early for a checkout with no
4379
+ ``graphify-out/graph.json`` and never computes ``stale`` — so this
4380
+ pass skipped it, and so did the graphify hooks' own
4381
+ ``[ ! -f graphify-out/graph.json ] && exit 0``. Two independent
4382
+ mechanisms declining to rebuild a graph that is not there made a
4383
+ single ``rm -rf graphify-out/`` (or a fresh clone on a machine that
4384
+ never had one) permanent until a human intervened. The guards below
4385
+ are unchanged and cover the absent case as-is — in particular guard
4386
+ 3, which is what stops a repo where ``graphify update .`` genuinely
4387
+ cannot succeed from retrying every poll forever.
4388
+
4291
4389
  The git hooks (`.githooks/`) are event-driven and structurally
4292
4390
  cannot cover every ref-moving operation — rebase/merge/cherry-pick
4293
4391
  `exit 0`, `git reset --hard` fires no hook at all, and every hook
@@ -4304,8 +4402,13 @@ class AgentServer:
4304
4402
  1. **Idle-gate.** Only when this machine has no RUNNING assignment.
4305
4403
  A rebuild is hundreds of files across many workers; running it
4306
4404
  while a worker is mid-build steals the CPU that worker was
4307
- dispatched for. This reads `self._assignments` under a brief
4308
- lock and releases it before the (possibly slow) rebuild runs —
4405
+ dispatched for. Every skip is counted
4406
+ (`_graph_heal_skipped_active`, surfaced as /health's
4407
+ `graph_self_heal` block) because the guard's cost lands hardest
4408
+ on the busiest machine — the one most likely to drift — and
4409
+ #2237 item 7 asks for that to be measured before the guard is
4410
+ traded for a heal window. This reads `self._assignments` under a
4411
+ brief lock and releases it before the (possibly slow) rebuild runs —
4309
4412
  load-bearing for guard-adjacent requirement #1625 decision 3:
4310
4413
  health must stay advisory, so a dispatch landing mid-rebuild
4311
4414
  must never be delayed by it (see `_graphify_update`, called
@@ -4360,13 +4463,32 @@ class AgentServer:
4360
4463
  with self._lock:
4361
4464
  active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
4362
4465
  if active:
4466
+ # #2237 item 7: count the skip instead of returning silently, so
4467
+ # "the busiest machine never heals" is a number an operator can
4468
+ # read off /health rather than an inference from a graph that
4469
+ # stays stale.
4470
+ self._graph_heal_skipped_active += 1
4471
+ self._graph_heal_last_skip_at = time.time()
4363
4472
  return
4473
+ self._graph_heal_passes += 1
4364
4474
 
4365
4475
  for i, result in enumerate(report.results):
4366
4476
  if result.check_id != "graph":
4367
4477
  continue
4368
4478
  values = result.values or {}
4369
- if not values.get("stale"):
4479
+ # #2237 item 5: ABSENT counts, not just stale. `graph_status`
4480
+ # returns early with `unknown_reason` when there is no
4481
+ # graphify-out/graph.json, so `stale` is never even computed for a
4482
+ # never-built (or `rm -rf`'d) checkout — which meant two
4483
+ # independent mechanisms declined to rebuild a graph that is not
4484
+ # there: this gate, and the graphify hooks' own
4485
+ # `[ ! -f graphify-out/graph.json ] && exit 0`. Between them, a
4486
+ # single `rm -rf graphify-out/` was permanent. Guard 3's
4487
+ # once-per-HEAD bookkeeping below keys on `head_sha`, which a
4488
+ # never-built checkout now carries (#2237 in `graph_health`), so a
4489
+ # repo where the build genuinely cannot succeed still gets exactly
4490
+ # one attempt per HEAD rather than one per poll.
4491
+ if not values.get("stale") and values.get("present", True):
4370
4492
  continue
4371
4493
  path_str = values.get("path")
4372
4494
  if not path_str:
@@ -5321,6 +5443,51 @@ class AgentServer:
5321
5443
  servable.append(repo_name)
5322
5444
  return servable, degraded
5323
5445
 
5446
+ def fix_graph(self, repo_name: str, *, timeout: float = 600.0) -> dict:
5447
+ """Repair the machine-local half of graphify for *repo_name* here
5448
+ (#2237 item 1 — the agent side of ``coord repo doctor --fix``).
5449
+
5450
+ The whole point of routing this through the agent is that the
5451
+ operator's laptop is *not* where the workers run: layer 5 was the one
5452
+ onboarding layer probed only on the machine running the command, so a
5453
+ repo with a graph on the operator's box and none on dellserver
5454
+ reported clean. Repairing it has the same shape — a fix that only
5455
+ ever repairs the local clone fixes the machine that needed it least.
5456
+
5457
+ Idempotent and never touches a tracked file:
5458
+ :func:`coord.graph_health.apply_local_graph_fix` sets
5459
+ ``core.hooksPath`` and builds a missing graph, and refuses outright
5460
+ when the repo does not ship ``.githooks/post-checkout`` (a versioned
5461
+ change, which is a PR against that repo and must never be automated).
5462
+
5463
+ Returns the :meth:`~coord.graph_health.GraphFixResult.to_dict` shape
5464
+ plus ``repo``. An unknown repo, or one with no checkout on this
5465
+ machine, comes back as a ``refused`` result rather than an error —
5466
+ the caller is sweeping every machine and wants a per-machine answer,
5467
+ not an exception that hides the other machines' results.
5468
+ """
5469
+ from coord.graph_health import GraphFixResult, apply_local_graph_fix # noqa: PLC0415
5470
+
5471
+ path_str = self.repo_paths.get(repo_name)
5472
+ if not path_str:
5473
+ result = GraphFixResult(
5474
+ repo_path="",
5475
+ refused=f"no repo_path configured for {repo_name!r} on this machine",
5476
+ )
5477
+ return {**result.to_dict(), "repo": repo_name}
5478
+
5479
+ repo_path = Path(path_str).expanduser()
5480
+ result = apply_local_graph_fix(repo_path, timeout=timeout)
5481
+ # A rebuild that succeeds here invalidates whatever this HEAD was
5482
+ # last recorded as failing (guard 3's bookkeeping) — otherwise the
5483
+ # self-heal would keep replaying a stale failure reason at an
5484
+ # operator who just fixed it by hand.
5485
+ if result.ok:
5486
+ with self._lock:
5487
+ self._graph_rebuild_failed.pop(str(repo_path), None)
5488
+ self._local_health_cache = None
5489
+ return {**result.to_dict(), "repo": repo_name}
5490
+
5324
5491
  def list_repos(self) -> dict[str, dict]:
5325
5492
  """Return local HEAD / branch / dirty flag for each configured repo.
5326
5493
 
@@ -6011,17 +6178,28 @@ class AgentServer:
6011
6178
  ``zero_commit_reason`` when the reap already flagged ADVISORY, since
6012
6179
  that is the string `coord status`, the dashboard and the GitHub
6013
6180
  advisory comment all render) is what makes the loss visible.
6181
+
6182
+ #2234 fix-1: mirrors the same rewrite for a REFUSED_POLICY reap —
6183
+ ``policy_refusal_reason`` (not ``zero_commit_reason``) is the string
6184
+ the refused_policy GitHub comment and `coord status` render for that
6185
+ status, so a dirty worktree left behind by an otherwise-correct
6186
+ policy refusal needs the same visibility, on the field that surface
6187
+ actually reads.
6014
6188
  """
6015
6189
  with self._lock:
6016
6190
  live = self._assignments.get(assignment.id, assignment)
6017
6191
  live.dirty_worktree_reason = reason
6018
6192
  if live.status == ADVISORY:
6019
6193
  live.zero_commit_reason = reason
6194
+ elif live.status == REFUSED_POLICY:
6195
+ live.policy_refusal_reason = reason
6020
6196
  # Keep the caller's object in sync when it isn't the live one, so
6021
6197
  # a caller holding a detached copy still sees the outcome.
6022
6198
  assignment.dirty_worktree_reason = reason
6023
6199
  if assignment.status == ADVISORY:
6024
6200
  assignment.zero_commit_reason = reason
6201
+ elif assignment.status == REFUSED_POLICY:
6202
+ assignment.policy_refusal_reason = reason
6025
6203
  self._persist()
6026
6204
 
6027
6205
  def _rescue_uncommitted_work(
@@ -7379,6 +7557,11 @@ class AgentServer:
7379
7557
  # assignment.
7380
7558
  _analysis_deliverable = False
7381
7559
  _zero_commit_reason: str | None = None
7560
+ # #2234: set alongside (never together with) `_zero_commit_reason` —
7561
+ # both are decided in the SAME `_ahead == 0` branch below so the two
7562
+ # readings of "0 commits" can never disagree about which one applies
7563
+ # to this assignment.
7564
+ _policy_refusal_reason: str | None = None
7382
7565
  if (exit_code == 0 and assignment is not None
7383
7566
  and assignment.worktree_path
7384
7567
  and assignment.spec.type in _ZERO_COMMIT_TYPES):
@@ -7399,6 +7582,30 @@ class AgentServer:
7399
7582
  )
7400
7583
  except OSError:
7401
7584
  pass
7585
+ elif _worker_summary is not None and _looks_like_policy_refusal(
7586
+ _worker_summary.result_text
7587
+ ):
7588
+ # #2234: the worker's own final message cites a
7589
+ # standing repo-rule prohibition as the reason it
7590
+ # stopped — the #2195 shape. Distinct from the
7591
+ # ADVISORY fallback below: retrying this assignment
7592
+ # cannot change a rule that isn't going anywhere, so
7593
+ # it must not consume the queue's attempt budget or
7594
+ # land in the same bucket as a genuinely stuck
7595
+ # worker.
7596
+ _policy_refusal_reason = _worker_summary.result_text or (
7597
+ "worker cited a standing repo-rule prohibition"
7598
+ )
7599
+ try:
7600
+ with open(assignment.log_path, "a") as reopen:
7601
+ reopen.write(
7602
+ "# reap: refused_policy — 0 commits ahead "
7603
+ f"of {_base}; worker's final message cites "
7604
+ "a standing repo-rule prohibition, status "
7605
+ "set to refused_policy (#2234)\n"
7606
+ )
7607
+ except OSError:
7608
+ pass
7402
7609
  else:
7403
7610
  _zero_commit_reason = (
7404
7611
  "worker exited cleanly but pushed 0 commits"
@@ -7472,6 +7679,17 @@ class AgentServer:
7472
7679
  # shrug.
7473
7680
  assignment.status = FAILED
7474
7681
  assignment.push_failure_reason = _push_failure_reason
7682
+ elif _policy_refusal_reason is not None:
7683
+ # #2234: clean exit, no commits, and the worker's own
7684
+ # final message cites a standing repo-rule
7685
+ # prohibition — a distinct, permanent shape of "0
7686
+ # commits", not the generic #448 ADVISORY. Checked
7687
+ # BEFORE `_zero_commit_reason` (the two are mutually
7688
+ # exclusive by construction — see the `_reap`
7689
+ # computation above — so the order is never actually
7690
+ # load-bearing, kept parallel to it for readability).
7691
+ assignment.status = REFUSED_POLICY
7692
+ assignment.policy_refusal_reason = _policy_refusal_reason
7475
7693
  elif _zero_commit_reason is not None:
7476
7694
  # #448: clean exit but no commits → advisory, not done.
7477
7695
  assignment.status = ADVISORY
@@ -7732,8 +7950,16 @@ class AgentServer:
7732
7950
  ):
7733
7951
  return
7734
7952
  self._last_advisory_terminal_check = now
7953
+ # #2234: REFUSED_POLICY joins ADVISORY here for the same reason
7954
+ # — both are terminal, zero-commit statuses the agent would
7955
+ # otherwise keep serving indefinitely from its own `/status`
7956
+ # feed once GitHub confirms the work is done, forcing every
7957
+ # downstream consumer (dashboard, TUI, any future client) to
7958
+ # reimplement the same GitHub-terminality filter this method
7959
+ # exists to spare them.
7735
7960
  candidates = [
7736
- a for a in self._assignments.values() if a.status == ADVISORY
7961
+ a for a in self._assignments.values()
7962
+ if a.status in (ADVISORY, REFUSED_POLICY)
7737
7963
  ]
7738
7964
  if not candidates:
7739
7965
  return
@@ -7805,7 +8031,14 @@ class AgentServer:
7805
8031
  ordered = list(self._assignments.values())
7806
8032
  superseded_ids: list[str] = []
7807
8033
  for i, a in enumerate(ordered):
7808
- if a.status != ADVISORY:
8034
+ # #2234: REFUSED_POLICY joins ADVISORY here too — a refusal
8035
+ # for issue X can be superseded the same way an advisory can
8036
+ # (e.g. the coordinator re-scopes the issue so a later
8037
+ # dispatch's deliverable is no longer coordinator-only, and
8038
+ # that later attempt reaches DONE). Same in-memory
8039
+ # comparison, same root cause as `_prune_terminal_advisory`
8040
+ # above.
8041
+ if a.status not in (ADVISORY, REFUSED_POLICY):
7809
8042
  continue
7810
8043
  key = (a.spec.repo_name, a.spec.issue_number)
7811
8044
  for later in ordered[i + 1 :]: