code-coordinator 0.5.97__tar.gz → 0.5.99__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 (843) hide show
  1. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/block_log.py +213 -7
  7. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/drive_queue.py +248 -5
  8. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/service.py +128 -0
  9. code_coordinator-0.5.99/coord/queue_diagnose.py +956 -0
  10. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/reconcile.py +269 -6
  11. code_coordinator-0.5.99/tests/test_block_log.py +1227 -0
  12. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_drive_queue.py +410 -1
  13. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_window.py +96 -3
  14. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_service.py +112 -0
  15. code_coordinator-0.5.99/tests/test_reconcile_no_agent_record.py +538 -0
  16. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_board_audit.py +10 -0
  17. code_coordinator-0.5.97/tests/test_block_log.py +0 -469
  18. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/cargo-test.yml +0 -0
  29. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/release-tui.yml +0 -0
  31. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/.gitignore +0 -0
  33. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/CLAUDE.md +0 -0
  34. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/GOAL.md +0 -0
  35. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/LICENSE +0 -0
  36. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/MANIFEST.in +0 -0
  37. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/README.md +0 -0
  38. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/code_coordinator.egg-info/top_level.txt +0 -0
  42. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/__init__.py +0 -0
  43. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/_board_mapping.py +0 -0
  44. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/acceptance.py +0 -0
  45. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/acceptance_drivers.py +0 -0
  46. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent.py +0 -0
  47. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent_app.py +0 -0
  48. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agent_update.py +0 -0
  49. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/.gitignore +0 -0
  50. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/agents/work.md +0 -0
  51. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/agents/opencode/routing.jsonc +0 -0
  52. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/audit.py +0 -0
  53. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/auto_loop.py +0 -0
  54. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_bool_guard.py +0 -0
  55. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_service.py +0 -0
  56. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/board_wire.py +0 -0
  57. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/brain.py +0 -0
  58. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/branch_model.py +0 -0
  59. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/bug_intake.py +0 -0
  60. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/cargo_cache.py +0 -0
  61. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/ci_github.py +0 -0
  62. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/client.py +0 -0
  66. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/config.py +0 -0
  97. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/conflict_fix.py +0 -0
  98. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dao.py +0 -0
  99. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/__init__.py +0 -0
  100. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/fixture.py +0 -0
  101. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/index.html +0 -0
  102. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/server.py +0 -0
  103. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/terminal.py +0 -0
  104. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/.gitignore +0 -0
  105. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/components.json +0 -0
  106. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  107. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  108. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  109. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  110. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  111. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  112. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  113. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  114. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  115. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/index.html +0 -0
  116. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  117. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/sw.js +0 -0
  118. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  119. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  120. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  121. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  122. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  123. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  124. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  125. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  126. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  127. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  128. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/eslint.config.js +0 -0
  129. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/index.html +0 -0
  130. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  131. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/package-lock.json +0 -0
  132. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/package.json +0 -0
  133. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  134. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/playwright.config.ts +0 -0
  135. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/postcss.config.js +0 -0
  136. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  137. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  138. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  139. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/App.tsx +0 -0
  140. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/api/client.ts +0 -0
  141. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  142. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  143. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  144. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  145. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  146. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  147. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  148. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  149. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  150. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  151. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  152. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  153. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  154. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  155. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  156. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  157. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  158. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  159. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  160. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  161. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  162. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  163. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  164. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  165. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  166. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  167. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  168. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  169. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  170. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  171. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  172. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  173. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  174. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  175. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  176. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/index.css +0 -0
  177. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  178. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  179. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/main.tsx +0 -0
  180. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  181. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  182. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  183. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  184. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  185. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  186. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  187. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  188. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  189. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  190. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  191. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  192. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  193. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  194. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  195. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  196. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  197. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  198. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  199. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  200. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  201. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  202. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  203. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tailwind.config.js +0 -0
  204. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tsconfig.json +0 -0
  205. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  206. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dashboard/webapp/vite.config.ts +0 -0
  207. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/db.py +0 -0
  208. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dead_end.py +0 -0
  209. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/README.md +0 -0
  210. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-agent.service +0 -0
  211. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.service +0 -0
  212. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.sh +0 -0
  213. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-db-backup.timer +0 -0
  214. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-drive-queue.service +0 -0
  215. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-drive-queue.timer +0 -0
  216. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-notify.service +0 -0
  217. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-notify.timer +0 -0
  218. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-propagate.service +0 -0
  219. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-propagate.timer +0 -0
  220. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-window.service +0 -0
  221. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-release-window.timer +0 -0
  222. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-serve.service +0 -0
  223. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web-dist-build.service +0 -0
  224. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web-dist-build.timer +0 -0
  225. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy/coord-web.service +0 -0
  226. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy_manifest.py +0 -0
  227. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deploy_units.py +0 -0
  228. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/deps.py +0 -0
  229. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/diagnose.py +0 -0
  230. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dispatch.py +0 -0
  231. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/dist_name.py +0 -0
  232. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive.py +0 -0
  233. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive_queue.py +0 -0
  234. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/drive_state.py +0 -0
  235. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/events.py +0 -0
  236. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/failure_class.py +0 -0
  237. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/filelock.py +0 -0
  238. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/fleet_config_health.py +0 -0
  239. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/freshness.py +0 -0
  240. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_a.py +0 -0
  241. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_b.py +0 -0
  242. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gate_snapshot.py +0 -0
  243. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/gates.py +0 -0
  244. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/github_ops.py +0 -0
  245. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/goal.py +0 -0
  246. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/graph_health.py +0 -0
  247. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/__init__.py +0 -0
  248. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/aggregate.py +0 -0
  249. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/__init__.py +0 -0
  250. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/agent_install.py +0 -0
  251. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/cargo_targets.py +0 -0
  252. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/claude_binary.py +0 -0
  253. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/deploy_lane_facts.py +0 -0
  254. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/disk.py +0 -0
  255. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_board.py +0 -0
  256. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  257. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_phantom.py +0 -0
  258. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/fleet_unit_drift.py +0 -0
  259. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/graph.py +0 -0
  260. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/graphify_cli.py +0 -0
  261. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/index_lock.py +0 -0
  262. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/plan_usage.py +0 -0
  263. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/repo_state.py +0 -0
  264. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/spawned_coord.py +0 -0
  265. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/timer_active.py +0 -0
  266. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/toolchain.py +0 -0
  267. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/unit_drift.py +0 -0
  268. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/unit_enablement.py +0 -0
  269. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/checks/worktrees.py +0 -0
  270. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/cli.py +0 -0
  271. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/context.py +0 -0
  272. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/fleet_snapshot.py +0 -0
  273. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/models.py +0 -0
  274. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/pypi.py +0 -0
  275. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/registry.py +0 -0
  276. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/render.py +0 -0
  277. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/health/units.py +0 -0
  278. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/hooks.py +0 -0
  279. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/housekeeping.py +0 -0
  280. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/interactive.py +0 -0
  281. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/issue_store.py +0 -0
  282. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/liveness_auditor.py +0 -0
  283. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/machine_pause.py +0 -0
  284. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/merge_queue.py +0 -0
  285. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_chat.py +0 -0
  286. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_dispatch.py +0 -0
  287. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_gate.py +0 -0
  288. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/milestone_order.py +0 -0
  289. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/mock_author.py +0 -0
  290. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/models.py +0 -0
  291. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/network.py +0 -0
  292. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/new_issue_chat.py +0 -0
  293. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/__init__.py +0 -0
  294. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/baseline.py +0 -0
  295. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/cli.py +0 -0
  296. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/collect.py +0 -0
  297. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/digest.py +0 -0
  298. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/models.py +0 -0
  299. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/predicate.py +0 -0
  300. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/store.py +0 -0
  301. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notifier/transport.py +0 -0
  302. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/notify.py +0 -0
  303. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/openapi.py +0 -0
  304. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/overlap_fence.py +0 -0
  305. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/overlap_predict.py +0 -0
  306. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/parentage.py +0 -0
  307. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/parentage_github.py +0 -0
  308. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/pipeline.py +0 -0
  309. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/plan_parser.py +0 -0
  310. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/plans.py +0 -0
  311. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/platform_paths.py +0 -0
  312. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_bridge.py +0 -0
  313. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_store.py +0 -0
  314. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/portal_sync.py +0 -0
  315. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/pr_body_lint.py +0 -0
  316. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/prereqs.py +0 -0
  317. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/progress.py +0 -0
  318. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/__init__.py +0 -0
  319. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/base.py +0 -0
  320. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/claude.py +0 -0
  321. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/claude_pty.py +0 -0
  322. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/providers/opencode.py +0 -0
  323. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/refine_chat.py +0 -0
  324. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_cordon.py +0 -0
  325. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_propagate.py +0 -0
  326. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_verify.py +0 -0
  327. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/release_window.py +0 -0
  328. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/repo_edit.py +0 -0
  329. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/repo_onboard.py +0 -0
  330. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/review.py +0 -0
  333. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/serve_app.py +0 -0
  335. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/state.py +0 -0
  341. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coord/worker_events.py +0 -0
  350. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/coordinator.example.yml +0 -0
  351. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-agent.service +0 -0
  352. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.service +0 -0
  353. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.sh +0 -0
  354. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-db-backup.timer +0 -0
  355. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-drive-queue.service +0 -0
  356. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-drive-queue.timer +0 -0
  357. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-notify.service +0 -0
  358. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-notify.timer +0 -0
  359. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-propagate.service +0 -0
  360. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-propagate.timer +0 -0
  361. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-window.service +0 -0
  362. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-release-window.timer +0 -0
  363. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-serve.service +0 -0
  364. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.service +0 -0
  365. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.sh +0 -0
  366. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-dist-build.timer +0 -0
  367. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web-rollback.sh +0 -0
  368. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/coord-web.service +0 -0
  369. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/deploy/node-shim.sh +0 -0
  370. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/AGENT_OPERATIONS.md +0 -0
  371. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ARCHITECTURE.md +0 -0
  372. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ARCH_SECURITY_GATES.md +0 -0
  373. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/COCKPIT.md +0 -0
  374. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/COST_DISCIPLINE.md +0 -0
  376. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CROSS_PLATFORM.md +0 -0
  377. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/CUSTOMER_PORTAL.md +0 -0
  378. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/DRIVE_QUEUE.md +0 -0
  379. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/EPHEMERAL_WORKERS.md +0 -0
  380. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/FORGE_MIGRATION.md +0 -0
  381. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/GRAPHIFY_SETUP.md +0 -0
  382. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ISSUE_GUIDANCE.md +0 -0
  383. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/MAC_MINI.md +0 -0
  384. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  385. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/NOTIFIER.md +0 -0
  386. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/OPENCODE_VERIFICATION.md +0 -0
  387. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/OPERATING_GOTCHAS.md +0 -0
  388. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/ORACLE_LOOP.md +0 -0
  389. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PHONE_WEBAPP.md +0 -0
  390. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PIPELINE_V2.md +0 -0
  391. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/PLATFORM_EVOLUTION.md +0 -0
  392. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/SECOND_BACKEND.md +0 -0
  393. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/STORE_SERVICE.md +0 -0
  394. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  395. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/WEB_CONTROL_CENTER.md +0 -0
  396. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/README.md +0 -0
  397. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/_tokens.css +0 -0
  398. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/issue-detail.html +0 -0
  399. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/pipeline-narrow.html +0 -0
  400. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/docs/mocks/web/pipeline-wide.html +0 -0
  401. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/graphify-out/.gitignore +0 -0
  402. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/install-agent.sh +0 -0
  403. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/pyproject.toml +0 -0
  404. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/audit_review_verdict_overrides.py +0 -0
  405. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  406. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/build-worker-image.sh +0 -0
  407. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/coordinator-machine.py +0 -0
  408. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/epic-down.sh +0 -0
  409. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/epic-up.sh +0 -0
  410. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/preflight.sh +0 -0
  411. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/provision-worker.sh +0 -0
  412. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  413. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  414. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/azure-workers/verify-github-token.sh +0 -0
  415. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/codegen.py +0 -0
  416. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/coord-test-runner.sh +0 -0
  417. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/run_tests_in_populated_home.sh +0 -0
  421. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/run_tests_without_gh.sh +0 -0
  422. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/smoke_437_interactive.py +0 -0
  423. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_878_review_capture.py +0 -0
  424. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_release_published.py +0 -0
  425. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/scripts/verify_release_wheel.py +0 -0
  426. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/setup.cfg +0 -0
  427. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/SMOKE_SET.md +0 -0
  428. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/__init__.py +0 -0
  429. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  430. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/contract.md +0 -0
  431. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/manifest.yml +0 -0
  432. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  433. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  434. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  435. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  436. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/conftest.py +0 -0
  437. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/contract.md +0 -0
  438. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/manifest.yml +0 -0
  439. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  440. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  441. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/contract.md +0 -0
  442. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/manifest.yml +0 -0
  443. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  444. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  445. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  446. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  447. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  448. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  449. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  450. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  451. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  452. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  453. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/contract.md +0 -0
  454. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  455. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  456. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/manifest.yml +0 -0
  457. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  458. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-51/tsconfig.json +0 -0
  459. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  460. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/conftest.py +0 -0
  461. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/board-pipeline-basic.json +0 -0
  462. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  463. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  464. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  465. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/all_pass.json +0 -0
  466. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  467. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/mixed_fail.json +0 -0
  468. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  469. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  470. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/skip.json +0 -0
  471. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/playwright/truncated.json +0 -0
  472. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  473. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  474. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  475. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  476. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  477. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  478. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  479. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  480. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_acceptance.py +0 -0
  481. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_acceptance_drivers.py +0 -0
  482. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent.py +0 -0
  483. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_api_error.py +0 -0
  484. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_app.py +0 -0
  485. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_branch_base.py +0 -0
  486. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_branch_capture.py +0 -0
  487. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_config_free_1712.py +0 -0
  488. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_deploy_units_endpoint.py +0 -0
  489. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_dirty_worktree.py +0 -0
  490. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_graph_self_heal.py +0 -0
  491. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_health_h3.py +0 -0
  492. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_idle_restart.py +0 -0
  493. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_push_failure.py +0 -0
  494. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_reap.py +0 -0
  495. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_repos_and_pull.py +0 -0
  496. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_restart_services_endpoint.py +0 -0
  497. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_startup_diagnostics.py +0 -0
  498. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_update.py +0 -0
  499. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_update_bluegreen.py +0 -0
  500. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_usage_limit.py +0 -0
  501. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_agent_zero_commit.py +0 -0
  502. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ambient_home_isolation.py +0 -0
  503. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_approve_reject_plan.py +0 -0
  504. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_approve_usage_gate.py +0 -0
  505. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_assignment_already_recorded_daemon.py +0 -0
  506. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_log.py +0 -0
  507. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_outcome.py +0 -0
  508. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_audit_query.py +0 -0
  509. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_auto_loop.py +0 -0
  510. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_auto_release_publish_2035.py +0 -0
  511. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_base_checkout_restore.py +0 -0
  512. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_cap_762.py +0 -0
  513. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_fixture.py +0 -0
  514. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_read_path.py +0 -0
  515. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_service.py +0 -0
  516. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_state.py +0 -0
  517. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_board_wire.py +0 -0
  518. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_brain.py +0 -0
  519. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_branch_model.py +0 -0
  520. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_bug_intake.py +0 -0
  521. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_build_worker_image_env_update.py +0 -0
  522. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cargo_cache.py +0 -0
  523. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_parity_2091.py +0 -0
  525. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_ci_store.py +0 -0
  526. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_claim.py +0 -0
  527. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_acceptance.py +0 -0
  528. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign.py +0 -0
  529. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  530. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_interactive_remote.py +0 -0
  531. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_provider.py +0 -0
  532. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  533. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_audit.py +0 -0
  534. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_chat_continue.py +0 -0
  535. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_diagnose_config_provenance.py +0 -0
  536. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_diagnose_graph.py +0 -0
  537. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor.py +0 -0
  538. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor_config_free_1801.py +0 -0
  539. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  540. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_drive.py +0 -0
  541. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_escalate.py +0 -0
  542. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_fix_headless_review.py +0 -0
  543. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_gate_a.py +0 -0
  544. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_install_drift.py +0 -0
  545. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_install_skills.py +0 -0
  546. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_issue_create_label.py +0 -0
  547. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_issue_reopen.py +0 -0
  548. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_merge.py +0 -0
  549. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_assign.py +0 -0
  550. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_capture.py +0 -0
  551. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_chat_add_child.py +0 -0
  552. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_dispatch.py +0 -0
  553. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_gate_b.py +0 -0
  554. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_gate_c.py +0 -0
  555. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_order.py +0 -0
  556. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  557. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_milestone_ship.py +0 -0
  558. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_network.py +0 -0
  559. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_new_issue_chat.py +0 -0
  560. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_plans.py +0 -0
  561. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_portal.py +0 -0
  562. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_pull_artifact.py +0 -0
  563. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_queue.py +0 -0
  564. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_reattach_sessions.py +0 -0
  565. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_refine_board.py +0 -0
  566. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_preflight.py +0 -0
  567. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_release_propagate.py +0 -0
  568. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_repo_2220.py +0 -0
  569. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_scorecard.py +0 -0
  570. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_set_review_findings.py +0 -0
  571. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_advisory_terminal.py +0 -0
  572. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_merge_queue.py +0 -0
  573. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_provider.py +0 -0
  574. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_review_finalizing.py +0 -0
  575. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_test_failed_tag.py +0 -0
  576. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_status_usage_limit.py +0 -0
  577. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_sync_comments_873.py +0 -0
  578. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_test_plan.py +0 -0
  579. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_track.py +0 -0
  580. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_tui_update.py +0 -0
  581. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cli_wait.py +0 -0
  582. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_client_base_install.py +0 -0
  583. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_comments.py +0 -0
  584. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_completion_summary.py +0 -0
  585. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config.py +0 -0
  586. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_acceptance.py +0 -0
  587. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_audit.py +0 -0
  588. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_pricing.py +0 -0
  589. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  590. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_config_usage_gate.py +0 -0
  591. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_conflict_fix.py +0 -0
  592. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_conflict_fix_semantic.py +0 -0
  593. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test.py +0 -0
  594. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_baseline.py +0 -0
  595. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_routing.py +0 -0
  596. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_test_runner_toolchain.py +0 -0
  597. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coord_web_sse_restart_live.py +0 -0
  598. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_coordinator_machine.py +0 -0
  599. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_cross_platform_imports.py +0 -0
  600. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard.py +0 -0
  601. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_fixture.py +0 -0
  602. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_terminal.py +0 -0
  603. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dashboard_terminal_live.py +0 -0
  604. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_db.py +0 -0
  605. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dead_end.py +0 -0
  606. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_db_backup.py +0 -0
  607. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_web_dist.py +0 -0
  608. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_coord_web_rollback.py +0 -0
  609. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_drive_queue_unit.py +0 -0
  610. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_manifest.py +0 -0
  611. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_units_lane.py +0 -0
  612. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deploy_web_unit.py +0 -0
  613. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_deps.py +0 -0
  614. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_diagnose.py +0 -0
  615. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dispatch.py +0 -0
  616. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dispatch_target_validation.py +0 -0
  617. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_dist_name.py +0 -0
  618. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_done_housekeeping.py +0 -0
  619. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive.py +0 -0
  620. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_queue.py +0 -0
  621. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_state.py +0 -0
  622. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_drive_tmux.py +0 -0
  623. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_capability_detection.py +0 -0
  624. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  625. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_epic_up_image_provenance.py +0 -0
  626. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_errors.py +0 -0
  627. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_events.py +0 -0
  628. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_failure_class.py +0 -0
  629. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_filelock.py +0 -0
  630. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  631. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fix_of_force_override.py +0 -0
  632. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_config_health.py +0 -0
  633. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_health_probes.py +0 -0
  634. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_fleet_health_snapshot.py +0 -0
  635. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_freshness.py +0 -0
  636. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_a.py +0 -0
  637. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_b.py +0 -0
  638. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gate_snapshot_staleness.py +0 -0
  639. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gates.py +0 -0
  640. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  641. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_generated_types_fixture.py +0 -0
  642. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_github_ops.py +0 -0
  643. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_goal.py +0 -0
  644. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_graph_health.py +0 -0
  645. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_graph_selfheal_absent_2237.py +0 -0
  646. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_handoff.py +0 -0
  647. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_checks.py +0 -0
  648. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_cli.py +0 -0
  649. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_cli_graph.py +0 -0
  650. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_config.py +0 -0
  651. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_context.py +0 -0
  652. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_deploy_lane_facts.py +0 -0
  653. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_incident_regression.py +0 -0
  654. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_pypi.py +0 -0
  655. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_registry.py +0 -0
  656. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_timer_active.py +0 -0
  657. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_toolchain.py +0 -0
  658. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_unit_drift.py +0 -0
  659. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_health_unit_enablement.py +0 -0
  660. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_hooks.py +0 -0
  661. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_human_attended_437.py +0 -0
  662. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_init.py +0 -0
  663. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_integration.py +0 -0
  664. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_briefing_echo.py +0 -0
  665. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_prefill_state.py +0 -0
  666. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_session_relaunch.py +0 -0
  667. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_test_verdict_backstop.py +0 -0
  668. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_token_attribution.py +0 -0
  669. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_interactive_worktree.py +0 -0
  670. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_issue_store_seam.py +0 -0
  671. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_liveness_auditor.py +0 -0
  672. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_liveness_notify.py +0 -0
  673. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_machine_pause.py +0 -0
  674. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_merge_queue.py +0 -0
  675. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_merge_verify.py +0 -0
  676. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_chat.py +0 -0
  677. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_dispatch.py +0 -0
  678. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_gate.py +0 -0
  679. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_order.py +0 -0
  680. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_milestone_seam.py +0 -0
  681. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_mock_author.py +0 -0
  682. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_model_tiering.py +0 -0
  683. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_models.py +0 -0
  684. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_models_config_labels.py +0 -0
  685. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_needs_attention.py +0 -0
  686. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_network.py +0 -0
  687. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_new_issue_chat.py +0 -0
  688. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_next_release_tag.py +0 -0
  689. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_no_direct_gh_calls.py +0 -0
  690. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_node_shim.py +0 -0
  691. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_baseline.py +0 -0
  692. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_cli.py +0 -0
  693. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_collect.py +0 -0
  694. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_config.py +0 -0
  695. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_drive_seam.py +0 -0
  696. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_isolation.py +0 -0
  697. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_predicate.py +0 -0
  698. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notifier_quiet_hours.py +0 -0
  699. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notify.py +0 -0
  700. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_notify_drain.py +0 -0
  701. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_openapi.py +0 -0
  702. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_operational_defaults.py +0 -0
  703. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_overlap_fence.py +0 -0
  704. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_overlap_predict.py +0 -0
  705. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_packaged_deploy_units.py +0 -0
  706. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_parentage.py +0 -0
  707. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_paste_landed.py +0 -0
  708. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_pipeline.py +0 -0
  709. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_approve_plan_command.py +0 -0
  710. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_pr_command.py +0 -0
  711. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_followup_review_command.py +0 -0
  712. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_only.py +0 -0
  713. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_plan_parser.py +0 -0
  714. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_platform_paths.py +0 -0
  715. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_bridge.py +0 -0
  716. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_config.py +0 -0
  717. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_portal_sync.py +0 -0
  718. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_pr_body_lint.py +0 -0
  719. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_prereqs.py +0 -0
  720. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_production_db_guard.py +0 -0
  721. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_progress.py +0 -0
  722. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_provider_seam.py +0 -0
  723. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers.py +0 -0
  724. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers_config_labels.py +0 -0
  725. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_providers_pty.py +0 -0
  726. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_quiet_hours.py +0 -0
  727. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_quiet_hours_store_2146.py +0 -0
  728. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reap_merged_sessions.py +0 -0
  729. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reap_stale_interactive_tick.py +0 -0
  730. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_branch.py +0 -0
  731. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_completions.py +0 -0
  732. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_merges.py +0 -0
  733. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reconcile_usage_limit_done.py +0 -0
  734. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_refine_chat.py +0 -0
  735. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_2101.py +0 -0
  736. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  737. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_cordon_deadlock_2240.py +0 -0
  738. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_propagate.py +0 -0
  739. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_unified_1242.py +0 -0
  740. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_verify.py +0 -0
  741. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_release_window.py +0 -0
  742. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_remote_auto_prune.py +0 -0
  743. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_remote_interactive_reaper.py +0 -0
  744. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_edit_2220.py +0 -0
  745. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_graph_fleet_2237.py +0 -0
  746. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_repo_onboard_2220.py +0 -0
  747. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_report_result_push.py +0 -0
  748. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_reports.py +0 -0
  749. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry.py +0 -0
  750. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry_advisory_1606.py +0 -0
  751. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_retry_type_1636.py +0 -0
  752. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_revalidate.py +0 -0
  753. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review.py +0 -0
  754. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_end_review_without_verdict.py +0 -0
  755. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_parse_failure_diagnostic.py +0 -0
  756. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_reaffirm.py +0 -0
  757. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_state.py +0 -0
  758. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_backstop.py +0 -0
  759. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_override_audit.py +0 -0
  760. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_verdict_relay.py +0 -0
  761. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_review_zero_commits.py +0 -0
  762. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_scoped_review_wiring.py +0 -0
  763. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_scorecard.py +0 -0
  764. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_serve.py +0 -0
  765. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_serve_app_board_trim.py +0 -0
  766. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_session.py +0 -0
  767. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_slice_issue_attribution.py +0 -0
  768. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke.py +0 -0
  769. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke_live_checkout_restore.py +0 -0
  770. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_smoke_workflow.py +0 -0
  771. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_spend_ceiling.py +0 -0
  772. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_spend_ceiling_coordinator.py +0 -0
  773. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_split.py +0 -0
  774. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_split_work.py +0 -0
  775. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stage_projection.py +0 -0
  776. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stalled_pipeline.py +0 -0
  777. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_state.py +0 -0
  778. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_state_review_findings_daemon.py +0 -0
  779. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_status_fleet_footer.py +0 -0
  780. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stop_1567.py +0 -0
  781. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_stuck.py +0 -0
  782. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_terminal_command.py +0 -0
  783. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_author.py +0 -0
  784. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_chat.py +0 -0
  785. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_orchestrator.py +0 -0
  786. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_report.py +0 -0
  787. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_verdict_parsing.py +0 -0
  788. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_test_verdict_transcript_floor.py +0 -0
  789. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_config_load_1080.py +0 -0
  790. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_thin_client_daemon_routing_906.py +0 -0
  791. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_tmux_host.py +0 -0
  792. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_tmux_session.py +0 -0
  793. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_transcript_floor.py +0 -0
  794. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage.py +0 -0
  795. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage_limits.py +0 -0
  796. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_usage_rollup.py +0 -0
  797. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_venv_live_install_2121.py +0 -0
  798. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_version_single_source.py +0 -0
  799. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_watch.py +0 -0
  800. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_events.py +0 -0
  801. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_image_pin_sync.py +0 -0
  802. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_safety.py +0 -0
  803. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worker_test_scoping.py +0 -0
  804. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worktree.py +0 -0
  805. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  806. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/Cargo.lock +0 -0
  807. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/Cargo.toml +0 -0
  808. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/cargo-config-local-quadraui.toml.example +0 -0
  809. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/audit.rs +0 -0
  810. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/chat.rs +0 -0
  811. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/data.rs +0 -0
  812. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/dialogs.rs +0 -0
  813. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/drive.rs +0 -0
  814. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/drive_queue.rs +0 -0
  815. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/escalation.rs +0 -0
  816. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/events.rs +0 -0
  817. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fixtures.rs +0 -0
  818. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_health.rs +0 -0
  819. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_sessions.rs +0 -0
  820. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/fleet_terminals.rs +0 -0
  821. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/format.rs +0 -0
  822. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/milestone_dag.rs +0 -0
  823. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/mod.rs +0 -0
  824. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/msv.rs +0 -0
  825. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/pipeline.rs +0 -0
  826. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/plans.rs +0 -0
  827. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/render.rs +0 -0
  828. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/reports.rs +0 -0
  829. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/sessions.rs +0 -0
  830. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/settings_ui.rs +0 -0
  831. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/sidebar.rs +0 -0
  832. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/terminal.rs +0 -0
  833. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/tests.rs +0 -0
  834. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/types.rs +0 -0
  835. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/app/workspace.rs +0 -0
  836. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/bin/gtk.rs +0 -0
  837. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/commands.rs +0 -0
  838. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/lib.rs +0 -0
  839. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/main.rs +0 -0
  840. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/src/settings.rs +0 -0
  841. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/tests/acceptance.rs +0 -0
  842. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/tui/tests/cli.rs +0 -0
  843. {code_coordinator-0.5.97 → code_coordinator-0.5.99}/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.97
3
+ Version: 0.5.99
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.97
3
+ Version: 0.5.99
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
@@ -109,6 +109,7 @@ coord/portal_sync.py
109
109
  coord/pr_body_lint.py
110
110
  coord/prereqs.py
111
111
  coord/progress.py
112
+ coord/queue_diagnose.py
112
113
  coord/reconcile.py
113
114
  coord/refine_chat.py
114
115
  coord/release_cordon.py
@@ -674,6 +675,7 @@ tests/test_reap_stale_interactive_tick.py
674
675
  tests/test_reconcile_branch.py
675
676
  tests/test_reconcile_completions.py
676
677
  tests/test_reconcile_merges.py
678
+ tests/test_reconcile_no_agent_record.py
677
679
  tests/test_reconcile_usage_limit_done.py
678
680
  tests/test_refine_chat.py
679
681
  tests/test_release_cordon_2101.py
@@ -290,6 +290,7 @@
290
290
  "coord/providers/claude.py",
291
291
  "coord/providers/claude_pty.py",
292
292
  "coord/providers/opencode.py",
293
+ "coord/queue_diagnose.py",
293
294
  "coord/reconcile.py",
294
295
  "coord/refine_chat.py",
295
296
  "coord/release_cordon.py",
@@ -704,6 +705,7 @@
704
705
  "tests/test_reconcile_branch.py",
705
706
  "tests/test_reconcile_completions.py",
706
707
  "tests/test_reconcile_merges.py",
708
+ "tests/test_reconcile_no_agent_record.py",
707
709
  "tests/test_reconcile_usage_limit_done.py",
708
710
  "tests/test_refine_chat.py",
709
711
  "tests/test_release_cordon_2101.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.97",
2
+ "tag": "0.5.99",
3
3
  "distance": 0,
4
- "node": "g2c2fb9bb30187ab30ecfca32a852de69332b37e9",
4
+ "node": "g8a04998d3cc3d58b70436288c2ee857a647fde7d",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -16,12 +16,24 @@ So this module records, for every entry that reaches ``blocked`` or
16
16
  Phase-0 read on its *true* cause — and
17
17
  * whether a **human had to act** to get it out.
18
18
 
19
- **What this is emphatically NOT.** It does not diagnose. It runs no ``gh``
20
- call, re-derives no gate, and consults no live state that the tick has not
21
- already fetched for its own purposes. Phase 1's read-only diagnostician is a
22
- separate, later thing whose scope this log exists to *decide*; building it now
23
- would be guessing at failure modes that #2230/#2229/#2231/#2234 have just
24
- stopped producing.
19
+ **What the RECORDER is emphatically NOT.** The writer above does not
20
+ diagnose. It runs no ``gh`` call, re-derives no gate, and consults no live
21
+ state that the tick has not already fetched for its own purposes.
22
+
23
+ **Phase 1 (#2276) fills the column Phase 0 cannot.** ``true_cause`` is empty
24
+ on every ``enter`` record — at that instant nobody knows it — and on ``exit``
25
+ it is derived from *the release the queue itself performed*, which is still
26
+ the queue talking about itself. #2235's finding is that the queue is wrong
27
+ about this five times out of seven. So :mod:`coord.queue_diagnose` re-derives
28
+ the cause from live state and appends a third record shape here,
29
+ :data:`EVENT_DIAGNOSIS`, which :func:`episodes` folds onto the open episode as
30
+ its ``true_cause``. That module owns the *deriving*; this one owns the
31
+ *record*, the pairing, and the honesty accounting — how often the derived
32
+ cause later agreed with how the episode actually resolved
33
+ (:func:`agreement_for`), reported as a rate rather than assumed
34
+ (:func:`summarize`). A diagnostician that is confidently wrong is worse than
35
+ one that abstains, which is why ``unknown`` is counted separately from
36
+ ``disagreed`` and never folded into it.
25
37
 
26
38
  **Recording must never change a decision.** Every public entry point here is
27
39
  best-effort and swallows its own exceptions (:func:`record`), for the same
@@ -65,10 +77,17 @@ from coord.drive_queue import (
65
77
  _log = logging.getLogger(__name__)
66
78
 
67
79
  __all__ = [
80
+ "AGREEMENT_ABSTAINED",
81
+ "AGREEMENT_AGREED",
82
+ "AGREEMENT_DISAGREED",
83
+ "AGREEMENT_UNDECIDED",
84
+ "EVENT_DIAGNOSIS",
68
85
  "EVENT_ENTER",
69
86
  "EVENT_RESOLVE",
70
87
  "STALL_STATES",
88
+ "agreement_for",
71
89
  "block_log_path",
90
+ "diagnosis_event",
72
91
  "enter_event",
73
92
  "episodes",
74
93
  "operator_resolution_event",
@@ -86,6 +105,13 @@ STALL_STATES: frozenset[str] = frozenset({STATE_BLOCKED, STATE_PARKED})
86
105
 
87
106
  EVENT_ENTER = "enter"
88
107
  EVENT_RESOLVE = "resolve"
108
+ #: #2276 Phase 1. A read-only re-derivation of an OPEN episode's cause, from
109
+ #: live state rather than from the queue's own stated reason. Appended to the
110
+ #: same file rather than a new store for the same reason `enter`/`resolve` are
111
+ #: two records and not one mutated row: the writer stays an O(1) append with
112
+ #: no read-modify-write race, and a later diagnosis that contradicts an earlier
113
+ #: one stays visible instead of overwriting it.
114
+ EVENT_DIAGNOSIS = "diagnosis"
89
115
 
90
116
  # Rotate at 4 MiB — comfortably more than two weeks at this fleet's rate
91
117
  # (single-digit stalls a night, ~400 bytes a record), and small enough that
@@ -444,6 +470,109 @@ def operator_resolution_event(
444
470
  return record
445
471
 
446
472
 
473
+ # ── #2276 Phase 1: the diagnosis record, and scoring it ──────────────────────
474
+
475
+
476
+ def diagnosis_event(
477
+ *,
478
+ key: str,
479
+ state: str,
480
+ stated_reason: str,
481
+ true_cause: str,
482
+ cause: str,
483
+ confidence: str,
484
+ evidence: Sequence[str] = (),
485
+ contradicts_stated: bool = False,
486
+ trigger: str = "",
487
+ host: str = "",
488
+ now: float | None = None,
489
+ ) -> dict[str, Any]:
490
+ """A ``diagnosis`` record for one still-open stall.
491
+
492
+ Deliberately NOT a ``resolve``: the entry is still stalled, and a record
493
+ that closed the episode would make an observation look like an outcome —
494
+ which is the exact conflation (*a stated reason read as a cause*) this
495
+ whole plan exists to undo. :func:`episodes` folds it onto the open
496
+ episode instead, so ``coord drive-queue block-log`` shows a populated
497
+ ``true_cause`` where it previously showed ``(unresolved)`` while the
498
+ episode itself stays open.
499
+
500
+ ``human_acted`` is absent on purpose rather than ``False``: Phase 1 acts on
501
+ nothing and knows nothing about what a human did, and a ``False`` here
502
+ would be counted by :func:`summarize` as an auto-release that never
503
+ happened.
504
+
505
+ Every argument is a plain scalar so this module needs no import from
506
+ :mod:`coord.queue_diagnose` — the recorder must not depend on the thing it
507
+ records.
508
+ """
509
+ return {
510
+ "event": EVENT_DIAGNOSIS,
511
+ "ts": time.time() if now is None else now,
512
+ "key": key,
513
+ "state": state,
514
+ # VERBATIM, same contract as `_enter_record`: the comparison between
515
+ # this and `true_cause` below IS the deliverable.
516
+ "stated_reason": stated_reason,
517
+ "true_cause": true_cause,
518
+ "cause": cause,
519
+ "confidence": confidence,
520
+ "evidence": [str(line) for line in evidence],
521
+ "contradicts_stated": bool(contradicts_stated),
522
+ "trigger": trigger,
523
+ "host": host,
524
+ "source": "diagnostician",
525
+ }
526
+
527
+
528
+ AGREEMENT_AGREED = "agreed"
529
+ AGREEMENT_DISAGREED = "disagreed"
530
+ #: The diagnosis said ``unknown``. A first-class verdict with NO penalty:
531
+ #: #2276 is explicit that a diagnostician which abstains is better than one
532
+ #: that guesses, so this is counted apart from `disagreed` and kept out of the
533
+ #: disagreement rate's denominator entirely.
534
+ AGREEMENT_ABSTAINED = "abstained"
535
+ #: The RESOLUTION is the unknown one. `operator-intervened` says in as many
536
+ #: words that what the human fixed is not recorded, so scoring a diagnosis
537
+ #: against it would be scoring it against noise.
538
+ AGREEMENT_UNDECIDED = "undecided"
539
+
540
+ #: ``resolve``-side cause slug -> the diagnosis causes that agree with it.
541
+ #: Keyed on the slug before the first " — ", the same split
542
+ #: :func:`summarize` buckets on. A resolution absent from this table is
543
+ #: undecidable, not a disagreement — see :data:`AGREEMENT_UNDECIDED`.
544
+ _AGREEING_CAUSES: dict[str, frozenset[str]] = {
545
+ "already-landed": frozenset({"pr-merged", "pr-closed"}),
546
+ "gate-cleared-after-giveup": frozenset(
547
+ {"nothing-blocking", "ci-green", "ci-pending"}
548
+ ),
549
+ "ci-reported": frozenset({"nothing-blocking", "ci-green", "ci-pending"}),
550
+ "unrefreshable-reading": frozenset({"nothing-blocking", "ci-green", "no-pr"}),
551
+ }
552
+
553
+
554
+ def agreement_for(diagnosed_cause: str, resolution_cause: str) -> str:
555
+ """Did Phase 1's derived cause match how the episode actually ended?
556
+
557
+ #2235's stated route to Phase 2 is *"run it read-only and check whether
558
+ its diagnosis matches what the human actually did"*, so this comparison
559
+ is a deliverable, not a follow-up. It is deliberately conservative in
560
+ both directions: an unrecognised resolution scores ``undecided`` rather
561
+ than being counted as a win, and an ``unknown`` diagnosis scores
562
+ ``abstained`` rather than being counted as a loss.
563
+ """
564
+ diagnosed = str(diagnosed_cause or "").split(" — ")[0]
565
+ resolved = str(resolution_cause or "").split(" — ")[0]
566
+ if not diagnosed:
567
+ return ""
568
+ if diagnosed == "unknown":
569
+ return AGREEMENT_ABSTAINED
570
+ agreeing = _AGREEING_CAUSES.get(resolved)
571
+ if agreeing is None:
572
+ return AGREEMENT_UNDECIDED
573
+ return AGREEMENT_AGREED if diagnosed in agreeing else AGREEMENT_DISAGREED
574
+
575
+
447
576
  # ── persistence (best-effort, never raises) ──────────────────────────────────
448
577
 
449
578
 
@@ -543,6 +672,17 @@ def episodes(events: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
543
672
  A ``resolve`` with no preceding ``enter`` (the log started mid-stall) is
544
673
  dropped rather than synthesised: an episode whose stated reason is
545
674
  unknown cannot answer the one question this log exists to answer.
675
+
676
+ A ``diagnosis`` (#2276 Phase 1) folds onto the open episode: it fills
677
+ ``true_cause`` — the column Phase 0 leaves empty and ``summarize`` buckets
678
+ as ``(unresolved)`` — without closing the episode, because the entry is
679
+ still stalled. A diagnosis for a key with no open episode is dropped for
680
+ the same reason an orphan ``resolve`` is: there is nothing to attach it
681
+ to, and inventing the episode would fabricate a stated reason to compare
682
+ against. Once the episode resolves, ``true_cause`` reverts to the
683
+ resolution's own account of what happened and the derived one is kept
684
+ beside it as ``diagnosed_cause``, so ``agreement`` scores two independent
685
+ claims rather than one claim against itself.
546
686
  """
547
687
  open_by_key: dict[str, dict[str, Any]] = {}
548
688
  out: list[dict[str, Any]] = []
@@ -571,21 +711,54 @@ def episodes(events: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
571
711
  "human_acted": None,
572
712
  "resolved_at": None,
573
713
  "stalled_seconds": None,
714
+ # #2276 Phase 1. `diagnoses` is what `needs_diagnosis` spends
715
+ # against the attempt budget, so it has to survive a restart —
716
+ # which it does, being recounted from the log every read
717
+ # rather than held in memory.
718
+ "diagnoses": 0,
719
+ "diagnosed_cause": "",
720
+ "diagnosis_confidence": "",
721
+ "diagnosis_evidence": [],
722
+ "diagnosis_contradicts_stated": False,
723
+ "agreement": "",
574
724
  }
725
+ elif kind == EVENT_DIAGNOSIS:
726
+ episode = open_by_key.get(key)
727
+ if episode is None:
728
+ continue
729
+ cause = str(event.get("cause") or "")
730
+ episode.update(
731
+ {
732
+ "diagnoses": int(episode.get("diagnoses") or 0) + 1,
733
+ "diagnosed_cause": cause,
734
+ "diagnosis_confidence": str(event.get("confidence") or ""),
735
+ "diagnosis_evidence": list(event.get("evidence") or []),
736
+ "diagnosis_contradicts_stated": bool(
737
+ event.get("contradicts_stated")
738
+ ),
739
+ # The whole point of the column: an OPEN episode now has a
740
+ # cause where it used to have "".
741
+ "true_cause": str(event.get("true_cause") or ""),
742
+ }
743
+ )
575
744
  elif kind == EVENT_RESOLVE:
576
745
  episode = open_by_key.pop(key, None)
577
746
  if episode is None:
578
747
  continue
579
748
  resolved_at = float(event.get("ts") or 0.0)
749
+ resolution_cause = str(event.get("true_cause") or "")
580
750
  episode.update(
581
751
  {
582
752
  "resolved": True,
583
753
  "resolution": event.get("resolution", ""),
584
- "true_cause": event.get("true_cause", ""),
754
+ "true_cause": resolution_cause,
585
755
  "human_acted": bool(event.get("human_acted")),
586
756
  "resolved_at": resolved_at,
587
757
  "stalled_seconds": max(0.0, resolved_at - episode["entered_at"]),
588
758
  "source": event.get("source", ""),
759
+ "agreement": agreement_for(
760
+ str(episode.get("diagnosed_cause") or ""), resolution_cause
761
+ ),
589
762
  }
590
763
  )
591
764
  out.append(episode)
@@ -608,6 +781,17 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
608
781
  than once. The issue's framing — *a repeat is a bug report, not a
609
782
  success* — needs that count visible from day one, or the trend line has
610
783
  nothing to be checked against.
784
+
785
+ ``diagnosis`` is #2276's own success criterion, and it is reported as a
786
+ measurement rather than an assertion. ``disagreement_rate`` is
787
+ ``disagreed / (agreed + disagreed)`` and is ``None`` — not ``0.0`` — when
788
+ nothing scorable has resolved yet, because a rate of zero out of zero
789
+ reads as a perfect record. ``abstained`` sits outside that fraction
790
+ entirely: #2276 makes ``unknown`` a first-class verdict with no penalty,
791
+ and putting it in the denominator would penalise it. ``contradicted``
792
+ counts the episodes where the live evidence positively ruled the queue's
793
+ stated reason out — the five-of-seven number, finally measured instead of
794
+ reconstructed by hand.
611
795
  """
612
796
  by_state: dict[str, int] = {}
613
797
  by_cause: dict[str, int] = {}
@@ -615,7 +799,17 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
615
799
  human = 0
616
800
  auto = 0
617
801
  still_open = 0
802
+ diagnosed = 0
803
+ contradicted = 0
804
+ agreement_counts: dict[str, int] = {}
618
805
  for item in items:
806
+ if item.get("diagnosed_cause"):
807
+ diagnosed += 1
808
+ if item.get("diagnosis_contradicts_stated"):
809
+ contradicted += 1
810
+ verdict = str(item.get("agreement") or "")
811
+ if verdict:
812
+ agreement_counts[verdict] = agreement_counts.get(verdict, 0) + 1
619
813
  state = str(item.get("state") or "?")
620
814
  by_state[state] = by_state.get(state, 0) + 1
621
815
  if not item.get("resolved"):
@@ -639,6 +833,9 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
639
833
  for (repo, stated), count in sorted(seen_pairs.items())
640
834
  if count > 1
641
835
  }
836
+ agreed = agreement_counts.get(AGREEMENT_AGREED, 0)
837
+ disagreed = agreement_counts.get(AGREEMENT_DISAGREED, 0)
838
+ scored = agreed + disagreed
642
839
  return {
643
840
  "episodes": len(items),
644
841
  "by_state": by_state,
@@ -647,4 +844,13 @@ def summarize(items: Sequence[Mapping[str, Any]]) -> dict[str, Any]:
647
844
  "auto_released": auto,
648
845
  "open": still_open,
649
846
  "repeat_causes": repeats,
847
+ "diagnosis": {
848
+ "diagnosed": diagnosed,
849
+ "contradicted_stated_reason": contradicted,
850
+ "agreed": agreed,
851
+ "disagreed": disagreed,
852
+ "abstained": agreement_counts.get(AGREEMENT_ABSTAINED, 0),
853
+ "undecided": agreement_counts.get(AGREEMENT_UNDECIDED, 0),
854
+ "disagreement_rate": (disagreed / scored) if scored else None,
855
+ },
650
856
  }
@@ -928,7 +928,26 @@ def _episode_line(item: Mapping[str, Any]) -> str:
928
928
  if len(stated) > 90:
929
929
  stated = stated[:87] + "..."
930
930
  if not item.get("resolved"):
931
- return f"{key:<28} {state:<8} STILL STALLED stated: {stated}"
931
+ line = f"{key:<28} {state:<8} STILL STALLED stated: {stated}"
932
+ # #2276 Phase 1. An open episode used to have nothing in the `cause`
933
+ # column at all — `summarize` bucketed it as `(unresolved)`. When the
934
+ # diagnostician has been round, it does, and the CONTRADICTS marker is
935
+ # what makes #2235's five-of-seven finding legible at a glance instead
936
+ # of requiring the reader to hold both strings in their head.
937
+ cause = " ".join(str(item.get("true_cause") or "").split())
938
+ if cause:
939
+ flag = (
940
+ " ← CONTRADICTS the stated reason"
941
+ if item.get("diagnosis_contradicts_stated")
942
+ else ""
943
+ )
944
+ confidence = str(item.get("diagnosis_confidence") or "?")
945
+ line += (
946
+ f"\n{'':<28} {'':<8} cause: {cause}"
947
+ f"\n{'':<28} {'':<8} "
948
+ f"(diagnosed, confidence {confidence}){flag}"
949
+ )
950
+ return line
932
951
  mark = "HUMAN" if item.get("human_acted") else "auto "
933
952
  held = item.get("stalled_seconds")
934
953
  age = _age_str(float(held)) if held is not None else "?"
@@ -962,10 +981,15 @@ def drive_queue_block_log(output_json: bool, days: float, config_path: Path) ->
962
981
  how often did a human have to act?" is answered from two weeks of evidence
963
982
  rather than from one morning's triage.
964
983
 
965
- Nothing here diagnoses. `cause` is derived from the release the queue
966
- itself performed (a #2230 gate-clear, a #1891 CI resume, an operator's
967
- `remove`), never from a live re-check — that is Phase 1, and its scope is
968
- supposed to be decided BY this data, not assumed ahead of it.
984
+ This command itself does not diagnose it renders what other passes
985
+ recorded. For a *resolved* episode, `cause` is still derived from the
986
+ release the queue itself performed (a #2230 gate-clear, a #1891 CI
987
+ resume, an operator's `remove`), never from a live re-check. For a
988
+ still-open episode, `cause` may instead be a Phase 1 (#2276) live
989
+ re-check's verdict — `coord drive-queue diagnose` or the notifier tick's
990
+ `diagnose_pass` recorded it as a `diagnosis` event, and `_episode_line`
991
+ renders it with a `(diagnosed, confidence ...)` tag so it reads distinct
992
+ from a resolution-derived cause.
969
993
 
970
994
  Read the two summary numbers together: `human_acted` is the count #2235
971
995
  wants to see fall, but a queue that stops needing interventions by leaving
@@ -1014,6 +1038,225 @@ def drive_queue_block_log(output_json: bool, days: float, config_path: Path) ->
1014
1038
  stats["repeat_causes"].items(), key=lambda kv: (-kv[1], kv[0])
1015
1039
  ):
1016
1040
  click.echo(f" {count}× {label}")
1041
+ for line in _diagnosis_summary_lines(stats.get("diagnosis") or {}):
1042
+ click.echo(line)
1043
+
1044
+
1045
+ def _diagnosis_summary_lines(diag: Mapping[str, Any]) -> list[str]:
1046
+ """#2276's success criterion, rendered as a measurement.
1047
+
1048
+ The disagreement rate is printed as ``(not yet measurable)`` rather than
1049
+ ``0%`` until something scorable has resolved, because #2276 is explicit
1050
+ that the number must be *measured, not assumed* — and "0% wrong out of
1051
+ nothing" is the most flattering way there is to assume it.
1052
+ """
1053
+ if not diag.get("diagnosed"):
1054
+ return []
1055
+ lines = [
1056
+ f"diagnosed {diag['diagnosed']} stall(s) — "
1057
+ f"{diag.get('contradicted_stated_reason', 0)} contradicted the stated reason"
1058
+ ]
1059
+ rate = diag.get("disagreement_rate")
1060
+ scored = f"{diag.get('agreed', 0)} agreed · {diag.get('disagreed', 0)} disagreed"
1061
+ tail = (
1062
+ f"{rate * 100:.0f}% disagreement"
1063
+ if rate is not None
1064
+ else "disagreement rate: (not yet measurable — nothing scorable has resolved)"
1065
+ )
1066
+ lines.append(f" vs. how they actually resolved: {scored} — {tail}")
1067
+ lines.append(
1068
+ f" {diag.get('abstained', 0)} abstained (said unknown, which is not a "
1069
+ f"failure) · {diag.get('undecided', 0)} unscorable"
1070
+ )
1071
+ return lines
1072
+
1073
+
1074
+ # ── diagnose (#2276 Phase 1) ─────────────────────────────────────────────────
1075
+
1076
+
1077
+ def _diagnosis_lines(diagnosis: Any) -> list[str]:
1078
+ """One diagnosis, rendered. ``stated`` and ``cause`` adjacent, as ever."""
1079
+ flag = " ← CONTRADICTS the stated reason" if diagnosis.contradicts_stated else ""
1080
+ trigger = f" (triggered by: {diagnosis.trigger})" if diagnosis.trigger else ""
1081
+ lines = [
1082
+ f"{diagnosis.key} [{diagnosis.state}]{trigger}",
1083
+ f" stated: {' '.join((diagnosis.stated_reason or '(none)').split())}",
1084
+ f" cause: {diagnosis.cause} (confidence {diagnosis.confidence}){flag}",
1085
+ ]
1086
+ if diagnosis.abstained:
1087
+ lines.append(
1088
+ " unknown is a verdict, not a failure — the evidence "
1089
+ "below was too thin to name a cause"
1090
+ )
1091
+ lines.append(" evidence:")
1092
+ lines.extend(f" - {line}" for line in diagnosis.evidence)
1093
+ return lines
1094
+
1095
+
1096
+ @drive_queue_group.command("diagnose")
1097
+ @click.option("--json", "output_json", is_flag=True, default=False, help="Emit diagnoses as JSON.")
1098
+ @click.option(
1099
+ "--dry-run",
1100
+ is_flag=True,
1101
+ default=False,
1102
+ help="Derive and print, but do not append the diagnosis to the block log.",
1103
+ )
1104
+ @_CONFIG_OPTION
1105
+ def drive_queue_diagnose(output_json: bool, dry_run: bool, config_path: Path) -> None:
1106
+ """Re-derive the REAL blocker of every still-stalled entry (#2276 Phase 1).
1107
+
1108
+ Read-only. It runs no `coord merge`, dispatches nothing, and writes nothing
1109
+ to the board or the queue — its single output is a `diagnosis` record in
1110
+ the Phase-0 block log, which no decision path reads.
1111
+
1112
+ The queue's stated reason is an INPUT TO BE CONTRADICTED, never a starting
1113
+ hypothesis: #2235 found that five of seven overnight stalls named a symptom
1114
+ rather than a cause, so this asks GitHub, the live gate report and the
1115
+ agent's /health what is actually true right now, and only then checks
1116
+ whether the evidence still supports what the queue said.
1117
+
1118
+ `unknown` is a first-class verdict. Thin evidence gets an abstention, not a
1119
+ guess — a confidently wrong cause is worse than no cause, because #2268's
1120
+ Phase 2 would inherit the confidence.
1121
+
1122
+ It runs here, and in `coord serve`'s notifier tick, rather than as a
1123
+ dispatched worker: a diagnosis needs `gh`, and `gh` is denied to workers
1124
+ (#1483). The trigger in the daemon is #1632's own stall detector — there is
1125
+ deliberately no second definition of "stalled" anywhere in this path.
1126
+
1127
+ That notifier-tick trigger only fires when `notifications.enabled` is
1128
+ true (`coord.notifier.service._tick` returns before `diagnose_pass` runs
1129
+ otherwise) — notifications are off by default in this repo, so on a
1130
+ fleet that has not turned them on, THIS command is the only live entry
1131
+ point into Phase 1.
1132
+ """
1133
+ from coord import block_log, queue_diagnose # noqa: PLC0415
1134
+ from coord.board_service import is_remote # noqa: PLC0415
1135
+ from coord.commands._common import _load_config # noqa: PLC0415
1136
+
1137
+ # #615/#906 guard: everything this command reads — the Phase-0 block log,
1138
+ # the queue rows, the board handed to GhLiveProbe — lives on the daemon
1139
+ # host, and the probes need `gh` (denied to workers, #1483). On a thin
1140
+ # client all three reads would be silently empty, so the "diagnosis"
1141
+ # would be a confident report about a queue that isn't there. Fail loud
1142
+ # instead (the exact #615 failure mode this audit exists to prevent).
1143
+ if is_remote():
1144
+ raise click.ClickException(
1145
+ "drive-queue diagnose reads the daemon host's block log, queue "
1146
+ "and board directly — run it there (a board_service-configured "
1147
+ "thin client would diagnose an empty queue)."
1148
+ )
1149
+
1150
+ from coord.drive import list_drive_sessions # noqa: PLC0415
1151
+ from coord.health.aggregate import local_fleet_health_block # noqa: PLC0415
1152
+ from coord.state import build_board, list_drive_queue # noqa: PLC0415
1153
+
1154
+ config = _load_config(config_path)
1155
+ episodes = [
1156
+ ep for ep in block_log.episodes(block_log.read_events()) if not ep.get("resolved")
1157
+ ]
1158
+ entries = entries_from_rows(list_drive_queue())
1159
+ # #2276 review: without these two, `GhLiveProbe._health()` short-circuits
1160
+ # to `(None, None, [])` for every entry — `agent_reachable` and
1161
+ # `agent_has_session` are permanently unknown, which makes `dead-leg` and
1162
+ # `agent-unreachable` structurally unreachable verdicts from this command.
1163
+ # Same local-DB read `coord status` uses in host mode (status.py's own
1164
+ # `local_fleet_health_block` call) — no fresh /health round trip, just
1165
+ # the last tick's reported state; and the same `list_drive_sessions()`
1166
+ # this file already calls elsewhere (`_fetch_board_view`) for live tmux
1167
+ # session names.
1168
+ fleet_health = local_fleet_health_block([m.name for m in config.machines])
1169
+ live_sessions = frozenset(
1170
+ str(row["session_name"])
1171
+ for row in list_drive_sessions()
1172
+ if row.get("session_name")
1173
+ )
1174
+ probe = queue_diagnose.GhLiveProbe(
1175
+ config=config,
1176
+ board=build_board(),
1177
+ fleet_health=fleet_health,
1178
+ live_sessions=live_sessions,
1179
+ # #1870: that `list_drive_sessions()` above is a LOCAL tmux read, so
1180
+ # the probe has to know whose tmux it is. Without this an entry some
1181
+ # OTHER machine launched reads as "session absent" here and lands a
1182
+ # high-confidence `dead-leg` on a session that is very much alive —
1183
+ # the same trap `_reconcile_running` already sidesteps.
1184
+ local_host=_local_host_id(),
1185
+ )
1186
+ # `keys=None` — an operator asking directly wants every open episode
1187
+ # looked at, not just the ones the notifier happens to have raised this
1188
+ # minute. `limit=None` for the same reason, and because the per-pass cap
1189
+ # exists to protect `coord serve`'s 30 s tick, which this is not on: a cap
1190
+ # here would silently diagnose four of ten and print "4 diagnosed", which
1191
+ # reads as "that was all of them". The per-episode budget still applies,
1192
+ # so this cannot become a way to spend `gh` calls in a loop.
1193
+ diagnoses = queue_diagnose.run_pass(
1194
+ entries, episodes, probe=probe, keys=None, limit=None
1195
+ )
1196
+
1197
+ if diagnoses and not dry_run:
1198
+ _record_block_log(
1199
+ [
1200
+ block_log.diagnosis_event(
1201
+ key=d.key,
1202
+ state=d.state,
1203
+ stated_reason=d.stated_reason,
1204
+ true_cause=d.true_cause,
1205
+ cause=d.cause,
1206
+ confidence=d.confidence,
1207
+ evidence=d.evidence,
1208
+ contradicts_stated=d.contradicts_stated,
1209
+ trigger=d.trigger,
1210
+ host=_local_host_id(),
1211
+ )
1212
+ for d in diagnoses
1213
+ ]
1214
+ )
1215
+
1216
+ if output_json:
1217
+ click.echo(
1218
+ _json.dumps(
1219
+ {
1220
+ "recorded": bool(diagnoses) and not dry_run,
1221
+ "diagnoses": [
1222
+ {
1223
+ "key": d.key,
1224
+ "state": d.state,
1225
+ "stated_reason": d.stated_reason,
1226
+ "cause": d.cause,
1227
+ "true_cause": d.true_cause,
1228
+ "confidence": d.confidence,
1229
+ "evidence": list(d.evidence),
1230
+ "contradicts_stated": d.contradicts_stated,
1231
+ "trigger": d.trigger,
1232
+ }
1233
+ for d in diagnoses
1234
+ ],
1235
+ }
1236
+ )
1237
+ )
1238
+ return
1239
+
1240
+ if not diagnoses:
1241
+ click.echo(
1242
+ "nothing to diagnose: no open stall episode is both unexplained and "
1243
+ "still within its diagnosis budget"
1244
+ )
1245
+ return
1246
+ for diagnosis in diagnoses:
1247
+ for line in _diagnosis_lines(diagnosis):
1248
+ click.echo(line)
1249
+ click.echo("")
1250
+ contradicted = sum(1 for d in diagnoses if d.contradicts_stated)
1251
+ abstained = sum(1 for d in diagnoses if d.abstained)
1252
+ click.echo(
1253
+ f"{len(diagnoses)} diagnosed — {contradicted} contradicted the stated "
1254
+ f"reason · {abstained} abstained (unknown)"
1255
+ )
1256
+ click.echo(
1257
+ "nothing was mutated; read the outcome later with "
1258
+ "`coord drive-queue block-log`"
1259
+ )
1017
1260
 
1018
1261
 
1019
1262
  # ── overlap-report (#2247) ───────────────────────────────────────────────────