code-coordinator 0.5.186__tar.gz → 0.5.188__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.186 → code_coordinator-0.5.188}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/cli.py +2 -0
  5. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/merge.py +82 -1
  6. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/conflict_fix.py +55 -6
  7. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/merge_queue.py +12 -0
  8. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notify.py +152 -14
  9. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/state.py +81 -0
  10. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_merge.py +116 -0
  11. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_conflict_fix.py +94 -0
  12. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notify.py +171 -0
  13. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_state.py +97 -0
  14. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/cargo-test.yml +0 -0
  25. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/release-tui.yml +0 -0
  27. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/.gitignore +0 -0
  29. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/GOAL.md +0 -0
  31. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/LICENSE +0 -0
  32. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/README.md +0 -0
  34. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/SOURCES.txt +0 -0
  35. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/scm_file_list.json +0 -0
  39. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent.py +0 -0
  45. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/block_log.py +0 -0
  53. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_bool_guard.py +0 -0
  54. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/client.py +0 -0
  64. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/repo.py +0 -0
  84. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/terminal.py +0 -0
  91. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/test_gate.py +0 -0
  92. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/commands/tui.py +0 -0
  93. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/comments.py +0 -0
  94. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/config.py +0 -0
  95. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/config_reload.py +0 -0
  96. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dao.py +0 -0
  97. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/__init__.py +0 -0
  98. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/fixture.py +0 -0
  99. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/index.html +0 -0
  100. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/server.py +0 -0
  101. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dashboard/terminal.py +0 -0
  102. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/db.py +0 -0
  103. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dead_end.py +0 -0
  104. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/README.md +0 -0
  105. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-agent.service +0 -0
  106. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.service +0 -0
  107. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.sh +0 -0
  108. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-db-backup.timer +0 -0
  109. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-drive-queue.service +0 -0
  110. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-drive-queue.timer +0 -0
  111. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-notify.service +0 -0
  112. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-notify.timer +0 -0
  113. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-propagate.service +0 -0
  114. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-propagate.timer +0 -0
  115. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-window.service +0 -0
  116. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-release-window.timer +0 -0
  117. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-serve.service +0 -0
  118. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web-dist-build.service +0 -0
  119. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web-dist-build.timer +0 -0
  120. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy/coord-web.service +0 -0
  121. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy_manifest.py +0 -0
  122. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deploy_units.py +0 -0
  123. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/deps.py +0 -0
  124. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/diagnose.py +0 -0
  125. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dispatch.py +0 -0
  126. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/dist_name.py +0 -0
  127. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive.py +0 -0
  128. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive_queue.py +0 -0
  129. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/drive_state.py +0 -0
  130. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/events.py +0 -0
  131. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/failure_class.py +0 -0
  132. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/filelock.py +0 -0
  133. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/fleet_config_health.py +0 -0
  134. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/freshness.py +0 -0
  135. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_a.py +0 -0
  136. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_b.py +0 -0
  137. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gate_snapshot.py +0 -0
  138. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/gates.py +0 -0
  139. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/github_ops.py +0 -0
  140. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/goal.py +0 -0
  141. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/graph_health.py +0 -0
  142. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/__init__.py +0 -0
  143. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/aggregate.py +0 -0
  144. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/__init__.py +0 -0
  145. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/agent_install.py +0 -0
  146. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/cargo_targets.py +0 -0
  147. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/claude_binary.py +0 -0
  148. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/coord_web_ci_pin.py +0 -0
  149. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/deploy_lane_facts.py +0 -0
  150. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/disk.py +0 -0
  151. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_board.py +0 -0
  152. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  153. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_phantom.py +0 -0
  154. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/fleet_unit_drift.py +0 -0
  155. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/graph.py +0 -0
  156. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/graphify_cli.py +0 -0
  157. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/index_lock.py +0 -0
  158. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/plan_usage.py +0 -0
  159. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/repo_state.py +0 -0
  160. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/spawned_coord.py +0 -0
  161. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/timer_active.py +0 -0
  162. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/toolchain.py +0 -0
  163. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/unit_drift.py +0 -0
  164. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/unit_enablement.py +0 -0
  165. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/checks/worktrees.py +0 -0
  166. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/cli.py +0 -0
  167. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/context.py +0 -0
  168. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/fleet_snapshot.py +0 -0
  169. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/models.py +0 -0
  170. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/pypi.py +0 -0
  171. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/registry.py +0 -0
  172. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/render.py +0 -0
  173. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/health/units.py +0 -0
  174. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/hooks.py +0 -0
  175. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/housekeeping.py +0 -0
  176. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/interactive.py +0 -0
  177. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/issue_store.py +0 -0
  178. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/liveness_auditor.py +0 -0
  179. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/machine_pause.py +0 -0
  180. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_chat.py +0 -0
  181. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_dispatch.py +0 -0
  182. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_gate.py +0 -0
  183. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/milestone_order.py +0 -0
  184. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/mock_author.py +0 -0
  185. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/models.py +0 -0
  186. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/network.py +0 -0
  187. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/new_issue_chat.py +0 -0
  188. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/__init__.py +0 -0
  189. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/baseline.py +0 -0
  190. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/cli.py +0 -0
  191. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/collect.py +0 -0
  192. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/digest.py +0 -0
  193. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/models.py +0 -0
  194. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/predicate.py +0 -0
  195. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/service.py +0 -0
  196. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/store.py +0 -0
  197. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/notifier/transport.py +0 -0
  198. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/openapi.py +0 -0
  199. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/overlap_fence.py +0 -0
  200. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/overlap_predict.py +0 -0
  201. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/parentage.py +0 -0
  202. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/parentage_github.py +0 -0
  203. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/pipeline.py +0 -0
  204. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/plan_parser.py +0 -0
  205. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/plans.py +0 -0
  206. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/platform_paths.py +0 -0
  207. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_bridge.py +0 -0
  208. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_store.py +0 -0
  209. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/portal_sync.py +0 -0
  210. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/pr_body_lint.py +0 -0
  211. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/prereqs.py +0 -0
  212. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/progress.py +0 -0
  213. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/__init__.py +0 -0
  214. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/base.py +0 -0
  215. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/claude.py +0 -0
  216. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/claude_pty.py +0 -0
  217. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/providers/opencode.py +0 -0
  218. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/queue_diagnose.py +0 -0
  219. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reconcile.py +0 -0
  220. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reconcile_tick.py +0 -0
  221. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/refine_chat.py +0 -0
  222. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_cordon.py +0 -0
  223. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_propagate.py +0 -0
  224. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_verify.py +0 -0
  225. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/release_window.py +0 -0
  226. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/repo_edit.py +0 -0
  227. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/repo_onboard.py +0 -0
  228. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/reports.py +0 -0
  229. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/revalidate.py +0 -0
  230. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/review.py +0 -0
  231. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/scorecard.py +0 -0
  232. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/self_health.py +0 -0
  233. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/serve_app.py +0 -0
  234. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  235. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  236. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  237. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  238. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  239. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/portal-followup/SKILL.md +0 -0
  240. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  241. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  242. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/skills/update-issue/SKILL.md +0 -0
  243. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/smoke.py +0 -0
  244. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/spend_ceiling.py +0 -0
  245. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/split_work.py +0 -0
  246. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/stage_projection.py +0 -0
  247. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_author.py +0 -0
  248. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_chat.py +0 -0
  249. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_orchestrator.py +0 -0
  250. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/test_report.py +0 -0
  251. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/tui_release.py +0 -0
  252. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage.py +0 -0
  253. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage_limits.py +0 -0
  254. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/usage_rollup.py +0 -0
  255. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coord/worker_events.py +0 -0
  256. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/coordinator.example.yml +0 -0
  257. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-agent.service +0 -0
  258. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.service +0 -0
  259. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.sh +0 -0
  260. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-db-backup.timer +0 -0
  261. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-drive-queue.service +0 -0
  262. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-drive-queue.timer +0 -0
  263. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-notify.service +0 -0
  264. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-notify.timer +0 -0
  265. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-propagate.service +0 -0
  266. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-propagate.timer +0 -0
  267. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-window.service +0 -0
  268. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-release-window.timer +0 -0
  269. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-serve.service +0 -0
  270. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.service +0 -0
  271. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.sh +0 -0
  272. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-dist-build.timer +0 -0
  273. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web-rollback.sh +0 -0
  274. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/coord-web.service +0 -0
  275. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/deploy/node-shim.sh +0 -0
  276. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  277. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_CI.md +0 -0
  278. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ADR_COORD_WEB_DIST.md +0 -0
  279. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/AGENT_OPERATIONS.md +0 -0
  280. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ARCHITECTURE.md +0 -0
  281. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ARCH_SECURITY_GATES.md +0 -0
  282. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/COCKPIT.md +0 -0
  283. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CONTROL_CENTER.md +0 -0
  284. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/COST_DISCIPLINE.md +0 -0
  285. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CROSS_PLATFORM.md +0 -0
  286. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/CUSTOMER_PORTAL.md +0 -0
  287. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/DRIVE_QUEUE.md +0 -0
  288. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/EPHEMERAL_WORKERS.md +0 -0
  289. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/FORGE_MIGRATION.md +0 -0
  290. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/GRAPHIFY_SETUP.md +0 -0
  291. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ISSUE_GUIDANCE.md +0 -0
  292. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/MAC_MINI.md +0 -0
  293. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  294. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/NOTIFIER.md +0 -0
  295. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/OPENCODE_VERIFICATION.md +0 -0
  296. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/OPERATING_GOTCHAS.md +0 -0
  297. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/ORACLE_LOOP.md +0 -0
  298. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PHONE_WEBAPP.md +0 -0
  299. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PIPELINE_V2.md +0 -0
  300. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/PLATFORM_EVOLUTION.md +0 -0
  301. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/SECOND_BACKEND.md +0 -0
  302. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/STORE_SERVICE.md +0 -0
  303. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  304. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/WEB_CONTROL_CENTER.md +0 -0
  305. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/WSL_WINDOWS_WORKER.md +0 -0
  306. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/README.md +0 -0
  307. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/_tokens.css +0 -0
  308. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/issue-detail.html +0 -0
  309. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/pipeline-narrow.html +0 -0
  310. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/docs/mocks/web/pipeline-wide.html +0 -0
  311. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/graphify-out/.gitignore +0 -0
  312. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/install-agent.sh +0 -0
  313. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/pyproject.toml +0 -0
  314. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/audit_review_verdict_overrides.py +0 -0
  315. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  316. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/build-worker-image.sh +0 -0
  317. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/coordinator-machine.py +0 -0
  318. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/epic-down.sh +0 -0
  319. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/epic-up.sh +0 -0
  320. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/preflight.sh +0 -0
  321. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/provision-worker.sh +0 -0
  322. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  323. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  324. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/azure-workers/verify-github-token.sh +0 -0
  325. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/codegen.py +0 -0
  326. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/coord-test-runner.sh +0 -0
  327. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/drive-batch.sh +0 -0
  328. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/gen_board_fixture.py +0 -0
  329. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/next_release_tag.py +0 -0
  330. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/run_tests_in_populated_home.sh +0 -0
  331. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/run_tests_without_gh.sh +0 -0
  332. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/smoke_437_interactive.py +0 -0
  333. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_878_review_capture.py +0 -0
  334. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_release_published.py +0 -0
  335. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/scripts/verify_release_wheel.py +0 -0
  336. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/setup.cfg +0 -0
  337. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/SMOKE_SET.md +0 -0
  338. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/__init__.py +0 -0
  339. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  340. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/contract.md +0 -0
  341. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/manifest.yml +0 -0
  342. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  343. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  344. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  345. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  346. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/conftest.py +0 -0
  347. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/contract.md +0 -0
  348. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/manifest.yml +0 -0
  349. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  350. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  351. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/contract.md +0 -0
  352. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/manifest.yml +0 -0
  353. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  354. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  355. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  356. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  357. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  358. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  359. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  360. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  361. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  362. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  363. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/contract.md +0 -0
  364. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  365. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  366. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/manifest.yml +0 -0
  367. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  368. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-51/tsconfig.json +0 -0
  369. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  370. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  371. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  372. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/contract.md +0 -0
  373. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  374. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/manifest.yml +0 -0
  375. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  376. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  377. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  378. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  379. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  380. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  381. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  382. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  383. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  384. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  385. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  386. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  387. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/conftest.py +0 -0
  388. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/board-pipeline-basic.json +0 -0
  389. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  390. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  391. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  392. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  393. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/all_pass.json +0 -0
  394. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  395. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/mixed_fail.json +0 -0
  396. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  397. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  398. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/skip.json +0 -0
  399. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/playwright/truncated.json +0 -0
  400. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  401. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  402. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  403. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  404. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  405. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  406. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  407. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  408. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_acceptance.py +0 -0
  409. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_acceptance_drivers.py +0 -0
  410. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent.py +0 -0
  411. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_api_error.py +0 -0
  412. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_app.py +0 -0
  413. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_branch_base.py +0 -0
  414. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_branch_capture.py +0 -0
  415. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_config_free_1712.py +0 -0
  416. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_deploy_units_endpoint.py +0 -0
  417. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_dirty_worktree.py +0 -0
  418. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  419. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_graph_self_heal.py +0 -0
  420. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_health_h3.py +0 -0
  421. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_idle_restart.py +0 -0
  422. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_push_failure.py +0 -0
  423. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_reap.py +0 -0
  424. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_repos_and_pull.py +0 -0
  425. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_restart_services_endpoint.py +0 -0
  426. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_skills_self_heal.py +0 -0
  427. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_startup_diagnostics.py +0 -0
  428. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_update.py +0 -0
  429. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_update_bluegreen.py +0 -0
  430. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_usage_limit.py +0 -0
  431. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_agent_zero_commit.py +0 -0
  432. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ambient_home_isolation.py +0 -0
  433. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_approve_reject_plan.py +0 -0
  434. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_approve_usage_gate.py +0 -0
  435. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_assignment_already_recorded_daemon.py +0 -0
  436. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_log.py +0 -0
  437. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_outcome.py +0 -0
  438. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_audit_query.py +0 -0
  439. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_auto_loop.py +0 -0
  440. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_auto_release_publish_2035.py +0 -0
  441. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_base_checkout_restore.py +0 -0
  442. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_block_log.py +0 -0
  443. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_cap_762.py +0 -0
  444. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_fixture.py +0 -0
  445. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_read_path.py +0 -0
  446. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_service.py +0 -0
  447. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_state.py +0 -0
  448. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_board_wire.py +0 -0
  449. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_brain.py +0 -0
  450. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_branch_model.py +0 -0
  451. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_bug_intake.py +0 -0
  452. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_build_worker_image_env_update.py +0 -0
  453. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cargo_cache.py +0 -0
  454. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_acceptance_gate_1950.py +0 -0
  455. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_parity_2091.py +0 -0
  456. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_ci_store.py +0 -0
  457. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_claim.py +0 -0
  458. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_acceptance.py +0 -0
  459. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign.py +0 -0
  460. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  461. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_interactive_remote.py +0 -0
  462. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_provider.py +0 -0
  463. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  464. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_audit.py +0 -0
  465. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_chat_continue.py +0 -0
  466. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_decide.py +0 -0
  467. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_config_provenance.py +0 -0
  468. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_graph.py +0 -0
  469. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_diagnose_self.py +0 -0
  470. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor.py +0 -0
  471. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor_config_free_1801.py +0 -0
  472. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  473. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_drive.py +0 -0
  474. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_drive_queue.py +0 -0
  475. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_escalate.py +0 -0
  476. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_fix_headless_review.py +0 -0
  477. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_gate_a.py +0 -0
  478. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_install_drift.py +0 -0
  479. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_install_skills.py +0 -0
  480. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_issue_create_label.py +0 -0
  481. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_issue_reopen.py +0 -0
  482. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_assign.py +0 -0
  483. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_capture.py +0 -0
  484. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_chat_add_child.py +0 -0
  485. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_dispatch.py +0 -0
  486. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_gate_b.py +0 -0
  487. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_gate_c.py +0 -0
  488. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_order.py +0 -0
  489. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  490. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_milestone_ship.py +0 -0
  491. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_network.py +0 -0
  492. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_new_issue_chat.py +0 -0
  493. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_plans.py +0 -0
  494. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_portal.py +0 -0
  495. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_pull_artifact.py +0 -0
  496. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_queue.py +0 -0
  497. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_reattach_sessions.py +0 -0
  498. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_refine_board.py +0 -0
  499. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_preflight.py +0 -0
  500. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_propagate.py +0 -0
  501. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_release_window.py +0 -0
  502. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_repo_2220.py +0 -0
  503. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_scorecard.py +0 -0
  504. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_set_review_findings.py +0 -0
  505. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_advisory_terminal.py +0 -0
  506. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_merge_queue.py +0 -0
  507. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_provider.py +0 -0
  508. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_review_finalizing.py +0 -0
  509. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_test_failed_tag.py +0 -0
  510. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_status_usage_limit.py +0 -0
  511. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_sync_comments_873.py +0 -0
  512. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_test_plan.py +0 -0
  513. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_track.py +0 -0
  514. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_tui_update.py +0 -0
  515. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cli_wait.py +0 -0
  516. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_client_base_install.py +0 -0
  517. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_comments.py +0 -0
  518. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_completion_summary.py +0 -0
  519. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config.py +0 -0
  520. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_acceptance.py +0 -0
  521. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_audit.py +0 -0
  522. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_pricing.py +0 -0
  523. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  524. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_config_usage_gate.py +0 -0
  525. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_conflict_fix_semantic.py +0 -0
  526. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test.py +0 -0
  527. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_baseline.py +0 -0
  528. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_populated_home.py +0 -0
  529. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_routing.py +0 -0
  530. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_test_runner_toolchain.py +0 -0
  531. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coord_web_sse_restart_live.py +0 -0
  532. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_coordinator_machine.py +0 -0
  533. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_cross_platform_imports.py +0 -0
  534. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard.py +0 -0
  535. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_fixture.py +0 -0
  536. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_terminal.py +0 -0
  537. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dashboard_terminal_live.py +0 -0
  538. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_db.py +0 -0
  539. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dead_end.py +0 -0
  540. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_db_backup.py +0 -0
  541. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_web_dist.py +0 -0
  542. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_coord_web_rollback.py +0 -0
  543. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_drive_queue_unit.py +0 -0
  544. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_manifest.py +0 -0
  545. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_units_lane.py +0 -0
  546. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deploy_web_unit.py +0 -0
  547. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_deps.py +0 -0
  548. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_diagnose.py +0 -0
  549. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dispatch.py +0 -0
  550. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dispatch_target_validation.py +0 -0
  551. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_dist_name.py +0 -0
  552. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_done_housekeeping.py +0 -0
  553. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive.py +0 -0
  554. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_queue.py +0 -0
  555. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_state.py +0 -0
  556. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_drive_tmux.py +0 -0
  557. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_capability_detection.py +0 -0
  558. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  559. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_epic_up_image_provenance.py +0 -0
  560. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_errors.py +0 -0
  561. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_events.py +0 -0
  562. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_failure_class.py +0 -0
  563. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_filelock.py +0 -0
  564. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  565. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fix_of_force_override.py +0 -0
  566. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_config_health.py +0 -0
  567. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_health_probes.py +0 -0
  568. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_fleet_health_snapshot.py +0 -0
  569. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_freshness.py +0 -0
  570. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_a.py +0 -0
  571. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_b.py +0 -0
  572. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gate_snapshot_staleness.py +0 -0
  573. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gates.py +0 -0
  574. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  575. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_generated_types_fixture.py +0 -0
  576. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_github_ops.py +0 -0
  577. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_goal.py +0 -0
  578. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_graph_health.py +0 -0
  579. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_graph_selfheal_absent_2237.py +0 -0
  580. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_handoff.py +0 -0
  581. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_checks.py +0 -0
  582. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_cli.py +0 -0
  583. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_cli_graph.py +0 -0
  584. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_config.py +0 -0
  585. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_context.py +0 -0
  586. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_coord_web_ci_pin.py +0 -0
  587. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_deploy_lane_facts.py +0 -0
  588. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_incident_regression.py +0 -0
  589. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_pypi.py +0 -0
  590. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_registry.py +0 -0
  591. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_timer_active.py +0 -0
  592. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_toolchain.py +0 -0
  593. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_unit_drift.py +0 -0
  594. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_health_unit_enablement.py +0 -0
  595. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_hooks.py +0 -0
  596. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_human_attended_437.py +0 -0
  597. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_init.py +0 -0
  598. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_integration.py +0 -0
  599. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_briefing_echo.py +0 -0
  600. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_prefill_state.py +0 -0
  601. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_session_relaunch.py +0 -0
  602. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_test_verdict_backstop.py +0 -0
  603. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_token_attribution.py +0 -0
  604. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_interactive_worktree.py +0 -0
  605. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_issue_store_seam.py +0 -0
  606. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_liveness_auditor.py +0 -0
  607. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_liveness_notify.py +0 -0
  608. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_machine_pause.py +0 -0
  609. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_merge_queue.py +0 -0
  610. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_merge_verify.py +0 -0
  611. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_chat.py +0 -0
  612. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_dispatch.py +0 -0
  613. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_gate.py +0 -0
  614. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_order.py +0 -0
  615. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_milestone_seam.py +0 -0
  616. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_mock_author.py +0 -0
  617. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_model_tiering.py +0 -0
  618. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_models.py +0 -0
  619. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_models_config_labels.py +0 -0
  620. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_needs_attention.py +0 -0
  621. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_network.py +0 -0
  622. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_new_issue_chat.py +0 -0
  623. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_next_release_tag.py +0 -0
  624. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_no_direct_gh_calls.py +0 -0
  625. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_node_shim.py +0 -0
  626. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_baseline.py +0 -0
  627. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_cli.py +0 -0
  628. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_collect.py +0 -0
  629. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_config.py +0 -0
  630. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_drive_seam.py +0 -0
  631. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_isolation.py +0 -0
  632. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_predicate.py +0 -0
  633. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_quiet_hours.py +0 -0
  634. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notifier_service.py +0 -0
  635. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_notify_drain.py +0 -0
  636. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_openapi.py +0 -0
  637. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_operational_defaults.py +0 -0
  638. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_overlap_fence.py +0 -0
  639. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_overlap_predict.py +0 -0
  640. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_packaged_deploy_units.py +0 -0
  641. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_parentage.py +0 -0
  642. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_paste_landed.py +0 -0
  643. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_pipeline.py +0 -0
  644. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_approve_plan_command.py +0 -0
  645. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_pr_command.py +0 -0
  646. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_followup_review_command.py +0 -0
  647. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_only.py +0 -0
  648. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_plan_parser.py +0 -0
  649. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_platform_paths.py +0 -0
  650. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_bridge.py +0 -0
  651. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_config.py +0 -0
  652. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_portal_sync.py +0 -0
  653. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_pr_body_lint.py +0 -0
  654. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_prereqs.py +0 -0
  655. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_production_db_guard.py +0 -0
  656. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_progress.py +0 -0
  657. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_provider_seam.py +0 -0
  658. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers.py +0 -0
  659. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers_config_labels.py +0 -0
  660. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_providers_pty.py +0 -0
  661. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_quiet_hours.py +0 -0
  662. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_quiet_hours_store_2146.py +0 -0
  663. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reap_merged_sessions.py +0 -0
  664. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reap_stale_interactive_tick.py +0 -0
  665. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile.py +0 -0
  666. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_branch.py +0 -0
  667. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_completions.py +0 -0
  668. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_merges.py +0 -0
  669. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_no_agent_record.py +0 -0
  670. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_tick.py +0 -0
  671. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reconcile_usage_limit_done.py +0 -0
  672. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_refine_chat.py +0 -0
  673. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_2101.py +0 -0
  674. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  675. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_cordon_deadlock_2240.py +0 -0
  676. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_propagate.py +0 -0
  677. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_unified_1242.py +0 -0
  678. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_verify.py +0 -0
  679. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_release_window.py +0 -0
  680. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_remote_auto_prune.py +0 -0
  681. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_remote_interactive_reaper.py +0 -0
  682. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_edit_2220.py +0 -0
  683. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_graph_fleet_2237.py +0 -0
  684. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_repo_onboard_2220.py +0 -0
  685. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_report_result_push.py +0 -0
  686. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_reports.py +0 -0
  687. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry.py +0 -0
  688. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry_advisory_1606.py +0 -0
  689. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_retry_type_1636.py +0 -0
  690. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_revalidate.py +0 -0
  691. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review.py +0 -0
  692. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_end_review_without_verdict.py +0 -0
  693. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_parse_failure_diagnostic.py +0 -0
  694. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_reaffirm.py +0 -0
  695. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_state.py +0 -0
  696. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_backstop.py +0 -0
  697. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_override_audit.py +0 -0
  698. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_verdict_relay.py +0 -0
  699. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_review_zero_commits.py +0 -0
  700. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_scoped_review_wiring.py +0 -0
  701. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_scorecard.py +0 -0
  702. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_self_health.py +0 -0
  703. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_serve.py +0 -0
  704. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_serve_app_board_trim.py +0 -0
  705. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_session.py +0 -0
  706. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_slice_issue_attribution.py +0 -0
  707. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke.py +0 -0
  708. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke_live_checkout_restore.py +0 -0
  709. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_smoke_workflow.py +0 -0
  710. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_spend_ceiling.py +0 -0
  711. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_spend_ceiling_coordinator.py +0 -0
  712. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_split.py +0 -0
  713. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_split_work.py +0 -0
  714. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stage_projection.py +0 -0
  715. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stalled_pipeline.py +0 -0
  716. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_state_review_findings_daemon.py +0 -0
  717. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_status_fleet_footer.py +0 -0
  718. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stop_1567.py +0 -0
  719. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_stuck.py +0 -0
  720. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_terminal_command.py +0 -0
  721. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_author.py +0 -0
  722. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_chat.py +0 -0
  723. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_orchestrator.py +0 -0
  724. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_report.py +0 -0
  725. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_verdict_parsing.py +0 -0
  726. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_test_verdict_transcript_floor.py +0 -0
  727. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_board_audit.py +0 -0
  728. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_config_load_1080.py +0 -0
  729. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_thin_client_daemon_routing_906.py +0 -0
  730. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_tmux_host.py +0 -0
  731. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_tmux_session.py +0 -0
  732. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_transcript_floor.py +0 -0
  733. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage.py +0 -0
  734. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage_limits.py +0 -0
  735. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_usage_rollup.py +0 -0
  736. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_venv_live_install_2121.py +0 -0
  737. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_version_single_source.py +0 -0
  738. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_watch.py +0 -0
  739. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  740. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_events.py +0 -0
  741. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_image_pin_sync.py +0 -0
  742. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_safety.py +0 -0
  743. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worker_test_scoping.py +0 -0
  744. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worktree.py +0 -0
  745. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  746. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/Cargo.lock +0 -0
  747. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/Cargo.toml +0 -0
  748. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/cargo-config-local-quadraui.toml.example +0 -0
  749. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/audit.rs +0 -0
  750. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/chat.rs +0 -0
  751. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/data.rs +0 -0
  752. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/dialogs.rs +0 -0
  753. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/doc_tabs.rs +0 -0
  754. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/drive.rs +0 -0
  755. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/drive_queue.rs +0 -0
  756. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/escalation.rs +0 -0
  757. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/events.rs +0 -0
  758. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fixtures.rs +0 -0
  759. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_health.rs +0 -0
  760. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_sessions.rs +0 -0
  761. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/fleet_terminals.rs +0 -0
  762. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/format.rs +0 -0
  763. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/milestone_dag.rs +0 -0
  764. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/mod.rs +0 -0
  765. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/msv.rs +0 -0
  766. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/pipeline.rs +0 -0
  767. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/plans.rs +0 -0
  768. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/render.rs +0 -0
  769. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/reports.rs +0 -0
  770. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/sessions.rs +0 -0
  771. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/settings_ui.rs +0 -0
  772. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/sidebar.rs +0 -0
  773. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/terminal.rs +0 -0
  774. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/tests.rs +0 -0
  775. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/types.rs +0 -0
  776. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/app/workspace.rs +0 -0
  777. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/bin/gtk.rs +0 -0
  778. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/commands.rs +0 -0
  779. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/lib.rs +0 -0
  780. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/main.rs +0 -0
  781. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/src/settings.rs +0 -0
  782. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/tests/acceptance.rs +0 -0
  783. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/tui/tests/cli.rs +0 -0
  784. {code_coordinator-0.5.186 → code_coordinator-0.5.188}/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.186
3
+ Version: 0.5.188
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.186
3
+ Version: 0.5.188
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.186",
2
+ "tag": "0.5.188",
3
3
  "distance": 0,
4
- "node": "g91a8fc0c07fd891a6a9c258c7f30aba6e090c865",
4
+ "node": "ge96703c949bd613e9a8c2b576d71050e015f956e",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-20"
@@ -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)
@@ -456,7 +456,9 @@ def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
456
456
  # failed for this entry in this session, don't loop — mark
457
457
  # HUMAN_REQUIRED so the user takes over. A successful
458
458
  # prior fix does not trigger this guard (#784).
459
- if has_prior_conflict_fix(fix_board, ev.entry.assignment_id):
459
+ if has_prior_conflict_fix(
460
+ fix_board, ev.entry.assignment_id, current_error=ev.entry.error,
461
+ ):
460
462
  ev.entry.state = HUMAN_REQUIRED
461
463
  click.echo(
462
464
  f" {ev.entry.repo_name} #{ev.entry.issue_number}: "
@@ -881,6 +883,85 @@ def post_pending_reviews(config_path: Path, repo_name: str | None) -> None:
881
883
  )
882
884
 
883
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
+
884
965
  def _load_issue_states() -> tuple[dict[str, set[int]], dict[str, set[int]]]:
885
966
  """Return ``(open_by_repo, known_by_repo)``.
886
967
 
@@ -367,7 +367,32 @@ def _has_active_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
367
367
  )
368
368
 
369
369
 
370
- def has_prior_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
370
+ def _dispatched_error(assignment: Assignment) -> str | None:
371
+ """The merge-failure text *assignment*'s briefing was built from.
372
+
373
+ ``build_conflict_fix_briefing``/``build_semantic_conflict_briefing``
374
+ both embed the triggering ``QueuedMerge.error`` verbatim (as a
375
+ ``"Reason: …"``/``"Last merge error: …"`` line) — that's the only durable
376
+ record of what the merge looked like *at dispatch time*, since
377
+ ``on_conflict_fix_done`` clears ``entry.error`` back to ``None`` on
378
+ success before the merge is retried. Returns ``None`` when the briefing
379
+ doesn't carry either marker (e.g. a hand-built test ``Assignment``).
380
+ """
381
+ briefing = assignment.briefing or ""
382
+ for line in briefing.splitlines():
383
+ if line.startswith("Reason: "):
384
+ return line[len("Reason: "):]
385
+ if line.startswith("Last merge error: "):
386
+ return line[len("Last merge error: "):]
387
+ return None
388
+
389
+
390
+ def has_prior_conflict_fix(
391
+ board: Board,
392
+ merge_entry_id: str | None,
393
+ *,
394
+ current_error: str | None = None,
395
+ ) -> bool:
371
396
  """True when a second conflict-fix dispatch for *merge_entry_id* is blocked.
372
397
 
373
398
  Blocks when a conflict-fix is **active** (running/pending — don't spawn a
@@ -379,6 +404,18 @@ def has_prior_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
379
404
  followed by a new conflict if other PRs merged in the meantime; that is a
380
405
  fresh situation and warrants a fresh fix attempt. Only actual failures
381
406
  consume the one-per-entry cap.
407
+
408
+ #2475: that "successful" carve-out assumed a ``done`` conflict-fix always
409
+ resolved *something*. It doesn't when the merge was never blocked by a
410
+ content conflict in the first place (e.g. a permanently-unmergeable
411
+ branch-protection state) — the worker finds nothing to rebase, exits
412
+ ``done``, and the merge queue retries into the *identical* failure
413
+ forever (#2009's 38-turn thrash). When *current_error* is given and a
414
+ prior ``done`` conflict-fix's dispatch-time error
415
+ (:func:`_dispatched_error`) matches it exactly, that's the same blocker
416
+ recurring unchanged — not a fresh conflict — so it now consumes the cap
417
+ too. Callers that don't pass *current_error* keep the pre-#2475 behaviour
418
+ (``done`` never blocks) since they have no error text to compare.
382
419
  """
383
420
  if merge_entry_id is None:
384
421
  return False
@@ -393,9 +430,16 @@ def has_prior_conflict_fix(board: Board, merge_entry_id: str | None) -> bool:
393
430
  # Genuine failure — retry cap consumed, surface to human.
394
431
  if a.status in ("failed", "advisory"):
395
432
  return True
396
- # "done" = successful rebase → cap not consumed; a re-conflict is new.
397
- # "cancelled" falls through here too — a cancelled attempt did no work,
398
- # so it is treated the same as "done": re-dispatch is allowed.
433
+ if a.status == "done":
434
+ if current_error is not None and _dispatched_error(a) == current_error:
435
+ # Same failure text recurring after a "successful" fix means
436
+ # nothing was actually fixed — treat like a genuine failure.
437
+ return True
438
+ # Otherwise: successful rebase, different (or unknown) situation
439
+ # now → cap not consumed; a re-conflict is new.
440
+ # "cancelled" falls through here too — a cancelled attempt did no
441
+ # work, so it is treated the same as an unrelated "done": re-dispatch
442
+ # is allowed.
399
443
  return False
400
444
 
401
445
 
@@ -463,7 +507,10 @@ def dispatch_conflict_fix(
463
507
  the caller marks the entry ``HUMAN_REQUIRED``. A ``done`` (successful)
464
508
  conflict-fix does *not* block a new dispatch — a successful rebase can be
465
509
  followed by a fresh conflict if other PRs merged in the meantime, and that
466
- warrants a new attempt rather than an immediate human escalation (#784).
510
+ warrants a new attempt rather than an immediate human escalation (#784) —
511
+ UNLESS (#2475) *entry.error* is identical to the error the prior ``done``
512
+ attempt was dispatched for, which means the merge failed the same way
513
+ again with nothing actually fixed; see :func:`has_prior_conflict_fix`.
467
514
 
468
515
  ``semantic=True`` (#1291) dispatches the escalated second attempt: a
469
516
  different, less prescriptive briefing (see
@@ -481,7 +528,9 @@ def dispatch_conflict_fix(
481
528
  return None
482
529
  if _has_active_conflict_fix(board, entry.assignment_id):
483
530
  return None
484
- elif has_prior_conflict_fix(board, entry.assignment_id):
531
+ elif has_prior_conflict_fix(
532
+ board, entry.assignment_id, current_error=entry.error,
533
+ ):
485
534
  return None
486
535
 
487
536
  repo = config.repo(entry.repo_name)
@@ -93,6 +93,18 @@ _HUMAN_SIGNALS = (
93
93
  "permission",
94
94
  "protected branch",
95
95
  "branch protection",
96
+ # #2475: GitHub's wording when a required status check can never report
97
+ # — e.g. its source CI job was deleted from the workflow while the
98
+ # check was still required in branch protection. This is a *permanent*
99
+ # block; no rebase or content change fixes it. The full message is
100
+ # something like "Pull request X is not mergeable: the base branch
101
+ # policy prohibits the merge.", which also contains "not mergeable" —
102
+ # a _REBASEABLE_SIGNALS entry — so without this specific phrase here,
103
+ # classify_conflict fell through past _HUMAN_SIGNALS (no match) to
104
+ # _REBASEABLE_SIGNALS's generic "not mergeable" match and misclassified
105
+ # the failure as "rebaseable", dispatching a conflict-fix worker that
106
+ # could never succeed (#2009's 38-turn thrash).
107
+ "policy prohibits the merge",
96
108
  )
97
109
 
98
110
 
@@ -884,7 +884,11 @@ def detect_stalled_pipeline(
884
884
  elif (
885
885
  matching_entry.state == CONFLICT
886
886
  and classify_conflict(matching_entry.error) == "rebaseable"
887
- and not has_prior_conflict_fix(board, matching_entry.assignment_id)
887
+ and not has_prior_conflict_fix(
888
+ board,
889
+ matching_entry.assignment_id,
890
+ current_error=matching_entry.error,
891
+ )
888
892
  ):
889
893
  # #1478: a rebaseable CONFLICT with no active/failed
890
894
  # conflict-fix attempt — the #1474 classify-and-dispatch step
@@ -1412,7 +1416,9 @@ def dispatch_stalled_pipeline_action(
1412
1416
  return StalledDispatchAction(
1413
1417
  kind="no_action", detail="merge queue entry no longer found",
1414
1418
  )
1415
- if has_prior_conflict_fix(board, entry.assignment_id):
1419
+ if has_prior_conflict_fix(
1420
+ board, entry.assignment_id, current_error=entry.error,
1421
+ ):
1416
1422
  return StalledDispatchAction(
1417
1423
  kind="skipped_human_required",
1418
1424
  detail="conflict-fix already active or its retry cap was already hit",
@@ -2127,28 +2133,26 @@ def _persist_review_findings(assignment_id: str, verdict: str, body: str) -> Non
2127
2133
  )
2128
2134
 
2129
2135
 
2130
- def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
2131
- """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.
2132
2140
 
2133
- Mirrors the local-file-then-agent-fetch fallback :func:`_try_parse_and_post_review`
2134
- itself uses to PARSE the log, but returns the raw text instead — the
2135
- diagnostic detectors (:func:`coord.review.detect_end_review_without_verdict`,
2136
- :func:`coord.review.detect_unparsed_review_marker`) need the text the
2137
- strict parser already rejected, not another parse attempt. Returns
2138
- ``None`` on any I/O failure — diagnostics are best-effort by design and
2139
- 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.
2140
2146
  """
2141
- log_path = entry.get("log_path")
2142
2147
  if log_path:
2143
2148
  try:
2144
2149
  return Path(log_path).read_text(encoding="utf-8", errors="replace")
2145
2150
  except OSError:
2146
2151
  pass
2147
- host = _agent_host(transition.machine_name)
2148
2152
  if host:
2149
2153
  try:
2150
2154
  resp = httpx.get(
2151
- f"http://{host}:{AGENT_PORT}/logs/{transition.assignment_id}",
2155
+ f"http://{host}:{AGENT_PORT}/logs/{assignment_id}",
2152
2156
  timeout=15.0,
2153
2157
  )
2154
2158
  resp.raise_for_status()
@@ -2158,6 +2162,126 @@ def _fetch_raw_log_text(transition: Transition, entry: dict) -> str | None:
2158
2162
  return None
2159
2163
 
2160
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
+
2161
2285
  def _warn_missing_review_verdict(
2162
2286
  transition: Transition, entry: dict, diagnostic: list,
2163
2287
  ) -> None:
@@ -2832,6 +2956,20 @@ def post_orphaned_review_findings(
2832
2956
  for row in rows:
2833
2957
  aid = row["assignment_id"]
2834
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
+
2835
2973
  findings = None
2836
2974
  # Try local file first (cheap) — works when notify runs on the
2837
2975
  # same host as the agent. Falls back to fetching via HTTP so the
@@ -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: