code-coordinator 0.5.561__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.561 → code_coordinator-0.5.563}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/acceptance.py +60 -0
  5. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/db.py +47 -1
  6. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dispatch.py +73 -34
  7. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/milestone_dispatch.py +49 -2
  8. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notify.py +50 -0
  9. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/serve_app.py +104 -0
  10. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/state.py +155 -0
  11. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_acceptance.py +58 -0
  12. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_db.py +8 -1
  13. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dispatch.py +136 -31
  14. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notify.py +113 -0
  15. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_verdict_relay.py +120 -0
  16. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_state.py +97 -0
  17. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.github/coord-ci-acceptance.yml +0 -0
  26. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.github/workflows/auto-release.yml +0 -0
  27. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/.gitignore +0 -0
  30. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/GOAL.md +0 -0
  32. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/LICENSE +0 -0
  33. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/README.md +0 -0
  35. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/SOURCES.txt +0 -0
  36. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/dependency_links.txt +0 -0
  37. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/entry_points.txt +0 -0
  38. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/requires.txt +0 -0
  39. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/scm_file_list.json +0 -0
  40. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agent.py +0 -0
  45. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/approved_work.py +0 -0
  51. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/backup.py +0 -0
  54. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/block_log.py +0 -0
  55. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/board_schema.py +0 -0
  56. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/bugbash.py +0 -0
  62. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/ci_fix.py +0 -0
  64. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/ci_github.py +0 -0
  65. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/ci_gitlab.py +0 -0
  66. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/ci_store.py +0 -0
  67. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/claim.py +0 -0
  68. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/claude_setup_token.py +0 -0
  69. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/cli.py +0 -0
  70. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/client.py +0 -0
  71. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/codegen.py +0 -0
  72. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/__init__.py +0 -0
  73. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/_common.py +0 -0
  74. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/acceptance.py +0 -0
  75. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/agent_ops.py +0 -0
  76. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/audit.py +0 -0
  77. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/backup.py +0 -0
  78. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/bugbash.py +0 -0
  79. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/chat.py +0 -0
  80. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/ci.py +0 -0
  81. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/codegen.py +0 -0
  82. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/dispatch.py +0 -0
  83. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/dispatch_workers.py +0 -0
  84. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/dr.py +0 -0
  85. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/drive.py +0 -0
  86. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/drive_queue.py +0 -0
  87. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/gate_a.py +0 -0
  88. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/gates.py +0 -0
  89. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/issues.py +0 -0
  90. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/lifecycle.py +0 -0
  91. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/machine.py +0 -0
  92. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/merge.py +0 -0
  93. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/milestone.py +0 -0
  94. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/plan_followup.py +0 -0
  95. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/plans.py +0 -0
  96. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/portal.py +0 -0
  97. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/pr.py +0 -0
  98. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/release.py +0 -0
  99. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/repo.py +0 -0
  100. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/report.py +0 -0
  101. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/review.py +0 -0
  102. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/scorecard.py +0 -0
  103. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/sessions.py +0 -0
  104. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/setup.py +0 -0
  105. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/status.py +0 -0
  106. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/store_migrate.py +0 -0
  107. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/terminal.py +0 -0
  108. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/test_gate.py +0 -0
  109. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/commands/tui.py +0 -0
  110. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/comments.py +0 -0
  111. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/config.py +0 -0
  112. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/config_reload.py +0 -0
  113. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/confirm_test.py +0 -0
  114. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/conflict_fix.py +0 -0
  115. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dao.py +0 -0
  116. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dashboard/__init__.py +0 -0
  117. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dashboard/fixture.py +0 -0
  118. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dashboard/index.html +0 -0
  119. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dashboard/server.py +0 -0
  120. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dashboard/terminal.py +0 -0
  121. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dead_end.py +0 -0
  122. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/decomposition_chat.py +0 -0
  123. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/README.md +0 -0
  124. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-agent.service +0 -0
  125. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-backup.service +0 -0
  126. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-backup.timer +0 -0
  127. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.service +0 -0
  128. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.sh +0 -0
  129. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-db-backup.timer +0 -0
  130. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-dr-verify.service +0 -0
  131. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-dr-verify.timer +0 -0
  132. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-drive-queue.service +0 -0
  133. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-drive-queue.timer +0 -0
  134. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-failure-notify.service +0 -0
  135. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-fleet-watchdog.service +0 -0
  136. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  137. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-notify.service +0 -0
  138. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-notify.timer +0 -0
  139. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-release-propagate.service +0 -0
  140. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-release-propagate.timer +0 -0
  141. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-release-window.service +0 -0
  142. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-release-window.timer +0 -0
  143. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-serve.service +0 -0
  144. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-web-dist-build.service +0 -0
  145. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-web-dist-build.timer +0 -0
  146. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy/coord-web.service +0 -0
  147. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy_manifest.py +0 -0
  148. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deploy_units.py +0 -0
  149. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deprecation_telemetry.py +0 -0
  150. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/deps.py +0 -0
  151. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/diagnose.py +0 -0
  152. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dispatch_liveness.py +0 -0
  153. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dist_name.py +0 -0
  154. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dr_promote.py +0 -0
  155. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/dr_verify.py +0 -0
  156. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/drive.py +0 -0
  157. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/drive_queue.py +0 -0
  158. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/drive_sessions_snapshot.py +0 -0
  159. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/drive_state.py +0 -0
  160. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/events.py +0 -0
  161. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/failure_class.py +0 -0
  162. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/failure_classifier.py +0 -0
  163. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/filelock.py +0 -0
  164. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/fleet_config_health.py +0 -0
  165. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/forge_availability.py +0 -0
  166. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/freshness.py +0 -0
  167. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gate_a.py +0 -0
  168. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gate_b.py +0 -0
  169. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gate_snapshot.py +0 -0
  170. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gates.py +0 -0
  171. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gen_board_fixture.py +0 -0
  172. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/github_ops.py +0 -0
  173. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/github_throttle.py +0 -0
  174. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/goal.py +0 -0
  175. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/graph_health.py +0 -0
  176. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/gtk_native_driver.py +0 -0
  177. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/__init__.py +0 -0
  178. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/aggregate.py +0 -0
  179. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/__init__.py +0 -0
  180. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/_ci_pin.py +0 -0
  181. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/agent_install.py +0 -0
  182. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/cargo_targets.py +0 -0
  183. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/claude_binary.py +0 -0
  184. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/config_drift.py +0 -0
  185. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  186. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/coord_web_ci_pin.py +0 -0
  187. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/deploy_lane_facts.py +0 -0
  188. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/disk.py +0 -0
  189. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/fleet_board.py +0 -0
  190. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  191. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/fleet_phantom.py +0 -0
  192. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/fleet_unit_drift.py +0 -0
  193. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/graph.py +0 -0
  194. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/graphify_cli.py +0 -0
  195. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/index_lock.py +0 -0
  196. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/issues_sync_staleness.py +0 -0
  197. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/local_machine_identity.py +0 -0
  198. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/plan_usage.py +0 -0
  199. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/pr_churn.py +0 -0
  200. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/release_cordon.py +0 -0
  201. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/repo_state.py +0 -0
  202. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/spawned_coord.py +0 -0
  203. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/stalled_pipeline.py +0 -0
  204. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/timer_active.py +0 -0
  205. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/toolchain.py +0 -0
  206. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/unit_drift.py +0 -0
  207. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/unit_enablement.py +0 -0
  208. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/wedged_drive_queue.py +0 -0
  209. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/checks/worktrees.py +0 -0
  210. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/cli.py +0 -0
  211. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/context.py +0 -0
  212. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/fleet_snapshot.py +0 -0
  213. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/models.py +0 -0
  214. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/pypi.py +0 -0
  215. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/registry.py +0 -0
  216. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/render.py +0 -0
  217. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/health/units.py +0 -0
  218. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/hooks.py +0 -0
  219. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/housekeeping.py +0 -0
  220. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/interactive.py +0 -0
  221. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/invariant_alarms.py +0 -0
  222. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/issue_store.py +0 -0
  223. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/issues_sync_status.py +0 -0
  224. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/liveness_auditor.py +0 -0
  225. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/mac_native_driver.py +0 -0
  226. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/machine_fault.py +0 -0
  227. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/machine_metrics.py +0 -0
  228. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/machine_onboard.py +0 -0
  229. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/machine_pause.py +0 -0
  230. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/machine_stats.py +0 -0
  231. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/merge_queue.py +0 -0
  232. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/milestone_chat.py +0 -0
  233. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/milestone_gate.py +0 -0
  234. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/milestone_order.py +0 -0
  235. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/mock_author.py +0 -0
  236. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/models.py +0 -0
  237. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/network.py +0 -0
  238. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/new_issue_chat.py +0 -0
  239. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/__init__.py +0 -0
  240. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/baseline.py +0 -0
  241. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/cli.py +0 -0
  242. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/collect.py +0 -0
  243. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/digest.py +0 -0
  244. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/models.py +0 -0
  245. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/predicate.py +0 -0
  246. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/service.py +0 -0
  247. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/store.py +0 -0
  248. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/notifier/transport.py +0 -0
  249. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/openapi.py +0 -0
  250. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/overlap_fence.py +0 -0
  251. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/overlap_predict.py +0 -0
  252. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/parentage.py +0 -0
  253. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/parentage_github.py +0 -0
  254. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/pipeline.py +0 -0
  255. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/plan_parser.py +0 -0
  256. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/plans.py +0 -0
  257. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/platform_paths.py +0 -0
  258. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/portal_bridge.py +0 -0
  259. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/portal_store.py +0 -0
  260. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/portal_sync.py +0 -0
  261. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/pr_body_lint.py +0 -0
  262. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/prereqs.py +0 -0
  263. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/progress.py +0 -0
  264. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/providers/__init__.py +0 -0
  265. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/providers/base.py +0 -0
  266. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/providers/claude.py +0 -0
  267. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/providers/claude_pty.py +0 -0
  268. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/providers/opencode.py +0 -0
  269. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/queue_diagnose.py +0 -0
  270. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/reconcile.py +0 -0
  271. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/reconcile_tick.py +0 -0
  272. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/refine_chat.py +0 -0
  273. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/release_cordon.py +0 -0
  274. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/release_gate.py +0 -0
  275. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/release_propagate.py +0 -0
  276. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/release_verify.py +0 -0
  277. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/release_window.py +0 -0
  278. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/repo_dormancy.py +0 -0
  279. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/repo_edit.py +0 -0
  280. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/repo_onboard.py +0 -0
  281. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/reports.py +0 -0
  282. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/rest_schema.py +0 -0
  283. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/restart_cmd.py +0 -0
  284. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/revalidate.py +0 -0
  285. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/review.py +0 -0
  286. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/scorecard.py +0 -0
  287. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/self_health.py +0 -0
  288. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  289. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  290. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  291. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  293. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/portal-followup/SKILL.md +0 -0
  294. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/release-now/SKILL.md +0 -0
  295. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  296. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  297. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/skills/update-issue/SKILL.md +0 -0
  298. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/smoke.py +0 -0
  299. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/smoke_tags.py +0 -0
  300. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/spend_ceiling.py +0 -0
  301. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/split_work.py +0 -0
  302. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/sql.py +0 -0
  303. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/stage_projection.py +0 -0
  304. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/store_migrate.py +0 -0
  305. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/store_parity.py +0 -0
  306. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/templates/deploy-cloudflare.node.yml +0 -0
  307. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/test_author.py +0 -0
  308. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/test_chat.py +0 -0
  309. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/test_orchestrator.py +0 -0
  310. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/test_report.py +0 -0
  311. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/tui_pty_driver.py +0 -0
  312. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/usage_rollup.py +0 -0
  317. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/win_native_bridge.py +0 -0
  318. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/win_native_driver.py +0 -0
  319. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coord/worker_events.py +0 -0
  320. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/coordinator.example.yml +0 -0
  321. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-agent.service +0 -0
  322. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-backup.service +0 -0
  323. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-backup.timer +0 -0
  324. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-db-backup.service +0 -0
  325. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-db-backup.sh +0 -0
  326. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-db-backup.timer +0 -0
  327. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-dr-verify.service +0 -0
  328. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-dr-verify.timer +0 -0
  329. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-drive-queue.service +0 -0
  330. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-drive-queue.timer +0 -0
  331. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-failure-notify.service +0 -0
  332. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-failure-notify.sh +0 -0
  333. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-fleet-watchdog.service +0 -0
  334. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-fleet-watchdog.timer +0 -0
  335. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-notify.service +0 -0
  336. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-notify.timer +0 -0
  337. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-release-propagate.service +0 -0
  338. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-release-propagate.timer +0 -0
  339. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-release-window.service +0 -0
  340. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-release-window.timer +0 -0
  341. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-serve.service +0 -0
  342. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.service +0 -0
  343. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.sh +0 -0
  344. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-web-dist-build.timer +0 -0
  345. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-web-rollback.sh +0 -0
  346. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/coord-web.service +0 -0
  347. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/deploy/node-shim.sh +0 -0
  348. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ADR_COORD_TUI_CI.md +0 -0
  349. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  350. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_CI.md +0 -0
  351. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ADR_COORD_WEB_DIST.md +0 -0
  352. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  353. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/AGENT_OPERATIONS.md +0 -0
  354. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ARCHITECTURE.md +0 -0
  355. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ARCH_SECURITY_GATES.md +0 -0
  356. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/COCKPIT.md +0 -0
  357. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/CONTROL_CENTER.md +0 -0
  358. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/COST_DISCIPLINE.md +0 -0
  359. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/CROSS_PLATFORM.md +0 -0
  360. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/CUSTOMER_FACING_APPS.md +0 -0
  361. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/CUSTOMER_PORTAL.md +0 -0
  362. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/DATA_STORE_SELECTION.md +0 -0
  363. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/DISASTER_RECOVERY.md +0 -0
  364. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/DRIVE_QUEUE.md +0 -0
  365. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/EPHEMERAL_WORKERS.md +0 -0
  366. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/FORGE_MIGRATION.md +0 -0
  367. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/GRAPHIFY_SETUP.md +0 -0
  368. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ISSUE_GUIDANCE.md +0 -0
  369. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/MAC_MINI.md +0 -0
  370. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  371. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/NOTIFIER.md +0 -0
  372. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/OPENCODE_VERIFICATION.md +0 -0
  373. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/OPERATING_GOTCHAS.md +0 -0
  374. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/OPERATOR_GUIDES.md +0 -0
  375. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/WSL_WINDOWS_WORKER.md +0 -0
  384. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/mocks/web/README.md +0 -0
  385. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/mocks/web/_tokens.css +0 -0
  386. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/mocks/web/issue-detail.html +0 -0
  387. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/mocks/web/pipeline-narrow.html +0 -0
  388. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/docs/mocks/web/pipeline-wide.html +0 -0
  389. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/graphify-out/.gitignore +0 -0
  390. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/install-agent.sh +0 -0
  391. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/pyproject.toml +0 -0
  392. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/audit_review_verdict_overrides.py +0 -0
  393. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  394. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/build-worker-image.sh +0 -0
  395. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/coordinator-machine.py +0 -0
  396. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/dr-down.sh +0 -0
  397. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/dr-up.sh +0 -0
  398. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/epic-down.sh +0 -0
  399. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/epic-up.sh +0 -0
  400. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/preflight.sh +0 -0
  401. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/provision-server.sh +0 -0
  402. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/provision-worker.sh +0 -0
  403. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  404. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  405. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/throwaway-vm.sh +0 -0
  406. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/azure-workers/verify-github-token.sh +0 -0
  407. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/check_gh_argv_containment.py +0 -0
  408. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/codegen.py +0 -0
  409. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-test-runner.sh +0 -0
  410. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  411. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  412. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  413. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  414. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/coord-venv-rollback.sh +0 -0
  415. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/extract-coord-tui.sh +0 -0
  417. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/fleet_watchdog.py +0 -0
  418. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/gen_mock_index.py +0 -0
  420. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/lib/provision-core.sh +0 -0
  421. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/next_release_tag.py +0 -0
  422. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/provision-machine.sh +0 -0
  423. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/run_tests_in_populated_home.sh +0 -0
  424. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/run_tests_without_gh.sh +0 -0
  425. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/setup-macmini.sh +0 -0
  426. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/smoke_437_interactive.py +0 -0
  427. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/verify-provision-noble.sh +0 -0
  428. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/verify_878_review_capture.py +0 -0
  429. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/verify_release_published.py +0 -0
  430. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/scripts/verify_release_wheel.py +0 -0
  431. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/setup.cfg +0 -0
  432. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/SMOKE_SET.md +0 -0
  433. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/__init__.py +0 -0
  434. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/contract.md +0 -0
  440. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  441. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  442. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/manifest.yml +0 -0
  443. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-51/tsconfig.json +0 -0
  445. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/backends.py +0 -0
  447. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  452. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  465. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_acceptance_drivers.py +0 -0
  470. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  479. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_skills_self_heal.py +0 -0
  487. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approve_capability_reroute_3241.py +0 -0
  494. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approve_dependency_busy_2804.py +0 -0
  495. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approved_work_2532.py +0 -0
  498. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_approved_work_2996.py +0 -0
  499. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_assignment_already_recorded_daemon.py +0 -0
  500. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_audit_log.py +0 -0
  501. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_audit_outcome.py +0 -0
  502. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_audit_query.py +0 -0
  503. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_auto_loop.py +0 -0
  504. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_auto_release_publish_2035.py +0 -0
  505. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_backend_selection.py +0 -0
  506. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_backup.py +0 -0
  507. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_schema.py +0 -0
  513. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_bugbash.py +0 -0
  520. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_check_gh_argv_containment.py +0 -0
  523. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_fix.py +0 -0
  525. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_github.py +0 -0
  526. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_gitlab.py +0 -0
  527. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_parity_2091.py +0 -0
  528. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_ci_store.py +0 -0
  529. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_claim.py +0 -0
  530. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_claude_md_budget.py +0 -0
  531. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_claude_setup_token.py +0 -0
  532. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_ci.py +0 -0
  541. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_codegen.py +0 -0
  542. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_decide.py +0 -0
  543. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_capability_rules.py +0 -0
  544. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_config_provenance.py +0 -0
  545. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_forge_availability.py +0 -0
  546. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_graph.py +0 -0
  547. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_self.py +0 -0
  548. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_diagnose_test_coverage.py +0 -0
  549. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  553. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_drive.py +0 -0
  554. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_drive_queue.py +0 -0
  555. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_issue_comment.py +0 -0
  561. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_issue_create_label.py +0 -0
  562. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_issue_reopen.py +0 -0
  563. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_issue_view_list.py +0 -0
  564. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_issues.py +0 -0
  565. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_pr.py +0 -0
  580. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_pull_artifact.py +0 -0
  581. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_queue.py +0 -0
  582. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_reattach_sessions.py +0 -0
  583. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_refine_board.py +0 -0
  584. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_release_preflight.py +0 -0
  585. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_release_propagate.py +0 -0
  586. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_release_window.py +0 -0
  587. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_repo_2220.py +0 -0
  588. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  589. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_scorecard.py +0 -0
  590. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_serve_store_backend_3084.py +0 -0
  591. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_set_review_findings.py +0 -0
  592. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_advisory_terminal.py +0 -0
  593. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_contested_tag.py +0 -0
  594. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_invariant_alarms.py +0 -0
  595. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_machine_fault.py +0 -0
  596. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_merge_queue.py +0 -0
  597. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_provider.py +0 -0
  598. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_retried_3340.py +0 -0
  599. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_review_finalizing.py +0 -0
  600. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_supervisor_3366.py +0 -0
  601. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_test_failed_tag.py +0 -0
  602. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_status_usage_limit.py +0 -0
  603. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_sync_comments_873.py +0 -0
  604. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_test_plan.py +0 -0
  605. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_track.py +0 -0
  606. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_tui_update.py +0 -0
  607. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cli_wait.py +0 -0
  608. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_client.py +0 -0
  609. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_client_base_install.py +0 -0
  610. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_client_config_cache_atomic_3052.py +0 -0
  611. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_client_resource_migration_1946.py +0 -0
  612. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_commands_common.py +0 -0
  613. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_comments.py +0 -0
  614. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_completion_summary.py +0 -0
  615. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config.py +0 -0
  616. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_acceptance.py +0 -0
  617. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_audit.py +0 -0
  618. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_drift_check.py +0 -0
  619. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_effective.py +0 -0
  620. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_pricing.py +0 -0
  621. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  622. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_config_usage_gate.py +0 -0
  623. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_confirm_test.py +0 -0
  624. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  627. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test.py +0 -0
  628. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  629. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test_runner_baseline.py +0 -0
  630. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test_runner_populated_home.py +0 -0
  631. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test_runner_routing.py +0 -0
  632. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_test_runner_toolchain.py +0 -0
  633. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_uat.py +0 -0
  634. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coord_web_sse_restart_live.py +0 -0
  635. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_coordinator_machine.py +0 -0
  636. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_cross_platform_imports.py +0 -0
  637. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dao.py +0 -0
  638. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard.py +0 -0
  639. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard_api.py +0 -0
  640. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard_fixture.py +0 -0
  641. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard_server.py +0 -0
  642. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard_terminal.py +0 -0
  643. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dashboard_terminal_live.py +0 -0
  644. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dead_end.py +0 -0
  645. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_decomposition_chat.py +0 -0
  646. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_coord_db_backup.py +0 -0
  647. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_coord_web_dist.py +0 -0
  648. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_coord_web_rollback.py +0 -0
  649. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_db_backup_unit.py +0 -0
  650. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_drive_queue_unit.py +0 -0
  651. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_failure_notify_unit.py +0 -0
  652. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_manifest.py +0 -0
  653. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_notify_unit.py +0 -0
  654. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_units_lane.py +0 -0
  655. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deploy_web_unit.py +0 -0
  656. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deprecation_telemetry.py +0 -0
  657. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_deps.py +0 -0
  658. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_diagnose.py +0 -0
  659. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dispatch_liveness.py +0 -0
  660. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dispatch_target_validation.py +0 -0
  661. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dispatch_workers.py +0 -0
  662. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dist_name.py +0 -0
  663. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_done_housekeeping.py +0 -0
  664. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dr_azure_scripts.py +0 -0
  665. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dr_promote.py +0 -0
  666. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_dr_verify.py +0 -0
  667. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive.py +0 -0
  668. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_machine_fault.py +0 -0
  669. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue.py +0 -0
  670. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_blocked_rendering.py +0 -0
  671. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_launch_argv.py +0 -0
  672. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_max_parallel_config.py +0 -0
  673. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  674. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_roll_pending.py +0 -0
  675. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  676. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_sessions_snapshot.py +0 -0
  677. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_state.py +0 -0
  678. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_drive_tmux.py +0 -0
  679. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_epic_up_capability_detection.py +0 -0
  680. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  681. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_epic_up_image_provenance.py +0 -0
  682. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_errors.py +0 -0
  683. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_events.py +0 -0
  684. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_failure_class.py +0 -0
  685. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_failure_classifier.py +0 -0
  686. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_filelock.py +0 -0
  687. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  688. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fix_escalation_classifier.py +0 -0
  689. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fix_of_force_override.py +0 -0
  690. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fleet_config_health.py +0 -0
  691. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fleet_health_probes.py +0 -0
  692. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fleet_health_snapshot.py +0 -0
  693. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_fleet_watchdog.py +0 -0
  694. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_forge_availability.py +0 -0
  695. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_freshness.py +0 -0
  696. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gate_a.py +0 -0
  697. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gate_b.py +0 -0
  698. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gate_snapshot_staleness.py +0 -0
  699. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gates.py +0 -0
  700. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  701. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gen_mock_index.py +0 -0
  702. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_generated_rust_fixture.py +0 -0
  703. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_generated_rust_requests.py +0 -0
  704. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_generated_types_fixture.py +0 -0
  705. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_github_ops.py +0 -0
  706. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_github_throttle.py +0 -0
  707. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_goal.py +0 -0
  708. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_graph_health.py +0 -0
  709. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_graph_selfheal_absent_2237.py +0 -0
  710. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_gtk_native_driver.py +0 -0
  711. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_handoff.py +0 -0
  712. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_checks.py +0 -0
  713. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_cli.py +0 -0
  714. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_cli_graph.py +0 -0
  715. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_config.py +0 -0
  716. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_context.py +0 -0
  717. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_coord_tui_ci_pin.py +0 -0
  718. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_coord_web_ci_pin.py +0 -0
  719. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_deploy_lane_facts.py +0 -0
  720. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_fix.py +0 -0
  721. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_incident_regression.py +0 -0
  722. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_issues_sync_staleness.py +0 -0
  723. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_pr_churn.py +0 -0
  724. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_pypi.py +0 -0
  725. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_registry.py +0 -0
  726. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_release_cordon_probe.py +0 -0
  727. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_timer_active.py +0 -0
  728. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_toolchain.py +0 -0
  729. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_unit_drift.py +0 -0
  730. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_unit_enablement.py +0 -0
  731. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_health_wedged_drive_queue.py +0 -0
  732. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_hooks.py +0 -0
  733. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_housekeeping.py +0 -0
  734. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_human_attended_437.py +0 -0
  735. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_init.py +0 -0
  736. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_install_agent_capabilities_3515.py +0 -0
  737. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_install_agent_venv_2911.py +0 -0
  738. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  739. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_integration.py +0 -0
  740. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive.py +0 -0
  741. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_briefing_echo.py +0 -0
  742. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_pane_log_2541.py +0 -0
  743. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_prefill_state.py +0 -0
  744. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_session_relaunch.py +0 -0
  745. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_test_verdict_backstop.py +0 -0
  746. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_token_attribution.py +0 -0
  747. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_interactive_worktree.py +0 -0
  748. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_invariant_alarms.py +0 -0
  749. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_issue_store_seam.py +0 -0
  750. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_issues_sync_status.py +0 -0
  751. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_liveness_auditor.py +0 -0
  752. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_liveness_notify.py +0 -0
  753. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_lock_contention_ratchet.py +0 -0
  754. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_mac_native_driver.py +0 -0
  755. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_machine_fault.py +0 -0
  756. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_machine_metrics.py +0 -0
  757. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_machine_onboard.py +0 -0
  758. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_machine_pause.py +0 -0
  759. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_machine_stats.py +0 -0
  760. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_merge_queue.py +0 -0
  761. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_merge_verify.py +0 -0
  762. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_milestone_chat.py +0 -0
  763. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_milestone_dispatch.py +0 -0
  764. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_milestone_gate.py +0 -0
  765. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_milestone_order.py +0 -0
  766. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_milestone_seam.py +0 -0
  767. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_mock_author.py +0 -0
  768. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_model_tiering.py +0 -0
  769. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_models.py +0 -0
  770. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_models_config_labels.py +0 -0
  771. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_needs_attention.py +0 -0
  772. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_network.py +0 -0
  773. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_new_issue_chat.py +0 -0
  774. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_next_release_tag.py +0 -0
  775. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_node_shim.py +0 -0
  776. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_baseline.py +0 -0
  777. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_cli.py +0 -0
  778. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_collect.py +0 -0
  779. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_config.py +0 -0
  780. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_drive_seam.py +0 -0
  781. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_isolation.py +0 -0
  782. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_predicate.py +0 -0
  783. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_quiet_hours.py +0 -0
  784. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notifier_service.py +0 -0
  785. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_notify_drain.py +0 -0
  786. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_openapi.py +0 -0
  787. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_operational_defaults.py +0 -0
  788. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_overlap_fence.py +0 -0
  789. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_overlap_predict.py +0 -0
  790. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_packaged_deploy_units.py +0 -0
  791. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_parentage.py +0 -0
  792. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_paste_landed.py +0 -0
  793. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  794. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_pipeline.py +0 -0
  795. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_plan_followup_approve_plan_command.py +0 -0
  796. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_plan_followup_pr_command.py +0 -0
  797. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_plan_followup_review_command.py +0 -0
  798. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_plan_only.py +0 -0
  799. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_plan_parser.py +0 -0
  800. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_platform_paths.py +0 -0
  801. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_portal_bridge.py +0 -0
  802. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_portal_config.py +0 -0
  803. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_portal_store.py +0 -0
  804. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_portal_sync.py +0 -0
  805. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_pr_body_lint.py +0 -0
  806. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_prereqs.py +0 -0
  807. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_production_db_guard.py +0 -0
  808. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_progress.py +0 -0
  809. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_provider_seam.py +0 -0
  810. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_providers.py +0 -0
  811. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_providers_config_labels.py +0 -0
  812. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_providers_pty.py +0 -0
  813. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_provision_core.py +0 -0
  814. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_provision_machine.py +0 -0
  815. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_py_rust_mirror_inventory.py +0 -0
  816. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_quiet_hours.py +0 -0
  817. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_quiet_hours_store_2146.py +0 -0
  818. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reap_merged_sessions.py +0 -0
  819. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reap_stale_interactive_tick.py +0 -0
  820. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile.py +0 -0
  821. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_branch.py +0 -0
  822. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_completions.py +0 -0
  823. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  824. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_merges.py +0 -0
  825. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_no_agent_record.py +0 -0
  826. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_tick.py +0 -0
  827. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reconcile_usage_limit_done.py +0 -0
  828. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_refine_chat.py +0 -0
  829. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_cordon_2101.py +0 -0
  830. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  831. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_cordon_deadlock_2240.py +0 -0
  832. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  833. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_cordon_stuck_2490.py +0 -0
  834. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_gate.py +0 -0
  835. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_propagate.py +0 -0
  836. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_propagate_threshold.py +0 -0
  837. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_roll_between_legs_2854.py +0 -0
  838. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_roll_window_handoff.py +0 -0
  839. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_unified_1242.py +0 -0
  840. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_verify.py +0 -0
  841. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_release_window.py +0 -0
  842. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_remote_auto_prune.py +0 -0
  843. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_remote_interactive_reaper.py +0 -0
  844. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_add.py +0 -0
  845. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_dormancy.py +0 -0
  846. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_edit_2220.py +0 -0
  847. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_graph_fleet_2237.py +0 -0
  848. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_max_parallel_3423.py +0 -0
  849. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_repo_onboard_2220.py +0 -0
  850. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_report_result_push.py +0 -0
  851. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_reports.py +0 -0
  852. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_restart_cmd.py +0 -0
  853. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_retry.py +0 -0
  854. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_retry_advisory_1606.py +0 -0
  855. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_retry_escalation_classify_3360.py +0 -0
  856. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_retry_type_1636.py +0 -0
  857. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_revalidate.py +0 -0
  858. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review.py +0 -0
  859. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_end_review_without_verdict.py +0 -0
  860. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_parse_failure_diagnostic.py +0 -0
  861. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_reaffirm.py +0 -0
  862. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_state.py +0 -0
  863. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_verdict_backstop.py +0 -0
  864. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_verdict_override_audit.py +0 -0
  865. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_review_zero_commits.py +0 -0
  866. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_scoped_review_wiring.py +0 -0
  867. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_scorecard.py +0 -0
  868. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_self_health.py +0 -0
  869. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_serve.py +0 -0
  870. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_serve_app.py +0 -0
  871. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_serve_app_board_trim.py +0 -0
  872. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_serve_rest_routes.py +0 -0
  873. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_session.py +0 -0
  874. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_slice_issue_attribution.py +0 -0
  875. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_smoke.py +0 -0
  876. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  877. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_smoke_live_checkout_restore.py +0 -0
  878. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_smoke_workflow.py +0 -0
  879. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_spend_ceiling.py +0 -0
  880. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_spend_ceiling_coordinator.py +0 -0
  881. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_split.py +0 -0
  882. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_split_work.py +0 -0
  883. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_sql_dialect.py +0 -0
  884. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_sqlite_connect_ratchet.py +0 -0
  885. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stage_projection.py +0 -0
  886. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stale_busy_reviewer_697.py +0 -0
  887. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stalled_pipeline.py +0 -0
  888. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_state_review_findings_daemon.py +0 -0
  889. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_status_fleet_footer.py +0 -0
  890. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stop_1567.py +0 -0
  891. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_store_contract.py +0 -0
  892. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_store_migrate.py +0 -0
  893. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stuck.py +0 -0
  894. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  895. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_terminal_command.py +0 -0
  896. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_author.py +0 -0
  897. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_chat.py +0 -0
  898. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_orchestrator.py +0 -0
  899. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_report.py +0 -0
  900. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_verdict_parsing.py +0 -0
  901. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_test_verdict_transcript_floor.py +0 -0
  902. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_text_io_encoding_audit.py +0 -0
  903. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_thin_client_board_audit.py +0 -0
  904. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_thin_client_config_load_1080.py +0 -0
  905. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_thin_client_daemon_routing_906.py +0 -0
  906. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_throwaway_vm.py +0 -0
  907. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_tmux_host.py +0 -0
  908. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_tmux_session.py +0 -0
  909. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_transcript_floor.py +0 -0
  910. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_tui_pty_driver.py +0 -0
  911. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_uat_checks.py +0 -0
  912. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_usage.py +0 -0
  913. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_usage_limits.py +0 -0
  914. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_usage_rollup.py +0 -0
  915. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_venv_live_install_2121.py +0 -0
  916. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_version_single_source.py +0 -0
  917. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_watch.py +0 -0
  918. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_win_native_bridge.py +0 -0
  919. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_win_native_driver.py +0 -0
  920. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  921. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worker_env_venv_isolation.py +0 -0
  922. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worker_events.py +0 -0
  923. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worker_image_pin_sync.py +0 -0
  924. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worker_safety.py +0 -0
  925. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worker_test_scoping.py +0 -0
  926. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worktree.py +0 -0
  927. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  928. {code_coordinator-0.5.561 → code_coordinator-0.5.563}/tests/test_write_parity.py +0 -0
  929. {code_coordinator-0.5.561 → 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.561
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.561
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.561",
2
+ "tag": "0.5.563",
3
3
  "distance": 0,
4
- "node": "g719f616d563fc6b94375e7381da2f4b6bc6c833d",
4
+ "node": "gd370d95cd8b305a54b4761f01ee5c006b5fa5099",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-02"
@@ -877,6 +877,66 @@ def oracle_loop_contract_block(
877
877
  if ms_dir is None:
878
878
  return ""
879
879
 
880
+ return _render_oracle_contract_block(
881
+ repo_name, issue_number, ms_dir, acceptance_dirname, exempt=exempt,
882
+ )
883
+
884
+
885
+ def oracle_loop_contract_block_for_slice(
886
+ repo_name: str,
887
+ issue_number: int,
888
+ *,
889
+ has_slice: bool,
890
+ exempt: bool,
891
+ ms_dir: str,
892
+ acceptance_dirname: str = ACCEPTANCE_DIRNAME,
893
+ ) -> str:
894
+ """(#2166) The exact same worker-briefing contract text
895
+ :func:`oracle_loop_contract_block` renders, but driven by an already-
896
+ resolved verdict (*has_slice*/*exempt*/*ms_dir*/*acceptance_dirname*)
897
+ instead of scanning a local checkout for one.
898
+
899
+ Exists so :func:`coord.dispatch.dispatch` can build the briefing block
900
+ from the EXACT SAME read :func:`coord.milestone_dispatch.
901
+ issue_oracle_ready` already did for the #1138 hard gate (default
902
+ branch, over ``gh``, one memoised fetch seam) rather than a second,
903
+ independent local-checkout scan that can silently disagree with it —
904
+ the #2166 split-brain: a dispatching host whose base checkout lagged
905
+ the default branch by a few commits had this (the old
906
+ ``oracle_loop_contract_block(Path, ...)`` call) come back ``""`` while
907
+ the gate, reading the default branch directly, had already let the
908
+ issue through — so the worker got dispatched with no oracle contract
909
+ at all, silently.
910
+
911
+ Returns ``""`` when *ms_dir* is empty (the gate never resolved a
912
+ milestone for this issue — ``OracleReadiness.applies`` was ``False``)
913
+ or neither *has_slice* nor *exempt* is set (no contract to point at
914
+ yet). Callers that have a full ``OracleReadiness`` in hand should pass
915
+ its ``has_slice``/``exempt``/``ms_dir``/``acceptance_dirname`` fields
916
+ straight through.
917
+ """
918
+ if not ms_dir or not (has_slice or exempt):
919
+ return ""
920
+ return _render_oracle_contract_block(
921
+ repo_name, issue_number, ms_dir, acceptance_dirname, exempt=exempt,
922
+ )
923
+
924
+
925
+ def _render_oracle_contract_block(
926
+ repo_name: str,
927
+ issue_number: int,
928
+ ms_dir: str,
929
+ acceptance_dirname: str,
930
+ *,
931
+ exempt: bool,
932
+ ) -> str:
933
+ """Shared template for :func:`oracle_loop_contract_block` (local-
934
+ checkout scan) and :func:`oracle_loop_contract_block_for_slice`
935
+ (gate-verdict-driven, #2166) — ONE rendering so the text a worker sees
936
+ can never drift between the two slice-presence sources, even though
937
+ which SOURCE decided "there is a slice" differs between the two
938
+ callers.
939
+ """
880
940
  dirname = acceptance_dirname.rstrip("/") if acceptance_dirname else ACCEPTANCE_DIRNAME
881
941
  contract_path = f"{dirname}/{ms_dir}/contract.md"
882
942
  mocks_dir = f"{dirname}/{ms_dir}/mocks"
@@ -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
@@ -12,6 +12,8 @@ import httpx
12
12
  if TYPE_CHECKING:
13
13
  from datetime import datetime
14
14
 
15
+ from coord.milestone_dispatch import OracleReadiness
16
+
15
17
  from coord import github_ops
16
18
  from coord.comments import (
17
19
  format_advisory,
@@ -112,7 +114,7 @@ class DispatchRefused(ValueError):
112
114
 
113
115
  def enforce_oracle_readiness(
114
116
  *, proposal_type: str, repo: Repo | None, config: Config, issue_number: int,
115
- ) -> None:
117
+ ) -> "OracleReadiness | None":
116
118
  """#1138: hard-gate a ``type="work"`` dispatch on the issue-level oracle
117
119
  gate (:func:`coord.milestone_dispatch.issue_oracle_ready`) — refuses an
118
120
  issue that belongs to an oracle-opted-in milestone (Gate A already
@@ -147,11 +149,23 @@ def enforce_oracle_readiness(
147
149
  hard stop would turn a GitHub hiccup into a fleet-wide outage for every
148
150
  oracle-configured repo, which is a worse failure mode than the gap
149
151
  #1138 closes.
152
+
153
+ Returns the :class:`coord.milestone_dispatch.OracleReadiness` verdict
154
+ it computed (``None`` for every cheap-no-op / fail-open case above) —
155
+ (#2166) so ``dispatch()`` can build the worker-briefing oracle-loop
156
+ contract block from THIS SAME verdict instead of re-deriving "does a
157
+ slice exist" via a second, independent read. Before this, the gate
158
+ read the default branch over ``gh`` while the briefing separately
159
+ scanned the dispatching host's local base checkout for a manifest —
160
+ two sources that silently disagreed whenever that checkout lagged
161
+ (#2166's split-brain). One call, reused for both the pass/fail
162
+ decision and the text the worker sees, makes that disagreement
163
+ structurally impossible rather than merely rare.
150
164
  """
151
165
  if proposal_type != "work" or repo is None:
152
- return
166
+ return None
153
167
  if not config.acceptance.has_driver(repo.name):
154
- return
168
+ return None
155
169
 
156
170
  from coord import github_ops # noqa: PLC0415
157
171
  from coord.milestone_dispatch import issue_oracle_ready # noqa: PLC0415
@@ -159,7 +173,7 @@ def enforce_oracle_readiness(
159
173
  try:
160
174
  issue_data = github_ops.get_issue(repo.github, issue_number)
161
175
  except RuntimeError:
162
- return
176
+ return None
163
177
 
164
178
  milestone_number = (issue_data.get("milestone") or {}).get("number")
165
179
  issue_labels = [lbl.get("name", "") for lbl in (issue_data.get("labels") or [])]
@@ -169,6 +183,7 @@ def enforce_oracle_readiness(
169
183
  )
170
184
  if readiness.reason is not None:
171
185
  raise DispatchRefused(readiness.reason)
186
+ return readiness
172
187
 
173
188
 
174
189
  def enforce_epic_dispatch_guard(
@@ -784,7 +799,11 @@ def dispatch(
784
799
  # a driver kind this install doesn't implement. Placed early / before
785
800
  # the TOS gate below so a refusal never depends on provider resolution
786
801
  # succeeding first.
787
- enforce_oracle_readiness(
802
+ #
803
+ # #2166: the returned verdict is reused below to build the worker-
804
+ # briefing oracle-loop contract block — the SAME read this gate just
805
+ # used, not a second independent one — so the two can never disagree.
806
+ oracle_readiness = enforce_oracle_readiness(
788
807
  proposal_type=proposal.type, repo=repo, config=config,
789
808
  issue_number=proposal.issue_number,
790
809
  )
@@ -994,44 +1013,64 @@ def dispatch(
994
1013
  # a milestone-level flag, so "driver configured for this repo" is the
995
1014
  # signal, mirroring the tests/acceptance/ auto-seal above) AND this issue
996
1015
  # already has an authored slice, OR (#3212) is exempted from one —
997
- # oracle_loop_contract_block covers both and returns "" only when neither
998
- # applies (e.g. before Gate A/#931 has run for it at all). An exemption
999
- # waives the automated gate, not the design contract the milestone's
1000
- # mocks define, so the worker still needs the pointer — see
1001
- # oracle_loop_contract_block's docstring for the exempted-issue variant.
1016
+ # oracle_loop_contract_block_for_slice covers both and returns "" only
1017
+ # when neither applies (e.g. before Gate A/#931 has run for it at all).
1018
+ # An exemption waives the automated gate, not the design contract the
1019
+ # milestone's mocks define, so the worker still needs the pointer — see
1020
+ # oracle_loop_contract_block_for_slice's docstring for the exempted-issue
1021
+ # variant.
1022
+ #
1023
+ # #2166: this used to re-derive "does a slice exist" by scanning the
1024
+ # dispatching HOST's local base checkout (`repo_root / search_root`) —
1025
+ # a second, independent read from the #1138 gate above, which reads the
1026
+ # default branch over `gh`. A stale base checkout (nothing refreshes it
1027
+ # automatically — see docs/ORACLE_LOOP.md) made the two disagree: the
1028
+ # gate let a dispatch through because the slice existed on the default
1029
+ # branch, while this scan came back `""` because the local clone hadn't
1030
+ # pulled it yet, silently sending the worker with no oracle contract at
1031
+ # all. Now this builds the block from `oracle_readiness` — the EXACT
1032
+ # verdict the gate above already computed — so there is only one read
1033
+ # and the two can never diverge again.
1002
1034
  briefing_text = proposal.briefing
1003
1035
  if proposal.type == "work" and proposal.issue_number:
1004
- from pathlib import Path # noqa: PLC0415
1005
-
1006
1036
  from coord.state import issue_context_block # noqa: PLC0415
1007
1037
 
1008
1038
  oracle_contract = ""
1009
1039
  if config.acceptance.has_driver(proposal.repo_name):
1010
- from coord.acceptance import oracle_loop_contract_block # noqa: PLC0415
1011
-
1012
- # #2896: the issue's slice may live under the shared repo-root
1013
- # tree (a directory-discovered driver, e.g. ms-37's cli-pytest
1014
- # suite) OR under an entrypoint-linked driver's own sibling
1015
- # `acceptance/` dir (e.g. ms-65's tui-tuidriver suite, relocated
1016
- # out of the repo root) — this dispatch call has no single path
1017
- # in hand to pick a route ahead of time (proposal.issue_number
1018
- # alone doesn't say which), so it tries every search root this
1019
- # repo declares and uses whichever one actually has the slice.
1020
- # A local checkout scan (no `gh`), so trying more than one root
1021
- # costs nothing but a stat/read against a directory that
1022
- # usually doesn't exist.
1023
- repo_root = Path(repo_path).expanduser()
1024
- for search_root in config.acceptance.acceptance_search_roots(
1025
- proposal.repo_name
1026
- ):
1027
- oracle_contract = oracle_loop_contract_block(
1028
- repo_root / search_root,
1040
+ from coord.acceptance import ( # noqa: PLC0415
1041
+ oracle_loop_contract_block_for_slice,
1042
+ )
1043
+
1044
+ if oracle_readiness is not None and oracle_readiness.applies:
1045
+ oracle_contract = oracle_loop_contract_block_for_slice(
1029
1046
  proposal.repo_name,
1030
1047
  proposal.issue_number,
1031
- acceptance_dirname=search_root,
1048
+ has_slice=oracle_readiness.has_slice,
1049
+ exempt=oracle_readiness.exempt,
1050
+ ms_dir=oracle_readiness.ms_dir,
1051
+ acceptance_dirname=oracle_readiness.acceptance_dirname,
1032
1052
  )
1033
- if oracle_contract:
1034
- break
1053
+ # #2166 acceptance criterion: a gate must be able to fail,
1054
+ # and unconfirmed success is a defect — if the gate's own
1055
+ # verdict says there's a slice (or an exemption) to point
1056
+ # at, rendering the block must not silently come back
1057
+ # empty. That combination can only mean a bug in the
1058
+ # renderer above, not "no slice yet" (which `applies`/
1059
+ # `has_slice`/`exempt` already ruled out) — refuse loudly
1060
+ # rather than dispatch a worker with a hollow briefing.
1061
+ if (
1062
+ oracle_readiness.has_slice or oracle_readiness.exempt
1063
+ ) and not oracle_contract:
1064
+ raise DispatchRefused(
1065
+ f"#2166: internal inconsistency building the "
1066
+ f"oracle-loop briefing for {proposal.repo_name}#"
1067
+ f"{proposal.issue_number} — the gate found a "
1068
+ "slice/exemption (ms_dir="
1069
+ f"{oracle_readiness.ms_dir!r}) but rendering the "
1070
+ "contract block came back empty. Refusing rather "
1071
+ "than dispatching a worker with no oracle "
1072
+ "contract."
1073
+ )
1035
1074
 
1036
1075
  # #1720: dispatch-time file-overlap fence — the union of file
1037
1076
  # footprints of every OTHER currently-running work-like assignment
@@ -433,6 +433,7 @@ def _fetch_manifest_data(
433
433
  *,
434
434
  issue_number: int | None = None,
435
435
  roots: Iterable[str] | None = None,
436
+ root_out: "list[str] | None" = None,
436
437
  ):
437
438
  """*milestone_number*'s manifest data via *fetch* (a raw-content GitHub
438
439
  fetch, no local checkout, no directory listing) — the legacy single-file
@@ -468,6 +469,16 @@ def _fetch_manifest_data(
468
469
  unchanged from before #2896. Tries each root until one actually has a
469
470
  legacy manifest and/or fragment file; a milestone's data lives under
470
471
  exactly one, so the first root that produces anything wins.
472
+
473
+ *root_out* (#2166), when given, has the matched root dir appended —
474
+ the SAME root this data actually came from — so a caller rendering the
475
+ worker-briefing contract block (which needs to name a repo-relative
476
+ dirname in the text, e.g. ``tests/acceptance/ms-37/contract.md``) can
477
+ do so without a second, independent search. Appends the first
478
+ candidate root (or the legacy single-root default) when nothing
479
+ matched, mirroring the fall-through return below — there is no "right"
480
+ root to name for a slice that doesn't exist, so the caller must check
481
+ ``has_slice``/``exempt`` before trusting this for message text.
471
482
  """
472
483
  from coord import github_ops # noqa: PLC0415
473
484
  from coord.acceptance import ( # noqa: PLC0415
@@ -511,6 +522,8 @@ def _fetch_manifest_data(
511
522
  legacy, legacy_found = _fetch_one(f"{root_dir}/{ms_dir}", "manifest")
512
523
  if issue_number is None:
513
524
  if legacy_found:
525
+ if root_out is not None:
526
+ root_out.append(root_dir)
514
527
  return legacy
515
528
  continue
516
529
  fragment, fragment_found = _fetch_one(
@@ -518,10 +531,14 @@ def _fetch_manifest_data(
518
531
  str(issue_number),
519
532
  )
520
533
  if legacy_found or fragment_found:
534
+ if root_out is not None:
535
+ root_out.append(root_dir)
521
536
  return merge_manifest_data(legacy, fragment)
522
537
 
523
538
  # No root produced anything — degrade to empty data, same as the old
524
539
  # single-root "not found" behaviour.
540
+ if root_out is not None:
541
+ root_out.append(search_roots[0])
525
542
  return legacy if issue_number is None else merge_manifest_data(legacy, fragment)
526
543
 
527
544
 
@@ -714,6 +731,19 @@ class OracleReadiness:
714
731
  #: gate doesn't apply. ``"approved"``/``"exempt"`` are the only values
715
732
  #: that let ``reason`` be ``None``.
716
733
  gate_a_state: str = ""
734
+ #: (#2166) The milestone this readiness verdict was computed against,
735
+ #: and the ``ms-NN`` directory name / repo-relative acceptance-root
736
+ #: dirname the slice (or exemption) it found actually lives under —
737
+ #: set whenever ``applies`` is ``True``. Exists so a caller that needs
738
+ #: to RENDER the worker-briefing contract block
739
+ #: (:func:`coord.acceptance.oracle_loop_contract_block_for_slice`) can
740
+ #: do so from THIS SAME verdict instead of re-deriving "does a slice
741
+ #: exist" from a second, independent read (previously a scan of the
742
+ #: dispatching host's local checkout, #2166's split-brain) — one
743
+ #: fetch, one source of truth, per #2096 "one question, one answer".
744
+ milestone_number: int | None = None
745
+ ms_dir: str = ""
746
+ acceptance_dirname: str = ""
717
747
 
718
748
 
719
749
  def _gate_a_exempt_trade_off_note(
@@ -857,14 +887,27 @@ def issue_oracle_ready(
857
887
  from coord.acceptance import test_ids_for_issue # noqa: PLC0415
858
888
  from coord.acceptance_drivers import SUPPORTED_KINDS # noqa: PLC0415
859
889
 
890
+ # #2166: capture WHICH search root this issue's manifest data actually
891
+ # came from, so the verdict below can carry enough to let a caller
892
+ # render the worker-briefing contract block from THIS read — the same
893
+ # `gh`-fetched-from-the-default-branch source the gate itself just
894
+ # used — instead of a second, independent local-checkout scan that can
895
+ # silently disagree with it (the #2166 split-brain).
896
+ matched_roots: list[str] = []
860
897
  manifest = _fetch_manifest_data(
861
898
  repo_cfg.github, milestone_number, repo_cfg.default_branch, fetch,
862
899
  issue_number=issue_number,
863
900
  roots=config.acceptance.acceptance_search_roots(repo_cfg.name),
901
+ root_out=matched_roots,
864
902
  )
865
903
  has_slice = bool(test_ids_for_issue(manifest.tests, issue_number))
866
904
  exempt = issue_number in manifest.exempt or "oracle:exempt" in set(issue_labels)
867
905
 
906
+ from coord.acceptance import ACCEPTANCE_DIRNAME, ms_dirname # noqa: PLC0415
907
+
908
+ ms_dir = ms_dirname(milestone_number)
909
+ acceptance_dirname = matched_roots[0] if matched_roots else ACCEPTANCE_DIRNAME
910
+
868
911
  entry = config.acceptance.drivers.get(repo_cfg.name)
869
912
  unsupported = _unsupported_driver_kinds(entry) if entry is not None else ()
870
913
 
@@ -887,13 +930,16 @@ def issue_oracle_ready(
887
930
  return OracleReadiness(
888
931
  applies=True, exempt=exempt, has_slice=has_slice,
889
932
  unsupported_kinds=unsupported, reason=signoff.reason,
890
- gate_a_state=signoff.state,
933
+ gate_a_state=signoff.state, milestone_number=milestone_number,
934
+ ms_dir=ms_dir, acceptance_dirname=acceptance_dirname,
891
935
  )
892
936
 
893
937
  if exempt:
894
938
  return OracleReadiness(
895
939
  applies=True, exempt=True, has_slice=has_slice,
896
940
  unsupported_kinds=unsupported, gate_a_state=signoff.state,
941
+ milestone_number=milestone_number, ms_dir=ms_dir,
942
+ acceptance_dirname=acceptance_dirname,
897
943
  )
898
944
 
899
945
  reason: str | None = None
@@ -920,7 +966,8 @@ def issue_oracle_ready(
920
966
  return OracleReadiness(
921
967
  applies=True, exempt=False, has_slice=has_slice,
922
968
  unsupported_kinds=unsupported, reason=reason,
923
- gate_a_state=signoff.state,
969
+ gate_a_state=signoff.state, milestone_number=milestone_number,
970
+ ms_dir=ms_dir, acceptance_dirname=acceptance_dirname,
924
971
  )
925
972
 
926
973
 
@@ -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"]),