code-coordinator 0.5.80__tar.gz → 0.5.81__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 (826) hide show
  1. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent.py +86 -9
  5. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/graph_health.py +13 -1
  6. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/opencode.py +13 -0
  7. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/repo_onboard.py +38 -1
  8. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/worker_events.py +225 -0
  9. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/GRAPHIFY_SETUP.md +44 -0
  10. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent.py +144 -0
  11. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_graph_health.py +37 -0
  12. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers.py +41 -0
  13. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_repo_onboard_2220.py +23 -0
  14. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_events.py +239 -0
  15. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/cargo-test.yml +0 -0
  26. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/release-tui.yml +0 -0
  28. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/.gitignore +0 -0
  30. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/GOAL.md +0 -0
  32. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/LICENSE +0 -0
  33. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/README.md +0 -0
  35. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/SOURCES.txt +0 -0
  36. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/dependency_links.txt +0 -0
  37. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/entry_points.txt +0 -0
  38. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/requires.txt +0 -0
  39. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/scm_file_list.json +0 -0
  40. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/acceptance.py +0 -0
  44. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/acceptance_drivers.py +0 -0
  45. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_bool_guard.py +0 -0
  53. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/client.py +0 -0
  64. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/config.py +0 -0
  96. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/conflict_fix.py +0 -0
  97. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dao.py +0 -0
  98. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/__init__.py +0 -0
  99. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/fixture.py +0 -0
  100. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/index.html +0 -0
  101. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/server.py +0 -0
  102. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/terminal.py +0 -0
  103. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/.gitignore +0 -0
  104. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/components.json +0 -0
  105. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  106. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  107. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  108. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  109. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  110. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  111. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  112. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  113. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  114. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/index.html +0 -0
  115. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  116. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/sw.js +0 -0
  117. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  118. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  119. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  120. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  121. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  122. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  123. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  124. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  125. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  126. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  127. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/eslint.config.js +0 -0
  128. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/index.html +0 -0
  129. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  130. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/package-lock.json +0 -0
  131. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/package.json +0 -0
  132. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  133. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/playwright.config.ts +0 -0
  134. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/postcss.config.js +0 -0
  135. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  136. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  137. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  138. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/App.tsx +0 -0
  139. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/api/client.ts +0 -0
  140. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  141. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  142. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  143. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  144. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  145. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  146. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  147. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  148. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  149. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  150. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  151. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  152. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  153. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  154. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  155. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  156. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  157. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  158. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  159. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  160. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  161. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  162. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  163. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  164. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  165. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  166. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  167. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  168. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  169. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  170. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  171. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  172. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  173. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  174. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  175. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/index.css +0 -0
  176. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  177. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  178. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/main.tsx +0 -0
  179. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  180. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  181. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  182. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  183. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  184. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  185. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  186. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  187. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  188. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  189. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  190. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  191. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  192. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  193. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  194. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  195. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  196. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  197. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  198. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  199. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  200. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  201. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  202. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tailwind.config.js +0 -0
  203. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tsconfig.json +0 -0
  204. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  205. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dashboard/webapp/vite.config.ts +0 -0
  206. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/db.py +0 -0
  207. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dead_end.py +0 -0
  208. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/README.md +0 -0
  209. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-agent.service +0 -0
  210. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.service +0 -0
  211. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.sh +0 -0
  212. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-db-backup.timer +0 -0
  213. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-drive-queue.service +0 -0
  214. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-drive-queue.timer +0 -0
  215. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-notify.service +0 -0
  216. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-notify.timer +0 -0
  217. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-propagate.service +0 -0
  218. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-propagate.timer +0 -0
  219. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-window.service +0 -0
  220. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-release-window.timer +0 -0
  221. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-serve.service +0 -0
  222. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web-dist-build.service +0 -0
  223. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web-dist-build.timer +0 -0
  224. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy/coord-web.service +0 -0
  225. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy_manifest.py +0 -0
  226. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deploy_units.py +0 -0
  227. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/deps.py +0 -0
  228. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/diagnose.py +0 -0
  229. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dispatch.py +0 -0
  230. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/dist_name.py +0 -0
  231. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive.py +0 -0
  232. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive_queue.py +0 -0
  233. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/drive_state.py +0 -0
  234. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/events.py +0 -0
  235. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/failure_class.py +0 -0
  236. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/filelock.py +0 -0
  237. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/fleet_config_health.py +0 -0
  238. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/freshness.py +0 -0
  239. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_a.py +0 -0
  240. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_b.py +0 -0
  241. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gate_snapshot.py +0 -0
  242. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/gates.py +0 -0
  243. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/github_ops.py +0 -0
  244. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/goal.py +0 -0
  245. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/__init__.py +0 -0
  246. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/aggregate.py +0 -0
  247. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/__init__.py +0 -0
  248. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/agent_install.py +0 -0
  249. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/cargo_targets.py +0 -0
  250. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/claude_binary.py +0 -0
  251. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/deploy_lane_facts.py +0 -0
  252. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/disk.py +0 -0
  253. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_board.py +0 -0
  254. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  255. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_phantom.py +0 -0
  256. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/fleet_unit_drift.py +0 -0
  257. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/graph.py +0 -0
  258. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/plan_usage.py +0 -0
  259. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/repo_state.py +0 -0
  260. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/spawned_coord.py +0 -0
  261. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/timer_active.py +0 -0
  262. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/toolchain.py +0 -0
  263. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/unit_drift.py +0 -0
  264. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/unit_enablement.py +0 -0
  265. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/checks/worktrees.py +0 -0
  266. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/cli.py +0 -0
  267. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/context.py +0 -0
  268. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/fleet_snapshot.py +0 -0
  269. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/models.py +0 -0
  270. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/pypi.py +0 -0
  271. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/registry.py +0 -0
  272. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/render.py +0 -0
  273. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/health/units.py +0 -0
  274. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/hooks.py +0 -0
  275. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/housekeeping.py +0 -0
  276. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/interactive.py +0 -0
  277. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/issue_store.py +0 -0
  278. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/liveness_auditor.py +0 -0
  279. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/machine_pause.py +0 -0
  280. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/merge_queue.py +0 -0
  281. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_chat.py +0 -0
  282. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_dispatch.py +0 -0
  283. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_gate.py +0 -0
  284. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/milestone_order.py +0 -0
  285. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/mock_author.py +0 -0
  286. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/models.py +0 -0
  287. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/network.py +0 -0
  288. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/new_issue_chat.py +0 -0
  289. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/__init__.py +0 -0
  290. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/baseline.py +0 -0
  291. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/cli.py +0 -0
  292. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/collect.py +0 -0
  293. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/digest.py +0 -0
  294. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/models.py +0 -0
  295. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/predicate.py +0 -0
  296. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/service.py +0 -0
  297. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/store.py +0 -0
  298. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notifier/transport.py +0 -0
  299. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/notify.py +0 -0
  300. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/openapi.py +0 -0
  301. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/overlap_fence.py +0 -0
  302. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/parentage.py +0 -0
  303. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/parentage_github.py +0 -0
  304. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/pipeline.py +0 -0
  305. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/plan_parser.py +0 -0
  306. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/plans.py +0 -0
  307. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/platform_paths.py +0 -0
  308. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/portal_bridge.py +0 -0
  309. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/pr_body_lint.py +0 -0
  310. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/prereqs.py +0 -0
  311. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/progress.py +0 -0
  312. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/__init__.py +0 -0
  313. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/base.py +0 -0
  314. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/claude.py +0 -0
  315. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/providers/claude_pty.py +0 -0
  316. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/reconcile.py +0 -0
  317. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/refine_chat.py +0 -0
  318. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_cordon.py +0 -0
  319. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_propagate.py +0 -0
  320. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_verify.py +0 -0
  321. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/release_window.py +0 -0
  322. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/repo_edit.py +0 -0
  323. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/reports.py +0 -0
  324. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/revalidate.py +0 -0
  325. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/review.py +0 -0
  326. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/scorecard.py +0 -0
  327. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/serve_app.py +0 -0
  328. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/skills/update-issue/SKILL.md +0 -0
  329. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/smoke.py +0 -0
  330. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/spend_ceiling.py +0 -0
  331. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/split_work.py +0 -0
  332. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/stage_projection.py +0 -0
  333. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/state.py +0 -0
  334. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_author.py +0 -0
  335. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_chat.py +0 -0
  336. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_orchestrator.py +0 -0
  337. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/test_report.py +0 -0
  338. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/tui_release.py +0 -0
  339. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage.py +0 -0
  340. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage_limits.py +0 -0
  341. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coord/usage_rollup.py +0 -0
  342. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/coordinator.example.yml +0 -0
  343. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-agent.service +0 -0
  344. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.service +0 -0
  345. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.sh +0 -0
  346. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-db-backup.timer +0 -0
  347. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-drive-queue.service +0 -0
  348. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-drive-queue.timer +0 -0
  349. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-notify.service +0 -0
  350. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-notify.timer +0 -0
  351. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-propagate.service +0 -0
  352. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-propagate.timer +0 -0
  353. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-window.service +0 -0
  354. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-release-window.timer +0 -0
  355. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-serve.service +0 -0
  356. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.service +0 -0
  357. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.sh +0 -0
  358. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-dist-build.timer +0 -0
  359. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web-rollback.sh +0 -0
  360. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/coord-web.service +0 -0
  361. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/deploy/node-shim.sh +0 -0
  362. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/AGENT_OPERATIONS.md +0 -0
  363. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ARCHITECTURE.md +0 -0
  364. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ARCH_SECURITY_GATES.md +0 -0
  365. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/COCKPIT.md +0 -0
  366. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CONTROL_CENTER.md +0 -0
  367. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/COST_DISCIPLINE.md +0 -0
  368. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CROSS_PLATFORM.md +0 -0
  369. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/CUSTOMER_PORTAL.md +0 -0
  370. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/DRIVE_QUEUE.md +0 -0
  371. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/EPHEMERAL_WORKERS.md +0 -0
  372. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/FORGE_MIGRATION.md +0 -0
  373. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ISSUE_GUIDANCE.md +0 -0
  374. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/MAC_MINI.md +0 -0
  375. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  376. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/NOTIFIER.md +0 -0
  377. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/OPENCODE_VERIFICATION.md +0 -0
  378. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/OPERATING_GOTCHAS.md +0 -0
  379. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/ORACLE_LOOP.md +0 -0
  380. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PHONE_WEBAPP.md +0 -0
  381. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PIPELINE_V2.md +0 -0
  382. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/PLATFORM_EVOLUTION.md +0 -0
  383. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/SECOND_BACKEND.md +0 -0
  384. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/STORE_SERVICE.md +0 -0
  385. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  386. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/WEB_CONTROL_CENTER.md +0 -0
  387. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/README.md +0 -0
  388. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/_tokens.css +0 -0
  389. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/issue-detail.html +0 -0
  390. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/pipeline-narrow.html +0 -0
  391. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/docs/mocks/web/pipeline-wide.html +0 -0
  392. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/graphify-out/.gitignore +0 -0
  393. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/install-agent.sh +0 -0
  394. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/pyproject.toml +0 -0
  395. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/audit_review_verdict_overrides.py +0 -0
  396. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  397. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/build-worker-image.sh +0 -0
  398. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/coordinator-machine.py +0 -0
  399. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/epic-down.sh +0 -0
  400. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/epic-up.sh +0 -0
  401. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/preflight.sh +0 -0
  402. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/provision-worker.sh +0 -0
  403. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  404. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  405. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/azure-workers/verify-github-token.sh +0 -0
  406. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/codegen.py +0 -0
  407. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/coord-test-runner.sh +0 -0
  408. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/drive-batch.sh +0 -0
  409. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/gen_board_fixture.py +0 -0
  410. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/next_release_tag.py +0 -0
  411. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/run_tests_in_populated_home.sh +0 -0
  412. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/run_tests_without_gh.sh +0 -0
  413. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/smoke_437_interactive.py +0 -0
  414. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_878_review_capture.py +0 -0
  415. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_release_published.py +0 -0
  416. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/scripts/verify_release_wheel.py +0 -0
  417. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/setup.cfg +0 -0
  418. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/SMOKE_SET.md +0 -0
  419. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/__init__.py +0 -0
  420. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  421. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/contract.md +0 -0
  422. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/manifest.yml +0 -0
  423. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  424. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  425. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  426. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  427. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/conftest.py +0 -0
  428. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/contract.md +0 -0
  429. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/manifest.yml +0 -0
  430. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  431. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  432. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/contract.md +0 -0
  433. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/manifest.yml +0 -0
  434. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  435. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  436. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  437. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  438. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  439. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  440. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  441. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  442. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  443. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  444. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/contract.md +0 -0
  445. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  446. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  447. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/manifest.yml +0 -0
  448. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  449. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-51/tsconfig.json +0 -0
  450. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  451. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/conftest.py +0 -0
  452. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/board-pipeline-basic.json +0 -0
  453. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  454. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  455. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  456. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/all_pass.json +0 -0
  457. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  458. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/mixed_fail.json +0 -0
  459. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  460. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  461. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/skip.json +0 -0
  462. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/playwright/truncated.json +0 -0
  463. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  464. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  465. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  466. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  467. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  468. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  469. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  470. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  471. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_acceptance.py +0 -0
  472. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_acceptance_drivers.py +0 -0
  473. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_api_error.py +0 -0
  474. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_app.py +0 -0
  475. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_branch_base.py +0 -0
  476. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_branch_capture.py +0 -0
  477. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_config_free_1712.py +0 -0
  478. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_deploy_units_endpoint.py +0 -0
  479. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_dirty_worktree.py +0 -0
  480. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_graph_self_heal.py +0 -0
  481. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_health_h3.py +0 -0
  482. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_idle_restart.py +0 -0
  483. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_push_failure.py +0 -0
  484. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_reap.py +0 -0
  485. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_repos_and_pull.py +0 -0
  486. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_restart_services_endpoint.py +0 -0
  487. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_approve_reject_plan.py +0 -0
  494. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_approve_usage_gate.py +0 -0
  495. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_assignment_already_recorded_daemon.py +0 -0
  496. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_log.py +0 -0
  497. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_outcome.py +0 -0
  498. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_audit_query.py +0 -0
  499. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_auto_loop.py +0 -0
  500. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_auto_release_publish_2035.py +0 -0
  501. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_base_checkout_restore.py +0 -0
  502. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_cap_762.py +0 -0
  503. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_fixture.py +0 -0
  504. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_read_path.py +0 -0
  505. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_service.py +0 -0
  506. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_state.py +0 -0
  507. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_board_wire.py +0 -0
  508. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_brain.py +0 -0
  509. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_branch_model.py +0 -0
  510. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_bug_intake.py +0 -0
  511. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_build_worker_image_env_update.py +0 -0
  512. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cargo_cache.py +0 -0
  513. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_acceptance_gate_1950.py +0 -0
  514. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_parity_2091.py +0 -0
  515. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_ci_store.py +0 -0
  516. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_claim.py +0 -0
  517. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_acceptance.py +0 -0
  518. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign.py +0 -0
  519. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  520. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_interactive_remote.py +0 -0
  521. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_provider.py +0 -0
  522. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  523. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_audit.py +0 -0
  524. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_chat_continue.py +0 -0
  525. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_diagnose_config_provenance.py +0 -0
  526. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_diagnose_graph.py +0 -0
  527. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor.py +0 -0
  528. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor_config_free_1801.py +0 -0
  529. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  530. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_drive.py +0 -0
  531. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_drive_queue.py +0 -0
  532. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_escalate.py +0 -0
  533. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_fix_headless_review.py +0 -0
  534. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_gate_a.py +0 -0
  535. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_install_drift.py +0 -0
  536. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_install_skills.py +0 -0
  537. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_issue_create_label.py +0 -0
  538. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_issue_reopen.py +0 -0
  539. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_merge.py +0 -0
  540. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_assign.py +0 -0
  541. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_capture.py +0 -0
  542. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_chat_add_child.py +0 -0
  543. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_dispatch.py +0 -0
  544. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_gate_b.py +0 -0
  545. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_gate_c.py +0 -0
  546. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_order.py +0 -0
  547. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  548. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_milestone_ship.py +0 -0
  549. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_network.py +0 -0
  550. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_new_issue_chat.py +0 -0
  551. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_plans.py +0 -0
  552. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_portal.py +0 -0
  553. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_pull_artifact.py +0 -0
  554. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_queue.py +0 -0
  555. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_reattach_sessions.py +0 -0
  556. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_refine_board.py +0 -0
  557. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_preflight.py +0 -0
  558. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_propagate.py +0 -0
  559. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_release_window.py +0 -0
  560. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_repo_2220.py +0 -0
  561. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_scorecard.py +0 -0
  562. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_set_review_findings.py +0 -0
  563. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_advisory_terminal.py +0 -0
  564. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_merge_queue.py +0 -0
  565. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_provider.py +0 -0
  566. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_review_finalizing.py +0 -0
  567. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_test_failed_tag.py +0 -0
  568. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_status_usage_limit.py +0 -0
  569. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_sync_comments_873.py +0 -0
  570. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_test_plan.py +0 -0
  571. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_track.py +0 -0
  572. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_tui_update.py +0 -0
  573. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cli_wait.py +0 -0
  574. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_client_base_install.py +0 -0
  575. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_comments.py +0 -0
  576. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_completion_summary.py +0 -0
  577. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config.py +0 -0
  578. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_acceptance.py +0 -0
  579. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_audit.py +0 -0
  580. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_pricing.py +0 -0
  581. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_config_usage_gate.py +0 -0
  582. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_conflict_fix.py +0 -0
  583. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_conflict_fix_semantic.py +0 -0
  584. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test.py +0 -0
  585. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_baseline.py +0 -0
  586. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_routing.py +0 -0
  587. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_test_runner_toolchain.py +0 -0
  588. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coord_web_sse_restart_live.py +0 -0
  589. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_coordinator_machine.py +0 -0
  590. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_cross_platform_imports.py +0 -0
  591. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard.py +0 -0
  592. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_fixture.py +0 -0
  593. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_terminal.py +0 -0
  594. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dashboard_terminal_live.py +0 -0
  595. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_db.py +0 -0
  596. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dead_end.py +0 -0
  597. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_db_backup.py +0 -0
  598. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_web_dist.py +0 -0
  599. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_coord_web_rollback.py +0 -0
  600. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_drive_queue_unit.py +0 -0
  601. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_manifest.py +0 -0
  602. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_units_lane.py +0 -0
  603. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deploy_web_unit.py +0 -0
  604. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_deps.py +0 -0
  605. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_diagnose.py +0 -0
  606. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dispatch.py +0 -0
  607. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dispatch_target_validation.py +0 -0
  608. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_dist_name.py +0 -0
  609. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_done_housekeeping.py +0 -0
  610. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive.py +0 -0
  611. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_queue.py +0 -0
  612. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_state.py +0 -0
  613. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_drive_tmux.py +0 -0
  614. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_capability_detection.py +0 -0
  615. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  616. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_epic_up_image_provenance.py +0 -0
  617. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_errors.py +0 -0
  618. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_events.py +0 -0
  619. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_failure_class.py +0 -0
  620. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_filelock.py +0 -0
  621. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  622. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fix_of_force_override.py +0 -0
  623. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_config_health.py +0 -0
  624. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_health_probes.py +0 -0
  625. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_fleet_health_snapshot.py +0 -0
  626. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_freshness.py +0 -0
  627. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_a.py +0 -0
  628. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_b.py +0 -0
  629. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gate_snapshot_staleness.py +0 -0
  630. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gates.py +0 -0
  631. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  632. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_generated_types_fixture.py +0 -0
  633. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_github_ops.py +0 -0
  634. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_goal.py +0 -0
  635. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_handoff.py +0 -0
  636. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_checks.py +0 -0
  637. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_cli.py +0 -0
  638. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_cli_graph.py +0 -0
  639. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_config.py +0 -0
  640. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_context.py +0 -0
  641. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_deploy_lane_facts.py +0 -0
  642. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_incident_regression.py +0 -0
  643. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_pypi.py +0 -0
  644. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_registry.py +0 -0
  645. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_timer_active.py +0 -0
  646. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_toolchain.py +0 -0
  647. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_unit_drift.py +0 -0
  648. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_health_unit_enablement.py +0 -0
  649. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_hooks.py +0 -0
  650. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_human_attended_437.py +0 -0
  651. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_init.py +0 -0
  652. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_integration.py +0 -0
  653. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_briefing_echo.py +0 -0
  654. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_prefill_state.py +0 -0
  655. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_session_relaunch.py +0 -0
  656. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_test_verdict_backstop.py +0 -0
  657. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_token_attribution.py +0 -0
  658. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_interactive_worktree.py +0 -0
  659. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_issue_store_seam.py +0 -0
  660. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_machine_pause.py +0 -0
  663. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_merge_queue.py +0 -0
  664. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_merge_verify.py +0 -0
  665. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_chat.py +0 -0
  666. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_dispatch.py +0 -0
  667. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_gate.py +0 -0
  668. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_order.py +0 -0
  669. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_milestone_seam.py +0 -0
  670. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_mock_author.py +0 -0
  671. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_model_tiering.py +0 -0
  672. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_models.py +0 -0
  673. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_models_config_labels.py +0 -0
  674. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_needs_attention.py +0 -0
  675. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_network.py +0 -0
  676. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_new_issue_chat.py +0 -0
  677. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_next_release_tag.py +0 -0
  678. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_no_direct_gh_calls.py +0 -0
  679. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_node_shim.py +0 -0
  680. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_baseline.py +0 -0
  681. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_cli.py +0 -0
  682. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_collect.py +0 -0
  683. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_config.py +0 -0
  684. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_drive_seam.py +0 -0
  685. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_isolation.py +0 -0
  686. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_predicate.py +0 -0
  687. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_quiet_hours.py +0 -0
  688. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notifier_service.py +0 -0
  689. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notify.py +0 -0
  690. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_notify_drain.py +0 -0
  691. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_openapi.py +0 -0
  692. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_operational_defaults.py +0 -0
  693. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_overlap_fence.py +0 -0
  694. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_packaged_deploy_units.py +0 -0
  695. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_parentage.py +0 -0
  696. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_paste_landed.py +0 -0
  697. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_pipeline.py +0 -0
  698. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_approve_plan_command.py +0 -0
  699. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_pr_command.py +0 -0
  700. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_followup_review_command.py +0 -0
  701. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_only.py +0 -0
  702. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_plan_parser.py +0 -0
  703. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_platform_paths.py +0 -0
  704. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_portal_bridge.py +0 -0
  705. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_portal_config.py +0 -0
  706. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_pr_body_lint.py +0 -0
  707. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_prereqs.py +0 -0
  708. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_production_db_guard.py +0 -0
  709. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_progress.py +0 -0
  710. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_provider_seam.py +0 -0
  711. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers_config_labels.py +0 -0
  712. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_providers_pty.py +0 -0
  713. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_quiet_hours.py +0 -0
  714. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_quiet_hours_store_2146.py +0 -0
  715. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reap_merged_sessions.py +0 -0
  716. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reap_stale_interactive_tick.py +0 -0
  717. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_branch.py +0 -0
  718. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_completions.py +0 -0
  719. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_merges.py +0 -0
  720. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reconcile_usage_limit_done.py +0 -0
  721. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_refine_chat.py +0 -0
  722. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_cordon_2101.py +0 -0
  723. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_propagate.py +0 -0
  724. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_unified_1242.py +0 -0
  725. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_verify.py +0 -0
  726. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_release_window.py +0 -0
  727. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_remote_auto_prune.py +0 -0
  728. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_remote_interactive_reaper.py +0 -0
  729. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_repo_edit_2220.py +0 -0
  730. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_report_result_push.py +0 -0
  731. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_reports.py +0 -0
  732. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry.py +0 -0
  733. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry_advisory_1606.py +0 -0
  734. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_retry_type_1636.py +0 -0
  735. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_revalidate.py +0 -0
  736. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review.py +0 -0
  737. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_end_review_without_verdict.py +0 -0
  738. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_parse_failure_diagnostic.py +0 -0
  739. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_reaffirm.py +0 -0
  740. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_state.py +0 -0
  741. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_backstop.py +0 -0
  742. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_override_audit.py +0 -0
  743. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_verdict_relay.py +0 -0
  744. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_review_zero_commits.py +0 -0
  745. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_scoped_review_wiring.py +0 -0
  746. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_scorecard.py +0 -0
  747. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_serve.py +0 -0
  748. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_serve_app_board_trim.py +0 -0
  749. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_session.py +0 -0
  750. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_slice_issue_attribution.py +0 -0
  751. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke.py +0 -0
  752. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke_live_checkout_restore.py +0 -0
  753. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_smoke_workflow.py +0 -0
  754. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_spend_ceiling.py +0 -0
  755. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_spend_ceiling_coordinator.py +0 -0
  756. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_split.py +0 -0
  757. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_split_work.py +0 -0
  758. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stage_projection.py +0 -0
  759. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stalled_pipeline.py +0 -0
  760. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_state.py +0 -0
  761. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_state_review_findings_daemon.py +0 -0
  762. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_status_fleet_footer.py +0 -0
  763. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stop_1567.py +0 -0
  764. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_stuck.py +0 -0
  765. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_terminal_command.py +0 -0
  766. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_author.py +0 -0
  767. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_chat.py +0 -0
  768. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_orchestrator.py +0 -0
  769. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_report.py +0 -0
  770. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_verdict_parsing.py +0 -0
  771. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_test_verdict_transcript_floor.py +0 -0
  772. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_board_audit.py +0 -0
  773. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_config_load_1080.py +0 -0
  774. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_thin_client_daemon_routing_906.py +0 -0
  775. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_tmux_host.py +0 -0
  776. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_tmux_session.py +0 -0
  777. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_transcript_floor.py +0 -0
  778. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage.py +0 -0
  779. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage_limits.py +0 -0
  780. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_usage_rollup.py +0 -0
  781. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_venv_live_install_2121.py +0 -0
  782. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_version_single_source.py +0 -0
  783. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_watch.py +0 -0
  784. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_image_pin_sync.py +0 -0
  785. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_safety.py +0 -0
  786. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worker_test_scoping.py +0 -0
  787. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worktree.py +0 -0
  788. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  789. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/Cargo.lock +0 -0
  790. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/Cargo.toml +0 -0
  791. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/cargo-config-local-quadraui.toml.example +0 -0
  792. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/audit.rs +0 -0
  793. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/chat.rs +0 -0
  794. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/data.rs +0 -0
  795. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/dialogs.rs +0 -0
  796. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/drive.rs +0 -0
  797. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/drive_queue.rs +0 -0
  798. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/escalation.rs +0 -0
  799. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/events.rs +0 -0
  800. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fixtures.rs +0 -0
  801. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_health.rs +0 -0
  802. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_sessions.rs +0 -0
  803. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/fleet_terminals.rs +0 -0
  804. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/format.rs +0 -0
  805. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/milestone_dag.rs +0 -0
  806. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/mod.rs +0 -0
  807. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/msv.rs +0 -0
  808. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/pipeline.rs +0 -0
  809. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/plans.rs +0 -0
  810. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/render.rs +0 -0
  811. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/reports.rs +0 -0
  812. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/sessions.rs +0 -0
  813. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/settings_ui.rs +0 -0
  814. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/sidebar.rs +0 -0
  815. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/terminal.rs +0 -0
  816. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/tests.rs +0 -0
  817. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/types.rs +0 -0
  818. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/app/workspace.rs +0 -0
  819. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/bin/gtk.rs +0 -0
  820. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/commands.rs +0 -0
  821. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/lib.rs +0 -0
  822. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/main.rs +0 -0
  823. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/src/settings.rs +0 -0
  824. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/acceptance.rs +0 -0
  825. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/cli.rs +0 -0
  826. {code_coordinator-0.5.80 → code_coordinator-0.5.81}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.80
3
+ Version: 0.5.81
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.80
3
+ Version: 0.5.81
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.80",
2
+ "tag": "0.5.81",
3
3
  "distance": 0,
4
- "node": "g8c6e8430b5fa1613efee27434db00b3e3b59d32b",
4
+ "node": "gf5568b98773fd08c6165236df1c398d57ecc9260",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -756,13 +756,11 @@ def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool,
756
756
  # across N consecutive legs means the prompt instruction isn't landing.
757
757
  # Deliberately NOT a DB column: this is a cheap, best-effort signal, not a
758
758
  # gate anything blocks on, so it stays out of the Assignment schema/migrations.
759
- # Separators recognized before a command token: `;`, `&`, `|` (covers `&&`
760
- # and `||` too, since `\s*` after the class soaks up the second char) and a
761
- # bare newline Claude Code's Bash tool very commonly emits multi-line
762
- # command strings (e.g. `cd repo\ngraphify query "foo"`) that aren't joined
763
- # with `;`/`&&`, so newline must count as a separator or those legs
764
- # undercount to 0 (#2212 review).
765
- _GRAPHIFY_INVOCATION_RE = re.compile(r"(?:^|[\n;&|]\s*)graphify(?:\s|$)")
759
+ # #2236: the pattern itself now lives in `coord.worker_events`, which grew a
760
+ # need for it when the summary parser started recording each query's OUTCOME
761
+ # and not just the count. Imported lazily (like every other
762
+ # `coord.worker_events` use in this module) rather than duplicated, so the two
763
+ # halves of the measurement can never drift apart on what counts as a query.
766
764
 
767
765
 
768
766
  def _count_graphify_invocations(bash_commands: list[str]) -> int:
@@ -781,7 +779,68 @@ def _count_graphify_invocations(bash_commands: list[str]) -> int:
781
779
  b"`` counts once, not twice. Treat the result as an "at least one graph
782
780
  query this leg" signal, not an exact invocation tally.
783
781
  """
784
- return sum(1 for cmd in bash_commands if cmd and _GRAPHIFY_INVOCATION_RE.search(cmd))
782
+ from coord.worker_events import is_graphify_command # noqa: PLC0415
783
+
784
+ return sum(1 for cmd in bash_commands if is_graphify_command(cmd))
785
+
786
+
787
+ def _worktree_graph_present(
788
+ worktree_path: str | None, repo_path_fallback: str | None = None
789
+ ) -> bool:
790
+ """True iff the worker's checkout has a **resolvable** ``graphify-out/graph.json``.
791
+
792
+ #2236: ``graphify_invocations=0`` is ambiguous on its own. Two of five
793
+ repos ship no graph and no ``.githooks/post-checkout``, so their worktrees
794
+ get an empty ``graphify-out/`` — and the worker prompt's own escape hatch
795
+ ("no graph? skip straight to grep, silently") then fires correctly and
796
+ says nothing. Those workers were *obeying* the rule, not ignoring it, and
797
+ the counter cannot tell them apart from a worker that had a graph and
798
+ never asked. Recording this alongside the count is what disambiguates.
799
+
800
+ *repo_path_fallback* mirrors the branch-capture logic a few hundred
801
+ lines up in ``_reap`` ("for legacy assignments (no worktree_path) we
802
+ fall back to the main repo clone"): a legacy/non-worktree assignment has
803
+ no ``worktree_path`` at all, but its worker still ran against
804
+ ``spec.repo_path`` directly, which may have a perfectly good graph.
805
+ Without this fallback, every legacy assignment logs ``graph_present=0``
806
+ regardless — conflating "no worktree" with "no graph".
807
+
808
+ ``exists()`` follows symlinks deliberately: a linked worktree's
809
+ ``graph.json`` is a symlink into the base checkout (see
810
+ ``coord/graph_health.py``), and a *dangling* symlink is exactly as
811
+ graph-blind as no file at all — so both must read as absent.
812
+ """
813
+ path = worktree_path or repo_path_fallback
814
+ if not path:
815
+ return False
816
+ try:
817
+ return (Path(path) / "graphify-out" / "graph.json").exists()
818
+ except OSError:
819
+ return False
820
+
821
+
822
+ def _format_graphify_query_lines(queries: Iterable[Any]) -> list[str]:
823
+ """Render per-query ``# graphify_query …`` log lines (#2236).
824
+
825
+ ``graphify_invocations=N`` counts attempts but cannot distinguish
826
+ "queried and got a useful answer" from "queried, got nothing, fell back to
827
+ grep" — and those imply opposite fixes (a habit problem the prompt can
828
+ move, vs. a graph coverage/quality problem no amount of prompting helps).
829
+ One line per query, ``grep``-able on ``outcome=``, with the command text
830
+ last because it is the only free-form field.
831
+ """
832
+ lines: list[str] = []
833
+ for q in queries:
834
+ results = getattr(q, "results", None)
835
+ # `worker_events._truncate` already newline-strips and trims this
836
+ # when the `GraphifyQuery` entry is built — no need to redo it here.
837
+ command = str(getattr(q, "command", ""))
838
+ lines.append(
839
+ f"# graphify_query: outcome={getattr(q, 'outcome', 'unknown')} "
840
+ f"results={results if results is not None else '?'} "
841
+ f"cmd={command!r}\n"
842
+ )
843
+ return lines
785
844
 
786
845
 
787
846
  def _infer_repo_github_slug(repo_path: str) -> str | None:
@@ -7511,9 +7570,27 @@ class AgentServer:
7511
7570
  _graphify_invocations = _count_graphify_invocations(
7512
7571
  _worker_summary.bash_commands if _worker_summary is not None else []
7513
7572
  )
7573
+ # #2236: the count alone can't separate "didn't try" from
7574
+ # "couldn't try" (no graph in this worktree — the prompt's own
7575
+ # escape hatch fires silently) or from "tried, got nothing".
7576
+ # `graph_present` answers the first; the per-query lines below
7577
+ # answer the second. Read while the worktree still exists —
7578
+ # `_cleanup_worktree` runs further down this same function.
7579
+ _graph_present = _worktree_graph_present(
7580
+ getattr(assignment, "worktree_path", None) if assignment else None,
7581
+ getattr(assignment.spec, "repo_path", None) if assignment else None,
7582
+ )
7514
7583
  reopen.write(
7515
7584
  f"# reap: done (exit_code={exit_code} status={final_status} "
7516
- f"graphify_invocations={_graphify_invocations})\n"
7585
+ f"graphify_invocations={_graphify_invocations} "
7586
+ f"graph_present={int(_graph_present)})\n"
7587
+ )
7588
+ reopen.writelines(
7589
+ _format_graphify_query_lines(
7590
+ _worker_summary.graphify_queries
7591
+ if _worker_summary is not None
7592
+ else []
7593
+ )
7517
7594
  )
7518
7595
  except (OSError, AttributeError):
7519
7596
  pass
@@ -280,6 +280,18 @@ def graph_status(repo_path: Path, default_branch: str = "main") -> GraphStatus:
280
280
  return st
281
281
 
282
282
 
283
+ def hooks_file_present(repo_path: Path) -> bool:
284
+ """Does this repo TRACK ``.githooks/post-checkout`` at all?
285
+
286
+ Split out of :func:`hooks_path_status` (#2236) so callers that only need
287
+ "does the repo ship the hook file" — as opposed to the full
288
+ ``core.hooksPath`` configuration story — have one place to ask, instead
289
+ of independently re-running the same ``.is_file()`` check (a split-brain
290
+ the two would otherwise be one edit away from disagreeing on).
291
+ """
292
+ return (repo_path / HOOKS_PATH / "post-checkout").is_file()
293
+
294
+
283
295
  def hooks_path_status(repo_path: Path) -> tuple[bool, str]:
284
296
  """``(ok, detail)`` for this checkout's ``core.hooksPath``.
285
297
 
@@ -298,7 +310,7 @@ def hooks_path_status(repo_path: Path) -> tuple[bool, str]:
298
310
  except (subprocess.SubprocessError, OSError) as exc:
299
311
  return False, f"could not read core.hooksPath ({exc})"
300
312
  value = r.stdout.strip()
301
- have_hook = (repo_path / HOOKS_PATH / "post-checkout").is_file()
313
+ have_hook = hooks_file_present(repo_path)
302
314
  if not value:
303
315
  if not have_hook:
304
316
  # The repo doesn't ship the bootstrap at all — telling the operator
@@ -830,6 +830,19 @@ def _update_opencode_summary(summary: WorkerSummary, data: dict) -> None:
830
830
  cmd = tool_input.get("command")
831
831
  if isinstance(cmd, str) and cmd:
832
832
  summary.bash_commands.append(cmd)
833
+ # #2236: same graph-usage instrumentation the claude parser
834
+ # does. opencode carries the call and its output in one event,
835
+ # so the outcome settles here instead of on a later
836
+ # `tool_result`.
837
+ from coord.worker_events import record_graphify_call # noqa: PLC0415
838
+
839
+ _out = state.get("output")
840
+ record_graphify_call(
841
+ summary,
842
+ cmd,
843
+ output=_out if isinstance(_out, str) else None,
844
+ is_error=state.get("status") == "error",
845
+ )
833
846
  elif tool in ("edit", "write"):
834
847
  fp = tool_input.get("filePath")
835
848
  if isinstance(fp, str) and fp:
@@ -144,6 +144,16 @@ class GraphFacts:
144
144
  detail: str | None = None
145
145
  hooks_installed: bool = False
146
146
  hooks_detail: str | None = None
147
+ # #2236: does the repo TRACK `.githooks/post-checkout` at all? Two
148
+ # distinct failures hide behind `hooks_installed=False`, and they take
149
+ # opposite fixes: a repo that ships the hook but hasn't pointed
150
+ # `core.hooksPath` at it needs one `git config`; a repo that never ported
151
+ # the hook (coord-portal, stick-demo) needs the files first — running
152
+ # `git config core.hooksPath .githooks` there points git at a directory
153
+ # that does not exist, which silently disables ALL hooks for that
154
+ # checkout. Telling an operator the wrong one is worse than saying
155
+ # nothing, so the fix line has to know which it is.
156
+ hooks_shipped: bool = False
147
157
 
148
158
 
149
159
  @dataclass
@@ -326,6 +336,13 @@ def gather_graph_facts(repo_path: Path | None, default_branch: str = "main") ->
326
336
  ok, detail = False, f"hooks probe failed: {exc}"
327
337
  facts.hooks_installed = bool(ok)
328
338
  facts.hooks_detail = detail
339
+ try:
340
+ # Same question `hooks_path_status` already answers internally —
341
+ # consume its `hooks_file_present` helper rather than re-running the
342
+ # `.is_file()` check independently (#2236 review: split-brain risk).
343
+ facts.hooks_shipped = graph_health.hooks_file_present(repo_path)
344
+ except OSError:
345
+ facts.hooks_shipped = False
329
346
  return facts
330
347
 
331
348
 
@@ -882,7 +899,27 @@ def evaluate_graph(facts: RepoFacts) -> list[Finding]:
882
899
  summary="graph artifact is current with HEAD",
883
900
  ))
884
901
 
885
- if not g.hooks_installed:
902
+ if not g.hooks_installed and not g.hooks_shipped:
903
+ # #2236: the repo never ported the hook. `git config core.hooksPath
904
+ # .githooks` here would point git at a directory that does not exist
905
+ # and disable every hook in the checkout, so the fix is to bring the
906
+ # files over FIRST — worktrees of this repo get no linked graph until
907
+ # then, however the machine is configured.
908
+ out.append(Finding(
909
+ layer="graph", check="graph.hooks_not_ported", severity=WARN,
910
+ summary=(
911
+ f"this repo ships no .githooks/post-checkout — "
912
+ f"{g.hooks_detail or 'the worktree graph bootstrap does not exist here'}; "
913
+ "worktrees get no linked graph, so every worker on this repo "
914
+ "silently falls back to grep"
915
+ ),
916
+ fix=(
917
+ "port .githooks/ (_lib.sh, post-checkout, post-commit, post-merge) "
918
+ "from claude-coordinator into this repo, THEN "
919
+ "git config core.hooksPath .githooks (see docs/GRAPHIFY_SETUP.md)"
920
+ ),
921
+ ))
922
+ elif not g.hooks_installed:
886
923
  out.append(Finding(
887
924
  layer="graph", check="graph.hooks_missing", severity=WARN,
888
925
  summary=(
@@ -44,6 +44,110 @@ class WorkerEvent:
44
44
  return {"type": self.type, "subtype": self.subtype, "raw": self.raw}
45
45
 
46
46
 
47
+ # #2212/#2236: recognise a `graphify` CLI call inside a Bash command string.
48
+ # Separators recognized before the command token: `;`, `&`, `|` (covers `&&`
49
+ # and `||` too, since `\s*` after the class soaks up the second char) and a
50
+ # bare newline — Claude Code's Bash tool very commonly emits multi-line
51
+ # command strings (e.g. `cd repo\ngraphify query "foo"`) that aren't joined
52
+ # with `;`/`&&`, so newline must count as a separator or those legs
53
+ # undercount to 0 (#2212 review). Anchoring on a separator is what keeps a
54
+ # path mention (`cat graphify-out/graph.json`) from counting as a query.
55
+ # Canonical home is here rather than in coord/agent.py (#2236) because the
56
+ # summary parser now needs it too — agent.py imports this symbol.
57
+ GRAPHIFY_INVOCATION_RE = re.compile(r"(?:^|[\n;&|]\s*)graphify(?:\s|$)")
58
+
59
+ # Longest command text kept per query. The point is to tell one query apart
60
+ # from another when reading logs, not to replay it — a multi-KB heredoc in the
61
+ # same Bash call would otherwise bloat every reap line.
62
+ _GRAPHIFY_CMD_MAX = 200
63
+
64
+ # graphify query prints a `… | 81 nodes found` traversal header; when the
65
+ # header is absent (other subcommands, older builds) we fall back to counting
66
+ # result rows, which are line-prefixed with the record kind.
67
+ _GRAPHIFY_COUNT_RE = re.compile(r"(\d+)\s+(?:nodes?|results?|matches?)\s+found", re.I)
68
+ _GRAPHIFY_ROW_RE = re.compile(r"^(?:NODE|EDGE|PATH|COMMUNITY)\b", re.M)
69
+
70
+ # graphify's real zero-match phrasing: `graphify query` prints the literal
71
+ # "No matching nodes found." (graphify/serve.py:435, vs. the "{N} nodes
72
+ # found" header on a hit, graphify/serve.py:445) and `graphify affected`
73
+ # prints "No affected nodes found." (graphify/affected.py:132). Neither has a
74
+ # leading digit, so `_GRAPHIFY_COUNT_RE` never matches it, and neither is
75
+ # NODE/EDGE/PATH/COMMUNITY-prefixed, so `_GRAPHIFY_ROW_RE` doesn't either —
76
+ # without this, a real "ran the query, graph doesn't cover that" result fell
77
+ # through to `None` ("unknown") instead of `0` ("empty"), which is precisely
78
+ # the "tried and got nothing must not look like never tried" case #2236
79
+ # exists to fix.
80
+ _GRAPHIFY_EMPTY_RE = re.compile(r"No (?:matching|affected) \w+ found\.?", re.I)
81
+
82
+
83
+ def is_graphify_command(cmd: str | None) -> bool:
84
+ """True iff *cmd* invokes the ``graphify`` CLI as a command token."""
85
+ return bool(cmd) and bool(GRAPHIFY_INVOCATION_RE.search(cmd or ""))
86
+
87
+
88
+ def graphify_result_count(output: str | None) -> int | None:
89
+ """Best-effort "how many results did this graphify call return".
90
+
91
+ Reads the ``N nodes found`` traversal header graphify prints first; falls
92
+ back to counting ``NODE``/``EDGE``/``PATH``/``COMMUNITY`` result rows,
93
+ then to graphify's literal "No matching/affected ... found." zero-match
94
+ phrasing, and then to "0 for empty output". Returns ``None`` when the
95
+ output has content but no recognisable result shape (e.g. ``graphify
96
+ update .``, whose output is a build log) — ``None`` means "not
97
+ countable", which is deliberately distinct from ``0`` ("ran, returned
98
+ nothing"), because the whole point of #2236 is to tell *tried and got
99
+ nothing* apart from *didn't try*.
100
+ """
101
+ if output is None:
102
+ return None
103
+ if not output.strip():
104
+ return 0
105
+ m = _GRAPHIFY_COUNT_RE.search(output)
106
+ if m:
107
+ try:
108
+ return int(m.group(1))
109
+ except ValueError: # pragma: no cover - regex guarantees digits
110
+ return None
111
+ rows = len(_GRAPHIFY_ROW_RE.findall(output))
112
+ if rows:
113
+ return rows
114
+ if _GRAPHIFY_EMPTY_RE.search(output):
115
+ return 0
116
+ return None
117
+
118
+
119
+ @dataclass
120
+ class GraphifyQuery:
121
+ """One ``graphify`` invocation by a worker, and what it returned (#2236).
122
+
123
+ ``graphify_invocations=N`` (#2212) counts attempts, which cannot separate
124
+ "queried and got a useful answer" from "queried, got nothing, fell back to
125
+ grep" — and those two imply opposite fixes (habit vs. graph coverage). So
126
+ each call is recorded with its command text and the outcome of its tool
127
+ result.
128
+
129
+ ``outcome`` is one of:
130
+
131
+ * ``"hit"`` — returned at least one countable result.
132
+ * ``"empty"`` — ran fine and returned nothing (graph coverage problem).
133
+ * ``"error"`` — the tool result was flagged as an error (e.g. no graph
134
+ built here, graphify not installed).
135
+ * ``"unknown"`` — no result was correlated (log truncated to a tail, or
136
+ output shape not countable, e.g. ``graphify update .``).
137
+ """
138
+
139
+ command: str
140
+ outcome: str = "unknown"
141
+ results: int | None = None
142
+
143
+ def to_dict(self) -> dict:
144
+ return {
145
+ "command": self.command,
146
+ "outcome": self.outcome,
147
+ "results": self.results,
148
+ }
149
+
150
+
47
151
  @dataclass
48
152
  class WorkerSummary:
49
153
  """Rolling summary built from a stream of WorkerEvents."""
@@ -60,6 +164,13 @@ class WorkerSummary:
60
164
  last_tool: str | None = None
61
165
  files_edited: list[str] = field(default_factory=list)
62
166
  bash_commands: list[str] = field(default_factory=list)
167
+ # #2236: one entry per `graphify` invocation, with the outcome of its tool
168
+ # result folded in when the log carries one. See :class:`GraphifyQuery`.
169
+ graphify_queries: list[GraphifyQuery] = field(default_factory=list)
170
+ # tool_use_id -> index into `graphify_queries`, so a later `tool_result`
171
+ # can be attributed back to the call that produced it. Internal bookkeeping
172
+ # for `update_summary`'s fold; deliberately excluded from `to_dict`.
173
+ pending_graphify: dict[str, int] = field(default_factory=dict, repr=False)
63
174
  duration_ms: int | None = None
64
175
  # Token counts from the result event (may be zero if the log predates
65
176
  # token reporting or the worker didn't emit usage data).
@@ -96,6 +207,7 @@ class WorkerSummary:
96
207
  "last_tool": self.last_tool,
97
208
  "files_edited": list(self.files_edited),
98
209
  "bash_commands": list(self.bash_commands),
210
+ "graphify_queries": [q.to_dict() for q in self.graphify_queries],
99
211
  "duration_ms": self.duration_ms,
100
212
  "input_tokens": self.input_tokens,
101
213
  "output_tokens": self.output_tokens,
@@ -495,6 +607,87 @@ def _assistant_text(event: WorkerEvent) -> str:
495
607
  # ── Streaming summary update ───────────────────────────────────────────────
496
608
 
497
609
 
610
+ def record_graphify_call(
611
+ summary: WorkerSummary,
612
+ cmd: str | None,
613
+ *,
614
+ tool_use_id: object = None,
615
+ output: str | None = None,
616
+ is_error: bool = False,
617
+ ) -> None:
618
+ """Record a graphify shell call on *summary*, if *cmd* is one (#2236).
619
+
620
+ Providers whose log carries the call and its output in one event (e.g.
621
+ opencode) pass ``output``/``is_error`` and the outcome is settled
622
+ immediately. Claude's stream-json splits the two across a ``tool_use``
623
+ block and a later ``tool_result``, so it passes ``tool_use_id`` instead
624
+ and the outcome is filled in by :func:`_resolve_graphify_result`. A call
625
+ with neither stays ``outcome="unknown"``, which is the honest reading: we
626
+ saw the attempt and never saw what came back.
627
+ """
628
+ if not is_graphify_command(cmd):
629
+ return
630
+ entry = GraphifyQuery(command=_truncate(cmd or "", _GRAPHIFY_CMD_MAX))
631
+ summary.graphify_queries.append(entry)
632
+ if output is not None or is_error:
633
+ _apply_graphify_outcome(entry, output, is_error)
634
+ return
635
+ if isinstance(tool_use_id, str) and tool_use_id:
636
+ summary.pending_graphify[tool_use_id] = len(summary.graphify_queries) - 1
637
+
638
+
639
+ def _apply_graphify_outcome(
640
+ entry: GraphifyQuery, output: str | None, is_error: bool
641
+ ) -> None:
642
+ if is_error:
643
+ entry.outcome = "error"
644
+ return
645
+ count = graphify_result_count(output)
646
+ entry.results = count
647
+ entry.outcome = "unknown" if count is None else ("hit" if count > 0 else "empty")
648
+
649
+
650
+ def _resolve_graphify_result(
651
+ summary: WorkerSummary, tool_use_id: object, output: str | None, is_error: bool
652
+ ) -> None:
653
+ """Attribute a tool result back to the graphify call that issued it."""
654
+ if not isinstance(tool_use_id, str):
655
+ return
656
+ idx = summary.pending_graphify.pop(tool_use_id, None)
657
+ if idx is None or idx >= len(summary.graphify_queries):
658
+ return
659
+ _apply_graphify_outcome(summary.graphify_queries[idx], output, is_error)
660
+
661
+
662
+ def _tool_result_output(block: dict, raw: dict) -> str | None:
663
+ """Text of a tool_result block, across the shapes claude emits.
664
+
665
+ ``content`` is either a plain string or a list of ``{"type": "text",
666
+ "text": ...}`` blocks; the sibling ``tool_use_result.stdout`` on the
667
+ envelope is used as a fallback for Bash calls whose content came through
668
+ empty.
669
+ """
670
+ content = block.get("content")
671
+ text: str | None = None
672
+ if isinstance(content, str):
673
+ text = content
674
+ elif isinstance(content, list):
675
+ parts = [
676
+ c.get("text")
677
+ for c in content
678
+ if isinstance(c, dict) and isinstance(c.get("text"), str)
679
+ ]
680
+ text = "\n".join(parts) if parts else None
681
+ if text:
682
+ return text
683
+ tur = raw.get("tool_use_result")
684
+ if isinstance(tur, dict):
685
+ stdout = tur.get("stdout")
686
+ if isinstance(stdout, str):
687
+ return stdout
688
+ return text
689
+
690
+
498
691
  def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
499
692
  """Fold *event* into *summary* in-place."""
500
693
  raw = event.raw
@@ -525,6 +718,7 @@ def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
525
718
  cmd = _command_from_input(block.get("input"))
526
719
  if cmd:
527
720
  summary.bash_commands.append(cmd)
721
+ record_graphify_call(summary, cmd, tool_use_id=block.get("id"))
528
722
  elif name in ("Edit", "Write", "NotebookEdit"):
529
723
  fp = _file_from_input(block.get("input"))
530
724
  if fp:
@@ -540,12 +734,43 @@ def update_summary(summary: WorkerSummary, event: WorkerEvent) -> None:
540
734
  cmd = _bash_command_from_event(event)
541
735
  if cmd:
542
736
  summary.bash_commands.append(cmd)
737
+ record_graphify_call(
738
+ summary, cmd, tool_use_id=raw.get("id") or raw.get("tool_use_id")
739
+ )
543
740
  elif name in ("Edit", "Write", "NotebookEdit"):
544
741
  fp = _file_path_from_event(event)
545
742
  if fp:
546
743
  summary.files_edited.append(fp)
547
744
  return
548
745
 
746
+ # #2236: tool results arrive either as `user` messages carrying
747
+ # `tool_result` content blocks (claude's stream-json shape) or as
748
+ # standalone `tool_result` events (older/other providers). Both are
749
+ # folded here purely to attribute an outcome to a pending graphify call —
750
+ # nothing else in the summary depends on results, so an unrecognised
751
+ # shape just leaves the entry `"unknown"`.
752
+ if event.type == "user":
753
+ message = raw.get("message") or {}
754
+ for block in _iter_content_blocks(message):
755
+ if block.get("type") != "tool_result":
756
+ continue
757
+ _resolve_graphify_result(
758
+ summary,
759
+ block.get("tool_use_id"),
760
+ _tool_result_output(block, raw),
761
+ bool(block.get("is_error")),
762
+ )
763
+ return
764
+
765
+ if event.type == "tool_result":
766
+ _resolve_graphify_result(
767
+ summary,
768
+ raw.get("tool_use_id"),
769
+ _tool_result_output(raw, raw),
770
+ bool(raw.get("is_error")),
771
+ )
772
+ return
773
+
549
774
  if event.type == "rate_limit_event":
550
775
  status, resets = _rate_limit_info(raw)
551
776
  if _is_rate_limit_throttled(status):
@@ -110,6 +110,50 @@ GRAPH_HEALTH: checkouts=3 stale=0
110
110
 
111
111
  If it reports STALE, run `graphify update .` in that checkout.
112
112
 
113
+ ## Measuring whether workers actually use it (#2212 / #2236)
114
+
115
+ Every reaped worker's log ends with a line the agent writes itself:
116
+
117
+ ```
118
+ # reap: done (exit_code=0 status=DONE graphify_invocations=1 graph_present=1)
119
+ # graphify_query: outcome=hit results=81 cmd='graphify query "where is X handled"'
120
+ ```
121
+
122
+ * **`graphify_invocations=N`** (#2212) — how many Bash calls this leg invoked the CLI in.
123
+ * **`graph_present=0|1`** (#2236) — whether the worktree had a **resolvable**
124
+ `graphify-out/graph.json` at reap time. Without it, `graphify_invocations=0` is ambiguous:
125
+ the worker prompt tells workers with no graph to *"skip straight to grep, silently"*, so a
126
+ repo that never onboarded (no graph, no `.githooks/post-checkout` — coord-portal and
127
+ stick-demo, as of this writing) produces zero-invocation legs that were **obeying** the rule,
128
+ not ignoring it. `graphify_invocations=0 graph_present=0` is a coverage gap; `=0` with
129
+ `graph_present=1` is a habit gap. Only the second is something prompt wording can move.
130
+ * **`# graphify_query:`** (#2236) — one line per call, with `outcome=hit|empty|error|unknown`,
131
+ the result count, and the command. `hit` vs `empty` separates *"queried and got an answer"*
132
+ from *"queried, got nothing, fell back to grep"* — opposite fixes: `empty` points at graph
133
+ coverage/quality, and no amount of prompting helps there.
134
+
135
+ `unknown` is honest, not a bug bucket — don't read it as "worker got no answer". Only
136
+ `graphify query` output is reliably countable (its `N nodes found` header, or a fallback
137
+ count of `NODE`/`EDGE`/`PATH`/`COMMUNITY` result rows, or graphify's own zero-match
138
+ phrasing, `"No matching/affected ... found."`). `graphify explain` and `graphify path` print
139
+ differently-shaped output with no countable header at all, so calls to those land in
140
+ `unknown` even when they returned a perfectly good answer. Skimming
141
+ `grep -c outcome=unknown` and reading it as "workers not getting answers" over-reads that
142
+ number — it may just mean "workers ran `explain`/`path`, not `query`".
143
+
144
+ Count them straight off the fleet's logs:
145
+
146
+ ```bash
147
+ grep -ho 'graphify_invocations=[0-9]* graph_present=[01]' ~/.coord/logs/*.log | sort | uniq -c
148
+ grep -ho 'graphify_query: outcome=[a-z]*' ~/.coord/logs/*.log | sort | uniq -c
149
+ ```
150
+
151
+ **`outcome=hit` means non-empty, not useful.** The counter cannot see relevance: a query
152
+ against a graph that indexed the wrong things returns rows and scores as a hit. A run of `hit`
153
+ outcomes that workers still abandon after one query is the signal that the graph's *content*,
154
+ not the worker's habit, is what needs work — cross-check with `coord diagnose --graph` for a
155
+ graph built from a stale SHA.
156
+
113
157
  ## Traps
114
158
 
115
159
  **`core.hooksPath` REPLACES `.git/hooks` wholesale.** Git stops looking in `.git/hooks`