code-coordinator 0.5.562__tar.gz → 0.5.563__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 (929) hide show
  1. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/db.py +47 -1
  5. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notify.py +50 -0
  6. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/serve_app.py +104 -0
  7. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/state.py +155 -0
  8. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_db.py +8 -1
  9. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notify.py +113 -0
  10. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_verdict_relay.py +120 -0
  11. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_state.py +97 -0
  12. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/.gitignore +0 -0
  25. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/GOAL.md +0 -0
  27. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/LICENSE +0 -0
  28. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/README.md +0 -0
  30. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/approved_work.py +0 -0
  47. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/backup.py +0 -0
  50. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/bugbash.py +0 -0
  58. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/claude_setup_token.py +0 -0
  65. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/cli.py +0 -0
  66. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/client.py +0 -0
  67. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/codegen.py +0 -0
  68. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/backup.py +0 -0
  74. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/bugbash.py +0 -0
  75. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/chat.py +0 -0
  76. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/ci.py +0 -0
  77. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/codegen.py +0 -0
  78. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/dispatch.py +0 -0
  79. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/dispatch_workers.py +0 -0
  80. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/dr.py +0 -0
  81. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/drive.py +0 -0
  82. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/drive_queue.py +0 -0
  83. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/gate_a.py +0 -0
  84. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/gates.py +0 -0
  85. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/issues.py +0 -0
  86. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/lifecycle.py +0 -0
  87. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/machine.py +0 -0
  88. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/merge.py +0 -0
  89. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/milestone.py +0 -0
  90. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/plan_followup.py +0 -0
  91. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/plans.py +0 -0
  92. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/portal.py +0 -0
  93. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/pr.py +0 -0
  94. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/release.py +0 -0
  95. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/repo.py +0 -0
  96. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/report.py +0 -0
  97. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/review.py +0 -0
  98. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/scorecard.py +0 -0
  99. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/sessions.py +0 -0
  100. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/setup.py +0 -0
  101. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/status.py +0 -0
  102. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/store_migrate.py +0 -0
  103. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/terminal.py +0 -0
  104. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/test_gate.py +0 -0
  105. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/commands/tui.py +0 -0
  106. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/comments.py +0 -0
  107. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/config.py +0 -0
  108. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/config_reload.py +0 -0
  109. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/confirm_test.py +0 -0
  110. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/conflict_fix.py +0 -0
  111. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dao.py +0 -0
  112. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dashboard/__init__.py +0 -0
  113. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dashboard/fixture.py +0 -0
  114. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dashboard/index.html +0 -0
  115. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dashboard/server.py +0 -0
  116. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dashboard/terminal.py +0 -0
  117. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dead_end.py +0 -0
  118. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/decomposition_chat.py +0 -0
  119. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/README.md +0 -0
  120. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-agent.service +0 -0
  121. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-backup.service +0 -0
  122. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-backup.timer +0 -0
  123. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.service +0 -0
  124. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.sh +0 -0
  125. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.timer +0 -0
  126. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-dr-verify.service +0 -0
  127. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-dr-verify.timer +0 -0
  128. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-drive-queue.service +0 -0
  129. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-drive-queue.timer +0 -0
  130. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-failure-notify.service +0 -0
  131. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-fleet-watchdog.service +0 -0
  132. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  133. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-notify.service +0 -0
  134. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-notify.timer +0 -0
  135. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-release-propagate.service +0 -0
  136. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-release-propagate.timer +0 -0
  137. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-release-window.service +0 -0
  138. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-release-window.timer +0 -0
  139. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-serve.service +0 -0
  140. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-web-dist-build.service +0 -0
  141. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-web-dist-build.timer +0 -0
  142. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy/coord-web.service +0 -0
  143. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy_manifest.py +0 -0
  144. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deploy_units.py +0 -0
  145. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deprecation_telemetry.py +0 -0
  146. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/deps.py +0 -0
  147. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/diagnose.py +0 -0
  148. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dispatch.py +0 -0
  149. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dispatch_liveness.py +0 -0
  150. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dr_promote.py +0 -0
  152. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/dr_verify.py +0 -0
  153. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/drive.py +0 -0
  154. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/drive_queue.py +0 -0
  155. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/drive_sessions_snapshot.py +0 -0
  156. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/drive_state.py +0 -0
  157. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/events.py +0 -0
  158. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/failure_class.py +0 -0
  159. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/failure_classifier.py +0 -0
  160. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/filelock.py +0 -0
  161. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/fleet_config_health.py +0 -0
  162. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/forge_availability.py +0 -0
  163. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/freshness.py +0 -0
  164. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gate_a.py +0 -0
  165. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gate_b.py +0 -0
  166. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gate_snapshot.py +0 -0
  167. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gates.py +0 -0
  168. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gen_board_fixture.py +0 -0
  169. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/github_ops.py +0 -0
  170. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/github_throttle.py +0 -0
  171. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/goal.py +0 -0
  172. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/graph_health.py +0 -0
  173. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/gtk_native_driver.py +0 -0
  174. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/__init__.py +0 -0
  175. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/aggregate.py +0 -0
  176. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/__init__.py +0 -0
  177. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/_ci_pin.py +0 -0
  178. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/agent_install.py +0 -0
  179. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/cargo_targets.py +0 -0
  180. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/claude_binary.py +0 -0
  181. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/config_drift.py +0 -0
  182. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  183. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/coord_web_ci_pin.py +0 -0
  184. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/deploy_lane_facts.py +0 -0
  185. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/disk.py +0 -0
  186. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/fleet_board.py +0 -0
  187. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  188. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/fleet_phantom.py +0 -0
  189. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/fleet_unit_drift.py +0 -0
  190. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/graph.py +0 -0
  191. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/graphify_cli.py +0 -0
  192. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/index_lock.py +0 -0
  193. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/issues_sync_staleness.py +0 -0
  194. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/local_machine_identity.py +0 -0
  195. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/plan_usage.py +0 -0
  196. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/pr_churn.py +0 -0
  197. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/release_cordon.py +0 -0
  198. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/repo_state.py +0 -0
  199. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/spawned_coord.py +0 -0
  200. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/stalled_pipeline.py +0 -0
  201. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/timer_active.py +0 -0
  202. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/toolchain.py +0 -0
  203. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/unit_drift.py +0 -0
  204. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/unit_enablement.py +0 -0
  205. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/wedged_drive_queue.py +0 -0
  206. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/checks/worktrees.py +0 -0
  207. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/cli.py +0 -0
  208. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/context.py +0 -0
  209. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/fleet_snapshot.py +0 -0
  210. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/models.py +0 -0
  211. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/pypi.py +0 -0
  212. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/registry.py +0 -0
  213. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/render.py +0 -0
  214. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/health/units.py +0 -0
  215. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/hooks.py +0 -0
  216. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/housekeeping.py +0 -0
  217. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/interactive.py +0 -0
  218. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/invariant_alarms.py +0 -0
  219. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/issue_store.py +0 -0
  220. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/issues_sync_status.py +0 -0
  221. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/liveness_auditor.py +0 -0
  222. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/mac_native_driver.py +0 -0
  223. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/machine_fault.py +0 -0
  224. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/machine_metrics.py +0 -0
  225. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/machine_onboard.py +0 -0
  226. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/machine_pause.py +0 -0
  227. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/machine_stats.py +0 -0
  228. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/merge_queue.py +0 -0
  229. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/milestone_chat.py +0 -0
  230. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/milestone_dispatch.py +0 -0
  231. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/milestone_gate.py +0 -0
  232. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/milestone_order.py +0 -0
  233. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/mock_author.py +0 -0
  234. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/models.py +0 -0
  235. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/network.py +0 -0
  236. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/new_issue_chat.py +0 -0
  237. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/__init__.py +0 -0
  238. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/baseline.py +0 -0
  239. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/cli.py +0 -0
  240. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/collect.py +0 -0
  241. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/digest.py +0 -0
  242. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/models.py +0 -0
  243. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/predicate.py +0 -0
  244. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/service.py +0 -0
  245. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/store.py +0 -0
  246. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/notifier/transport.py +0 -0
  247. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/openapi.py +0 -0
  248. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/overlap_fence.py +0 -0
  249. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/overlap_predict.py +0 -0
  250. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/parentage.py +0 -0
  251. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/parentage_github.py +0 -0
  252. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/pipeline.py +0 -0
  253. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/plan_parser.py +0 -0
  254. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/plans.py +0 -0
  255. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/platform_paths.py +0 -0
  256. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/portal_bridge.py +0 -0
  257. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/portal_store.py +0 -0
  258. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/portal_sync.py +0 -0
  259. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/pr_body_lint.py +0 -0
  260. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/prereqs.py +0 -0
  261. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/progress.py +0 -0
  262. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/providers/__init__.py +0 -0
  263. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/providers/base.py +0 -0
  264. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/providers/claude.py +0 -0
  265. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/providers/claude_pty.py +0 -0
  266. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/providers/opencode.py +0 -0
  267. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/queue_diagnose.py +0 -0
  268. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/reconcile.py +0 -0
  269. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/reconcile_tick.py +0 -0
  270. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/refine_chat.py +0 -0
  271. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/release_cordon.py +0 -0
  272. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/release_gate.py +0 -0
  273. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/release_propagate.py +0 -0
  274. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/release_verify.py +0 -0
  275. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/release_window.py +0 -0
  276. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/repo_dormancy.py +0 -0
  277. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/repo_edit.py +0 -0
  278. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/repo_onboard.py +0 -0
  279. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/reports.py +0 -0
  280. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/rest_schema.py +0 -0
  281. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/restart_cmd.py +0 -0
  282. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/revalidate.py +0 -0
  283. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/review.py +0 -0
  284. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/scorecard.py +0 -0
  285. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/self_health.py +0 -0
  286. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  287. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  288. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  289. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  290. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  291. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/portal-followup/SKILL.md +0 -0
  292. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/release-now/SKILL.md +0 -0
  293. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  294. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  295. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/skills/update-issue/SKILL.md +0 -0
  296. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/smoke.py +0 -0
  297. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/smoke_tags.py +0 -0
  298. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/spend_ceiling.py +0 -0
  299. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/split_work.py +0 -0
  300. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/sql.py +0 -0
  301. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/stage_projection.py +0 -0
  302. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/store_migrate.py +0 -0
  303. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/store_parity.py +0 -0
  304. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/templates/deploy-cloudflare.node.yml +0 -0
  305. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/test_author.py +0 -0
  306. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/test_chat.py +0 -0
  307. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/test_orchestrator.py +0 -0
  308. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/test_report.py +0 -0
  309. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/tui_pty_driver.py +0 -0
  310. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/tui_release.py +0 -0
  311. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/uat_checks.py +0 -0
  312. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/usage.py +0 -0
  313. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/usage_limits.py +0 -0
  314. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/usage_rollup.py +0 -0
  315. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/win_native_bridge.py +0 -0
  316. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/win_native_driver.py +0 -0
  317. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coord/worker_events.py +0 -0
  318. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/coordinator.example.yml +0 -0
  319. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-agent.service +0 -0
  320. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-backup.service +0 -0
  321. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-backup.timer +0 -0
  322. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-db-backup.service +0 -0
  323. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-db-backup.sh +0 -0
  324. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-db-backup.timer +0 -0
  325. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-dr-verify.service +0 -0
  326. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-dr-verify.timer +0 -0
  327. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-drive-queue.service +0 -0
  328. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-drive-queue.timer +0 -0
  329. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-failure-notify.service +0 -0
  330. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-failure-notify.sh +0 -0
  331. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-fleet-watchdog.service +0 -0
  332. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-fleet-watchdog.timer +0 -0
  333. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-notify.service +0 -0
  334. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-notify.timer +0 -0
  335. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-release-propagate.service +0 -0
  336. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-release-propagate.timer +0 -0
  337. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-release-window.service +0 -0
  338. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-release-window.timer +0 -0
  339. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-serve.service +0 -0
  340. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.service +0 -0
  341. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.sh +0 -0
  342. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.timer +0 -0
  343. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-web-rollback.sh +0 -0
  344. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/coord-web.service +0 -0
  345. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/deploy/node-shim.sh +0 -0
  346. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ADR_COORD_TUI_CI.md +0 -0
  347. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  348. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_CI.md +0 -0
  349. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_DIST.md +0 -0
  350. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  351. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/AGENT_OPERATIONS.md +0 -0
  352. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ARCHITECTURE.md +0 -0
  353. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ARCH_SECURITY_GATES.md +0 -0
  354. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/COCKPIT.md +0 -0
  355. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/CONTROL_CENTER.md +0 -0
  356. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/COST_DISCIPLINE.md +0 -0
  357. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/CROSS_PLATFORM.md +0 -0
  358. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/CUSTOMER_FACING_APPS.md +0 -0
  359. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/CUSTOMER_PORTAL.md +0 -0
  360. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/DATA_STORE_SELECTION.md +0 -0
  361. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/DISASTER_RECOVERY.md +0 -0
  362. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/DRIVE_QUEUE.md +0 -0
  363. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/EPHEMERAL_WORKERS.md +0 -0
  364. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/FORGE_MIGRATION.md +0 -0
  365. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/GRAPHIFY_SETUP.md +0 -0
  366. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ISSUE_GUIDANCE.md +0 -0
  367. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/MAC_MINI.md +0 -0
  368. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  369. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/NOTIFIER.md +0 -0
  370. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/OPENCODE_VERIFICATION.md +0 -0
  371. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/OPERATING_GOTCHAS.md +0 -0
  372. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/OPERATOR_GUIDES.md +0 -0
  373. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/WSL_WINDOWS_WORKER.md +0 -0
  382. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/mocks/web/README.md +0 -0
  383. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/mocks/web/_tokens.css +0 -0
  384. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/mocks/web/issue-detail.html +0 -0
  385. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/mocks/web/pipeline-narrow.html +0 -0
  386. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/docs/mocks/web/pipeline-wide.html +0 -0
  387. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/graphify-out/.gitignore +0 -0
  388. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/install-agent.sh +0 -0
  389. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/pyproject.toml +0 -0
  390. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/audit_review_verdict_overrides.py +0 -0
  391. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  392. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/build-worker-image.sh +0 -0
  393. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/coordinator-machine.py +0 -0
  394. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/dr-down.sh +0 -0
  395. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/dr-up.sh +0 -0
  396. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/epic-down.sh +0 -0
  397. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/epic-up.sh +0 -0
  398. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/preflight.sh +0 -0
  399. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/provision-server.sh +0 -0
  400. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/provision-worker.sh +0 -0
  401. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  402. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  403. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/throwaway-vm.sh +0 -0
  404. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/azure-workers/verify-github-token.sh +0 -0
  405. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/check_gh_argv_containment.py +0 -0
  406. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/codegen.py +0 -0
  407. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-test-runner.sh +0 -0
  408. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  409. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  410. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  411. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  412. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/coord-venv-rollback.sh +0 -0
  413. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/drive-batch.sh +0 -0
  414. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/extract-coord-tui.sh +0 -0
  415. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/fleet_watchdog.py +0 -0
  416. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/gen_mock_index.py +0 -0
  418. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/lib/provision-core.sh +0 -0
  419. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/provision-machine.sh +0 -0
  421. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/run_tests_in_populated_home.sh +0 -0
  422. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/run_tests_without_gh.sh +0 -0
  423. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/setup-macmini.sh +0 -0
  424. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/smoke_437_interactive.py +0 -0
  425. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/verify-provision-noble.sh +0 -0
  426. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/verify_878_review_capture.py +0 -0
  427. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/verify_release_published.py +0 -0
  428. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/scripts/verify_release_wheel.py +0 -0
  429. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/setup.cfg +0 -0
  430. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/SMOKE_SET.md +0 -0
  431. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/__init__.py +0 -0
  432. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-37/conftest.py +0 -0
  433. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-37/contract.md +0 -0
  434. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-37/manifest.yml +0 -0
  435. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  436. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  437. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/contract.md +0 -0
  438. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  439. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  440. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/manifest.yml +0 -0
  441. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  442. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-51/tsconfig.json +0 -0
  443. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/backends.py +0 -0
  445. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/conftest.py +0 -0
  446. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/board-pipeline-basic.json +0 -0
  447. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  448. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  449. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  450. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  451. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/all_pass.json +0 -0
  452. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  453. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/mixed_fail.json +0 -0
  454. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  455. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  456. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/skip.json +0 -0
  457. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/playwright/truncated.json +0 -0
  458. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  459. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  460. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  461. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  462. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  463. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  478. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_graph_self_heal.py +0 -0
  479. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_health_h3.py +0 -0
  480. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_idle_restart.py +0 -0
  481. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_push_failure.py +0 -0
  482. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_reap.py +0 -0
  483. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_repos_and_pull.py +0 -0
  484. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_restart_services_endpoint.py +0 -0
  485. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_skills_self_heal.py +0 -0
  486. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_startup_diagnostics.py +0 -0
  487. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_update.py +0 -0
  488. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_update_bluegreen.py +0 -0
  489. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_usage_limit.py +0 -0
  490. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approve_capability_reroute_3241.py +0 -0
  493. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approve_dependency_busy_2804.py +0 -0
  494. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approve_reject_plan.py +0 -0
  495. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approve_usage_gate.py +0 -0
  496. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approved_work_2532.py +0 -0
  497. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_approved_work_2996.py +0 -0
  498. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_assignment_already_recorded_daemon.py +0 -0
  499. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_audit_log.py +0 -0
  500. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_audit_outcome.py +0 -0
  501. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_audit_query.py +0 -0
  502. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_auto_loop.py +0 -0
  503. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_auto_release_publish_2035.py +0 -0
  504. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_backend_selection.py +0 -0
  505. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_backup.py +0 -0
  506. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_schema.py +0 -0
  512. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_bugbash.py +0 -0
  519. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_check_gh_argv_containment.py +0 -0
  522. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_acceptance_gate_1950.py +0 -0
  523. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_fix.py +0 -0
  524. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_github.py +0 -0
  525. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_gitlab.py +0 -0
  526. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_parity_2091.py +0 -0
  527. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_ci_store.py +0 -0
  528. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_claim.py +0 -0
  529. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_claude_md_budget.py +0 -0
  530. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_claude_setup_token.py +0 -0
  531. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_acceptance.py +0 -0
  532. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_assign.py +0 -0
  533. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  534. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_assign_interactive_remote.py +0 -0
  535. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_assign_provider.py +0 -0
  536. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  537. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_audit.py +0 -0
  538. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_chat_continue.py +0 -0
  539. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_ci.py +0 -0
  540. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_codegen.py +0 -0
  541. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_decide.py +0 -0
  542. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_capability_rules.py +0 -0
  543. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_config_provenance.py +0 -0
  544. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_forge_availability.py +0 -0
  545. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_graph.py +0 -0
  546. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_self.py +0 -0
  547. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_diagnose_test_coverage.py +0 -0
  548. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_doctor.py +0 -0
  549. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_doctor_config_free_1801.py +0 -0
  550. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  551. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  552. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_drive_queue.py +0 -0
  554. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_escalate.py +0 -0
  555. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_fix_headless_review.py +0 -0
  556. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_gate_a.py +0 -0
  557. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_install_drift.py +0 -0
  558. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_install_skills.py +0 -0
  559. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_issue_comment.py +0 -0
  560. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_issue_create_label.py +0 -0
  561. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_issue_reopen.py +0 -0
  562. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_issue_view_list.py +0 -0
  563. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_issues.py +0 -0
  564. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_merge.py +0 -0
  565. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_assign.py +0 -0
  566. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_capture.py +0 -0
  567. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_chat_add_child.py +0 -0
  568. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_dispatch.py +0 -0
  569. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_gate_b.py +0 -0
  570. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_gate_c.py +0 -0
  571. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_order.py +0 -0
  572. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  573. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_milestone_ship.py +0 -0
  574. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_network.py +0 -0
  575. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_new_issue_chat.py +0 -0
  576. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_plans.py +0 -0
  577. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_portal.py +0 -0
  578. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_pr.py +0 -0
  579. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_pull_artifact.py +0 -0
  580. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_queue.py +0 -0
  581. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_reattach_sessions.py +0 -0
  582. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_refine_board.py +0 -0
  583. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_release_preflight.py +0 -0
  584. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_release_propagate.py +0 -0
  585. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_release_window.py +0 -0
  586. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_repo_2220.py +0 -0
  587. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  588. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_scorecard.py +0 -0
  589. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_serve_store_backend_3084.py +0 -0
  590. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_set_review_findings.py +0 -0
  591. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_advisory_terminal.py +0 -0
  592. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_contested_tag.py +0 -0
  593. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_invariant_alarms.py +0 -0
  594. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_machine_fault.py +0 -0
  595. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_merge_queue.py +0 -0
  596. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_provider.py +0 -0
  597. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_retried_3340.py +0 -0
  598. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_review_finalizing.py +0 -0
  599. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_supervisor_3366.py +0 -0
  600. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_test_failed_tag.py +0 -0
  601. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_status_usage_limit.py +0 -0
  602. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_sync_comments_873.py +0 -0
  603. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_test_plan.py +0 -0
  604. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_track.py +0 -0
  605. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_tui_update.py +0 -0
  606. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cli_wait.py +0 -0
  607. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_client.py +0 -0
  608. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_client_base_install.py +0 -0
  609. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_client_config_cache_atomic_3052.py +0 -0
  610. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_client_resource_migration_1946.py +0 -0
  611. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_commands_common.py +0 -0
  612. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_comments.py +0 -0
  613. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_completion_summary.py +0 -0
  614. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config.py +0 -0
  615. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_acceptance.py +0 -0
  616. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_audit.py +0 -0
  617. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_drift_check.py +0 -0
  618. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_effective.py +0 -0
  619. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_pricing.py +0 -0
  620. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  621. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_config_usage_gate.py +0 -0
  622. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_confirm_test.py +0 -0
  623. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_conflict_fix.py +0 -0
  624. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_conflict_fix_semantic.py +0 -0
  625. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  626. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  628. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test_runner_baseline.py +0 -0
  629. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test_runner_populated_home.py +0 -0
  630. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test_runner_routing.py +0 -0
  631. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_test_runner_toolchain.py +0 -0
  632. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_uat.py +0 -0
  633. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coord_web_sse_restart_live.py +0 -0
  634. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_coordinator_machine.py +0 -0
  635. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_cross_platform_imports.py +0 -0
  636. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dao.py +0 -0
  637. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard.py +0 -0
  638. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard_api.py +0 -0
  639. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard_fixture.py +0 -0
  640. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard_server.py +0 -0
  641. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard_terminal.py +0 -0
  642. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dashboard_terminal_live.py +0 -0
  643. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dead_end.py +0 -0
  644. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_decomposition_chat.py +0 -0
  645. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_coord_db_backup.py +0 -0
  646. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_coord_web_dist.py +0 -0
  647. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_coord_web_rollback.py +0 -0
  648. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_db_backup_unit.py +0 -0
  649. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_drive_queue_unit.py +0 -0
  650. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_failure_notify_unit.py +0 -0
  651. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_manifest.py +0 -0
  652. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_notify_unit.py +0 -0
  653. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_units_lane.py +0 -0
  654. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deploy_web_unit.py +0 -0
  655. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deprecation_telemetry.py +0 -0
  656. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_deps.py +0 -0
  657. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_diagnose.py +0 -0
  658. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dispatch.py +0 -0
  659. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dispatch_liveness.py +0 -0
  660. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dispatch_target_validation.py +0 -0
  661. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dispatch_workers.py +0 -0
  662. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dist_name.py +0 -0
  663. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_done_housekeeping.py +0 -0
  664. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dr_azure_scripts.py +0 -0
  665. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dr_promote.py +0 -0
  666. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_dr_verify.py +0 -0
  667. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive.py +0 -0
  668. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_machine_fault.py +0 -0
  669. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue.py +0 -0
  670. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_blocked_rendering.py +0 -0
  671. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_launch_argv.py +0 -0
  672. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_max_parallel_config.py +0 -0
  673. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  674. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_roll_pending.py +0 -0
  675. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  676. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_sessions_snapshot.py +0 -0
  677. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_state.py +0 -0
  678. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_drive_tmux.py +0 -0
  679. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_epic_up_capability_detection.py +0 -0
  680. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  681. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_epic_up_image_provenance.py +0 -0
  682. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_errors.py +0 -0
  683. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_events.py +0 -0
  684. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_failure_class.py +0 -0
  685. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_failure_classifier.py +0 -0
  686. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_filelock.py +0 -0
  687. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  688. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fix_escalation_classifier.py +0 -0
  689. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fix_of_force_override.py +0 -0
  690. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fleet_config_health.py +0 -0
  691. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fleet_health_probes.py +0 -0
  692. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fleet_health_snapshot.py +0 -0
  693. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_fleet_watchdog.py +0 -0
  694. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_forge_availability.py +0 -0
  695. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_freshness.py +0 -0
  696. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gate_a.py +0 -0
  697. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gate_b.py +0 -0
  698. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gate_snapshot_staleness.py +0 -0
  699. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gates.py +0 -0
  700. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  701. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gen_mock_index.py +0 -0
  702. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_generated_rust_fixture.py +0 -0
  703. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_generated_rust_requests.py +0 -0
  704. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_generated_types_fixture.py +0 -0
  705. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_github_ops.py +0 -0
  706. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_github_throttle.py +0 -0
  707. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_goal.py +0 -0
  708. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_graph_health.py +0 -0
  709. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_graph_selfheal_absent_2237.py +0 -0
  710. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_gtk_native_driver.py +0 -0
  711. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_handoff.py +0 -0
  712. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_checks.py +0 -0
  713. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_cli.py +0 -0
  714. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_cli_graph.py +0 -0
  715. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_config.py +0 -0
  716. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_context.py +0 -0
  717. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_coord_tui_ci_pin.py +0 -0
  718. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_coord_web_ci_pin.py +0 -0
  719. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_deploy_lane_facts.py +0 -0
  720. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_fix.py +0 -0
  721. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_incident_regression.py +0 -0
  722. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_issues_sync_staleness.py +0 -0
  723. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_pr_churn.py +0 -0
  724. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_pypi.py +0 -0
  725. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_registry.py +0 -0
  726. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_release_cordon_probe.py +0 -0
  727. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_timer_active.py +0 -0
  728. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_toolchain.py +0 -0
  729. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_unit_drift.py +0 -0
  730. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_unit_enablement.py +0 -0
  731. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_health_wedged_drive_queue.py +0 -0
  732. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_hooks.py +0 -0
  733. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_housekeeping.py +0 -0
  734. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_human_attended_437.py +0 -0
  735. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_init.py +0 -0
  736. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_install_agent_capabilities_3515.py +0 -0
  737. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_install_agent_venv_2911.py +0 -0
  738. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  739. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_integration.py +0 -0
  740. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive.py +0 -0
  741. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_briefing_echo.py +0 -0
  742. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_pane_log_2541.py +0 -0
  743. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_prefill_state.py +0 -0
  744. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_session_relaunch.py +0 -0
  745. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_test_verdict_backstop.py +0 -0
  746. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_token_attribution.py +0 -0
  747. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_interactive_worktree.py +0 -0
  748. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_invariant_alarms.py +0 -0
  749. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_issue_store_seam.py +0 -0
  750. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_issues_sync_status.py +0 -0
  751. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_liveness_auditor.py +0 -0
  752. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_liveness_notify.py +0 -0
  753. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_lock_contention_ratchet.py +0 -0
  754. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_mac_native_driver.py +0 -0
  755. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_machine_fault.py +0 -0
  756. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_machine_metrics.py +0 -0
  757. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_machine_onboard.py +0 -0
  758. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_machine_pause.py +0 -0
  759. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_machine_stats.py +0 -0
  760. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_merge_queue.py +0 -0
  761. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_merge_verify.py +0 -0
  762. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_milestone_chat.py +0 -0
  763. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_milestone_dispatch.py +0 -0
  764. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_milestone_gate.py +0 -0
  765. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_milestone_order.py +0 -0
  766. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_milestone_seam.py +0 -0
  767. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_mock_author.py +0 -0
  768. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_model_tiering.py +0 -0
  769. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_models.py +0 -0
  770. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_models_config_labels.py +0 -0
  771. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_needs_attention.py +0 -0
  772. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_network.py +0 -0
  773. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_new_issue_chat.py +0 -0
  774. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_next_release_tag.py +0 -0
  775. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_node_shim.py +0 -0
  776. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_baseline.py +0 -0
  777. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_cli.py +0 -0
  778. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_collect.py +0 -0
  779. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_config.py +0 -0
  780. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_drive_seam.py +0 -0
  781. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_isolation.py +0 -0
  782. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_predicate.py +0 -0
  783. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_quiet_hours.py +0 -0
  784. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notifier_service.py +0 -0
  785. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_notify_drain.py +0 -0
  786. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_openapi.py +0 -0
  787. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_operational_defaults.py +0 -0
  788. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_overlap_fence.py +0 -0
  789. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_overlap_predict.py +0 -0
  790. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_packaged_deploy_units.py +0 -0
  791. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_parentage.py +0 -0
  792. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_paste_landed.py +0 -0
  793. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  794. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_pipeline.py +0 -0
  795. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_plan_followup_approve_plan_command.py +0 -0
  796. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_plan_followup_pr_command.py +0 -0
  797. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_plan_followup_review_command.py +0 -0
  798. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_plan_only.py +0 -0
  799. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_plan_parser.py +0 -0
  800. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_platform_paths.py +0 -0
  801. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_portal_bridge.py +0 -0
  802. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_portal_config.py +0 -0
  803. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_portal_store.py +0 -0
  804. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_portal_sync.py +0 -0
  805. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_pr_body_lint.py +0 -0
  806. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_prereqs.py +0 -0
  807. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_production_db_guard.py +0 -0
  808. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_progress.py +0 -0
  809. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_provider_seam.py +0 -0
  810. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_providers.py +0 -0
  811. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_providers_config_labels.py +0 -0
  812. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_providers_pty.py +0 -0
  813. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_provision_core.py +0 -0
  814. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_provision_machine.py +0 -0
  815. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_py_rust_mirror_inventory.py +0 -0
  816. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_quiet_hours.py +0 -0
  817. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_quiet_hours_store_2146.py +0 -0
  818. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reap_merged_sessions.py +0 -0
  819. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reap_stale_interactive_tick.py +0 -0
  820. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile.py +0 -0
  821. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_branch.py +0 -0
  822. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_completions.py +0 -0
  823. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  824. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_merges.py +0 -0
  825. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_no_agent_record.py +0 -0
  826. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_tick.py +0 -0
  827. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reconcile_usage_limit_done.py +0 -0
  828. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_refine_chat.py +0 -0
  829. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_cordon_2101.py +0 -0
  830. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  831. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_cordon_deadlock_2240.py +0 -0
  832. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  833. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_cordon_stuck_2490.py +0 -0
  834. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_gate.py +0 -0
  835. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_propagate.py +0 -0
  836. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_propagate_threshold.py +0 -0
  837. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_roll_between_legs_2854.py +0 -0
  838. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_roll_window_handoff.py +0 -0
  839. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_unified_1242.py +0 -0
  840. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_verify.py +0 -0
  841. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_release_window.py +0 -0
  842. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_remote_auto_prune.py +0 -0
  843. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_remote_interactive_reaper.py +0 -0
  844. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_add.py +0 -0
  845. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_dormancy.py +0 -0
  846. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_edit_2220.py +0 -0
  847. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_graph_fleet_2237.py +0 -0
  848. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_max_parallel_3423.py +0 -0
  849. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_repo_onboard_2220.py +0 -0
  850. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_report_result_push.py +0 -0
  851. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_reports.py +0 -0
  852. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_restart_cmd.py +0 -0
  853. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_retry.py +0 -0
  854. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_retry_advisory_1606.py +0 -0
  855. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_retry_escalation_classify_3360.py +0 -0
  856. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_retry_type_1636.py +0 -0
  857. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_revalidate.py +0 -0
  858. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review.py +0 -0
  859. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_end_review_without_verdict.py +0 -0
  860. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_parse_failure_diagnostic.py +0 -0
  861. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_reaffirm.py +0 -0
  862. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_state.py +0 -0
  863. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_verdict_backstop.py +0 -0
  864. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_verdict_override_audit.py +0 -0
  865. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_review_zero_commits.py +0 -0
  866. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_scoped_review_wiring.py +0 -0
  867. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_scorecard.py +0 -0
  868. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_self_health.py +0 -0
  869. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_serve.py +0 -0
  870. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_serve_app.py +0 -0
  871. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_serve_app_board_trim.py +0 -0
  872. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_serve_rest_routes.py +0 -0
  873. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_session.py +0 -0
  874. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_slice_issue_attribution.py +0 -0
  875. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_smoke.py +0 -0
  876. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  877. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_smoke_live_checkout_restore.py +0 -0
  878. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_smoke_workflow.py +0 -0
  879. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_spend_ceiling.py +0 -0
  880. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_spend_ceiling_coordinator.py +0 -0
  881. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_split.py +0 -0
  882. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_split_work.py +0 -0
  883. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_sql_dialect.py +0 -0
  884. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_sqlite_connect_ratchet.py +0 -0
  885. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stage_projection.py +0 -0
  886. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stale_busy_reviewer_697.py +0 -0
  887. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stalled_pipeline.py +0 -0
  888. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_state_review_findings_daemon.py +0 -0
  889. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_status_fleet_footer.py +0 -0
  890. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stop_1567.py +0 -0
  891. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_store_contract.py +0 -0
  892. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_store_migrate.py +0 -0
  893. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stuck.py +0 -0
  894. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  895. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_terminal_command.py +0 -0
  896. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_author.py +0 -0
  897. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_chat.py +0 -0
  898. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_orchestrator.py +0 -0
  899. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_report.py +0 -0
  900. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_verdict_parsing.py +0 -0
  901. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_test_verdict_transcript_floor.py +0 -0
  902. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_text_io_encoding_audit.py +0 -0
  903. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_thin_client_board_audit.py +0 -0
  904. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_thin_client_config_load_1080.py +0 -0
  905. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_thin_client_daemon_routing_906.py +0 -0
  906. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_throwaway_vm.py +0 -0
  907. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_tmux_host.py +0 -0
  908. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_tmux_session.py +0 -0
  909. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_transcript_floor.py +0 -0
  910. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_tui_pty_driver.py +0 -0
  911. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_uat_checks.py +0 -0
  912. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_usage.py +0 -0
  913. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_usage_limits.py +0 -0
  914. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_usage_rollup.py +0 -0
  915. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_venv_live_install_2121.py +0 -0
  916. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_version_single_source.py +0 -0
  917. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_watch.py +0 -0
  918. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_win_native_bridge.py +0 -0
  919. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_win_native_driver.py +0 -0
  920. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  921. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worker_env_venv_isolation.py +0 -0
  922. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worker_events.py +0 -0
  923. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worker_image_pin_sync.py +0 -0
  924. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worker_safety.py +0 -0
  925. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worker_test_scoping.py +0 -0
  926. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worktree.py +0 -0
  927. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  928. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/test_write_parity.py +0 -0
  929. {code_coordinator-0.5.562 → code_coordinator-0.5.563}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.562
3
+ Version: 0.5.563
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.562
3
+ Version: 0.5.563
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.562",
2
+ "tag": "0.5.563",
3
3
  "distance": 0,
4
- "node": "g4c48decab602ab760461ff8d55ddd5db5baccd46",
4
+ "node": "gd370d95cd8b305a54b4761f01ee5c006b5fa5099",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-02"
@@ -1087,7 +1087,27 @@ def retry_on_locked(
1087
1087
  # knows the table exists: `_ensure_archive_mirror` itself, unconditionally
1088
1088
  # and idempotently (`CREATE INDEX IF NOT EXISTS`) on every housekeeping
1089
1089
  # sweep — see that function's own comment in coord/housekeeping.py.
1090
- _DB_SCHEMA_VERSION = 21
1090
+ #
1091
+ # #2468: bumped 21 -> 22 for the new `review_post_claims` TABLE above (not a
1092
+ # column — same shape as #3113/#3333's table-only bumps: `_migrate_add_
1093
+ # columns` below is unchanged, `CREATE TABLE IF NOT EXISTS` in `_SCHEMA_SQL`
1094
+ # is what actually creates it on an existing database). `_try_parse_and_
1095
+ # post_review` (the live completion path) and `post_orphaned_review_findings`
1096
+ # (the orphan sweep) both query "done reviews with `review_posted_at IS
1097
+ # NULL`" and only set `review_posted_at` AFTER successfully posting to
1098
+ # GitHub — two coordinator passes racing each other (one on the live path,
1099
+ # one on the orphan sweep, or two concurrent `coord notify` invocations) can
1100
+ # both see NULL and both post, producing the byte-identical duplicate-comment
1101
+ # incident on #2288 round 4 this closes. `coord.state.claim_review_post`
1102
+ # does the same conditional `INSERT ... OR IGNORE` + `rowcount` check
1103
+ # `claim_review_dispatch` already does for *dispatching* a review; the loser
1104
+ # of THIS claim skips *posting* it instead. Released
1105
+ # (`coord.state.release_review_post_claim`) only when the post attempt
1106
+ # itself fails, so a legitimate retry of a transient `gh`/GitHub failure
1107
+ # isn't permanently stranded — a successful post leaves the claim in place
1108
+ # forever, which is harmless since `review_posted_at` being set already
1109
+ # excludes the row from both callers' candidate queries.
1110
+ _DB_SCHEMA_VERSION = 22
1091
1111
 
1092
1112
 
1093
1113
  def _read_schema_version(conn: sqlite3.Connection) -> int:
@@ -1981,6 +2001,32 @@ _SCHEMA_SQL = """
1981
2001
  PRIMARY KEY (work_assignment_id, capability_partition)
1982
2002
  );
1983
2003
 
2004
+ -- #2468: atomic review-POSTING claim — a sibling to `review_claims`
2005
+ -- above, but for the act of posting a review's findings to GitHub
2006
+ -- rather than dispatching the review worker. `_try_parse_and_post_
2007
+ -- review` (the live completion path, in `coord.notify`) and
2008
+ -- `post_orphaned_review_findings` (the orphan sweep, same module)
2009
+ -- both query "done review assignments with `review_posted_at IS
2010
+ -- NULL`" as their candidate set and only set `review_posted_at`
2011
+ -- AFTER the GitHub post succeeds — a classic check-then-act gap.
2012
+ -- Two coordinator passes racing each other (the #2468 incident: the
2013
+ -- identical "Review Complete" comment posted twice, 4 seconds apart,
2014
+ -- on #2288's round-4 review) each saw `review_posted_at IS NULL`
2015
+ -- and both posted. `coord.state.claim_review_post` does a
2016
+ -- conditional `INSERT ... OR IGNORE` keyed on `assignment_id` and
2017
+ -- checks `rowcount` to learn atomically whether THIS call gets to
2018
+ -- post; the loser skips instead of also posting a duplicate
2019
+ -- comment. Released (`coord.state.release_review_post_claim`) only
2020
+ -- when the post attempt itself fails, so a transient GitHub/`gh`
2021
+ -- failure doesn't permanently strand the row unposted — a
2022
+ -- successful post never releases the claim, which is harmless
2023
+ -- because `review_posted_at` being set already excludes the row
2024
+ -- from both callers' candidate queries from then on.
2025
+ CREATE TABLE IF NOT EXISTS review_post_claims (
2026
+ assignment_id TEXT PRIMARY KEY,
2027
+ claimed_at REAL NOT NULL
2028
+ );
2029
+
1984
2030
  CREATE INDEX IF NOT EXISTS idx_assignments_status ON assignments(status);
1985
2031
  CREATE INDEX IF NOT EXISTS idx_assignments_machine ON assignments(machine_name);
1986
2032
  -- #3470: the `issue-cost` report's full-history scan groups every
@@ -72,12 +72,14 @@ from coord.smoke import (
72
72
  smoke_leg_capabilities,
73
73
  )
74
74
  from coord.state import (
75
+ claim_review_post,
75
76
  load_dispatched,
76
77
  load_done_reviews_needing_post,
77
78
  load_liveness_audit_state,
78
79
  load_notified,
79
80
  mark_notified,
80
81
  mark_review_posted,
82
+ release_review_post_claim,
81
83
  save_liveness_audit_state,
82
84
  save_plan,
83
85
  )
@@ -3585,6 +3587,25 @@ def _try_parse_and_post_review(
3585
3587
  transition.assignment_id, findings.verdict, findings.body
3586
3588
  )
3587
3589
 
3590
+ # #2468: claim the right to POST this review's findings before actually
3591
+ # posting them. `post_orphaned_review_findings` (the orphan sweep) reads
3592
+ # the identical "done review, review_posted_at IS NULL" candidate set
3593
+ # this function is reacting to, and used to race it: both callers could
3594
+ # see NULL and both post the byte-identical comment (the #2288 round-4
3595
+ # incident this closes). Losing the claim means another caller is
3596
+ # posting — or has already posted — these exact findings, so this call
3597
+ # must NOT fall through to the "could not post" fallback comment below;
3598
+ # return True (handled) rather than False (which the caller would read
3599
+ # as a parse failure and post yet another, differently-worded, comment).
3600
+ if not claim_review_post(transition.assignment_id):
3601
+ log.info(
3602
+ "#2468: lost the review-post claim for %s — another caller is "
3603
+ "posting (or already posted) these findings; skipping to avoid "
3604
+ "a duplicate GitHub comment",
3605
+ transition.assignment_id,
3606
+ )
3607
+ return True
3608
+
3588
3609
  review_target = record.get("review_target")
3589
3610
  repo_github = record["repo_github"]
3590
3611
 
@@ -3648,6 +3669,11 @@ def _try_parse_and_post_review(
3648
3669
  log.warning(
3649
3670
  "Failed to post review comment for %s: %s", transition.assignment_id, exc
3650
3671
  )
3672
+ # #2468: both post attempts (gh pr review, then this issue-comment
3673
+ # fallback) failed — release the claim so a later retry (another
3674
+ # `coord notify` pass, or `post_orphaned_review_findings`) isn't
3675
+ # permanently blocked from posting these findings at all.
3676
+ release_review_post_claim(transition.assignment_id)
3651
3677
  return False
3652
3678
 
3653
3679
 
@@ -4546,6 +4572,24 @@ def post_orphaned_review_findings(
4546
4572
  # per-stage display can skip the HTTP fetch on later runs.
4547
4573
  _persist_review_findings(aid, findings.verdict, findings.body)
4548
4574
 
4575
+ # #2468: claim the right to POST before actually posting —
4576
+ # `_try_parse_and_post_review` (the live completion path, run
4577
+ # from `detect_transitions` earlier in the same drain, or from a
4578
+ # concurrent `coord notify` process) reads the identical
4579
+ # "review_posted_at IS NULL" candidate set this sweep queried via
4580
+ # `load_done_reviews_needing_post`. Losing the claim means that
4581
+ # other caller is posting — or has already posted — these exact
4582
+ # findings; skip entirely rather than writing a second,
4583
+ # byte-identical GitHub comment (the #2288 round-4 incident).
4584
+ if not claim_review_post(aid):
4585
+ log.info(
4586
+ "post_orphaned: lost the review-post claim for %s — "
4587
+ "another caller is posting (or already posted) these "
4588
+ "findings; skipping",
4589
+ aid,
4590
+ )
4591
+ continue
4592
+
4549
4593
  review_target = row.get("review_target")
4550
4594
  repo_github = row.get("repo_github") or ""
4551
4595
  issue_number = row.get("issue_number", 0)
@@ -4617,6 +4661,12 @@ def post_orphaned_review_findings(
4617
4661
  mark_notified(aid, EVENT_COMPLETION)
4618
4662
  posted_ids.append(aid)
4619
4663
  log.info("post_orphaned: posted findings for review %s", aid)
4664
+ else:
4665
+ # #2468: both post attempts failed — release the claim so a
4666
+ # later retry (the next drain's orphan sweep, or the live
4667
+ # path) isn't permanently blocked from posting these
4668
+ # findings at all.
4669
+ release_review_post_claim(aid)
4620
4670
 
4621
4671
  return posted_ids
4622
4672
 
@@ -4175,6 +4175,67 @@ def openapi_spec() -> dict:
4175
4175
  },
4176
4176
  }
4177
4177
  },
4178
+ "/review-post-claim": {
4179
+ "post": {
4180
+ "summary": (
4181
+ "Atomically claim the right to POST a review's findings "
4182
+ "to GitHub (#2468) — a conditional insert so the live "
4183
+ "completion path and the orphan sweep can never both "
4184
+ "post the identical comment"
4185
+ ),
4186
+ "requestBody": {
4187
+ "required": True,
4188
+ "content": {
4189
+ "application/json": {
4190
+ "schema": {
4191
+ "type": "object",
4192
+ "properties": {
4193
+ "assignment_id": {"type": "string"},
4194
+ },
4195
+ "required": ["assignment_id"],
4196
+ }
4197
+ }
4198
+ },
4199
+ },
4200
+ "responses": {
4201
+ "200": {
4202
+ "description": "OK — `claimed` is true iff this call won",
4203
+ "content": {"application/json": {"schema": ok_response}},
4204
+ },
4205
+ "400": {"description": "Missing assignment_id"},
4206
+ },
4207
+ }
4208
+ },
4209
+ "/review-post-claim-release": {
4210
+ "post": {
4211
+ "summary": (
4212
+ "Release a claim taken via /review-post-claim (#2468), "
4213
+ "ONLY when the post attempt itself failed, so a "
4214
+ "legitimate retry isn't permanently stranded"
4215
+ ),
4216
+ "requestBody": {
4217
+ "required": True,
4218
+ "content": {
4219
+ "application/json": {
4220
+ "schema": {
4221
+ "type": "object",
4222
+ "properties": {
4223
+ "assignment_id": {"type": "string"},
4224
+ },
4225
+ "required": ["assignment_id"],
4226
+ }
4227
+ }
4228
+ },
4229
+ },
4230
+ "responses": {
4231
+ "200": {
4232
+ "description": "OK — idempotent, absent claim is a no-op",
4233
+ "content": {"application/json": {"schema": ok_response}},
4234
+ },
4235
+ "400": {"description": "Missing assignment_id"},
4236
+ },
4237
+ }
4238
+ },
4178
4239
  "/smoke-claim": {
4179
4240
  "post": {
4180
4241
  "summary": (
@@ -8408,6 +8469,44 @@ def build_app(
8408
8469
  )
8409
8470
  return JSONResponse({"ok": True})
8410
8471
 
8472
+ async def post_review_post_claim(request: Request) -> Response:
8473
+ # #2468: atomic review-POSTING claim on the daemon's canonical DB —
8474
+ # see coord.state.claim_review_post's docstring for the duplicate-
8475
+ # comment race this closes.
8476
+ from coord import state # noqa: PLC0415
8477
+
8478
+ body = await _read_json(request)
8479
+ if body is None:
8480
+ return JSONResponse({"error": "invalid JSON body"}, status_code=400)
8481
+ try:
8482
+ claimed = state._claim_review_post_local(body["assignment_id"])
8483
+ except KeyError as e:
8484
+ return JSONResponse({"error": f"missing field: {e}"}, status_code=400)
8485
+ except Exception as e: # noqa: BLE001
8486
+ return JSONResponse(
8487
+ {"error": "review-post-claim write failed", "detail": str(e)},
8488
+ status_code=503,
8489
+ )
8490
+ return JSONResponse({"ok": True, "claimed": claimed})
8491
+
8492
+ async def post_review_post_claim_release(request: Request) -> Response:
8493
+ # #2468: release a claim taken via post_review_post_claim above.
8494
+ from coord import state # noqa: PLC0415
8495
+
8496
+ body = await _read_json(request)
8497
+ if body is None:
8498
+ return JSONResponse({"error": "invalid JSON body"}, status_code=400)
8499
+ try:
8500
+ state._release_review_post_claim_local(body["assignment_id"])
8501
+ except KeyError as e:
8502
+ return JSONResponse({"error": f"missing field: {e}"}, status_code=400)
8503
+ except Exception as e: # noqa: BLE001
8504
+ return JSONResponse(
8505
+ {"error": "review-post-claim-release write failed", "detail": str(e)},
8506
+ status_code=503,
8507
+ )
8508
+ return JSONResponse({"ok": True})
8509
+
8411
8510
  async def post_smoke_claim(request: Request) -> Response:
8412
8511
  # #3333: atomic smoke fan-out dispatch claim on the daemon's
8413
8512
  # canonical DB — see coord.state.claim_smoke_dispatch's docstring
@@ -12003,6 +12102,11 @@ def build_app(
12003
12102
  Route("/review-findings", post_review_findings, methods=["POST"]),
12004
12103
  Route("/review-claim", post_review_claim, methods=["POST"]),
12005
12104
  Route("/review-claim-release", post_review_claim_release, methods=["POST"]),
12105
+ Route("/review-post-claim", post_review_post_claim, methods=["POST"]),
12106
+ Route(
12107
+ "/review-post-claim-release", post_review_post_claim_release,
12108
+ methods=["POST"],
12109
+ ),
12006
12110
  Route("/smoke-claim", post_smoke_claim, methods=["POST"]),
12007
12111
  Route("/smoke-claim-release", post_smoke_claim_release, methods=["POST"]),
12008
12112
  Route("/smoke-fanout-merge", post_smoke_fanout_merge, methods=["POST"]),
@@ -2871,6 +2871,161 @@ def release_review_claim_if_row_is_review(assignment_id: str) -> None:
2871
2871
  pass
2872
2872
 
2873
2873
 
2874
+ # ── Atomic review-POSTING claim (#2468) ──────────────────────────────────────
2875
+
2876
+
2877
+ def claim_review_post(assignment_id: str) -> bool:
2878
+ """Atomically claim the right to POST a review's findings for
2879
+ *assignment_id* (#2468).
2880
+
2881
+ Returns ``True`` when THIS call wins the claim (no other in-flight claim
2882
+ exists for the same review assignment), ``False`` when another caller
2883
+ already holds it — the caller should skip posting entirely rather than
2884
+ also writing a duplicate comment.
2885
+
2886
+ ``coord.notify._try_parse_and_post_review`` (the live completion path)
2887
+ and ``coord.notify.post_orphaned_review_findings`` (the orphan sweep)
2888
+ both query "done review assignments with ``review_posted_at IS NULL``"
2889
+ as their candidate set and only set ``review_posted_at`` AFTER the
2890
+ GitHub post succeeds — a classic check-then-act gap. Two coordinator
2891
+ passes racing each other (the #2468 incident: the identical "Review
2892
+ Complete" comment posted twice, 4 seconds apart, on #2288's round-4
2893
+ review) each saw ``review_posted_at IS NULL`` and both posted. This is
2894
+ the DB-level conditional insert that closes the gap — a single
2895
+ ``INSERT ... OR IGNORE`` is atomic even across two separate
2896
+ processes/machines, mirroring :func:`claim_review_dispatch` exactly,
2897
+ but for *posting* a review rather than *dispatching* one.
2898
+
2899
+ Routes to the daemon when ``board_service`` is configured (the claim
2900
+ table lives on the shared canonical DB, same as ``assignments``), else
2901
+ writes the local DB directly.
2902
+
2903
+ Released by :func:`release_review_post_claim` — call sites are both
2904
+ posting functions above, ONLY on a failed post attempt, so a legitimate
2905
+ retry of a transient GitHub/``gh`` failure is never permanently
2906
+ stranded. A successful post never releases the claim: once
2907
+ ``review_posted_at`` is set, the row is excluded from both callers'
2908
+ candidate queries forever, so a lingering claim row is harmless.
2909
+ """
2910
+ if not assignment_id:
2911
+ return True
2912
+ svc = _board_service()
2913
+ resp = _route_write(svc, "/review-post-claim", {"assignment_id": assignment_id})
2914
+ if resp is not None:
2915
+ return bool(resp.get("claimed", False))
2916
+ return _claim_review_post_local(assignment_id)
2917
+
2918
+
2919
+ def _claim_review_post_local(assignment_id: str) -> bool:
2920
+ """Local-DB write for :func:`claim_review_post`.
2921
+
2922
+ Called directly by the daemon endpoint so it never re-routes back over
2923
+ HTTP — mirrors :func:`_claim_review_dispatch_local` exactly, including
2924
+ its ``retry_on_locked`` + row-scoped :func:`coord.db.undo_pending_write`
2925
+ treatment: a `database is locked` collision is absorbed rather than
2926
+ raised straight out, and if the `INSERT OR IGNORE` applied but the
2927
+ following `conn.commit()` raised, the closure undoes its own
2928
+ just-inserted row before re-raising so a commit failure never leaves a
2929
+ claim nobody actually won sitting on the shared connection for an
2930
+ unrelated handler's next commit to durably persist (the vimcode#1086
2931
+ incident :func:`_claim_review_dispatch_local`'s own docstring
2932
+ describes, for the sibling table).
2933
+ """
2934
+
2935
+ def _write() -> int:
2936
+ conn = get_connection()
2937
+ claimed_at = time.time()
2938
+ inserted = 0
2939
+ try:
2940
+ cur = sql.insert_ignore(
2941
+ conn, "review_post_claims", ["assignment_id", "claimed_at"],
2942
+ (assignment_id, claimed_at),
2943
+ )
2944
+ inserted = cur.rowcount or 0
2945
+ conn.commit()
2946
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
2947
+ if inserted:
2948
+ undo_pending_write(
2949
+ conn, exc,
2950
+ undo=lambda: sql.execute(
2951
+ conn,
2952
+ "DELETE FROM review_post_claims "
2953
+ "WHERE assignment_id=? AND claimed_at=?",
2954
+ (assignment_id, claimed_at),
2955
+ ),
2956
+ )
2957
+ raise
2958
+ return inserted
2959
+
2960
+ return retry_on_locked(_write) > 0
2961
+
2962
+
2963
+ def release_review_post_claim(assignment_id: str) -> None:
2964
+ """Release a claim taken by :func:`claim_review_post`, when posting the
2965
+ review's findings failed (#2468).
2966
+
2967
+ Idempotent — deleting an absent row is a no-op. Routes to the daemon
2968
+ exactly like :func:`claim_review_post` does: a thin client that claimed
2969
+ via the ``/review-post-claim`` POST above must release through the same
2970
+ seam, or the claim it took on the daemon's canonical DB would never
2971
+ actually clear.
2972
+
2973
+ Deliberately NOT called on a successful post — see
2974
+ :func:`claim_review_post`'s docstring for why a lingering claim after
2975
+ success is harmless.
2976
+ """
2977
+ if not assignment_id:
2978
+ return
2979
+ svc = _board_service()
2980
+ resp = _route_write(
2981
+ svc, "/review-post-claim-release", {"assignment_id": assignment_id}
2982
+ )
2983
+ if resp is not None:
2984
+ return
2985
+ _release_review_post_claim_local(assignment_id)
2986
+
2987
+
2988
+ def _release_review_post_claim_local(assignment_id: str) -> None:
2989
+ """Local-DB write for :func:`release_review_post_claim`.
2990
+
2991
+ Called directly by the daemon endpoint so it never re-routes back over
2992
+ HTTP. Same ``retry_on_locked`` + undo-this-row-on-commit-failure
2993
+ treatment as :func:`_release_review_dispatch_claim_local` — see that
2994
+ function's docstring for why the undo is a compensating statement
2995
+ rather than any transaction-level rollback.
2996
+ """
2997
+
2998
+ def _write() -> None:
2999
+ conn = get_connection()
3000
+ row = sql.execute(
3001
+ conn,
3002
+ "SELECT claimed_at FROM review_post_claims WHERE assignment_id=?",
3003
+ (assignment_id,),
3004
+ ).fetchone()
3005
+ claimed_at = row[0] if row is not None else None
3006
+ deleted = 0
3007
+ try:
3008
+ cur = sql.execute(
3009
+ conn,
3010
+ "DELETE FROM review_post_claims WHERE assignment_id=?",
3011
+ (assignment_id,),
3012
+ )
3013
+ deleted = cur.rowcount or 0
3014
+ conn.commit()
3015
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
3016
+ if deleted and claimed_at is not None:
3017
+ undo_pending_write(
3018
+ conn, exc,
3019
+ undo=lambda: sql.insert_ignore(
3020
+ conn, "review_post_claims", ["assignment_id", "claimed_at"],
3021
+ (assignment_id, claimed_at),
3022
+ ),
3023
+ )
3024
+ raise
3025
+
3026
+ retry_on_locked(_write)
3027
+
3028
+
2874
3029
  # ── Atomic smoke fan-out dispatch claim (#3333) ──────────────────────────────
2875
3030
 
2876
3031
 
@@ -2472,7 +2472,14 @@ class TestUatStateAndReasonColumns:
2472
2472
  # #3470 bumped this to (21, 98): two new `assignments` indexes appended to
2473
2473
  # `_SCHEMA_SQL` (not a column — `_MIGRATE_ADD_COLUMNS`'s length is
2474
2474
  # unchanged), for the `issue-cost` report's full-history scan.
2475
- _PINNED_SCHEMA_VERSION_AND_MIGRATION_COUNT = (21, 98)
2475
+ # #2468 bumped this to (22, 98): a new `review_post_claims` TABLE (not a
2476
+ # column — `_MIGRATE_ADD_COLUMNS`'s length is unchanged at 98, so only the
2477
+ # version moved, to force `_ensure_schema`'s `CREATE TABLE IF NOT EXISTS` to
2478
+ # run once more on an existing database) — same shape as #3113's
2479
+ # `review_claims` / #3333's `smoke_claims` bumps above. Closes the race where
2480
+ # the live review-completion path and the orphan sweep both see
2481
+ # `review_posted_at IS NULL` and both post the identical GitHub comment.
2482
+ _PINNED_SCHEMA_VERSION_AND_MIGRATION_COUNT = (22, 98)
2476
2483
 
2477
2484
 
2478
2485
  class TestMigrateAddColumnsVersionGuard:
@@ -1360,6 +1360,119 @@ class TestPostOrphanedReviewFindings:
1360
1360
  assert body_arg.startswith("<!-- coord:review verdict=approve")
1361
1361
  assert "All clear." in body_arg
1362
1362
 
1363
+
1364
+ class TestReviewPostClaimRace:
1365
+ """#2468: the identical "Review Complete" comment posted twice, 4 seconds
1366
+ apart, on #2288's round-4 review. `_try_parse_and_post_review` (the live
1367
+ completion path) and `post_orphaned_review_findings` (the orphan sweep)
1368
+ both query "done review, `review_posted_at IS NULL`" and only set
1369
+ `review_posted_at` AFTER posting — a classic check-then-act gap when two
1370
+ coordinator passes race each other. These tests simulate the race by
1371
+ having one caller win `claim_review_post` out-of-band (standing in for a
1372
+ concurrent process) immediately before the other caller runs, and assert
1373
+ the loser never posts."""
1374
+
1375
+ def test_orphan_sweep_skips_when_live_path_already_claimed(
1376
+ self, coord_dir: Path, config: Config, tmp_path: Path
1377
+ ) -> None:
1378
+ """Live-path's claim wins first (simulating `_try_parse_and_post_
1379
+ review` mid-flight on another process, `review_posted_at` not yet
1380
+ set) — the orphan sweep must see the row as a candidate
1381
+ (`review_posted_at IS NULL`) but skip posting rather than writing a
1382
+ second, byte-identical comment."""
1383
+ _record_review_assignment("orphan-race1", review_target="50")
1384
+ from coord.db import get_connection
1385
+ conn = get_connection()
1386
+ conn.execute(
1387
+ "UPDATE assignments SET status='done', finished_at=1234.0 "
1388
+ "WHERE assignment_id='orphan-race1'"
1389
+ )
1390
+ conn.commit()
1391
+
1392
+ # Simulates the live completion path having already won the claim
1393
+ # on a concurrent process, before this sweep runs.
1394
+ assert state_mod.claim_review_post("orphan-race1") is True
1395
+
1396
+ log_path = _make_log_with_review(tmp_path, "request-changes", "Blocking finding.")
1397
+ agent_status = {
1398
+ "active": [],
1399
+ "completed": [_agent_completed("orphan-race1", "done", log_path=log_path)],
1400
+ }
1401
+ with patch.object(notify_mod, "_agent_status", return_value=agent_status), \
1402
+ patch("coord.notify.github_ops.post_pr_review") as mock_review, \
1403
+ patch("coord.notify.github_ops.post_issue_comment") as mock_comment:
1404
+ posted = notify_mod.post_orphaned_review_findings(config)
1405
+
1406
+ assert posted == []
1407
+ mock_review.assert_not_called()
1408
+ mock_comment.assert_not_called()
1409
+
1410
+ def test_live_path_treats_lost_claim_as_handled_not_a_parse_failure(
1411
+ self, coord_dir: Path, config: Config, tmp_path: Path
1412
+ ) -> None:
1413
+ """Orphan sweep's claim wins first (simulating a concurrent
1414
+ `post_orphaned_review_findings` pass) — `_try_parse_and_post_review`
1415
+ must return True (handled elsewhere) rather than False, which the
1416
+ caller in `post_transition` would read as a parse failure and post
1417
+ yet another, differently-worded fallback comment."""
1418
+ _record_review_assignment("rev-race2", review_target="99")
1419
+ log_path = _make_log_with_review(tmp_path, "request-changes", "Blocking finding.")
1420
+
1421
+ # Simulates a concurrent orphan-sweep pass having already won the
1422
+ # claim for this same assignment.
1423
+ assert state_mod.claim_review_post("rev-race2") is True
1424
+
1425
+ transition = notify_mod.Transition(
1426
+ assignment_id="rev-race2",
1427
+ machine_name="laptop",
1428
+ repo_name="api",
1429
+ issue_number=42,
1430
+ event="completion",
1431
+ exit_code=0,
1432
+ )
1433
+ record = {"review_target": "99", "repo_github": "acme/api"}
1434
+ entry = {"log_path": log_path}
1435
+ with patch("coord.notify.github_ops.post_pr_review") as mock_review, \
1436
+ patch("coord.notify.github_ops.post_issue_comment") as mock_comment:
1437
+ result = notify_mod._try_parse_and_post_review(
1438
+ transition, record, entry, 1.0,
1439
+ )
1440
+
1441
+ assert result is True
1442
+ mock_review.assert_not_called()
1443
+ mock_comment.assert_not_called()
1444
+
1445
+ def test_duplicate_direct_calls_post_exactly_once(
1446
+ self, coord_dir: Path, config: Config, tmp_path: Path
1447
+ ) -> None:
1448
+ """Two back-to-back calls to `_try_parse_and_post_review` for the
1449
+ SAME assignment — standing in for two coordinator passes racing each
1450
+ other on the live completion path itself — must post exactly once."""
1451
+ _record_review_assignment("rev-race3", review_target="101")
1452
+ log_path = _make_log_with_review(tmp_path, "approve", "LGTM.")
1453
+
1454
+ transition = notify_mod.Transition(
1455
+ assignment_id="rev-race3",
1456
+ machine_name="laptop",
1457
+ repo_name="api",
1458
+ issue_number=42,
1459
+ event="completion",
1460
+ exit_code=0,
1461
+ )
1462
+ record = {"review_target": "101", "repo_github": "acme/api"}
1463
+ entry = {"log_path": log_path}
1464
+ with patch("coord.notify.github_ops.post_pr_review") as mock_review:
1465
+ first = notify_mod._try_parse_and_post_review(
1466
+ transition, record, entry, 1.0,
1467
+ )
1468
+ second = notify_mod._try_parse_and_post_review(
1469
+ transition, record, entry, 1.0,
1470
+ )
1471
+
1472
+ assert first is True
1473
+ assert second is True # loser: treated as handled, not re-posted
1474
+ mock_review.assert_called_once()
1475
+
1363
1476
  # ── #2476: cost/token capture on the orphaned-findings path ────────────
1364
1477
  #
1365
1478
  # Root cause: `post_orphaned_review_findings` (run_drain's step 4, which