code-coordinator 0.5.187__tar.gz → 0.5.189__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 (784) hide show
  1. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent.py +71 -0
  5. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/cli.py +2 -0
  6. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/merge.py +79 -0
  7. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notify.py +144 -12
  8. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/claude.py +19 -0
  9. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/claude_pty.py +11 -0
  10. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/state.py +81 -0
  11. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent.py +111 -0
  12. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_merge.py +116 -0
  13. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notify.py +171 -0
  14. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers_pty.py +34 -2
  15. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_state.py +97 -0
  16. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_test_scoping.py +23 -4
  17. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/coord-ci-acceptance.yml +0 -0
  26. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/auto-release.yml +0 -0
  27. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/cargo-test.yml +0 -0
  28. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/publish.yml +0 -0
  29. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/release-tui.yml +0 -0
  30. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.github/workflows/test.yml +0 -0
  31. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/.gitignore +0 -0
  32. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/GOAL.md +0 -0
  34. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/LICENSE +0 -0
  35. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/README.md +0 -0
  37. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/SOURCES.txt +0 -0
  38. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/dependency_links.txt +0 -0
  39. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/entry_points.txt +0 -0
  40. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/requires.txt +0 -0
  41. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/scm_file_list.json +0 -0
  42. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent_app.py +0 -0
  48. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agent_update.py +0 -0
  49. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/.gitignore +0 -0
  50. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/agents/work.md +0 -0
  51. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/agents/opencode/routing.jsonc +0 -0
  52. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/audit.py +0 -0
  53. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/auto_loop.py +0 -0
  54. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/block_log.py +0 -0
  55. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_bool_guard.py +0 -0
  56. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/ci_store.py +0 -0
  64. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/client.py +0 -0
  66. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/config.py +0 -0
  97. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/db.py +0 -0
  106. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dead_end.py +0 -0
  107. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/README.md +0 -0
  108. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-agent.service +0 -0
  109. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.service +0 -0
  110. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.sh +0 -0
  111. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-db-backup.timer +0 -0
  112. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-drive-queue.service +0 -0
  113. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-drive-queue.timer +0 -0
  114. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-notify.service +0 -0
  115. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-notify.timer +0 -0
  116. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-propagate.service +0 -0
  117. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-propagate.timer +0 -0
  118. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-window.service +0 -0
  119. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-release-window.timer +0 -0
  120. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-serve.service +0 -0
  121. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web-dist-build.service +0 -0
  122. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web-dist-build.timer +0 -0
  123. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy/coord-web.service +0 -0
  124. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy_manifest.py +0 -0
  125. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deploy_units.py +0 -0
  126. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/deps.py +0 -0
  127. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/diagnose.py +0 -0
  128. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dispatch.py +0 -0
  129. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/dist_name.py +0 -0
  130. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive.py +0 -0
  131. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive_queue.py +0 -0
  132. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/drive_state.py +0 -0
  133. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/events.py +0 -0
  134. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/failure_class.py +0 -0
  135. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/filelock.py +0 -0
  136. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/fleet_config_health.py +0 -0
  137. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/freshness.py +0 -0
  138. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_a.py +0 -0
  139. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_b.py +0 -0
  140. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gate_snapshot.py +0 -0
  141. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/gates.py +0 -0
  142. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/github_ops.py +0 -0
  143. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/goal.py +0 -0
  144. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/graph_health.py +0 -0
  145. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/__init__.py +0 -0
  146. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/aggregate.py +0 -0
  147. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/__init__.py +0 -0
  148. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/agent_install.py +0 -0
  149. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/cargo_targets.py +0 -0
  150. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/claude_binary.py +0 -0
  151. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/coord_web_ci_pin.py +0 -0
  152. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/deploy_lane_facts.py +0 -0
  153. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/disk.py +0 -0
  154. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_board.py +0 -0
  155. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  156. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_phantom.py +0 -0
  157. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/fleet_unit_drift.py +0 -0
  158. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/graph.py +0 -0
  159. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/graphify_cli.py +0 -0
  160. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/index_lock.py +0 -0
  161. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/plan_usage.py +0 -0
  162. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/repo_state.py +0 -0
  163. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/spawned_coord.py +0 -0
  164. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/timer_active.py +0 -0
  165. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/toolchain.py +0 -0
  166. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/unit_drift.py +0 -0
  167. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/unit_enablement.py +0 -0
  168. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/checks/worktrees.py +0 -0
  169. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/cli.py +0 -0
  170. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/context.py +0 -0
  171. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/fleet_snapshot.py +0 -0
  172. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/models.py +0 -0
  173. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/pypi.py +0 -0
  174. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/registry.py +0 -0
  175. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/render.py +0 -0
  176. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/health/units.py +0 -0
  177. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/hooks.py +0 -0
  178. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/housekeeping.py +0 -0
  179. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/interactive.py +0 -0
  180. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/issue_store.py +0 -0
  181. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/liveness_auditor.py +0 -0
  182. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/machine_pause.py +0 -0
  183. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/merge_queue.py +0 -0
  184. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_chat.py +0 -0
  185. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_dispatch.py +0 -0
  186. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_gate.py +0 -0
  187. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/milestone_order.py +0 -0
  188. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/mock_author.py +0 -0
  189. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/models.py +0 -0
  190. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/network.py +0 -0
  191. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/new_issue_chat.py +0 -0
  192. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/__init__.py +0 -0
  193. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/baseline.py +0 -0
  194. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/cli.py +0 -0
  195. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/collect.py +0 -0
  196. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/digest.py +0 -0
  197. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/models.py +0 -0
  198. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/predicate.py +0 -0
  199. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/service.py +0 -0
  200. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/store.py +0 -0
  201. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/notifier/transport.py +0 -0
  202. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/openapi.py +0 -0
  203. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/overlap_fence.py +0 -0
  204. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/overlap_predict.py +0 -0
  205. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/parentage.py +0 -0
  206. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/parentage_github.py +0 -0
  207. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/pipeline.py +0 -0
  208. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/plan_parser.py +0 -0
  209. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/plans.py +0 -0
  210. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/platform_paths.py +0 -0
  211. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_bridge.py +0 -0
  212. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_store.py +0 -0
  213. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/portal_sync.py +0 -0
  214. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/pr_body_lint.py +0 -0
  215. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/prereqs.py +0 -0
  216. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/progress.py +0 -0
  217. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/__init__.py +0 -0
  218. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/base.py +0 -0
  219. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/providers/opencode.py +0 -0
  220. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/queue_diagnose.py +0 -0
  221. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reconcile.py +0 -0
  222. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reconcile_tick.py +0 -0
  223. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/refine_chat.py +0 -0
  224. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_cordon.py +0 -0
  225. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_propagate.py +0 -0
  226. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_verify.py +0 -0
  227. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/release_window.py +0 -0
  228. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/repo_edit.py +0 -0
  229. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/repo_onboard.py +0 -0
  230. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/reports.py +0 -0
  231. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/revalidate.py +0 -0
  232. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/review.py +0 -0
  233. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/scorecard.py +0 -0
  234. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/self_health.py +0 -0
  235. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/serve_app.py +0 -0
  236. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  237. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  238. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  239. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  240. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  241. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/portal-followup/SKILL.md +0 -0
  242. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  243. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  244. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/skills/update-issue/SKILL.md +0 -0
  245. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/smoke.py +0 -0
  246. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/spend_ceiling.py +0 -0
  247. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/split_work.py +0 -0
  248. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/stage_projection.py +0 -0
  249. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_author.py +0 -0
  250. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_chat.py +0 -0
  251. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_orchestrator.py +0 -0
  252. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/test_report.py +0 -0
  253. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/tui_release.py +0 -0
  254. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage.py +0 -0
  255. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage_limits.py +0 -0
  256. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/usage_rollup.py +0 -0
  257. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coord/worker_events.py +0 -0
  258. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/coordinator.example.yml +0 -0
  259. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-agent.service +0 -0
  260. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.service +0 -0
  261. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.sh +0 -0
  262. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-db-backup.timer +0 -0
  263. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-drive-queue.service +0 -0
  264. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-drive-queue.timer +0 -0
  265. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-notify.service +0 -0
  266. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-notify.timer +0 -0
  267. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-propagate.service +0 -0
  268. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-propagate.timer +0 -0
  269. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-window.service +0 -0
  270. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-release-window.timer +0 -0
  271. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-serve.service +0 -0
  272. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.service +0 -0
  273. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.sh +0 -0
  274. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-dist-build.timer +0 -0
  275. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web-rollback.sh +0 -0
  276. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/coord-web.service +0 -0
  277. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/deploy/node-shim.sh +0 -0
  278. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  279. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_CI.md +0 -0
  280. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ADR_COORD_WEB_DIST.md +0 -0
  281. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/AGENT_OPERATIONS.md +0 -0
  282. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ARCHITECTURE.md +0 -0
  283. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ARCH_SECURITY_GATES.md +0 -0
  284. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/COCKPIT.md +0 -0
  285. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CONTROL_CENTER.md +0 -0
  286. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/COST_DISCIPLINE.md +0 -0
  287. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CROSS_PLATFORM.md +0 -0
  288. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/CUSTOMER_PORTAL.md +0 -0
  289. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/DRIVE_QUEUE.md +0 -0
  290. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/EPHEMERAL_WORKERS.md +0 -0
  291. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/FORGE_MIGRATION.md +0 -0
  292. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/GRAPHIFY_SETUP.md +0 -0
  293. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ISSUE_GUIDANCE.md +0 -0
  294. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/MAC_MINI.md +0 -0
  295. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  296. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/NOTIFIER.md +0 -0
  297. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/OPENCODE_VERIFICATION.md +0 -0
  298. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/OPERATING_GOTCHAS.md +0 -0
  299. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/ORACLE_LOOP.md +0 -0
  300. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PHONE_WEBAPP.md +0 -0
  301. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PIPELINE_V2.md +0 -0
  302. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/PLATFORM_EVOLUTION.md +0 -0
  303. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/SECOND_BACKEND.md +0 -0
  304. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/STORE_SERVICE.md +0 -0
  305. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  306. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/WEB_CONTROL_CENTER.md +0 -0
  307. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/WSL_WINDOWS_WORKER.md +0 -0
  308. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/README.md +0 -0
  309. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/_tokens.css +0 -0
  310. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/issue-detail.html +0 -0
  311. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/pipeline-narrow.html +0 -0
  312. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/docs/mocks/web/pipeline-wide.html +0 -0
  313. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/graphify-out/.gitignore +0 -0
  314. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/install-agent.sh +0 -0
  315. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/pyproject.toml +0 -0
  316. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/audit_review_verdict_overrides.py +0 -0
  317. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  318. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/build-worker-image.sh +0 -0
  319. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/coordinator-machine.py +0 -0
  320. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/epic-down.sh +0 -0
  321. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/epic-up.sh +0 -0
  322. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/preflight.sh +0 -0
  323. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/provision-worker.sh +0 -0
  324. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  325. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  326. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/azure-workers/verify-github-token.sh +0 -0
  327. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/codegen.py +0 -0
  328. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/coord-test-runner.sh +0 -0
  329. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/drive-batch.sh +0 -0
  330. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/gen_board_fixture.py +0 -0
  331. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/next_release_tag.py +0 -0
  332. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/run_tests_in_populated_home.sh +0 -0
  333. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/run_tests_without_gh.sh +0 -0
  334. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/smoke_437_interactive.py +0 -0
  335. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_878_review_capture.py +0 -0
  336. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_release_published.py +0 -0
  337. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/scripts/verify_release_wheel.py +0 -0
  338. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/setup.cfg +0 -0
  339. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/SMOKE_SET.md +0 -0
  340. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/__init__.py +0 -0
  341. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  342. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/contract.md +0 -0
  343. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/manifest.yml +0 -0
  344. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  345. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  346. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  347. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  348. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/conftest.py +0 -0
  349. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/contract.md +0 -0
  350. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/manifest.yml +0 -0
  351. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  352. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  353. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/contract.md +0 -0
  354. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/manifest.yml +0 -0
  355. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  356. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  357. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  358. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  359. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  360. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  361. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  362. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  363. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  364. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  365. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/contract.md +0 -0
  366. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  367. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  368. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/manifest.yml +0 -0
  369. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  370. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-51/tsconfig.json +0 -0
  371. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  372. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  373. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  374. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/contract.md +0 -0
  375. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  376. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/manifest.yml +0 -0
  377. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  378. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  379. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  380. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  381. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  382. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  383. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  384. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  385. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  386. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  387. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  388. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  389. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/conftest.py +0 -0
  390. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/board-pipeline-basic.json +0 -0
  391. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  392. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  393. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  394. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  395. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/all_pass.json +0 -0
  396. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  397. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/mixed_fail.json +0 -0
  398. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  399. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  400. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/skip.json +0 -0
  401. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/playwright/truncated.json +0 -0
  402. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  403. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  404. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  405. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  406. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  407. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  408. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  409. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  410. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_acceptance.py +0 -0
  411. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_acceptance_drivers.py +0 -0
  412. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_api_error.py +0 -0
  413. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_app.py +0 -0
  414. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_branch_base.py +0 -0
  415. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_branch_capture.py +0 -0
  416. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_config_free_1712.py +0 -0
  417. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_deploy_units_endpoint.py +0 -0
  418. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_dirty_worktree.py +0 -0
  419. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  420. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_graph_self_heal.py +0 -0
  421. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_health_h3.py +0 -0
  422. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_idle_restart.py +0 -0
  423. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_push_failure.py +0 -0
  424. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_reap.py +0 -0
  425. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_repos_and_pull.py +0 -0
  426. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_restart_services_endpoint.py +0 -0
  427. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_skills_self_heal.py +0 -0
  428. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_startup_diagnostics.py +0 -0
  429. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_update.py +0 -0
  430. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_update_bluegreen.py +0 -0
  431. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_usage_limit.py +0 -0
  432. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_agent_zero_commit.py +0 -0
  433. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ambient_home_isolation.py +0 -0
  434. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_approve_reject_plan.py +0 -0
  435. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_approve_usage_gate.py +0 -0
  436. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_assignment_already_recorded_daemon.py +0 -0
  437. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_log.py +0 -0
  438. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_outcome.py +0 -0
  439. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_audit_query.py +0 -0
  440. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_auto_loop.py +0 -0
  441. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_auto_release_publish_2035.py +0 -0
  442. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_base_checkout_restore.py +0 -0
  443. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_block_log.py +0 -0
  444. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_cap_762.py +0 -0
  445. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_fixture.py +0 -0
  446. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_read_path.py +0 -0
  447. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_service.py +0 -0
  448. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_state.py +0 -0
  449. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_board_wire.py +0 -0
  450. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_brain.py +0 -0
  451. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_branch_model.py +0 -0
  452. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_bug_intake.py +0 -0
  453. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_build_worker_image_env_update.py +0 -0
  454. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cargo_cache.py +0 -0
  455. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_acceptance_gate_1950.py +0 -0
  456. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_parity_2091.py +0 -0
  457. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_ci_store.py +0 -0
  458. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_claim.py +0 -0
  459. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_acceptance.py +0 -0
  460. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign.py +0 -0
  461. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  462. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_interactive_remote.py +0 -0
  463. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_provider.py +0 -0
  464. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  465. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_audit.py +0 -0
  466. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_chat_continue.py +0 -0
  467. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_decide.py +0 -0
  468. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_config_provenance.py +0 -0
  469. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_graph.py +0 -0
  470. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_diagnose_self.py +0 -0
  471. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor.py +0 -0
  472. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor_config_free_1801.py +0 -0
  473. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  474. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_drive.py +0 -0
  475. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_drive_queue.py +0 -0
  476. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_escalate.py +0 -0
  477. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_fix_headless_review.py +0 -0
  478. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_gate_a.py +0 -0
  479. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_install_drift.py +0 -0
  480. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_install_skills.py +0 -0
  481. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_issue_create_label.py +0 -0
  482. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_issue_reopen.py +0 -0
  483. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_assign.py +0 -0
  484. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_capture.py +0 -0
  485. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_chat_add_child.py +0 -0
  486. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_dispatch.py +0 -0
  487. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_gate_b.py +0 -0
  488. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_gate_c.py +0 -0
  489. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_order.py +0 -0
  490. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  491. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_milestone_ship.py +0 -0
  492. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_network.py +0 -0
  493. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_new_issue_chat.py +0 -0
  494. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_plans.py +0 -0
  495. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_portal.py +0 -0
  496. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_pull_artifact.py +0 -0
  497. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_queue.py +0 -0
  498. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_reattach_sessions.py +0 -0
  499. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_refine_board.py +0 -0
  500. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_preflight.py +0 -0
  501. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_propagate.py +0 -0
  502. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_release_window.py +0 -0
  503. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_repo_2220.py +0 -0
  504. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_scorecard.py +0 -0
  505. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_set_review_findings.py +0 -0
  506. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_advisory_terminal.py +0 -0
  507. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_merge_queue.py +0 -0
  508. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_provider.py +0 -0
  509. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_review_finalizing.py +0 -0
  510. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_test_failed_tag.py +0 -0
  511. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_status_usage_limit.py +0 -0
  512. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_sync_comments_873.py +0 -0
  513. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_test_plan.py +0 -0
  514. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_track.py +0 -0
  515. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_tui_update.py +0 -0
  516. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cli_wait.py +0 -0
  517. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_client_base_install.py +0 -0
  518. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_comments.py +0 -0
  519. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_completion_summary.py +0 -0
  520. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config.py +0 -0
  521. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_acceptance.py +0 -0
  522. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_audit.py +0 -0
  523. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_pricing.py +0 -0
  524. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  525. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_config_usage_gate.py +0 -0
  526. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_conflict_fix.py +0 -0
  527. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_conflict_fix_semantic.py +0 -0
  528. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test.py +0 -0
  529. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_baseline.py +0 -0
  530. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_populated_home.py +0 -0
  531. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_routing.py +0 -0
  532. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_test_runner_toolchain.py +0 -0
  533. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coord_web_sse_restart_live.py +0 -0
  534. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_coordinator_machine.py +0 -0
  535. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_cross_platform_imports.py +0 -0
  536. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard.py +0 -0
  537. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_fixture.py +0 -0
  538. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_terminal.py +0 -0
  539. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dashboard_terminal_live.py +0 -0
  540. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_db.py +0 -0
  541. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dead_end.py +0 -0
  542. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_db_backup.py +0 -0
  543. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_web_dist.py +0 -0
  544. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_coord_web_rollback.py +0 -0
  545. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_drive_queue_unit.py +0 -0
  546. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_manifest.py +0 -0
  547. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_units_lane.py +0 -0
  548. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deploy_web_unit.py +0 -0
  549. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_deps.py +0 -0
  550. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_diagnose.py +0 -0
  551. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dispatch.py +0 -0
  552. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dispatch_target_validation.py +0 -0
  553. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_dist_name.py +0 -0
  554. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_done_housekeeping.py +0 -0
  555. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive.py +0 -0
  556. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_queue.py +0 -0
  557. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_state.py +0 -0
  558. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_drive_tmux.py +0 -0
  559. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_capability_detection.py +0 -0
  560. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  561. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_epic_up_image_provenance.py +0 -0
  562. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_errors.py +0 -0
  563. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_events.py +0 -0
  564. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_failure_class.py +0 -0
  565. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_filelock.py +0 -0
  566. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  567. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fix_of_force_override.py +0 -0
  568. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_config_health.py +0 -0
  569. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_health_probes.py +0 -0
  570. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_fleet_health_snapshot.py +0 -0
  571. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_freshness.py +0 -0
  572. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_a.py +0 -0
  573. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_b.py +0 -0
  574. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gate_snapshot_staleness.py +0 -0
  575. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gates.py +0 -0
  576. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  577. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_generated_types_fixture.py +0 -0
  578. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_github_ops.py +0 -0
  579. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_goal.py +0 -0
  580. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_graph_health.py +0 -0
  581. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_graph_selfheal_absent_2237.py +0 -0
  582. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_handoff.py +0 -0
  583. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_checks.py +0 -0
  584. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_cli.py +0 -0
  585. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_cli_graph.py +0 -0
  586. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_config.py +0 -0
  587. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_context.py +0 -0
  588. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_coord_web_ci_pin.py +0 -0
  589. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_deploy_lane_facts.py +0 -0
  590. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_incident_regression.py +0 -0
  591. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_pypi.py +0 -0
  592. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_registry.py +0 -0
  593. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_timer_active.py +0 -0
  594. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_toolchain.py +0 -0
  595. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_unit_drift.py +0 -0
  596. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_health_unit_enablement.py +0 -0
  597. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_hooks.py +0 -0
  598. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_human_attended_437.py +0 -0
  599. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_init.py +0 -0
  600. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_integration.py +0 -0
  601. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_briefing_echo.py +0 -0
  602. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_prefill_state.py +0 -0
  603. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_session_relaunch.py +0 -0
  604. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_test_verdict_backstop.py +0 -0
  605. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_token_attribution.py +0 -0
  606. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_interactive_worktree.py +0 -0
  607. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_issue_store_seam.py +0 -0
  608. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_liveness_auditor.py +0 -0
  609. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_liveness_notify.py +0 -0
  610. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_machine_pause.py +0 -0
  611. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_merge_queue.py +0 -0
  612. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_merge_verify.py +0 -0
  613. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_chat.py +0 -0
  614. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_dispatch.py +0 -0
  615. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_gate.py +0 -0
  616. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_order.py +0 -0
  617. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_milestone_seam.py +0 -0
  618. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_mock_author.py +0 -0
  619. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_model_tiering.py +0 -0
  620. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_models.py +0 -0
  621. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_models_config_labels.py +0 -0
  622. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_needs_attention.py +0 -0
  623. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_network.py +0 -0
  624. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_new_issue_chat.py +0 -0
  625. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_next_release_tag.py +0 -0
  626. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_no_direct_gh_calls.py +0 -0
  627. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_node_shim.py +0 -0
  628. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_baseline.py +0 -0
  629. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_cli.py +0 -0
  630. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_collect.py +0 -0
  631. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_config.py +0 -0
  632. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_drive_seam.py +0 -0
  633. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_isolation.py +0 -0
  634. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_predicate.py +0 -0
  635. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_quiet_hours.py +0 -0
  636. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notifier_service.py +0 -0
  637. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_notify_drain.py +0 -0
  638. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_openapi.py +0 -0
  639. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_operational_defaults.py +0 -0
  640. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_overlap_fence.py +0 -0
  641. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_overlap_predict.py +0 -0
  642. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_packaged_deploy_units.py +0 -0
  643. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_parentage.py +0 -0
  644. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_paste_landed.py +0 -0
  645. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_pipeline.py +0 -0
  646. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_approve_plan_command.py +0 -0
  647. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_pr_command.py +0 -0
  648. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_followup_review_command.py +0 -0
  649. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_only.py +0 -0
  650. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_plan_parser.py +0 -0
  651. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_platform_paths.py +0 -0
  652. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_bridge.py +0 -0
  653. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_config.py +0 -0
  654. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_portal_sync.py +0 -0
  655. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_pr_body_lint.py +0 -0
  656. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_prereqs.py +0 -0
  657. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_production_db_guard.py +0 -0
  658. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_progress.py +0 -0
  659. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_provider_seam.py +0 -0
  660. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers.py +0 -0
  661. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_providers_config_labels.py +0 -0
  662. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_quiet_hours.py +0 -0
  663. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_quiet_hours_store_2146.py +0 -0
  664. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reap_merged_sessions.py +0 -0
  665. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reap_stale_interactive_tick.py +0 -0
  666. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile.py +0 -0
  667. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_branch.py +0 -0
  668. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_completions.py +0 -0
  669. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_merges.py +0 -0
  670. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_no_agent_record.py +0 -0
  671. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_tick.py +0 -0
  672. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reconcile_usage_limit_done.py +0 -0
  673. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_refine_chat.py +0 -0
  674. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_2101.py +0 -0
  675. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  676. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_cordon_deadlock_2240.py +0 -0
  677. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_propagate.py +0 -0
  678. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_unified_1242.py +0 -0
  679. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_verify.py +0 -0
  680. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_release_window.py +0 -0
  681. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_remote_auto_prune.py +0 -0
  682. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_remote_interactive_reaper.py +0 -0
  683. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_edit_2220.py +0 -0
  684. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_graph_fleet_2237.py +0 -0
  685. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_repo_onboard_2220.py +0 -0
  686. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_report_result_push.py +0 -0
  687. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_reports.py +0 -0
  688. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry.py +0 -0
  689. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry_advisory_1606.py +0 -0
  690. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_retry_type_1636.py +0 -0
  691. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_revalidate.py +0 -0
  692. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review.py +0 -0
  693. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_end_review_without_verdict.py +0 -0
  694. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_parse_failure_diagnostic.py +0 -0
  695. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_reaffirm.py +0 -0
  696. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_state.py +0 -0
  697. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_backstop.py +0 -0
  698. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_override_audit.py +0 -0
  699. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_verdict_relay.py +0 -0
  700. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_review_zero_commits.py +0 -0
  701. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_scoped_review_wiring.py +0 -0
  702. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_scorecard.py +0 -0
  703. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_self_health.py +0 -0
  704. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_serve.py +0 -0
  705. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_serve_app_board_trim.py +0 -0
  706. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_session.py +0 -0
  707. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_slice_issue_attribution.py +0 -0
  708. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke.py +0 -0
  709. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke_live_checkout_restore.py +0 -0
  710. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_smoke_workflow.py +0 -0
  711. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_spend_ceiling.py +0 -0
  712. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_spend_ceiling_coordinator.py +0 -0
  713. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_split.py +0 -0
  714. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_split_work.py +0 -0
  715. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stage_projection.py +0 -0
  716. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stalled_pipeline.py +0 -0
  717. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_state_review_findings_daemon.py +0 -0
  718. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_status_fleet_footer.py +0 -0
  719. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stop_1567.py +0 -0
  720. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_stuck.py +0 -0
  721. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_terminal_command.py +0 -0
  722. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_author.py +0 -0
  723. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_chat.py +0 -0
  724. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_orchestrator.py +0 -0
  725. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_report.py +0 -0
  726. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_verdict_parsing.py +0 -0
  727. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_test_verdict_transcript_floor.py +0 -0
  728. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_board_audit.py +0 -0
  729. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_config_load_1080.py +0 -0
  730. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_thin_client_daemon_routing_906.py +0 -0
  731. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_tmux_host.py +0 -0
  732. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_tmux_session.py +0 -0
  733. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_transcript_floor.py +0 -0
  734. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage.py +0 -0
  735. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage_limits.py +0 -0
  736. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_usage_rollup.py +0 -0
  737. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_venv_live_install_2121.py +0 -0
  738. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_version_single_source.py +0 -0
  739. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_watch.py +0 -0
  740. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  741. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_events.py +0 -0
  742. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_image_pin_sync.py +0 -0
  743. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worker_safety.py +0 -0
  744. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worktree.py +0 -0
  745. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  746. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/Cargo.lock +0 -0
  747. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/Cargo.toml +0 -0
  748. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/cargo-config-local-quadraui.toml.example +0 -0
  749. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/audit.rs +0 -0
  750. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/chat.rs +0 -0
  751. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/data.rs +0 -0
  752. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/dialogs.rs +0 -0
  753. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/doc_tabs.rs +0 -0
  754. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/drive.rs +0 -0
  755. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/drive_queue.rs +0 -0
  756. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/escalation.rs +0 -0
  757. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/events.rs +0 -0
  758. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fixtures.rs +0 -0
  759. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_health.rs +0 -0
  760. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_sessions.rs +0 -0
  761. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/fleet_terminals.rs +0 -0
  762. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/format.rs +0 -0
  763. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/milestone_dag.rs +0 -0
  764. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/mod.rs +0 -0
  765. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/msv.rs +0 -0
  766. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/pipeline.rs +0 -0
  767. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/plans.rs +0 -0
  768. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/render.rs +0 -0
  769. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/reports.rs +0 -0
  770. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/sessions.rs +0 -0
  771. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/settings_ui.rs +0 -0
  772. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/sidebar.rs +0 -0
  773. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/terminal.rs +0 -0
  774. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/tests.rs +0 -0
  775. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/types.rs +0 -0
  776. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/app/workspace.rs +0 -0
  777. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/bin/gtk.rs +0 -0
  778. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/commands.rs +0 -0
  779. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/lib.rs +0 -0
  780. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/main.rs +0 -0
  781. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/src/settings.rs +0 -0
  782. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/tests/acceptance.rs +0 -0
  783. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/tui/tests/cli.rs +0 -0
  784. {code_coordinator-0.5.187 → code_coordinator-0.5.189}/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.187
3
+ Version: 0.5.189
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.187
3
+ Version: 0.5.189
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.187",
2
+ "tag": "0.5.189",
3
3
  "distance": 0,
4
- "node": "gc74dfc5a8d399b33526076eaec24aed5d5ad1ce3",
4
+ "node": "g9c81a5128ae2355b8dee8b005e2836f58e553167",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-20"
@@ -3678,6 +3678,49 @@ NEW_ISSUE_CHAT_DENY_COMMANDS: list[str] = [
3678
3678
  ]
3679
3679
 
3680
3680
 
3681
+ # Deny list applied to review workers (#2461). Unlike every other member of
3682
+ # WRITE_CAPABLE_SPEC_TYPES, a reviewer has ZERO legitimate mutations of its
3683
+ # own — coord.review.REVIEWER_SYSTEM_PROMPT already tells it "You are NOT
3684
+ # allowed to push commits or modify the PR's code. You only review" and "You
3685
+ # are NOT allowed to run any `gh` commands" (the coordinator posts the
3686
+ # review on its behalf after the session ends). Before #2461 that was
3687
+ # enforced by the PROMPT ALONE: `"review"` wasn't one of the explicit
3688
+ # branches in `default_worker_command`, so it fell through to the generic
3689
+ # `else` below and got the exact same `Read,Edit,Write,Bash,Monitor` grant as
3690
+ # a real work leg — nothing but the model's own good behaviour stood between
3691
+ # "read the diff" and "silently commit a fix and push it". This list is
3692
+ # wired into BOTH the system prompt (via `build_deny_prompt`, soft — a
3693
+ # reminder) AND `--disallowedTools` (CLI-enforced, hard — see the
3694
+ # `spec.type == "review"` branch below) so a reviewer that ignores its own
3695
+ # prompt still cannot shell out to a mutating git/gh command. The read-only
3696
+ # git the briefing actually tells reviewers to run (`git fetch`, `git diff`,
3697
+ # `git log`) stays allowed by omission.
3698
+ REVIEW_DENY_COMMANDS: list[str] = [
3699
+ "Bash(gh *)",
3700
+ "Bash(git push *)",
3701
+ "Bash(git commit *)",
3702
+ "Bash(git add *)",
3703
+ "Bash(git merge *)",
3704
+ "Bash(git rebase *)",
3705
+ "Bash(git cherry-pick *)",
3706
+ "Bash(git reset *)",
3707
+ "Bash(git checkout *)",
3708
+ "Bash(git switch *)",
3709
+ "Bash(git branch *)",
3710
+ "Bash(git stash *)",
3711
+ "Bash(git clean *)",
3712
+ "Bash(git rm *)",
3713
+ "Bash(git apply *)",
3714
+ "Bash(git am *)",
3715
+ "Bash(git tag *)",
3716
+ "Bash(rm -rf *)",
3717
+ "Bash(rm -fr *)",
3718
+ "Bash(coord approve *)",
3719
+ "Bash(coord merge *)",
3720
+ "Bash(coord assign *)",
3721
+ ]
3722
+
3723
+
3681
3724
  WorkerCommandBuilder = Callable[[AssignmentSpec], list[str]]
3682
3725
 
3683
3726
 
@@ -4111,6 +4154,26 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
4111
4154
  system_prompt = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
4112
4155
  system_prompt += build_deny_prompt(spec.deny_commands)
4113
4156
  allowed_tools = "Read,Bash"
4157
+ elif spec.type == "review":
4158
+ # #2461: give review its own branch instead of falling through to
4159
+ # the generic `else` below — see REVIEW_DENY_COMMANDS for the full
4160
+ # story. A reviewer reads the diff and reports a verdict; it edits
4161
+ # and pushes nothing, so it gets no Edit/Write. `Monitor` is
4162
+ # withheld too, for the same #1394/#2301 reason the `smoke` branch
4163
+ # above withholds it: a review leg is a one-shot `claude -p`
4164
+ # session, and an await-a-notification tool that only resumes an
4165
+ # INTERACTIVE session would silently kill it mid-run.
4166
+ #
4167
+ # A scratch/tmp path outside the worktree (e.g. `/tmp/...`) stays
4168
+ # writable for a reviewer that wants to stage its findings before
4169
+ # the final `coord report-result --body-file` call — Bash retains
4170
+ # ordinary shell redirection (`cat >`, heredocs) even with no Write
4171
+ # tool grant; only the Edit/Write *tools* (which target the
4172
+ # worktree/repo) and the mutating git/gh commands below are blocked.
4173
+ from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
4174
+ system_prompt = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
4175
+ system_prompt += build_deny_prompt(REVIEW_DENY_COMMANDS)
4176
+ allowed_tools = "Read,Bash"
4114
4177
  else:
4115
4178
  system_prompt = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
4116
4179
  system_prompt += build_deny_prompt(spec.deny_commands)
@@ -4177,6 +4240,14 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
4177
4240
  for pattern in _base_checkout_write_guard_tools(spec.repo_path):
4178
4241
  if pattern not in disallowed_tools:
4179
4242
  disallowed_tools.append(pattern)
4243
+ # #2461: review gets its mutating-command deny list wired into
4244
+ # --disallowedTools too, not just the soft system-prompt reminder from
4245
+ # build_deny_prompt above — the CLI enforces this one even if the model
4246
+ # decides to ignore its own prompt.
4247
+ if spec.type == "review":
4248
+ for pattern in REVIEW_DENY_COMMANDS:
4249
+ if pattern not in disallowed_tools:
4250
+ disallowed_tools.append(pattern)
4180
4251
  if disallowed_tools:
4181
4252
  argv.extend(["--disallowedTools", ",".join(disallowed_tools)])
4182
4253
  # #315: when resuming a prior chat session, load the prior conversation so
@@ -91,6 +91,7 @@ from coord.notifier.cli import notifier_group
91
91
  # client, coord/commands/portal.py is the CLI over it.
92
92
  from coord.commands.portal import portal_group
93
93
  from coord.commands.merge import (
94
+ backfill_review_cost,
94
95
  bounce,
95
96
  merge,
96
97
  post_pending_reviews,
@@ -442,6 +443,7 @@ main.add_command(unqueue)
442
443
  main.add_command(set_test_mode)
443
444
  main.add_command(notify)
444
445
  main.add_command(post_pending_reviews)
446
+ main.add_command(backfill_review_cost)
445
447
  main.add_command(merge)
446
448
  main.add_command(resume)
447
449
  main.add_command(test)
@@ -883,6 +883,85 @@ def post_pending_reviews(config_path: Path, repo_name: str | None) -> None:
883
883
  )
884
884
 
885
885
 
886
+ @click.command(
887
+ "backfill-review-cost",
888
+ help=(
889
+ "One-shot repair for #2476: capture cost/tokens for review "
890
+ "assignments left at cost_usd IS NULL/0 by the review-completion "
891
+ "capture gap (post_orphaned_review_findings recovered the verdict "
892
+ "but never captured cost/tokens — fixed going forward, this repairs "
893
+ "the backlog it already created).\n\n"
894
+ "Walks every terminal type='review' row with cost_usd IS NULL or 0, "
895
+ "tries the local log first, then the assignment's agent /logs/<id> "
896
+ "endpoint, parses, and persists via the same "
897
+ "update_assignment_cost/update_assignment_tokens writers the live "
898
+ "capture path uses — no new write mechanism. Run once per machine "
899
+ "that hosts review logs; logs that have already aged out (or "
900
+ "whose agent is offline) are reported as still-missing rather than "
901
+ "silently dropped, so the residual gap stays known."
902
+ ),
903
+ )
904
+ @_CONFIG_OPTION
905
+ @click.option("--repo", "repo_name", default=None, help="Only process assignments for this repo.")
906
+ def backfill_review_cost(config_path: Path, repo_name: str | None) -> None:
907
+ from coord.notify import _capture_cost_and_tokens_for_review
908
+ from coord.state import load_review_assignments_missing_cost
909
+ from coord.usage import LOGS_DIR
910
+
911
+ cfg = _load_config(config_path)
912
+ machines_by_name = {m.name: m for m in cfg.machines}
913
+
914
+ candidates = load_review_assignments_missing_cost(repo_name=repo_name)
915
+ if not candidates:
916
+ click.echo("No review assignments with missing cost/tokens found.")
917
+ return
918
+
919
+ click.echo(f"Found {len(candidates)} review assignment(s) with missing cost/tokens:")
920
+ for row in candidates:
921
+ click.echo(
922
+ f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']} "
923
+ f"(machine: {row['machine_name']})"
924
+ )
925
+
926
+ recovered: list[dict] = []
927
+ still_missing: list[dict] = []
928
+ for row in candidates:
929
+ aid = row["assignment_id"]
930
+ machine = machines_by_name.get(row["machine_name"])
931
+ host = machine.host if machine is not None else None
932
+ # #2476: always offer the conventional local path — it resolves
933
+ # correctly whenever this command runs on the same box that hosted
934
+ # the review (the common case for a per-machine repair run), and is
935
+ # a harmless miss otherwise (falls straight through to the *host*
936
+ # fetch below, same as `_capture_cost_and_tokens_for_review` already
937
+ # does for every other caller).
938
+ log_path = str(LOGS_DIR / f"{aid}.log")
939
+ wrote = _capture_cost_and_tokens_for_review(
940
+ aid, log_path=log_path, host=host,
941
+ provider_name=row.get("provider_name"),
942
+ )
943
+ (recovered if wrote else still_missing).append(row)
944
+
945
+ click.echo(f"\nRecovered cost/tokens for {len(recovered)} assignment(s):")
946
+ for row in recovered:
947
+ click.echo(f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']}")
948
+
949
+ if still_missing:
950
+ click.echo(
951
+ f"\n{len(still_missing)} assignment(s) still missing "
952
+ "(log gone on disk and agent unreachable/offline):"
953
+ )
954
+ for row in still_missing:
955
+ click.echo(
956
+ f" {row['assignment_id']} — {row['repo_name']} #{row['issue_number']} "
957
+ f"(machine: {row['machine_name']})"
958
+ )
959
+ click.echo(
960
+ f"\nSummary: {len(recovered)} recovered, {len(still_missing)} still missing "
961
+ f"of {len(candidates)} total."
962
+ )
963
+
964
+
886
965
  def _load_issue_states() -> tuple[dict[str, set[int]], dict[str, set[int]]]:
887
966
  """Return ``(open_by_repo, known_by_repo)``.
888
967
 
@@ -2133,28 +2133,26 @@ def _persist_review_findings(assignment_id: str, verdict: str, body: str) -> Non
2133
2133
  )
2134
2134
 
2135
2135
 
2136
- def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
2137
- """Best-effort raw log text for #1956/#1348 diagnostics.
2136
+ def _fetch_raw_log_text_by_id(
2137
+ assignment_id: str, log_path: str | None, host: str | None,
2138
+ ) -> str | None:
2139
+ """Shared local-file-then-agent-fetch raw-text primitive.
2138
2140
 
2139
- Mirrors the local-file-then-agent-fetch fallback :func:`_try_parse_and_post_review`
2140
- itself uses to PARSE the log, but returns the raw text instead — the
2141
- diagnostic detectors (:func:`coord.review.detect_end_review_without_verdict`,
2142
- :func:`coord.review.detect_unparsed_review_marker`) need the text the
2143
- strict parser already rejected, not another parse attempt. Returns
2144
- ``None`` on any I/O failure — diagnostics are best-effort by design and
2145
- must never be the reason ``coord notify`` raises.
2141
+ Tries *log_path* on the local filesystem first (cheap, no network); when
2142
+ that's absent or unreadable (the worker ran on a remote agent whose log
2143
+ isn't on this filesystem), falls back to fetching it via the agent's
2144
+ ``/logs/<id>`` endpoint at *host*. Returns ``None`` when neither source
2145
+ yields text — every caller here is best-effort by design.
2146
2146
  """
2147
- log_path = entry.get("log_path")
2148
2147
  if log_path:
2149
2148
  try:
2150
2149
  return Path(log_path).read_text(encoding="utf-8", errors="replace")
2151
2150
  except OSError:
2152
2151
  pass
2153
- host = _agent_host(transition.machine_name)
2154
2152
  if host:
2155
2153
  try:
2156
2154
  resp = httpx.get(
2157
- f"http://{host}:{AGENT_PORT}/logs/{transition.assignment_id}",
2155
+ f"http://{host}:{AGENT_PORT}/logs/{assignment_id}",
2158
2156
  timeout=15.0,
2159
2157
  )
2160
2158
  resp.raise_for_status()
@@ -2164,6 +2162,126 @@ def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
2164
2162
  return None
2165
2163
 
2166
2164
 
2165
+ def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
2166
+ """Best-effort raw log text for #1956/#1348 diagnostics.
2167
+
2168
+ Mirrors the local-file-then-agent-fetch fallback :func:`_try_parse_and_post_review`
2169
+ itself uses to PARSE the log, but returns the raw text instead — the
2170
+ diagnostic detectors (:func:`coord.review.detect_end_review_without_verdict`,
2171
+ :func:`coord.review.detect_unparsed_review_marker`) need the text the
2172
+ strict parser already rejected, not another parse attempt. Returns
2173
+ ``None`` on any I/O failure — diagnostics are best-effort by design and
2174
+ must never be the reason ``coord notify`` raises.
2175
+ """
2176
+ log_path = entry.get("log_path")
2177
+ host = _agent_host(transition.machine_name)
2178
+ return _fetch_raw_log_text_by_id(transition.assignment_id, log_path, host)
2179
+
2180
+
2181
+ def _capture_cost_and_tokens_for_review(
2182
+ assignment_id: str,
2183
+ *,
2184
+ log_path: str | None,
2185
+ host: str | None,
2186
+ provider_name: str | None = None,
2187
+ ) -> bool:
2188
+ """#2476: best-effort cost/token capture for a review row, local-log-
2189
+ first with a remote-agent-fetch fallback.
2190
+
2191
+ ``post_transition``'s ``_capture_cost`` is the ONLY place cost/tokens get
2192
+ captured for a review that completes through the direct
2193
+ ``detect_transitions`` path — but investigation of #2476 found the
2194
+ majority of review completions actually get their GitHub comment posted
2195
+ later, by :func:`post_orphaned_review_findings` (run_drain's step 4,
2196
+ which runs on every ~60s drain tick, not just as manual cleanup): that
2197
+ function does its own independent ``/status`` poll and local-then-remote
2198
+ log fallback to recover the VERDICT, but until now never captured
2199
+ cost/tokens at all. Once that row is marked ``notified``/
2200
+ ``review_posted_at``, nothing ever revisits it — so a review rescued by
2201
+ the orphaned-findings path was permanently stuck at ``cost_usd IS NULL``
2202
+ even though the exact same log :func:`post_orphaned_review_findings`
2203
+ just successfully parsed the verdict from also has a perfectly good
2204
+ ``total_cost_usd`` in it.
2205
+
2206
+ Mirrors :func:`_capture_cost`'s log-parse-then-persist logic (same
2207
+ :func:`coord.usage.parse_usage_from_log`, same
2208
+ ``update_assignment_cost``/``update_assignment_tokens`` writers) so this
2209
+ is not a new capture mechanism — just the existing one, reachable from a
2210
+ second call site. Never raises; returns True iff something was
2211
+ persisted.
2212
+ """
2213
+ from coord.state import update_assignment_cost, update_assignment_tokens # noqa: PLC0415
2214
+ from coord.usage import parse_usage_from_log # noqa: PLC0415
2215
+
2216
+ parsed = None
2217
+ if log_path:
2218
+ try:
2219
+ parsed = parse_usage_from_log(Path(log_path), provider_name=provider_name)
2220
+ except Exception as exc: # noqa: BLE001
2221
+ log.debug(
2222
+ "_capture_cost_and_tokens_for_review: local parse failed for %s: %s",
2223
+ assignment_id, exc,
2224
+ )
2225
+ parsed = None
2226
+
2227
+ if parsed is None and host:
2228
+ text = _fetch_raw_log_text_by_id(assignment_id, None, host)
2229
+ if text:
2230
+ import tempfile # noqa: PLC0415
2231
+
2232
+ try:
2233
+ with tempfile.NamedTemporaryFile(
2234
+ mode="w", suffix=".log", delete=True
2235
+ ) as tf:
2236
+ tf.write(text)
2237
+ tf.flush()
2238
+ parsed = parse_usage_from_log(
2239
+ Path(tf.name), provider_name=provider_name
2240
+ )
2241
+ except Exception as exc: # noqa: BLE001
2242
+ log.debug(
2243
+ "_capture_cost_and_tokens_for_review: remote parse failed "
2244
+ "for %s: %s", assignment_id, exc,
2245
+ )
2246
+ parsed = None
2247
+
2248
+ if parsed is None:
2249
+ return False
2250
+
2251
+ wrote = False
2252
+ if parsed.total_cost_usd and parsed.total_cost_usd > 0:
2253
+ try:
2254
+ update_assignment_cost(assignment_id, parsed.total_cost_usd)
2255
+ wrote = True
2256
+ except Exception as exc: # noqa: BLE001
2257
+ log.warning(
2258
+ "_capture_cost_and_tokens_for_review: failed to persist cost "
2259
+ "for %s: %s", assignment_id, exc,
2260
+ )
2261
+
2262
+ token_total = (
2263
+ parsed.input_tokens + parsed.output_tokens
2264
+ + parsed.cache_creation_tokens + parsed.cache_read_tokens
2265
+ )
2266
+ if token_total > 0:
2267
+ try:
2268
+ update_assignment_tokens(
2269
+ assignment_id,
2270
+ input_tokens=parsed.input_tokens,
2271
+ output_tokens=parsed.output_tokens,
2272
+ cache_creation_tokens=parsed.cache_creation_tokens,
2273
+ cache_read_tokens=parsed.cache_read_tokens,
2274
+ )
2275
+ wrote = True
2276
+ except Exception as exc: # noqa: BLE001
2277
+ log.warning(
2278
+ "_capture_cost_and_tokens_for_review: failed to persist "
2279
+ "tokens for %s: %s", assignment_id, exc,
2280
+ )
2281
+
2282
+ return wrote
2283
+
2284
+
2167
2285
  def _warn_missing_review_verdict(
2168
2286
  transition: Transition, entry: dict, diagnostic: list,
2169
2287
  ) -> None:
@@ -2838,6 +2956,20 @@ def post_orphaned_review_findings(
2838
2956
  for row in rows:
2839
2957
  aid = row["assignment_id"]
2840
2958
  log_path = log_by_id.get(aid)
2959
+
2960
+ # #2476: capture cost/tokens for this row too. This is the ONLY
2961
+ # place a review whose verdict is being recovered here (rather
2962
+ # than through the direct detect_transitions → post_transition
2963
+ # path, which already calls `_capture_cost`) ever gets a chance
2964
+ # at cost/token capture — once `posted`/`mark_notified` below
2965
+ # lands, nothing ever revisits this row. Independent of whether
2966
+ # findings parsing succeeds: a row whose body can't be recovered
2967
+ # can still have its cost recovered from the same log.
2968
+ _capture_cost_and_tokens_for_review(
2969
+ aid, log_path=log_path, host=machine.host,
2970
+ provider_name=row.get("provider_name"),
2971
+ )
2972
+
2841
2973
  findings = None
2842
2974
  # Try local file first (cheap) — works when notify runs on the
2843
2975
  # same host as the agent. Falls back to fetching via HTTP so the
@@ -113,6 +113,7 @@ class ClaudeProvider(Provider):
113
113
  NEW_ISSUE_CHAT_DENY_COMMANDS,
114
114
  NEW_ISSUE_CHAT_SYSTEM_PROMPT,
115
115
  REFINEMENT_SYSTEM_PROMPT,
116
+ REVIEW_DENY_COMMANDS,
116
117
  TEST_CHAT_SYSTEM_PROMPT,
117
118
  WORKER_PLAN_PROMPT,
118
119
  WORKER_SYSTEM_PROMPT,
@@ -120,6 +121,7 @@ class ClaudeProvider(Provider):
120
121
  _sealed_write_guard_tools,
121
122
  build_deny_prompt,
122
123
  )
124
+ from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
123
125
  from coord.smoke import SMOKE_SYSTEM_PROMPT # noqa: PLC0415
124
126
 
125
127
  binary = self._binary if self._binary is not None else DEFAULT_WORKER_BINARY
@@ -180,6 +182,17 @@ class ClaudeProvider(Provider):
180
182
  _sp = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
181
183
  _sp += build_deny_prompt(spec.deny_commands)
182
184
  _at = "Read,Bash"
185
+ elif spec.type == "review":
186
+ # #2461: keep in sync with default_worker_command's identical
187
+ # branch — a reviewer reads the diff and reports a verdict,
188
+ # it edits and pushes nothing, so Read,Bash only (no
189
+ # Edit/Write, no Monitor — same one-shot-session reasoning as
190
+ # the `smoke` branch above). See REVIEW_DENY_COMMANDS for why
191
+ # its mutating-command deny list also lands in
192
+ # --disallowedTools below, not just this prompt text.
193
+ _sp = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
194
+ _sp += build_deny_prompt(REVIEW_DENY_COMMANDS)
195
+ _at = "Read,Bash"
183
196
  else:
184
197
  _sp = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
185
198
  _sp += build_deny_prompt(spec.deny_commands)
@@ -217,6 +230,12 @@ class ClaudeProvider(Provider):
217
230
  for pattern in _base_checkout_write_guard_tools(spec.repo_path):
218
231
  if pattern not in disallowed_tools:
219
232
  disallowed_tools.append(pattern)
233
+ # #2461: same CLI-enforced hard block as default_worker_command —
234
+ # see REVIEW_DENY_COMMANDS.
235
+ if spec.type == "review":
236
+ for pattern in REVIEW_DENY_COMMANDS:
237
+ if pattern not in disallowed_tools:
238
+ disallowed_tools.append(pattern)
220
239
  if disallowed_tools:
221
240
  argv.extend(["--disallowedTools", ",".join(disallowed_tools)])
222
241
  if spec.resume_session_id:
@@ -433,6 +433,7 @@ class ClaudePtyProvider(Provider):
433
433
  NEW_ISSUE_CHAT_DENY_COMMANDS,
434
434
  NEW_ISSUE_CHAT_SYSTEM_PROMPT,
435
435
  REFINEMENT_SYSTEM_PROMPT,
436
+ REVIEW_DENY_COMMANDS,
436
437
  TEST_CHAT_SYSTEM_PROMPT,
437
438
  WORKER_PLAN_PROMPT,
438
439
  WORKER_SYSTEM_PROMPT,
@@ -497,6 +498,16 @@ class ClaudePtyProvider(Provider):
497
498
  _sp = spec.system_prompt if spec.system_prompt else SMOKE_SYSTEM_PROMPT
498
499
  _sp += build_deny_prompt(spec.deny_commands)
499
500
  _at = "Read,Bash"
501
+ elif spec.type == "review":
502
+ # #2461: keep in sync with default_worker_command's identical
503
+ # branch — a reviewer reads the diff and reports a verdict,
504
+ # it edits and pushes nothing, so Read,Bash only (no
505
+ # Edit/Write, no Monitor — same one-shot-session reasoning as
506
+ # the `smoke` branch above).
507
+ from coord.review import REVIEWER_SYSTEM_PROMPT # noqa: PLC0415
508
+ _sp = spec.system_prompt if spec.system_prompt else REVIEWER_SYSTEM_PROMPT
509
+ _sp += build_deny_prompt(REVIEW_DENY_COMMANDS)
510
+ _at = "Read,Bash"
500
511
  else:
501
512
  _sp = spec.system_prompt if spec.system_prompt else WORKER_SYSTEM_PROMPT
502
513
  _sp += build_deny_prompt(spec.deny_commands)
@@ -3248,6 +3248,13 @@ def load_done_reviews_needing_post(repo_name: str | None = None) -> list[dict]:
3248
3248
  "review_of_assignment_id": a.get("review_of_assignment_id"),
3249
3249
  "review_target": a.get("review_target"),
3250
3250
  "status": a.get("status"),
3251
+ # #2476: threaded through to
3252
+ # coord.notify._capture_cost_and_tokens_for_review so
3253
+ # post_orphaned_review_findings' cost/token capture
3254
+ # resolves the right Provider instead of always
3255
+ # assuming claude (mirrors the #1710 provider_name
3256
+ # threading everywhere else cost is parsed).
3257
+ "provider_name": a.get("provider_name"),
3251
3258
  })
3252
3259
  return results
3253
3260
  except Exception: # noqa: BLE001 — daemon unreachable → local fallback
@@ -3277,6 +3284,80 @@ def _load_done_reviews_needing_post_local(repo_name: str | None = None) -> list[
3277
3284
  return [_row_to_dispatched_dict(row) for row in rows]
3278
3285
 
3279
3286
 
3287
+ def load_review_assignments_missing_cost(repo_name: str | None = None) -> list[dict]:
3288
+ """#2476: return terminal review assignments whose cost was never
3289
+ captured (``cost_usd IS NULL OR cost_usd = 0``).
3290
+
3291
+ Feeds ``coord backfill-review-cost`` — the one-shot repair for the
3292
+ already-lost data the #2476 capture gap left behind. Unlike
3293
+ :func:`load_done_reviews_needing_post` this is NOT scoped to
3294
+ ``status='done'``/``review_posted_at IS NULL`` — a review can be
3295
+ terminal (``done``/``failed``/``advisory``) with a perfectly good
3296
+ verdict already posted and STILL be missing cost, since the capture gap
3297
+ is independent of whether the findings post succeeded. Excludes
3298
+ ``running``/``pending``/``finalizing`` rows: a still-in-flight or
3299
+ not-yet-promoted review has no final cost to recover yet — the live
3300
+ capture path (or a later backfill run) is the right place for those,
3301
+ not a one-shot repair racing an in-progress worker.
3302
+
3303
+ Optionally filtered to a single repo by *repo_name*. Returns dicts in
3304
+ the same shape as :func:`load_done_reviews_needing_post` (including
3305
+ ``provider_name`` for :func:`coord.notify._capture_cost_and_tokens_for_review`).
3306
+
3307
+ **Daemon-aware:** mirrors :func:`load_done_reviews_needing_post` — reads
3308
+ the ``GET /board`` payload when a ``board_service`` is configured so a
3309
+ thin client sees the real candidates instead of an empty local table.
3310
+ """
3311
+ svc = _board_service()
3312
+ if svc is not None:
3313
+ try:
3314
+ from coord.client import fetch_board_payload # noqa: PLC0415
3315
+
3316
+ payload = fetch_board_payload(svc)
3317
+ results: list[dict] = []
3318
+ for a in payload.get("assignments", []):
3319
+ if (
3320
+ a.get("type") == "review"
3321
+ and a.get("status") not in ("running", "pending", "finalizing")
3322
+ and not (a.get("cost_usd") or 0)
3323
+ and (repo_name is None or a.get("repo_name") == repo_name)
3324
+ ):
3325
+ results.append({
3326
+ "assignment_id": a.get("assignment_id"),
3327
+ "machine_name": a.get("machine_name", ""),
3328
+ "repo_name": a.get("repo_name", ""),
3329
+ "repo_github": a.get("repo_github"),
3330
+ "issue_number": a.get("issue_number", 0),
3331
+ "issue_title": a.get("issue_title", ""),
3332
+ "status": a.get("status"),
3333
+ "provider_name": a.get("provider_name"),
3334
+ })
3335
+ return results
3336
+ except Exception: # noqa: BLE001 — daemon unreachable → local fallback
3337
+ pass
3338
+ return _load_review_assignments_missing_cost_local(repo_name=repo_name)
3339
+
3340
+
3341
+ def _load_review_assignments_missing_cost_local(repo_name: str | None = None) -> list[dict]:
3342
+ """Local-DB read for :func:`load_review_assignments_missing_cost`."""
3343
+ conn = get_connection()
3344
+ where = (
3345
+ "type='review' AND status NOT IN ('running', 'pending', 'finalizing') "
3346
+ "AND (cost_usd IS NULL OR cost_usd = 0)"
3347
+ )
3348
+ if repo_name:
3349
+ rows = conn.execute(
3350
+ f"SELECT * FROM assignments WHERE {where} AND repo_name=? "
3351
+ "ORDER BY finished_at",
3352
+ (repo_name,),
3353
+ ).fetchall()
3354
+ else:
3355
+ rows = conn.execute(
3356
+ f"SELECT * FROM assignments WHERE {where} ORDER BY finished_at",
3357
+ ).fetchall()
3358
+ return [_row_to_dispatched_dict(row) for row in rows]
3359
+
3360
+
3280
3361
  # ── Plan persistence ────────────────────────────────────────────────────────────
3281
3362
 
3282
3363
  def save_plan(assignment_id: str, plan_dict: dict) -> None: