code-coordinator 0.5.513__tar.gz → 0.5.515__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 (908) hide show
  1. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/ci_store.py +20 -5
  5. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/claim.py +30 -12
  6. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dispatch.py +11 -7
  7. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dispatch_liveness.py +23 -16
  8. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/merge_queue.py +18 -2
  9. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/milestone_dispatch.py +6 -4
  10. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/reconcile.py +33 -18
  11. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/smoke.py +13 -6
  12. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_store.py +40 -0
  13. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_claim.py +34 -0
  14. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_network.py +1 -1
  15. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dispatch.py +29 -7
  16. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dispatch_liveness.py +20 -2
  17. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_merge_queue.py +136 -0
  18. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile.py +56 -3
  19. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_smoke.py +44 -5
  20. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.claude/commands/board.md +0 -0
  21. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.claude/commands/complete-session.md +0 -0
  22. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.claude/commands/coordinator.md +0 -0
  23. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.githooks/_lib.sh +0 -0
  24. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.githooks/post-checkout +0 -0
  25. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.githooks/post-commit +0 -0
  26. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.githooks/post-merge +0 -0
  27. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  28. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.github/coord-ci-acceptance.yml +0 -0
  29. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.github/workflows/auto-release.yml +0 -0
  30. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.github/workflows/test.yml +0 -0
  32. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/.gitignore +0 -0
  33. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/CLAUDE.md +0 -0
  34. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/GOAL.md +0 -0
  35. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/LICENSE +0 -0
  36. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/MANIFEST.in +0 -0
  37. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/README.md +0 -0
  38. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/SOURCES.txt +0 -0
  39. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/scm_file_list.json +0 -0
  43. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/code_coordinator.egg-info/top_level.txt +0 -0
  44. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/__init__.py +0 -0
  45. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/_board_mapping.py +0 -0
  46. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/acceptance.py +0 -0
  47. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/acceptance_drivers.py +0 -0
  48. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agent.py +0 -0
  49. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agent_app.py +0 -0
  50. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agent_update.py +0 -0
  51. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agents/opencode/.gitignore +0 -0
  52. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agents/opencode/agents/work.md +0 -0
  53. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/agents/opencode/routing.jsonc +0 -0
  54. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/approved_work.py +0 -0
  55. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/audit.py +0 -0
  56. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/auto_loop.py +0 -0
  57. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/backup.py +0 -0
  58. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/block_log.py +0 -0
  59. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/board_schema.py +0 -0
  60. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/ci_fix.py +0 -0
  67. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/ci_github.py +0 -0
  68. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/ci_gitlab.py +0 -0
  69. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/claude_setup_token.py +0 -0
  70. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/cli.py +0 -0
  71. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/client.py +0 -0
  72. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/codegen.py +0 -0
  73. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/__init__.py +0 -0
  74. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/_common.py +0 -0
  75. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/acceptance.py +0 -0
  76. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/agent_ops.py +0 -0
  77. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/audit.py +0 -0
  78. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/backup.py +0 -0
  79. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/chat.py +0 -0
  80. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/ci.py +0 -0
  81. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/codegen.py +0 -0
  82. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/dispatch.py +0 -0
  83. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/dispatch_workers.py +0 -0
  84. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/dr.py +0 -0
  85. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/drive.py +0 -0
  86. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/drive_queue.py +0 -0
  87. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/gate_a.py +0 -0
  88. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/gates.py +0 -0
  89. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/issues.py +0 -0
  90. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/lifecycle.py +0 -0
  91. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/machine.py +0 -0
  92. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/merge.py +0 -0
  93. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/milestone.py +0 -0
  94. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/plan_followup.py +0 -0
  95. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/plans.py +0 -0
  96. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/portal.py +0 -0
  97. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/pr.py +0 -0
  98. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/release.py +0 -0
  99. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/repo.py +0 -0
  100. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/report.py +0 -0
  101. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/review.py +0 -0
  102. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/scorecard.py +0 -0
  103. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/sessions.py +0 -0
  104. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/setup.py +0 -0
  105. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/status.py +0 -0
  106. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/store_migrate.py +0 -0
  107. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/terminal.py +0 -0
  108. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/test_gate.py +0 -0
  109. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/commands/tui.py +0 -0
  110. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/comments.py +0 -0
  111. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/config.py +0 -0
  112. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/config_reload.py +0 -0
  113. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/confirm_test.py +0 -0
  114. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/conflict_fix.py +0 -0
  115. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dao.py +0 -0
  116. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dashboard/__init__.py +0 -0
  117. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dashboard/fixture.py +0 -0
  118. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dashboard/index.html +0 -0
  119. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dashboard/server.py +0 -0
  120. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dashboard/terminal.py +0 -0
  121. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/db.py +0 -0
  122. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dead_end.py +0 -0
  123. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/decomposition_chat.py +0 -0
  124. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/README.md +0 -0
  125. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-agent.service +0 -0
  126. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-backup.service +0 -0
  127. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-backup.timer +0 -0
  128. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-db-backup.service +0 -0
  129. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-db-backup.sh +0 -0
  130. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-db-backup.timer +0 -0
  131. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-dr-verify.service +0 -0
  132. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-dr-verify.timer +0 -0
  133. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-drive-queue.service +0 -0
  134. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-drive-queue.timer +0 -0
  135. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-failure-notify.service +0 -0
  136. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-fleet-watchdog.service +0 -0
  137. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  138. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-notify.service +0 -0
  139. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-notify.timer +0 -0
  140. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-release-propagate.service +0 -0
  141. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-release-propagate.timer +0 -0
  142. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-release-window.service +0 -0
  143. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-release-window.timer +0 -0
  144. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-serve.service +0 -0
  145. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-web-dist-build.service +0 -0
  146. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-web-dist-build.timer +0 -0
  147. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy/coord-web.service +0 -0
  148. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy_manifest.py +0 -0
  149. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deploy_units.py +0 -0
  150. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deprecation_telemetry.py +0 -0
  151. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/deps.py +0 -0
  152. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/diagnose.py +0 -0
  153. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dist_name.py +0 -0
  154. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dr_promote.py +0 -0
  155. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/dr_verify.py +0 -0
  156. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/drive.py +0 -0
  157. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/drive_queue.py +0 -0
  158. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/drive_sessions_snapshot.py +0 -0
  159. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/drive_state.py +0 -0
  160. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/events.py +0 -0
  161. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/failure_class.py +0 -0
  162. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/failure_classifier.py +0 -0
  163. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/filelock.py +0 -0
  164. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/fleet_config_health.py +0 -0
  165. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/forge_availability.py +0 -0
  166. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/freshness.py +0 -0
  167. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/gate_a.py +0 -0
  168. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/gate_b.py +0 -0
  169. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/gate_snapshot.py +0 -0
  170. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/gates.py +0 -0
  171. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/gen_board_fixture.py +0 -0
  172. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/github_ops.py +0 -0
  173. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/github_throttle.py +0 -0
  174. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/goal.py +0 -0
  175. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/graph_health.py +0 -0
  176. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/__init__.py +0 -0
  177. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/aggregate.py +0 -0
  178. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/__init__.py +0 -0
  179. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/_ci_pin.py +0 -0
  180. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/agent_install.py +0 -0
  181. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/cargo_targets.py +0 -0
  182. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/claude_binary.py +0 -0
  183. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/config_drift.py +0 -0
  184. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  185. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/coord_web_ci_pin.py +0 -0
  186. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/deploy_lane_facts.py +0 -0
  187. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/disk.py +0 -0
  188. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/fleet_board.py +0 -0
  189. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  190. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/fleet_phantom.py +0 -0
  191. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/fleet_unit_drift.py +0 -0
  192. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/graph.py +0 -0
  193. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/graphify_cli.py +0 -0
  194. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/index_lock.py +0 -0
  195. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/issues_sync_staleness.py +0 -0
  196. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/plan_usage.py +0 -0
  197. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/pr_churn.py +0 -0
  198. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/release_cordon.py +0 -0
  199. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/repo_state.py +0 -0
  200. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/spawned_coord.py +0 -0
  201. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/stalled_pipeline.py +0 -0
  202. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/timer_active.py +0 -0
  203. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/toolchain.py +0 -0
  204. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/unit_drift.py +0 -0
  205. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/unit_enablement.py +0 -0
  206. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/wedged_drive_queue.py +0 -0
  207. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/checks/worktrees.py +0 -0
  208. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/cli.py +0 -0
  209. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/context.py +0 -0
  210. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/fleet_snapshot.py +0 -0
  211. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/models.py +0 -0
  212. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/pypi.py +0 -0
  213. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/registry.py +0 -0
  214. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/render.py +0 -0
  215. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/health/units.py +0 -0
  216. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/hooks.py +0 -0
  217. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/housekeeping.py +0 -0
  218. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/interactive.py +0 -0
  219. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/invariant_alarms.py +0 -0
  220. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/issue_store.py +0 -0
  221. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/issues_sync_status.py +0 -0
  222. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/liveness_auditor.py +0 -0
  223. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/machine_fault.py +0 -0
  224. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/machine_metrics.py +0 -0
  225. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/machine_onboard.py +0 -0
  226. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/machine_pause.py +0 -0
  227. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/machine_stats.py +0 -0
  228. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/milestone_chat.py +0 -0
  229. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/milestone_gate.py +0 -0
  230. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/milestone_order.py +0 -0
  231. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/mock_author.py +0 -0
  232. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/models.py +0 -0
  233. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/network.py +0 -0
  234. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/new_issue_chat.py +0 -0
  235. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/__init__.py +0 -0
  236. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/baseline.py +0 -0
  237. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/cli.py +0 -0
  238. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/collect.py +0 -0
  239. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/digest.py +0 -0
  240. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/models.py +0 -0
  241. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/predicate.py +0 -0
  242. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/service.py +0 -0
  243. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/store.py +0 -0
  244. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notifier/transport.py +0 -0
  245. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/notify.py +0 -0
  246. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/openapi.py +0 -0
  247. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/overlap_fence.py +0 -0
  248. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/overlap_predict.py +0 -0
  249. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/parentage.py +0 -0
  250. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/parentage_github.py +0 -0
  251. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/pipeline.py +0 -0
  252. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/plan_parser.py +0 -0
  253. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/plans.py +0 -0
  254. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/platform_paths.py +0 -0
  255. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/portal_bridge.py +0 -0
  256. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/portal_store.py +0 -0
  257. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/portal_sync.py +0 -0
  258. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/pr_body_lint.py +0 -0
  259. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/prereqs.py +0 -0
  260. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/progress.py +0 -0
  261. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/providers/__init__.py +0 -0
  262. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/providers/base.py +0 -0
  263. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/providers/claude.py +0 -0
  264. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/providers/claude_pty.py +0 -0
  265. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/providers/opencode.py +0 -0
  266. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/queue_diagnose.py +0 -0
  267. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/reconcile_tick.py +0 -0
  268. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/refine_chat.py +0 -0
  269. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/release_cordon.py +0 -0
  270. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/release_propagate.py +0 -0
  271. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/release_verify.py +0 -0
  272. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/release_window.py +0 -0
  273. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/repo_dormancy.py +0 -0
  274. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/repo_edit.py +0 -0
  275. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/repo_onboard.py +0 -0
  276. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/reports.py +0 -0
  277. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/rest_schema.py +0 -0
  278. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/restart_cmd.py +0 -0
  279. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/revalidate.py +0 -0
  280. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/review.py +0 -0
  281. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/scorecard.py +0 -0
  282. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/self_health.py +0 -0
  283. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/serve_app.py +0 -0
  284. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  285. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  286. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  287. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  288. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  289. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/portal-followup/SKILL.md +0 -0
  290. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/release-now/SKILL.md +0 -0
  291. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  292. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  293. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/skills/update-issue/SKILL.md +0 -0
  294. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/spend_ceiling.py +0 -0
  295. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/split_work.py +0 -0
  296. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/sql.py +0 -0
  297. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/stage_projection.py +0 -0
  298. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/state.py +0 -0
  299. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/store_migrate.py +0 -0
  300. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/store_parity.py +0 -0
  301. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/templates/deploy-cloudflare.node.yml +0 -0
  302. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/test_author.py +0 -0
  303. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/test_chat.py +0 -0
  304. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/test_orchestrator.py +0 -0
  305. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/test_report.py +0 -0
  306. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/tui_release.py +0 -0
  307. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/uat_checks.py +0 -0
  308. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/usage.py +0 -0
  309. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/usage_limits.py +0 -0
  310. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/usage_rollup.py +0 -0
  311. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coord/worker_events.py +0 -0
  312. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/coordinator.example.yml +0 -0
  313. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-agent.service +0 -0
  314. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-backup.service +0 -0
  315. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-backup.timer +0 -0
  316. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-db-backup.service +0 -0
  317. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-db-backup.sh +0 -0
  318. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-db-backup.timer +0 -0
  319. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-dr-verify.service +0 -0
  320. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-dr-verify.timer +0 -0
  321. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-drive-queue.service +0 -0
  322. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-drive-queue.timer +0 -0
  323. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-failure-notify.service +0 -0
  324. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-failure-notify.sh +0 -0
  325. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-fleet-watchdog.service +0 -0
  326. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-fleet-watchdog.timer +0 -0
  327. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-notify.service +0 -0
  328. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-notify.timer +0 -0
  329. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-release-propagate.service +0 -0
  330. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-release-propagate.timer +0 -0
  331. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-release-window.service +0 -0
  332. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-release-window.timer +0 -0
  333. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-serve.service +0 -0
  334. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-web-dist-build.service +0 -0
  335. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-web-dist-build.sh +0 -0
  336. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-web-dist-build.timer +0 -0
  337. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-web-rollback.sh +0 -0
  338. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/coord-web.service +0 -0
  339. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/deploy/node-shim.sh +0 -0
  340. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ADR_COORD_TUI_CI.md +0 -0
  341. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  342. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ADR_COORD_WEB_CI.md +0 -0
  343. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ADR_COORD_WEB_DIST.md +0 -0
  344. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  345. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/AGENT_OPERATIONS.md +0 -0
  346. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ARCHITECTURE.md +0 -0
  347. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ARCH_SECURITY_GATES.md +0 -0
  348. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/COCKPIT.md +0 -0
  349. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/CONTROL_CENTER.md +0 -0
  350. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/COST_DISCIPLINE.md +0 -0
  351. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/CROSS_PLATFORM.md +0 -0
  352. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/CUSTOMER_FACING_APPS.md +0 -0
  353. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/CUSTOMER_PORTAL.md +0 -0
  354. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/DATA_STORE_SELECTION.md +0 -0
  355. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/DISASTER_RECOVERY.md +0 -0
  356. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/DRIVE_QUEUE.md +0 -0
  357. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/EPHEMERAL_WORKERS.md +0 -0
  358. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/FORGE_MIGRATION.md +0 -0
  359. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/GRAPHIFY_SETUP.md +0 -0
  360. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ISSUE_GUIDANCE.md +0 -0
  361. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/MAC_MINI.md +0 -0
  362. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  363. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/NOTIFIER.md +0 -0
  364. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/OPENCODE_VERIFICATION.md +0 -0
  365. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/OPERATING_GOTCHAS.md +0 -0
  366. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/OPERATOR_GUIDES.md +0 -0
  367. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/ORACLE_LOOP.md +0 -0
  368. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/PHONE_WEBAPP.md +0 -0
  369. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/PIPELINE_V2.md +0 -0
  370. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/PLATFORM_EVOLUTION.md +0 -0
  371. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/SECOND_BACKEND.md +0 -0
  372. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/STORE_SERVICE.md +0 -0
  373. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  374. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/WEB_CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/WSL_WINDOWS_WORKER.md +0 -0
  376. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/mocks/web/README.md +0 -0
  377. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/mocks/web/_tokens.css +0 -0
  378. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/mocks/web/issue-detail.html +0 -0
  379. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/mocks/web/pipeline-narrow.html +0 -0
  380. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/docs/mocks/web/pipeline-wide.html +0 -0
  381. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/graphify-out/.gitignore +0 -0
  382. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/install-agent.sh +0 -0
  383. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/pyproject.toml +0 -0
  384. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/audit_review_verdict_overrides.py +0 -0
  385. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  386. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/build-worker-image.sh +0 -0
  387. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/coordinator-machine.py +0 -0
  388. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/dr-down.sh +0 -0
  389. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/dr-up.sh +0 -0
  390. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/epic-down.sh +0 -0
  391. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/epic-up.sh +0 -0
  392. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/preflight.sh +0 -0
  393. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/provision-server.sh +0 -0
  394. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/provision-worker.sh +0 -0
  395. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  396. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  397. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/throwaway-vm.sh +0 -0
  398. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/azure-workers/verify-github-token.sh +0 -0
  399. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/check_gh_argv_containment.py +0 -0
  400. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/codegen.py +0 -0
  401. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-test-runner.sh +0 -0
  402. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  403. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  404. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  405. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  406. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/coord-venv-rollback.sh +0 -0
  407. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/drive-batch.sh +0 -0
  408. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/extract-coord-tui.sh +0 -0
  409. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/fleet_watchdog.py +0 -0
  410. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/gen_board_fixture.py +0 -0
  411. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/gen_mock_index.py +0 -0
  412. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/lib/provision-core.sh +0 -0
  413. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/next_release_tag.py +0 -0
  414. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/provision-machine.sh +0 -0
  415. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/run_tests_in_populated_home.sh +0 -0
  416. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/run_tests_without_gh.sh +0 -0
  417. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/setup-macmini.sh +0 -0
  418. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/smoke_437_interactive.py +0 -0
  419. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/verify-provision-noble.sh +0 -0
  420. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/verify_878_review_capture.py +0 -0
  421. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/verify_release_published.py +0 -0
  422. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/scripts/verify_release_wheel.py +0 -0
  423. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/setup.cfg +0 -0
  424. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/SMOKE_SET.md +0 -0
  425. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/__init__.py +0 -0
  426. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-37/conftest.py +0 -0
  427. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-37/contract.md +0 -0
  428. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-37/manifest.yml +0 -0
  429. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  430. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  431. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/contract.md +0 -0
  432. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  433. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  434. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/manifest.yml +0 -0
  435. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  436. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-51/tsconfig.json +0 -0
  437. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  438. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/backends.py +0 -0
  439. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/conftest.py +0 -0
  440. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/board-pipeline-basic.json +0 -0
  441. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  442. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  443. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  444. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  445. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/all_pass.json +0 -0
  446. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  447. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/mixed_fail.json +0 -0
  448. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  449. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  450. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/skip.json +0 -0
  451. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/playwright/truncated.json +0 -0
  452. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  453. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  454. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  455. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  456. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  457. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  458. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  459. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  460. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_acceptance.py +0 -0
  461. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_acceptance_drivers.py +0 -0
  462. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent.py +0 -0
  463. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_api_error.py +0 -0
  464. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_app.py +0 -0
  465. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_branch_base.py +0 -0
  466. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_branch_capture.py +0 -0
  467. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_config_free_1712.py +0 -0
  468. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_deploy_units_endpoint.py +0 -0
  469. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_dirty_worktree.py +0 -0
  470. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  471. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_graph_self_heal.py +0 -0
  472. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_health_h3.py +0 -0
  473. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_idle_restart.py +0 -0
  474. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_push_failure.py +0 -0
  475. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_reap.py +0 -0
  476. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_repos_and_pull.py +0 -0
  477. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_restart_services_endpoint.py +0 -0
  478. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_skills_self_heal.py +0 -0
  479. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_startup_diagnostics.py +0 -0
  480. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_update.py +0 -0
  481. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_update_bluegreen.py +0 -0
  482. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_usage_limit.py +0 -0
  483. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_agent_zero_commit.py +0 -0
  484. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ambient_home_isolation.py +0 -0
  485. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approve_capability_reroute_3241.py +0 -0
  486. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approve_dependency_busy_2804.py +0 -0
  487. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approve_reject_plan.py +0 -0
  488. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approve_usage_gate.py +0 -0
  489. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approved_work_2532.py +0 -0
  490. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_approved_work_2996.py +0 -0
  491. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_assignment_already_recorded_daemon.py +0 -0
  492. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_audit_log.py +0 -0
  493. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_audit_outcome.py +0 -0
  494. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_audit_query.py +0 -0
  495. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_auto_loop.py +0 -0
  496. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_auto_release_publish_2035.py +0 -0
  497. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_backend_selection.py +0 -0
  498. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_backup.py +0 -0
  499. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_base_checkout_restore.py +0 -0
  500. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_block_log.py +0 -0
  501. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_cap_762.py +0 -0
  502. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_fixture.py +0 -0
  503. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_read_path.py +0 -0
  504. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_schema.py +0 -0
  505. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_service.py +0 -0
  506. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_state.py +0 -0
  507. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_board_wire.py +0 -0
  508. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_brain.py +0 -0
  509. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_branch_model.py +0 -0
  510. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_bug_intake.py +0 -0
  511. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_build_worker_image_env_update.py +0 -0
  512. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cargo_cache.py +0 -0
  513. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_check_gh_argv_containment.py +0 -0
  514. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_acceptance_gate_1950.py +0 -0
  515. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_fix.py +0 -0
  516. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_github.py +0 -0
  517. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_gitlab.py +0 -0
  518. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_ci_parity_2091.py +0 -0
  519. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_claude_md_budget.py +0 -0
  520. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_claude_setup_token.py +0 -0
  521. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_acceptance.py +0 -0
  522. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_assign.py +0 -0
  523. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  524. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_assign_interactive_remote.py +0 -0
  525. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_assign_provider.py +0 -0
  526. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  527. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_audit.py +0 -0
  528. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_chat_continue.py +0 -0
  529. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_ci.py +0 -0
  530. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_codegen.py +0 -0
  531. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_decide.py +0 -0
  532. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_capability_rules.py +0 -0
  533. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_config_provenance.py +0 -0
  534. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_forge_availability.py +0 -0
  535. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_graph.py +0 -0
  536. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_self.py +0 -0
  537. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_diagnose_test_coverage.py +0 -0
  538. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_doctor.py +0 -0
  539. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_doctor_config_free_1801.py +0 -0
  540. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  541. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  542. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_drive.py +0 -0
  543. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_drive_queue.py +0 -0
  544. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_escalate.py +0 -0
  545. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_fix_headless_review.py +0 -0
  546. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_gate_a.py +0 -0
  547. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_install_drift.py +0 -0
  548. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_install_skills.py +0 -0
  549. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_issue_comment.py +0 -0
  550. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_issue_create_label.py +0 -0
  551. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_issue_reopen.py +0 -0
  552. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_issue_view_list.py +0 -0
  553. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_issues.py +0 -0
  554. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_merge.py +0 -0
  555. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_assign.py +0 -0
  556. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_capture.py +0 -0
  557. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_chat_add_child.py +0 -0
  558. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_dispatch.py +0 -0
  559. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_gate_b.py +0 -0
  560. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_gate_c.py +0 -0
  561. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_order.py +0 -0
  562. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  563. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_milestone_ship.py +0 -0
  564. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_new_issue_chat.py +0 -0
  565. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_plans.py +0 -0
  566. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_portal.py +0 -0
  567. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_pr.py +0 -0
  568. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_pull_artifact.py +0 -0
  569. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_queue.py +0 -0
  570. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_reattach_sessions.py +0 -0
  571. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_refine_board.py +0 -0
  572. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_release_preflight.py +0 -0
  573. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_release_propagate.py +0 -0
  574. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_release_window.py +0 -0
  575. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_repo_2220.py +0 -0
  576. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  577. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_scorecard.py +0 -0
  578. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_serve_store_backend_3084.py +0 -0
  579. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_set_review_findings.py +0 -0
  580. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_advisory_terminal.py +0 -0
  581. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_contested_tag.py +0 -0
  582. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_invariant_alarms.py +0 -0
  583. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_machine_fault.py +0 -0
  584. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_merge_queue.py +0 -0
  585. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_provider.py +0 -0
  586. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_retried_3340.py +0 -0
  587. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_review_finalizing.py +0 -0
  588. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_supervisor_3366.py +0 -0
  589. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_test_failed_tag.py +0 -0
  590. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_status_usage_limit.py +0 -0
  591. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_sync_comments_873.py +0 -0
  592. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_test_plan.py +0 -0
  593. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_track.py +0 -0
  594. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_tui_update.py +0 -0
  595. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cli_wait.py +0 -0
  596. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_client.py +0 -0
  597. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_client_base_install.py +0 -0
  598. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_client_config_cache_atomic_3052.py +0 -0
  599. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_client_resource_migration_1946.py +0 -0
  600. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_commands_common.py +0 -0
  601. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_comments.py +0 -0
  602. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_completion_summary.py +0 -0
  603. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config.py +0 -0
  604. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_acceptance.py +0 -0
  605. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_audit.py +0 -0
  606. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_drift_check.py +0 -0
  607. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_effective.py +0 -0
  608. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_pricing.py +0 -0
  609. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  610. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_config_usage_gate.py +0 -0
  611. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_confirm_test.py +0 -0
  612. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_conflict_fix.py +0 -0
  613. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_conflict_fix_semantic.py +0 -0
  614. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  615. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test.py +0 -0
  616. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  617. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test_runner_baseline.py +0 -0
  618. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test_runner_populated_home.py +0 -0
  619. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test_runner_routing.py +0 -0
  620. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_test_runner_toolchain.py +0 -0
  621. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_uat.py +0 -0
  622. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coord_web_sse_restart_live.py +0 -0
  623. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_coordinator_machine.py +0 -0
  624. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_cross_platform_imports.py +0 -0
  625. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dao.py +0 -0
  626. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard.py +0 -0
  627. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard_api.py +0 -0
  628. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard_fixture.py +0 -0
  629. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard_server.py +0 -0
  630. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard_terminal.py +0 -0
  631. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dashboard_terminal_live.py +0 -0
  632. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_db.py +0 -0
  633. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dead_end.py +0 -0
  634. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_decomposition_chat.py +0 -0
  635. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_coord_db_backup.py +0 -0
  636. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_coord_web_dist.py +0 -0
  637. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_coord_web_rollback.py +0 -0
  638. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_db_backup_unit.py +0 -0
  639. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_drive_queue_unit.py +0 -0
  640. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_failure_notify_unit.py +0 -0
  641. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_manifest.py +0 -0
  642. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_notify_unit.py +0 -0
  643. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_units_lane.py +0 -0
  644. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deploy_web_unit.py +0 -0
  645. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deprecation_telemetry.py +0 -0
  646. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_deps.py +0 -0
  647. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_diagnose.py +0 -0
  648. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dispatch_target_validation.py +0 -0
  649. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dispatch_workers.py +0 -0
  650. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dist_name.py +0 -0
  651. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_done_housekeeping.py +0 -0
  652. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dr_azure_scripts.py +0 -0
  653. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dr_promote.py +0 -0
  654. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_dr_verify.py +0 -0
  655. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive.py +0 -0
  656. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_machine_fault.py +0 -0
  657. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue.py +0 -0
  658. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_blocked_rendering.py +0 -0
  659. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_launch_argv.py +0 -0
  660. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_max_parallel_config.py +0 -0
  661. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  662. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_roll_pending.py +0 -0
  663. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  664. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_sessions_snapshot.py +0 -0
  665. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_state.py +0 -0
  666. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_drive_tmux.py +0 -0
  667. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_epic_up_capability_detection.py +0 -0
  668. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  669. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_epic_up_image_provenance.py +0 -0
  670. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_errors.py +0 -0
  671. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_events.py +0 -0
  672. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_failure_class.py +0 -0
  673. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_failure_classifier.py +0 -0
  674. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_filelock.py +0 -0
  675. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  676. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fix_escalation_classifier.py +0 -0
  677. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fix_of_force_override.py +0 -0
  678. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fleet_config_health.py +0 -0
  679. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fleet_health_probes.py +0 -0
  680. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fleet_health_snapshot.py +0 -0
  681. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_fleet_watchdog.py +0 -0
  682. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_forge_availability.py +0 -0
  683. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_freshness.py +0 -0
  684. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gate_a.py +0 -0
  685. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gate_b.py +0 -0
  686. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gate_snapshot_staleness.py +0 -0
  687. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gates.py +0 -0
  688. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  689. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_gen_mock_index.py +0 -0
  690. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_generated_rust_fixture.py +0 -0
  691. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_generated_rust_requests.py +0 -0
  692. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_generated_types_fixture.py +0 -0
  693. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_github_ops.py +0 -0
  694. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_github_throttle.py +0 -0
  695. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_goal.py +0 -0
  696. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_graph_health.py +0 -0
  697. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_graph_selfheal_absent_2237.py +0 -0
  698. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_handoff.py +0 -0
  699. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_checks.py +0 -0
  700. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_cli.py +0 -0
  701. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_cli_graph.py +0 -0
  702. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_config.py +0 -0
  703. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_context.py +0 -0
  704. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_coord_tui_ci_pin.py +0 -0
  705. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_coord_web_ci_pin.py +0 -0
  706. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_deploy_lane_facts.py +0 -0
  707. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_fix.py +0 -0
  708. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_incident_regression.py +0 -0
  709. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_issues_sync_staleness.py +0 -0
  710. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_pr_churn.py +0 -0
  711. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_pypi.py +0 -0
  712. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_registry.py +0 -0
  713. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_release_cordon_probe.py +0 -0
  714. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_timer_active.py +0 -0
  715. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_toolchain.py +0 -0
  716. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_unit_drift.py +0 -0
  717. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_unit_enablement.py +0 -0
  718. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_health_wedged_drive_queue.py +0 -0
  719. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_hooks.py +0 -0
  720. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_housekeeping.py +0 -0
  721. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_human_attended_437.py +0 -0
  722. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_init.py +0 -0
  723. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_install_agent_venv_2911.py +0 -0
  724. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_integration.py +0 -0
  725. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_briefing_echo.py +0 -0
  726. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_pane_log_2541.py +0 -0
  727. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_prefill_state.py +0 -0
  728. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_session_relaunch.py +0 -0
  729. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_test_verdict_backstop.py +0 -0
  730. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_token_attribution.py +0 -0
  731. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_interactive_worktree.py +0 -0
  732. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_invariant_alarms.py +0 -0
  733. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_issue_store_seam.py +0 -0
  734. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_issues_sync_status.py +0 -0
  735. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_liveness_auditor.py +0 -0
  736. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_liveness_notify.py +0 -0
  737. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_lock_contention_ratchet.py +0 -0
  738. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_machine_fault.py +0 -0
  739. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_machine_metrics.py +0 -0
  740. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_machine_onboard.py +0 -0
  741. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_machine_pause.py +0 -0
  742. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_machine_stats.py +0 -0
  743. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_merge_verify.py +0 -0
  744. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_milestone_chat.py +0 -0
  745. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_milestone_dispatch.py +0 -0
  746. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_milestone_gate.py +0 -0
  747. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_milestone_order.py +0 -0
  748. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_milestone_seam.py +0 -0
  749. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_mock_author.py +0 -0
  750. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_model_tiering.py +0 -0
  751. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_models.py +0 -0
  752. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_models_config_labels.py +0 -0
  753. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_needs_attention.py +0 -0
  754. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_network.py +0 -0
  755. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_new_issue_chat.py +0 -0
  756. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_next_release_tag.py +0 -0
  757. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_node_shim.py +0 -0
  758. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_baseline.py +0 -0
  759. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_cli.py +0 -0
  760. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_collect.py +0 -0
  761. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_config.py +0 -0
  762. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_drive_seam.py +0 -0
  763. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_isolation.py +0 -0
  764. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_predicate.py +0 -0
  765. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_quiet_hours.py +0 -0
  766. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notifier_service.py +0 -0
  767. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notify.py +0 -0
  768. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_notify_drain.py +0 -0
  769. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_openapi.py +0 -0
  770. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_operational_defaults.py +0 -0
  771. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_overlap_fence.py +0 -0
  772. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_overlap_predict.py +0 -0
  773. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_packaged_deploy_units.py +0 -0
  774. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_parentage.py +0 -0
  775. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_paste_landed.py +0 -0
  776. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  777. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_pipeline.py +0 -0
  778. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_plan_followup_approve_plan_command.py +0 -0
  779. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_plan_followup_pr_command.py +0 -0
  780. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_plan_followup_review_command.py +0 -0
  781. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_plan_only.py +0 -0
  782. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_plan_parser.py +0 -0
  783. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_platform_paths.py +0 -0
  784. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_portal_bridge.py +0 -0
  785. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_portal_config.py +0 -0
  786. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_portal_store.py +0 -0
  787. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_portal_sync.py +0 -0
  788. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_pr_body_lint.py +0 -0
  789. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_prereqs.py +0 -0
  790. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_production_db_guard.py +0 -0
  791. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_progress.py +0 -0
  792. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_provider_seam.py +0 -0
  793. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_providers.py +0 -0
  794. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_providers_config_labels.py +0 -0
  795. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_providers_pty.py +0 -0
  796. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_provision_core.py +0 -0
  797. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_provision_machine.py +0 -0
  798. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_py_rust_mirror_inventory.py +0 -0
  799. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_quiet_hours.py +0 -0
  800. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_quiet_hours_store_2146.py +0 -0
  801. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reap_merged_sessions.py +0 -0
  802. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reap_stale_interactive_tick.py +0 -0
  803. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_branch.py +0 -0
  804. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_completions.py +0 -0
  805. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  806. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_merges.py +0 -0
  807. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_no_agent_record.py +0 -0
  808. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_tick.py +0 -0
  809. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reconcile_usage_limit_done.py +0 -0
  810. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_refine_chat.py +0 -0
  811. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_cordon_2101.py +0 -0
  812. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  813. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_cordon_deadlock_2240.py +0 -0
  814. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  815. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_cordon_stuck_2490.py +0 -0
  816. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_propagate.py +0 -0
  817. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_propagate_threshold.py +0 -0
  818. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_roll_between_legs_2854.py +0 -0
  819. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_roll_window_handoff.py +0 -0
  820. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_unified_1242.py +0 -0
  821. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_verify.py +0 -0
  822. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_release_window.py +0 -0
  823. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_remote_auto_prune.py +0 -0
  824. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_remote_interactive_reaper.py +0 -0
  825. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_add.py +0 -0
  826. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_dormancy.py +0 -0
  827. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_edit_2220.py +0 -0
  828. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_graph_fleet_2237.py +0 -0
  829. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_max_parallel_3423.py +0 -0
  830. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_repo_onboard_2220.py +0 -0
  831. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_report_result_push.py +0 -0
  832. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_reports.py +0 -0
  833. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_restart_cmd.py +0 -0
  834. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_retry.py +0 -0
  835. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_retry_advisory_1606.py +0 -0
  836. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_retry_escalation_classify_3360.py +0 -0
  837. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_retry_type_1636.py +0 -0
  838. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_revalidate.py +0 -0
  839. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review.py +0 -0
  840. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_end_review_without_verdict.py +0 -0
  841. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_parse_failure_diagnostic.py +0 -0
  842. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_reaffirm.py +0 -0
  843. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_state.py +0 -0
  844. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_verdict_backstop.py +0 -0
  845. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_verdict_override_audit.py +0 -0
  846. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_verdict_relay.py +0 -0
  847. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_review_zero_commits.py +0 -0
  848. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_scoped_review_wiring.py +0 -0
  849. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_scorecard.py +0 -0
  850. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_self_health.py +0 -0
  851. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_serve.py +0 -0
  852. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_serve_app.py +0 -0
  853. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_serve_app_board_trim.py +0 -0
  854. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_serve_rest_routes.py +0 -0
  855. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_session.py +0 -0
  856. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_slice_issue_attribution.py +0 -0
  857. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  858. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_smoke_live_checkout_restore.py +0 -0
  859. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_smoke_workflow.py +0 -0
  860. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_spend_ceiling.py +0 -0
  861. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_spend_ceiling_coordinator.py +0 -0
  862. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_split.py +0 -0
  863. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_split_work.py +0 -0
  864. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_sql_dialect.py +0 -0
  865. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_sqlite_connect_ratchet.py +0 -0
  866. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stage_projection.py +0 -0
  867. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stale_busy_reviewer_697.py +0 -0
  868. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stalled_pipeline.py +0 -0
  869. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_state.py +0 -0
  870. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_state_review_findings_daemon.py +0 -0
  871. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_status_fleet_footer.py +0 -0
  872. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stop_1567.py +0 -0
  873. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_store_contract.py +0 -0
  874. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_store_migrate.py +0 -0
  875. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stuck.py +0 -0
  876. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  877. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_terminal_command.py +0 -0
  878. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_author.py +0 -0
  879. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_chat.py +0 -0
  880. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_orchestrator.py +0 -0
  881. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_report.py +0 -0
  882. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_verdict_parsing.py +0 -0
  883. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_test_verdict_transcript_floor.py +0 -0
  884. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_text_io_encoding_audit.py +0 -0
  885. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_thin_client_board_audit.py +0 -0
  886. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_thin_client_config_load_1080.py +0 -0
  887. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_thin_client_daemon_routing_906.py +0 -0
  888. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_throwaway_vm.py +0 -0
  889. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_tmux_host.py +0 -0
  890. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_tmux_session.py +0 -0
  891. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_transcript_floor.py +0 -0
  892. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_uat_checks.py +0 -0
  893. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_usage.py +0 -0
  894. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_usage_limits.py +0 -0
  895. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_usage_rollup.py +0 -0
  896. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_venv_live_install_2121.py +0 -0
  897. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_version_single_source.py +0 -0
  898. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_watch.py +0 -0
  899. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  900. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worker_env_venv_isolation.py +0 -0
  901. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worker_events.py +0 -0
  902. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worker_image_pin_sync.py +0 -0
  903. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worker_safety.py +0 -0
  904. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worker_test_scoping.py +0 -0
  905. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worktree.py +0 -0
  906. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  907. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/tests/test_write_parity.py +0 -0
  908. {code_coordinator-0.5.513 → code_coordinator-0.5.515}/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.513
3
+ Version: 0.5.515
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.513
3
+ Version: 0.5.515
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.513",
2
+ "tag": "0.5.515",
3
3
  "distance": 0,
4
- "node": "g62d2f7e1d36394c598063480dfdc2028204abbf1",
4
+ "node": "ge613e87191b4cc036d660b56820c2096be20c180",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-21"
@@ -539,6 +539,25 @@ CI_RERUN_POLL_INTERVAL_SECONDS = 10.0
539
539
  CI_RERUN_MAX_WAIT_SECONDS = 360.0
540
540
 
541
541
 
542
+ def is_unreadable_check_name(name: str) -> bool:
543
+ """The name-only half of :func:`is_unreadable_check` (#3438).
544
+
545
+ Split out so a caller holding only a bare check *name* — not a full
546
+ ``CheckRun`` with a ``.conclusion`` — can still recognize the #1525
547
+ synthetic stand-in. This is exactly the shape of
548
+ ``QueuedMerge.ci_seen_check_names_json`` (:mod:`coord.merge_queue`'s
549
+ #3263 shrinkage guard persists names, not whole ``CheckRun`` objects),
550
+ so a row poisoned before #3438's write-side fix — one whose stored JSON
551
+ already contains a synthetic name — can be filtered on *read* too,
552
+ recovering in place rather than needing manual DB repair.
553
+
554
+ One question, one answer: :func:`is_unreadable_check` delegates here for
555
+ its own name check rather than re-deriving the same prefix/substring
556
+ test, so the two can never drift apart.
557
+ """
558
+ return name.startswith("coord: ") and "read CI status" in name
559
+
560
+
542
561
  def is_unreadable_check(check) -> bool:
543
562
  """True for the #1525 synthetic "could not read CI status" / "gh too
544
563
  old" stand-ins (``coord.ci_github._unreadable_check`` /
@@ -570,11 +589,7 @@ def is_unreadable_check(check) -> bool:
570
589
  than the prose these three call sites already commit to.
571
590
  """
572
591
  name = str(getattr(check, "name", ""))
573
- return (
574
- getattr(check, "conclusion", None) == "unknown"
575
- and name.startswith("coord: ")
576
- and "read CI status" in name
577
- )
592
+ return getattr(check, "conclusion", None) == "unknown" and is_unreadable_check_name(name)
578
593
 
579
594
 
580
595
  @dataclass
@@ -454,20 +454,38 @@ def _default_branch_lookup(repo_github: str, issue_number: int) -> list[str]:
454
454
  return _drop_merged_branches(repo_github, branches)
455
455
 
456
456
 
457
- def any_matching_branch_merged(repo_github: str, issue_number: int) -> bool:
458
- """#3376: True when at least one remote branch matching `issue-{N}-*`
459
- has already merged into the repo's default branch — the `branch_merged`
460
- predicate `coord.dispatch_liveness.check_dispatch_liveness` needs,
461
- backed by a live GitHub check.
462
-
463
- Reuses the exact merge-detection `_drop_merged_branches` already
464
- performs for claim detection (PR-merged OR `ahead_by == 0` ancestry,
465
- survives squash merges — #3103): this is just "did filtering drop
466
- anything", with the fail-open direction flipped to match a REFUSAL
467
- predicate rather than a claim-signal — no matching branch at all, or
468
- any lookup failure, returns `False` ("not merged, don't refuse
457
+ def any_matching_branch_merged(
458
+ repo_github: str, issue_number: int, *, branch: str | None = None
459
+ ) -> bool:
460
+ """#3376: True when the branch a dispatch is about to act on has already
461
+ merged into the repo's default branch — the `branch_merged` predicate
462
+ `coord.dispatch_liveness.check_dispatch_liveness` needs, backed by a
463
+ live GitHub check.
464
+
465
+ #3436: when *branch* is given — the exact branch the dispatch targets,
466
+ e.g. an `Assignment.branch` or `Proposal.target_branch` — this checks
467
+ ONLY that branch and ignores every other `issue-{N}-*` sibling. Without
468
+ this, the issue-scoped fallback below answers "has ANY branch for this
469
+ issue merged", which a single zero-commit review-leg branch (cut from
470
+ the then-current default-branch tip and never diverged — routine
471
+ residue of a review/scoped-review leg, not evidence the real work
472
+ landed) trips forever, permanently refusing dispatch for an issue whose
473
+ actual work branch sits unmerged with real commits on it.
474
+
475
+ Falls back to the original issue-scoped "has ANY matching branch
476
+ merged" behaviour only when *branch* is `None` — a caller with nothing
477
+ assigned yet (a pre-dispatch check before any branch exists) has no
478
+ single branch to ask about, so the issue-scoped signal is the best one
479
+ available. Reuses the exact merge-detection `_drop_merged_branches`
480
+ already performs for claim detection (PR-merged OR `ahead_by == 0`
481
+ ancestry, survives squash merges — #3103): this is just "did filtering
482
+ drop anything", with the fail-open direction flipped to match a
483
+ REFUSAL predicate rather than a claim-signal — no matching branch at
484
+ all, or any lookup failure, returns `False` ("not merged, don't refuse
469
485
  dispatch on this"), never `True`.
470
486
  """
487
+ if branch is not None:
488
+ return not _drop_merged_branches(repo_github, [branch])
471
489
  branches = list_matching_remote_branches(repo_github, issue_number)
472
490
  if not branches:
473
491
  return False
@@ -653,12 +653,16 @@ def dispatch(
653
653
  like every caller that predates this parameter — same opt-in shape as
654
654
  *status_fetcher*.
655
655
 
656
- *issue_liveness_fetcher* (#3376) is `(repo_name: str, issue_number: int)
657
- -> (issue_closed: bool, branch_merged: bool)` — the other two
658
- predicates of the same STRUCTURAL DISPATCH-LIVENESS GATE. `None` (the
659
- default) performs no check at all and refuses nothing, same opt-in
660
- shape as *credential_fetcher*. See `coord.dispatch_liveness` for the
661
- single function all three predicates funnel through.
656
+ *issue_liveness_fetcher* (#3376) is `(repo_name: str, issue_number: int,
657
+ branch: str | None) -> (issue_closed: bool, branch_merged: bool)` — the
658
+ other two predicates of the same STRUCTURAL DISPATCH-LIVENESS GATE.
659
+ `None` (the default) performs no check at all and refuses nothing, same
660
+ opt-in shape as *credential_fetcher*. `branch` (#3436) is
661
+ `proposal.target_branch` — the exact branch THIS dispatch would land
662
+ on, not merely some `issue-{N}-*` sibling — so a zero-commit review-leg
663
+ branch cut from the default branch never masquerades as "this issue's
664
+ work already merged". See `coord.dispatch_liveness` for the single
665
+ function all three predicates funnel through.
662
666
  """
663
667
  machine = next(
664
668
  (m for m in config.machines if m.name == proposal.machine_name), None
@@ -865,7 +869,7 @@ def dispatch(
865
869
  branch_merged: bool | None = None
866
870
  if issue_liveness_fetcher is not None:
867
871
  issue_closed, branch_merged = issue_liveness_fetcher(
868
- proposal.repo_name, proposal.issue_number
872
+ proposal.repo_name, proposal.issue_number, proposal.target_branch
869
873
  )
870
874
  machine_healthy: bool | None = None
871
875
  if credential_fetcher is not None:
@@ -148,8 +148,8 @@ def check_dispatch_liveness(
148
148
 
149
149
  def github_issue_liveness_fetcher(
150
150
  config: "Config",
151
- ) -> Callable[[str, int], tuple[bool, bool]]:
152
- """Build a REAL `(repo_name, issue_number) -> (issue_closed,
151
+ ) -> Callable[[str, int, str | None], tuple[bool, bool]]:
152
+ """Build a REAL `(repo_name, issue_number, branch) -> (issue_closed,
153
153
  branch_merged)` fetcher, backed by live GitHub calls — the piece #3376
154
154
  review round 1 found missing: `check_dispatch_liveness`'s two new
155
155
  predicates existed and were unit-tested, but every actual dispatch
@@ -165,30 +165,37 @@ def github_issue_liveness_fetcher(
165
165
 
166
166
  Resolves `repo_name` (coordinator.yml's internal name) to `owner/repo`
167
167
  via *config* — every fetcher call inside `coord.dispatch.dispatch()`
168
- only ever hands this `(proposal.repo_name, proposal.issue_number)`, so
169
- the GitHub-repo mapping has to happen inside the closure, not at the
170
- call site.
168
+ only ever hands this `(proposal.repo_name, proposal.issue_number,
169
+ proposal.target_branch)`, so the GitHub-repo mapping has to happen
170
+ inside the closure, not at the call site.
171
171
 
172
172
  issue_closed: `coord.github_ops.issue_is_closed` — one `gh` call.
173
- branch_merged: `coord.claim.any_matching_branch_merged` — is there a
174
- remote `issue-{N}-*` branch (any slug, not a title-guessed one — a
175
- dispatch site has no reliable way to know which title a PRIOR dispatch
176
- used to slugify its branch, and issue titles can be edited after the
177
- fact) whose current tip has already merged. Both fail open (`False`) on
178
- any GitHub/network hiccup — same "never refuse on evidence we don't
179
- have" posture `claude_credential_reachable` documents for the third
180
- predicate, and matching `issue_is_closed`'s/`pr_is_merged`'s own
181
- documented fail-open contracts.
173
+ branch_merged: `coord.claim.any_matching_branch_merged` — #3436: when
174
+ *branch* is given (the dispatch's actual target — e.g. `Assignment.
175
+ branch`/`Proposal.target_branch`), asks whether THAT branch has merged
176
+ and ignores every other `issue-{N}-*` sibling, so a zero-commit
177
+ review-leg branch cut from the default-branch tip can no longer
178
+ permanently refuse dispatch for the issue's real, unmerged work
179
+ branch. `branch=None` (a caller with nothing dispatched yet) falls
180
+ back to the original issue-scoped "any matching branch merged" check.
181
+ Both fail open (`False`) on any GitHub/network hiccup — same "never
182
+ refuse on evidence we don't have" posture `claude_credential_reachable`
183
+ documents for the third predicate, and matching `issue_is_closed`'s/
184
+ `pr_is_merged`'s own documented fail-open contracts.
182
185
  """
183
186
 
184
- def fetcher(repo_name: str, issue_number: int) -> tuple[bool, bool]:
187
+ def fetcher(
188
+ repo_name: str, issue_number: int, branch: str | None = None
189
+ ) -> tuple[bool, bool]:
185
190
  from coord import github_ops # noqa: PLC0415
186
191
  from coord.claim import any_matching_branch_merged # noqa: PLC0415
187
192
 
188
193
  repo_cfg = config.repo(repo_name)
189
194
  repo_github = repo_cfg.github if repo_cfg is not None else repo_name
190
195
  issue_closed = github_ops.issue_is_closed(repo_github, issue_number)
191
- branch_merged = any_matching_branch_merged(repo_github, issue_number)
196
+ branch_merged = any_matching_branch_merged(
197
+ repo_github, issue_number, branch=branch
198
+ )
192
199
  return issue_closed, branch_merged
193
200
 
194
201
  return fetcher
@@ -38,6 +38,7 @@ from coord.ci_store import (
38
38
  failed_checks,
39
39
  in_flight_checks,
40
40
  is_unreadable_check,
41
+ is_unreadable_check_name,
41
42
  is_verdictless_job,
42
43
  shrunk_check_names,
43
44
  summarize,
@@ -2442,7 +2443,11 @@ def _ci_seen_check_names(entry: "QueuedMerge") -> frozenset[str]:
2442
2443
  return frozenset()
2443
2444
  if not isinstance(names, list):
2444
2445
  return frozenset()
2445
- return frozenset(str(n) for n in names)
2446
+ # #3438: filter defensively on READ too, not just at the #3438 write-side
2447
+ # fix in `_ci_record_seen_check_names` — a row already poisoned in the
2448
+ # wild (written before this fix) recovers on its very next read here,
2449
+ # rather than being stuck until someone hand-edits the DB.
2450
+ return frozenset(str(n) for n in names if not is_unreadable_check_name(str(n)))
2446
2451
 
2447
2452
 
2448
2453
  def _ci_record_seen_check_names(entry: "QueuedMerge", checks: list[CheckRun]) -> None:
@@ -2462,9 +2467,20 @@ def _ci_record_seen_check_names(entry: "QueuedMerge", checks: list[CheckRun]) ->
2462
2467
  that disappears for more than one consecutive tick keeps being flagged
2463
2468
  rather than being silently dropped from the record the moment it first
2464
2469
  vanishes.
2470
+
2471
+ #3438: the #1525 synthetic "could not read CI status" stand-in
2472
+ (:func:`coord.ci_store.is_unreadable_check`) is excluded from
2473
+ *current_names* on BOTH branches. That stand-in only ever appears in a
2474
+ read where the real checks could not be fetched at all; memoizing its
2475
+ name would poison this entry permanently, because the only read that
2476
+ could ever re-supply it (another failed fetch) would simultaneously
2477
+ fail to report every real check name too, which the #3263 guard would
2478
+ also reject as shrinkage — a closed loop with no exit. Filtering here,
2479
+ at the point of record, means it never enters
2480
+ ``ci_seen_check_names_json`` in the first place, on either branch.
2465
2481
  """
2466
2482
  sha = entry.branch_head_sha or ""
2467
- current_names = {c.name for c in checks}
2483
+ current_names = {c.name for c in checks if not is_unreadable_check(c)}
2468
2484
  if entry.ci_seen_checks_sha != sha:
2469
2485
  entry.ci_seen_checks_sha = sha
2470
2486
  entry.ci_seen_check_names_json = json.dumps(sorted(current_names))
@@ -1092,10 +1092,12 @@ def dispatch_entry(
1092
1092
  assign`), matching the same check ``_dispatch_headless`` performs.
1093
1093
 
1094
1094
  *issue_liveness_fetcher* (#3376) is an optional ``(repo_name: str,
1095
- issue_number: int) -> (issue_closed: bool, branch_merged: bool)``
1096
- callable threaded straight through to :func:`coord.dispatch.dispatch`'s
1097
- parameter of the same name — the STRUCTURAL DISPATCH-LIVENESS GATE's
1098
- other two predicates. ``None`` (the default) performs no check and
1095
+ issue_number: int, branch: str | None) -> (issue_closed: bool,
1096
+ branch_merged: bool)`` callable threaded straight through to
1097
+ :func:`coord.dispatch.dispatch`'s parameter of the same name — the
1098
+ STRUCTURAL DISPATCH-LIVENESS GATE's other two predicates (#3436:
1099
+ ``dispatch()`` itself supplies the branch, from ``proposal.
1100
+ target_branch``). ``None`` (the default) performs no check and
1099
1101
  refuses nothing, same opt-in shape as every other fetcher in this
1100
1102
  module; the daemon's auto-drain/gate ticks (``coord.serve_app``'s
1101
1103
  ``_milestone_drain_tick``/``_milestone_gate_tick``) are the production
@@ -1752,7 +1752,10 @@ def _resolve_retry_provider(
1752
1752
 
1753
1753
 
1754
1754
  def _issue_liveness_from_cache(
1755
- board: Board, repo_name: str, issue_number: int
1755
+ board: Board,
1756
+ repo_name: str,
1757
+ issue_number: int,
1758
+ branch: str | None = None,
1756
1759
  ) -> tuple[bool, bool]:
1757
1760
  """#3376: local-only ``issue_liveness_fetcher`` for `_reassign` —
1758
1761
  "issue closed" from the local `issues` cache table (`coord.state.
@@ -1763,6 +1766,14 @@ def _issue_liveness_from_cache(
1763
1766
  ``"merged"``). Neither call touches GitHub — same "no live probe from
1764
1767
  a passive tick" posture as the ``cached_labels`` lookup beside this
1765
1768
  function's one caller.
1769
+
1770
+ #3436: when *branch* is given (the failed row's own `Assignment.
1771
+ branch` — the branch a retry would actually land on), the "merged"
1772
+ scan is additionally scoped to rows on THAT branch, not merely any
1773
+ completed row for the issue — a merged review-leg row for the same
1774
+ issue on a *different*, zero-commit branch must not read as "this
1775
+ issue's work already merged" and block a retry of the real, unmerged
1776
+ work branch. `branch=None` keeps the original issue-scoped behaviour.
1766
1777
  """
1767
1778
  from coord.state import get_cached_issue_state # noqa: PLC0415
1768
1779
 
@@ -1771,6 +1782,7 @@ def _issue_liveness_from_cache(
1771
1782
  a.repo_name == repo_name
1772
1783
  and a.issue_number == issue_number
1773
1784
  and a.status == "merged"
1785
+ and (branch is None or a.branch == branch)
1774
1786
  for a in board.completed
1775
1787
  )
1776
1788
  return issue_closed, branch_merged
@@ -1812,20 +1824,23 @@ def _reassign(
1812
1824
  entry point.
1813
1825
 
1814
1826
  *issue_liveness_fetcher* (#3376) is an optional ``(repo_name: str,
1815
- issue_number: int) -> (issue_closed: bool, branch_merged: bool)``
1816
- callable — the other two predicates of the same STRUCTURAL DISPATCH-
1817
- LIVENESS GATE `coord.dispatch.dispatch()` itself checks (see
1818
- `coord.dispatch_liveness`). `None` (the default here) performs no
1819
- check and skips nothing — same opt-in shape as *credential_fetcher*
1820
- above, for the same reason: the real wiring happens at `reconcile()`'s
1821
- own call site. Unlike *credential_fetcher* (a machine FILTER — an
1822
- unhealthy machine is simply excluded from *candidates*), a positive
1823
- hit here means the auto-reassign attempt itself is pointless — #3367's
1824
- own incident was exactly this shape one layer up (four auto-retried
1825
- review dispatches against a dead host); #3376 generalizes it to "is
1826
- the thing being retried still real at all", so this returns ``None``
1827
- (skip, exactly like "no candidate machines") rather than trying
1828
- another machine.
1827
+ issue_number: int, branch: str | None) -> (issue_closed: bool,
1828
+ branch_merged: bool)`` callable — the other two predicates of the same
1829
+ STRUCTURAL DISPATCH-LIVENESS GATE `coord.dispatch.dispatch()` itself
1830
+ checks (see `coord.dispatch_liveness`). `None` (the default here)
1831
+ performs no check and skips nothing — same opt-in shape as
1832
+ *credential_fetcher* above, for the same reason: the real wiring
1833
+ happens at `reconcile()`'s own call site. Unlike *credential_fetcher*
1834
+ (a machine FILTER — an unhealthy machine is simply excluded from
1835
+ *candidates*), a positive hit here means the auto-reassign attempt
1836
+ itself is pointless — #3367's own incident was exactly this shape one
1837
+ layer up (four auto-retried review dispatches against a dead host);
1838
+ #3376 generalizes it to "is the thing being retried still real at
1839
+ all", so this returns ``None`` (skip, exactly like "no candidate
1840
+ machines") rather than trying another machine. #3436: *branch* is
1841
+ ``failed.branch`` — the exact branch a retry would land on — so a
1842
+ merged sibling branch for the same issue no longer masquerades as
1843
+ "this issue's work already merged".
1829
1844
 
1830
1845
  Raises :class:`UnsupportedRetryType` when ``failed.type`` is not in
1831
1846
  :data:`coord.models.WORK_LIKE_TYPES` — a ``smoke``/``review``/other
@@ -1842,7 +1857,7 @@ def _reassign(
1842
1857
 
1843
1858
  if issue_liveness_fetcher is not None:
1844
1859
  issue_closed, branch_merged = issue_liveness_fetcher(
1845
- failed.repo_name, failed.issue_number
1860
+ failed.repo_name, failed.issue_number, failed.branch
1846
1861
  )
1847
1862
  refusal = check_dispatch_liveness(
1848
1863
  repo_name=failed.repo_name,
@@ -2797,8 +2812,8 @@ def reconcile(board: Board, config: Config) -> list[str]:
2797
2812
  reassigned = _reassign(
2798
2813
  failed_a, board, config, issue_labels=cached_labels,
2799
2814
  credential_fetcher=claude_credential_reachable,
2800
- issue_liveness_fetcher=lambda repo, num: (
2801
- _issue_liveness_from_cache(board, repo, num)
2815
+ issue_liveness_fetcher=lambda repo, num, branch=None: (
2816
+ _issue_liveness_from_cache(board, repo, num, branch)
2802
2817
  ),
2803
2818
  )
2804
2819
  except RetryProviderMismatch:
@@ -3033,7 +3033,9 @@ def dispatch_pending_smoke(
3033
3033
  *,
3034
3034
  now: float | None = None,
3035
3035
  gh_ops: "GhOps | None" = None,
3036
- issue_liveness_fetcher: Callable[[str, int], tuple[bool, bool]] | None = None,
3036
+ issue_liveness_fetcher: (
3037
+ Callable[[str, int, str | None], tuple[bool, bool]] | None
3038
+ ) = None,
3037
3039
  ) -> list[Assignment]:
3038
3040
  """Bulk Test-stage dispatch — the smoke analogue of
3039
3041
  :func:`coord.review.dispatch_pending_reviews`.
@@ -3066,10 +3068,15 @@ def dispatch_pending_smoke(
3066
3068
  live gate check in this codebase hands `merge_queue`'s gate functions.
3067
3069
 
3068
3070
  #3375: *issue_liveness_fetcher* is the SAME opt-in
3069
- ``(repo_name, issue_number) -> (issue_closed, branch_merged)`` contract
3070
- `coord.dispatch_liveness.check_dispatch_liveness` already gates
3071
- `coord.dispatch.dispatch()` with (#3376) — but this stage never went
3072
- through that call path. `dispatch_smoke`/`_dispatch_smoke_legs` POST
3071
+ ``(repo_name, issue_number, branch) -> (issue_closed, branch_merged)``
3072
+ contract `coord.dispatch_liveness.check_dispatch_liveness` already
3073
+ gates `coord.dispatch.dispatch()` with (#3376) — but this stage never
3074
+ went through that call path. #3436: *branch* is `completed.branch` —
3075
+ the row's own branch, not merely some `issue-{N}-*` sibling — so a
3076
+ zero-commit review-leg branch cut from the default branch can no
3077
+ longer masquerade as "this issue's work already merged" and
3078
+ permanently skip the Test stage for the real, unmerged work branch.
3079
+ `dispatch_smoke`/`_dispatch_smoke_legs` POST
3073
3080
  straight to a machine's `/assign` over `httpx`, so #3376's dispatch-time
3074
3081
  gate never saw a Test-stage dispatch at all, and the five-smoke-agents
3075
3082
  incident that motivated both issues could still reproduce after #3376
@@ -3316,7 +3323,7 @@ def dispatch_pending_smoke(
3316
3323
  )
3317
3324
 
3318
3325
  issue_closed, branch_merged = issue_liveness_fetcher(
3319
- completed.repo_name, completed.issue_number
3326
+ completed.repo_name, completed.issue_number, completed.branch
3320
3327
  )
3321
3328
  refusal = check_dispatch_liveness(
3322
3329
  repo_name=completed.repo_name,
@@ -218,6 +218,46 @@ class TestShrunkCheckNames:
218
218
  assert shrunk_check_names(seen, checks) == frozenset({"a", "b"})
219
219
 
220
220
 
221
+ class TestIsUnreadableCheckName:
222
+ """#3438: the name-only half of `is_unreadable_check`, split out so a
223
+ caller holding only a bare check NAME (e.g. `coord.merge_queue`'s
224
+ persisted `ci_seen_check_names_json`, which stores names, not whole
225
+ `CheckRun` objects) can still recognize the #1525 synthetic stand-in."""
226
+
227
+ def test_matches_the_unreadable_check_stand_in_name(self) -> None:
228
+ from coord.ci_store import is_unreadable_check_name
229
+ name = "coord: could not read CI status for acme/api#99 (HTTP 503)"
230
+ assert is_unreadable_check_name(name) is True
231
+
232
+ def test_matches_the_gh_too_old_stand_in_name(self) -> None:
233
+ from coord.ci_store import is_unreadable_check_name
234
+ name = "coord: gh is too old to read CI status for acme/api#99 (v1.0)"
235
+ assert is_unreadable_check_name(name) is True
236
+
237
+ def test_does_not_match_a_real_check_name(self) -> None:
238
+ from coord.ci_store import is_unreadable_check_name
239
+ assert is_unreadable_check_name("cargo-test") is False
240
+
241
+ def test_does_not_match_the_gate_snapshot_stale_stand_in(self) -> None:
242
+ """A different `coord: `-prefixed synthetic, for a different local
243
+ condition (#2347's own documented distinction) — must not match
244
+ just because it shares the prefix."""
245
+ from coord.ci_store import is_unreadable_check_name
246
+ name = "coord: gate snapshot stale (120s)"
247
+ assert is_unreadable_check_name(name) is False
248
+
249
+ def test_agrees_with_is_unreadable_check_on_full_check_objects(self) -> None:
250
+ """One question, one answer: `is_unreadable_check` must delegate
251
+ here rather than re-deriving the same test, so the two can never
252
+ drift apart."""
253
+ from coord.ci_github import _unreadable_check
254
+ from coord.ci_store import is_unreadable_check, is_unreadable_check_name
255
+
256
+ check = _unreadable_check("acme/api", 99, "HTTP 503")
257
+ assert is_unreadable_check(check) is True
258
+ assert is_unreadable_check_name(check.name) is True
259
+
260
+
221
261
  class _FakeClock:
222
262
  """Deterministic (clock, sleep) pair for `wait_for_ci_settle` tests
223
263
  (#1925) — `sleep` advances the same counter `clock` reads, so a bounded
@@ -873,6 +873,40 @@ def test_any_matching_branch_merged_false_on_gh_error(monkeypatch) -> None:
873
873
  assert claim_mod.any_matching_branch_merged("acme/api", 9) is False
874
874
 
875
875
 
876
+ def test_any_matching_branch_merged_scoped_branch_ignores_merged_siblings(
877
+ monkeypatch,
878
+ ) -> None:
879
+ """#3436: reproduces vimcode#1156's shape — several MERGED, zero-commit
880
+ `issue-{N}-*` review-leg branches (cut from the default-branch tip,
881
+ never diverged) alongside the one real, unmerged work branch. The
882
+ issue-scoped (no ``branch=``) check is tripped by the merged siblings —
883
+ the documented fallback behaviour for a caller with nothing dispatched
884
+ yet — but a caller that names the ACTUAL branch in play must get an
885
+ answer scoped to just that branch, not "did anything for this issue
886
+ ever merge"."""
887
+ import coord.claim as claim_mod
888
+
889
+ monkeypatch.setattr(
890
+ "coord.github_ops._gh",
891
+ _gh_stub_with_matching_refs(
892
+ ["issue-1156-review-fix-1", "issue-1156-real-work"],
893
+ "main",
894
+ {"issue-1156-review-fix-1": 0, "issue-1156-real-work": 5},
895
+ ),
896
+ )
897
+ # No branch named: falls back to the issue-scoped check, which still
898
+ # trips on the merged sibling (unchanged pre-#3436 fallback behaviour).
899
+ assert claim_mod.any_matching_branch_merged("acme/api", 1156) is True
900
+ # Scoped to the real, unmerged work branch: must NOT report merged.
901
+ assert claim_mod.any_matching_branch_merged(
902
+ "acme/api", 1156, branch="issue-1156-real-work"
903
+ ) is False
904
+ # Scoped to the merged sibling itself: correctly reports merged.
905
+ assert claim_mod.any_matching_branch_merged(
906
+ "acme/api", 1156, branch="issue-1156-review-fix-1"
907
+ ) is True
908
+
909
+
876
910
  # ── #1553: has_active_work_followup keys on the EFFECTIVE issue ─────────────
877
911
 
878
912
 
@@ -480,7 +480,7 @@ class TestApproveProviderAwareModel:
480
480
  with patch("coord.dispatch.httpx.post", return_value=mock_resp) as mock_post, \
481
481
  patch(
482
482
  "coord.dispatch_liveness.github_issue_liveness_fetcher",
483
- return_value=lambda _repo, _issue: (False, False),
483
+ return_value=lambda _repo, _issue, _branch=None: (False, False),
484
484
  ), \
485
485
  patch("coord.github_ops.get_issue") as mock_get_issue, \
486
486
  patch("coord.github_ops.post_issue_comment"):
@@ -2610,6 +2610,28 @@ class TestDispatchLivenessGate:
2610
2610
  dispatch(proposal, config)
2611
2611
  mock_post.assert_called_once()
2612
2612
 
2613
+ @patch("coord.dispatch.httpx.post")
2614
+ def test_passes_proposal_target_branch_to_the_fetcher(
2615
+ self, mock_post: MagicMock, config: Config, proposal: Proposal,
2616
+ ) -> None:
2617
+ """#3436: the fetcher must see the DISPATCH'S OWN target branch, not
2618
+ just `(repo_name, issue_number)` — the whole point being that a
2619
+ merged, zero-commit `issue-{N}-*` sibling (e.g. a review-leg
2620
+ branch) must not be able to answer for the real work branch this
2621
+ exact dispatch is about to land on."""
2622
+ mock_resp = MagicMock()
2623
+ mock_resp.json.return_value = {"id": "abc"}
2624
+ mock_post.return_value = mock_resp
2625
+ proposal.target_branch = "issue-10-fix-auth"
2626
+ seen: list[tuple] = []
2627
+
2628
+ def fetcher(repo, num, branch=None):
2629
+ seen.append((repo, num, branch))
2630
+ return False, False
2631
+
2632
+ dispatch(proposal, config, issue_liveness_fetcher=fetcher)
2633
+ assert seen == [("api", 10, "issue-10-fix-auth")]
2634
+
2613
2635
  @patch("coord.dispatch.record_dispatch_refusal")
2614
2636
  @patch("coord.dispatch.httpx.post")
2615
2637
  def test_refuses_a_closed_issue(
@@ -2619,7 +2641,7 @@ class TestDispatchLivenessGate:
2619
2641
  with pytest.raises(DispatchRefused, match="already closed"):
2620
2642
  dispatch(
2621
2643
  proposal, config,
2622
- issue_liveness_fetcher=lambda repo, num: (True, False),
2644
+ issue_liveness_fetcher=lambda repo, num, branch=None: (True, False),
2623
2645
  )
2624
2646
  mock_post.assert_not_called()
2625
2647
  mock_record.assert_called_once()
@@ -2633,7 +2655,7 @@ class TestDispatchLivenessGate:
2633
2655
  with pytest.raises(DispatchRefused, match="already merged"):
2634
2656
  dispatch(
2635
2657
  proposal, config,
2636
- issue_liveness_fetcher=lambda repo, num: (False, True),
2658
+ issue_liveness_fetcher=lambda repo, num, branch=None: (False, True),
2637
2659
  )
2638
2660
  mock_post.assert_not_called()
2639
2661
  mock_record.assert_called_once()
@@ -2647,7 +2669,7 @@ class TestDispatchLivenessGate:
2647
2669
  mock_post.return_value = mock_resp
2648
2670
  dispatch(
2649
2671
  proposal, config,
2650
- issue_liveness_fetcher=lambda repo, num: (False, False),
2672
+ issue_liveness_fetcher=lambda repo, num, branch=None: (False, False),
2651
2673
  )
2652
2674
  mock_post.assert_called_once()
2653
2675
 
@@ -2662,7 +2684,7 @@ class TestDispatchLivenessGate:
2662
2684
  with pytest.raises(ValueError, match="not routable"):
2663
2685
  dispatch(
2664
2686
  proposal, config,
2665
- issue_liveness_fetcher=lambda repo, num: (False, False),
2687
+ issue_liveness_fetcher=lambda repo, num, branch=None: (False, False),
2666
2688
  credential_fetcher=lambda m: False,
2667
2689
  )
2668
2690
  mock_post.assert_not_called()
@@ -2680,17 +2702,17 @@ class TestDispatchLivenessGate:
2680
2702
  with pytest.raises(DispatchRefused):
2681
2703
  dispatch(
2682
2704
  proposal, config,
2683
- issue_liveness_fetcher=lambda repo, num: (True, False),
2705
+ issue_liveness_fetcher=lambda repo, num, branch=None: (True, False),
2684
2706
  )
2685
2707
  with pytest.raises(DispatchRefused):
2686
2708
  dispatch(
2687
2709
  proposal, config,
2688
- issue_liveness_fetcher=lambda repo, num: (False, True),
2710
+ issue_liveness_fetcher=lambda repo, num, branch=None: (False, True),
2689
2711
  )
2690
2712
  with pytest.raises(DispatchRefused):
2691
2713
  dispatch(
2692
2714
  proposal, config,
2693
- issue_liveness_fetcher=lambda repo, num: (False, False),
2715
+ issue_liveness_fetcher=lambda repo, num, branch=None: (False, False),
2694
2716
  credential_fetcher=lambda m: False,
2695
2717
  )
2696
2718
  mock_post.assert_not_called()
@@ -140,7 +140,7 @@ class TestGithubIssueLivenessFetcher:
140
140
  assert issue_closed is True
141
141
  assert branch_merged is False
142
142
  mock_closed.assert_called_once_with("acme/api", 42)
143
- mock_merged.assert_called_once_with("acme/api", 42)
143
+ mock_merged.assert_called_once_with("acme/api", 42, branch=None)
144
144
 
145
145
  @patch("coord.claim.any_matching_branch_merged", return_value=True)
146
146
  @patch("coord.github_ops.issue_is_closed", return_value=False)
@@ -167,4 +167,22 @@ class TestGithubIssueLivenessFetcher:
167
167
  assert issue_closed is False
168
168
  assert branch_merged is False
169
169
  mock_closed.assert_called_once_with("ghost", 1)
170
- mock_merged.assert_called_once_with("ghost", 1)
170
+ mock_merged.assert_called_once_with("ghost", 1, branch=None)
171
+
172
+ @patch("coord.claim.any_matching_branch_merged", return_value=False)
173
+ @patch("coord.github_ops.issue_is_closed", return_value=False)
174
+ def test_passes_the_target_branch_through(
175
+ self, mock_closed: MagicMock, mock_merged: MagicMock,
176
+ ) -> None:
177
+ """#3436: a caller that names a specific branch (the dispatch's
178
+ actual target — e.g. `Proposal.target_branch`/`Assignment.branch`)
179
+ must have it forwarded to `any_matching_branch_merged`'s
180
+ branch-scoped check, not silently dropped in favour of the
181
+ issue-scoped fallback."""
182
+ fetcher = github_issue_liveness_fetcher(self._config())
183
+ issue_closed, branch_merged = fetcher("api", 42, "issue-42-real-work")
184
+ assert issue_closed is False
185
+ assert branch_merged is False
186
+ mock_merged.assert_called_once_with(
187
+ "acme/api", 42, branch="issue-42-real-work"
188
+ )