code-coordinator 0.5.569__tar.gz → 0.5.571__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 (932) hide show
  1. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/drive_queue.py +111 -9
  5. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/drive_queue.py +56 -23
  6. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/win_native_driver.py +81 -25
  7. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_drive_queue.py +107 -0
  8. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive.py +16 -0
  9. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue.py +181 -0
  10. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_win_native_driver.py +156 -0
  11. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/.gitignore +0 -0
  24. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/GOAL.md +0 -0
  26. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/LICENSE +0 -0
  27. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/README.md +0 -0
  29. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/backup.py +0 -0
  49. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/bugbash.py +0 -0
  57. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/claude_setup_token.py +0 -0
  64. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/client.py +0 -0
  66. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/codegen.py +0 -0
  67. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/backup.py +0 -0
  73. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/bugbash.py +0 -0
  74. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/ci.py +0 -0
  76. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/codegen.py +0 -0
  77. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/dr.py +0 -0
  80. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/drive.py +0 -0
  81. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/machine.py +0 -0
  86. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/merge.py +0 -0
  87. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/milestone.py +0 -0
  88. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/plan_followup.py +0 -0
  89. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/plans.py +0 -0
  90. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/portal.py +0 -0
  91. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/pr.py +0 -0
  92. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/release.py +0 -0
  93. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/store_migrate.py +0 -0
  101. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/terminal.py +0 -0
  102. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/test_gate.py +0 -0
  103. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/commands/tui.py +0 -0
  104. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/comments.py +0 -0
  105. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/config.py +0 -0
  106. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/config_reload.py +0 -0
  107. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/confirm_test.py +0 -0
  108. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/conflict_fix.py +0 -0
  109. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dao.py +0 -0
  110. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/__init__.py +0 -0
  111. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/fixture.py +0 -0
  112. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/index.html +0 -0
  113. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/reports.html +0 -0
  114. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/server.py +0 -0
  115. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dashboard/terminal.py +0 -0
  116. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/db.py +0 -0
  117. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dead_end.py +0 -0
  118. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/decomposition_chat.py +0 -0
  119. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/README.md +0 -0
  120. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-agent.service +0 -0
  121. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-backup.service +0 -0
  122. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-backup.timer +0 -0
  123. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-db-backup.service +0 -0
  124. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-db-backup.sh +0 -0
  125. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-db-backup.timer +0 -0
  126. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-dr-verify.service +0 -0
  127. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-dr-verify.timer +0 -0
  128. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-drive-queue.service +0 -0
  129. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-drive-queue.timer +0 -0
  130. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-failure-notify.service +0 -0
  131. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-fleet-watchdog.service +0 -0
  132. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  133. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-notify.service +0 -0
  134. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-notify.timer +0 -0
  135. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-release-propagate.service +0 -0
  136. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-release-propagate.timer +0 -0
  137. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-release-window.service +0 -0
  138. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-release-window.timer +0 -0
  139. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-serve.service +0 -0
  140. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-web-dist-build.service +0 -0
  141. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-web-dist-build.timer +0 -0
  142. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy/coord-web.service +0 -0
  143. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy_manifest.py +0 -0
  144. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deploy_units.py +0 -0
  145. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deprecation_telemetry.py +0 -0
  146. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/deps.py +0 -0
  147. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/diagnose.py +0 -0
  148. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dispatch.py +0 -0
  149. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dispatch_liveness.py +0 -0
  150. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dr_promote.py +0 -0
  152. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/dr_verify.py +0 -0
  153. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/drive.py +0 -0
  154. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/drive_sessions_snapshot.py +0 -0
  155. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/drive_state.py +0 -0
  156. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/events.py +0 -0
  157. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/failure_class.py +0 -0
  158. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/failure_classifier.py +0 -0
  159. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/filelock.py +0 -0
  160. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/fleet_config_health.py +0 -0
  161. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/forge_availability.py +0 -0
  162. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/freshness.py +0 -0
  163. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gate_a.py +0 -0
  164. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gate_b.py +0 -0
  165. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gate_snapshot.py +0 -0
  166. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gates.py +0 -0
  167. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gen_board_fixture.py +0 -0
  168. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/github_ops.py +0 -0
  169. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/github_throttle.py +0 -0
  170. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/goal.py +0 -0
  171. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/graph_health.py +0 -0
  172. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/gtk_native_driver.py +0 -0
  173. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/__init__.py +0 -0
  174. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/aggregate.py +0 -0
  175. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/__init__.py +0 -0
  176. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/_ci_pin.py +0 -0
  177. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/agent_install.py +0 -0
  178. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/cargo_targets.py +0 -0
  179. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/claude_binary.py +0 -0
  180. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/config_drift.py +0 -0
  181. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  182. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/coord_web_ci_pin.py +0 -0
  183. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/deploy_lane_facts.py +0 -0
  184. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/disk.py +0 -0
  185. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/fleet_board.py +0 -0
  186. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  187. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/fleet_phantom.py +0 -0
  188. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/fleet_unit_drift.py +0 -0
  189. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/graph.py +0 -0
  190. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/graphify_cli.py +0 -0
  191. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/index_lock.py +0 -0
  192. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/issues_sync_staleness.py +0 -0
  193. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/local_machine_identity.py +0 -0
  194. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/plan_usage.py +0 -0
  195. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/pr_churn.py +0 -0
  196. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/release_cordon.py +0 -0
  197. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/repo_state.py +0 -0
  198. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/spawned_coord.py +0 -0
  199. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/stalled_pipeline.py +0 -0
  200. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/timer_active.py +0 -0
  201. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/toolchain.py +0 -0
  202. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/unit_drift.py +0 -0
  203. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/unit_enablement.py +0 -0
  204. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/wedged_drive_queue.py +0 -0
  205. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/checks/worktrees.py +0 -0
  206. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/cli.py +0 -0
  207. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/context.py +0 -0
  208. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/fleet_snapshot.py +0 -0
  209. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/models.py +0 -0
  210. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/pypi.py +0 -0
  211. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/registry.py +0 -0
  212. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/render.py +0 -0
  213. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/health/units.py +0 -0
  214. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/hooks.py +0 -0
  215. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/housekeeping.py +0 -0
  216. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/interactive.py +0 -0
  217. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/invariant_alarms.py +0 -0
  218. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/issue_store.py +0 -0
  219. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/issues_sync_status.py +0 -0
  220. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/liveness_auditor.py +0 -0
  221. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/mac_native_driver.py +0 -0
  222. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/machine_fault.py +0 -0
  223. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/machine_metrics.py +0 -0
  224. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/machine_onboard.py +0 -0
  225. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/machine_pause.py +0 -0
  226. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/machine_stats.py +0 -0
  227. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/merge_queue.py +0 -0
  228. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/milestone_chat.py +0 -0
  229. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/milestone_dispatch.py +0 -0
  230. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/milestone_gate.py +0 -0
  231. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/milestone_order.py +0 -0
  232. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/mock_author.py +0 -0
  233. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/models.py +0 -0
  234. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/network.py +0 -0
  235. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/new_issue_chat.py +0 -0
  236. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/__init__.py +0 -0
  237. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/baseline.py +0 -0
  238. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/cli.py +0 -0
  239. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/collect.py +0 -0
  240. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/digest.py +0 -0
  241. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/models.py +0 -0
  242. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/predicate.py +0 -0
  243. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/service.py +0 -0
  244. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/store.py +0 -0
  245. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notifier/transport.py +0 -0
  246. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/notify.py +0 -0
  247. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/openapi.py +0 -0
  248. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/overlap_fence.py +0 -0
  249. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/overlap_predict.py +0 -0
  250. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/parentage.py +0 -0
  251. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/parentage_github.py +0 -0
  252. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/pipeline.py +0 -0
  253. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/plan_parser.py +0 -0
  254. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/plans.py +0 -0
  255. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/platform_paths.py +0 -0
  256. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/portal_bridge.py +0 -0
  257. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/portal_store.py +0 -0
  258. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/portal_sync.py +0 -0
  259. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/pr_body_lint.py +0 -0
  260. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/prereqs.py +0 -0
  261. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/progress.py +0 -0
  262. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/providers/__init__.py +0 -0
  263. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/providers/base.py +0 -0
  264. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/providers/claude.py +0 -0
  265. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/providers/claude_pty.py +0 -0
  266. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/providers/opencode.py +0 -0
  267. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/queue_diagnose.py +0 -0
  268. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/reconcile.py +0 -0
  269. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/reconcile_tick.py +0 -0
  270. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/refine_chat.py +0 -0
  271. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/release_cordon.py +0 -0
  272. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/release_gate.py +0 -0
  273. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/release_propagate.py +0 -0
  274. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/release_verify.py +0 -0
  275. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/release_window.py +0 -0
  276. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/repo_dormancy.py +0 -0
  277. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/repo_edit.py +0 -0
  278. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/repo_onboard.py +0 -0
  279. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/reports.py +0 -0
  280. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/rest_schema.py +0 -0
  281. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/restart_cmd.py +0 -0
  282. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/revalidate.py +0 -0
  283. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/review.py +0 -0
  284. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/scorecard.py +0 -0
  285. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/self_health.py +0 -0
  286. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/serve_app.py +0 -0
  287. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  288. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  289. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  290. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  291. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/portal-followup/SKILL.md +0 -0
  293. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/release-now/SKILL.md +0 -0
  294. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  295. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  296. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/skills/update-issue/SKILL.md +0 -0
  297. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/smoke.py +0 -0
  298. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/smoke_tags.py +0 -0
  299. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/spend_ceiling.py +0 -0
  300. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/split_work.py +0 -0
  301. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/sql.py +0 -0
  302. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/stage_projection.py +0 -0
  303. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/state.py +0 -0
  304. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/store_migrate.py +0 -0
  305. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/store_parity.py +0 -0
  306. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/templates/deploy-cloudflare.node.yml +0 -0
  307. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/test_author.py +0 -0
  308. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/test_chat.py +0 -0
  309. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/test_orchestrator.py +0 -0
  310. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/test_report.py +0 -0
  311. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/tui_pty_driver.py +0 -0
  312. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/usage_rollup.py +0 -0
  317. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/win_native_bridge.py +0 -0
  318. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coord/worker_events.py +0 -0
  319. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/coordinator.example.yml +0 -0
  320. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-agent.service +0 -0
  321. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-backup.service +0 -0
  322. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-backup.timer +0 -0
  323. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-db-backup.service +0 -0
  324. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-db-backup.sh +0 -0
  325. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-db-backup.timer +0 -0
  326. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-dr-verify.service +0 -0
  327. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-dr-verify.timer +0 -0
  328. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-drive-queue.service +0 -0
  329. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-drive-queue.timer +0 -0
  330. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-failure-notify.service +0 -0
  331. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-failure-notify.sh +0 -0
  332. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-fleet-watchdog.service +0 -0
  333. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-fleet-watchdog.timer +0 -0
  334. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-notify.service +0 -0
  335. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-notify.timer +0 -0
  336. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-release-propagate.service +0 -0
  337. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-release-propagate.timer +0 -0
  338. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-release-window.service +0 -0
  339. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-release-window.timer +0 -0
  340. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-serve.service +0 -0
  341. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-web-dist-build.service +0 -0
  342. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-web-dist-build.sh +0 -0
  343. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-web-dist-build.timer +0 -0
  344. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-web-rollback.sh +0 -0
  345. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/coord-web.service +0 -0
  346. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/deploy/node-shim.sh +0 -0
  347. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ADR_COORD_TUI_CI.md +0 -0
  348. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  349. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ADR_COORD_WEB_CI.md +0 -0
  350. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ADR_COORD_WEB_DIST.md +0 -0
  351. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  352. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/AGENT_OPERATIONS.md +0 -0
  353. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ARCHITECTURE.md +0 -0
  354. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ARCH_SECURITY_GATES.md +0 -0
  355. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/COCKPIT.md +0 -0
  356. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/CONTROL_CENTER.md +0 -0
  357. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/COST_DISCIPLINE.md +0 -0
  358. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/CROSS_PLATFORM.md +0 -0
  359. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/CUSTOMER_FACING_APPS.md +0 -0
  360. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/CUSTOMER_PORTAL.md +0 -0
  361. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/DATA_STORE_SELECTION.md +0 -0
  362. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/DISASTER_RECOVERY.md +0 -0
  363. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/DRIVE_QUEUE.md +0 -0
  364. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/EPHEMERAL_WORKERS.md +0 -0
  365. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/FORGE_MIGRATION.md +0 -0
  366. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/GRAPHIFY_SETUP.md +0 -0
  367. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ISSUE_GUIDANCE.md +0 -0
  368. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/MAC_MINI.md +0 -0
  369. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  370. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/NOTIFIER.md +0 -0
  371. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/OPENCODE_VERIFICATION.md +0 -0
  372. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/OPERATING_GOTCHAS.md +0 -0
  373. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/OPERATOR_GUIDES.md +0 -0
  374. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/ORACLE_LOOP.md +0 -0
  375. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/PHONE_WEBAPP.md +0 -0
  376. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/PIPELINE_V2.md +0 -0
  377. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/PLATFORM_EVOLUTION.md +0 -0
  378. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/SECOND_BACKEND.md +0 -0
  379. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/STORE_SERVICE.md +0 -0
  380. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  381. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/WEB_CONTROL_CENTER.md +0 -0
  382. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/WSL_WINDOWS_WORKER.md +0 -0
  383. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/mocks/web/README.md +0 -0
  384. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/mocks/web/_tokens.css +0 -0
  385. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/mocks/web/issue-detail.html +0 -0
  386. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/mocks/web/pipeline-narrow.html +0 -0
  387. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/docs/mocks/web/pipeline-wide.html +0 -0
  388. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/graphify-out/.gitignore +0 -0
  389. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/install-agent.sh +0 -0
  390. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/pyproject.toml +0 -0
  391. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/audit_review_verdict_overrides.py +0 -0
  392. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  393. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/build-worker-image.sh +0 -0
  394. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/coordinator-machine.py +0 -0
  395. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/dr-down.sh +0 -0
  396. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/dr-up.sh +0 -0
  397. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/epic-down.sh +0 -0
  398. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/epic-up.sh +0 -0
  399. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/preflight.sh +0 -0
  400. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/provision-server.sh +0 -0
  401. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/provision-worker.sh +0 -0
  402. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  403. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  404. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/throwaway-vm.sh +0 -0
  405. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/azure-workers/verify-github-token.sh +0 -0
  406. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/check_gh_argv_containment.py +0 -0
  407. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/codegen.py +0 -0
  408. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-test-runner.sh +0 -0
  409. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  410. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  411. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  412. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  413. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/coord-venv-rollback.sh +0 -0
  414. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/drive-batch.sh +0 -0
  415. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/extract-coord-tui.sh +0 -0
  416. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/fleet_watchdog.py +0 -0
  417. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/gen_board_fixture.py +0 -0
  418. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/gen_mock_index.py +0 -0
  419. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/lib/provision-core.sh +0 -0
  420. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/next_release_tag.py +0 -0
  421. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/provision-machine.sh +0 -0
  422. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/run_tests_in_populated_home.sh +0 -0
  423. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/run_tests_without_gh.sh +0 -0
  424. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/setup-macmini.sh +0 -0
  425. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/smoke_437_interactive.py +0 -0
  426. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/verify-provision-noble.sh +0 -0
  427. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/verify_878_review_capture.py +0 -0
  428. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/verify_release_published.py +0 -0
  429. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/scripts/verify_release_wheel.py +0 -0
  430. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/setup.cfg +0 -0
  431. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/SMOKE_SET.md +0 -0
  432. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/__init__.py +0 -0
  433. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-37/conftest.py +0 -0
  434. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-37/contract.md +0 -0
  435. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-37/manifest.yml +0 -0
  436. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  437. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  438. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/contract.md +0 -0
  439. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  440. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  441. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/manifest.yml +0 -0
  442. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-51/tsconfig.json +0 -0
  444. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/backends.py +0 -0
  446. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/conftest.py +0 -0
  447. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/board-pipeline-basic.json +0 -0
  448. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  449. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  450. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  451. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  452. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/all_pass.json +0 -0
  453. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  454. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/mixed_fail.json +0 -0
  455. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  456. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  457. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/skip.json +0 -0
  458. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/playwright/truncated.json +0 -0
  459. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  460. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  461. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  462. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  463. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  464. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  465. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  466. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  467. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_acceptance.py +0 -0
  469. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_acceptance_drivers.py +0 -0
  470. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  479. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_skills_self_heal.py +0 -0
  487. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approve_capability_reroute_3241.py +0 -0
  494. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approve_dependency_busy_2804.py +0 -0
  495. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approved_work_2532.py +0 -0
  498. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_approved_work_2996.py +0 -0
  499. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_assignment_already_recorded_daemon.py +0 -0
  500. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_audit_log.py +0 -0
  501. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_audit_outcome.py +0 -0
  502. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_audit_query.py +0 -0
  503. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_auto_loop.py +0 -0
  504. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_auto_release_publish_2035.py +0 -0
  505. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_backend_selection.py +0 -0
  506. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_backup.py +0 -0
  507. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_schema.py +0 -0
  513. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_bugbash.py +0 -0
  520. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_check_gh_argv_containment.py +0 -0
  523. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_fix.py +0 -0
  525. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_github.py +0 -0
  526. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_gitlab.py +0 -0
  527. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_parity_2091.py +0 -0
  528. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_ci_store.py +0 -0
  529. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_claim.py +0 -0
  530. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_claude_md_budget.py +0 -0
  531. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_claude_setup_token.py +0 -0
  532. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_ci.py +0 -0
  541. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_codegen.py +0 -0
  542. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_decide.py +0 -0
  543. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_capability_rules.py +0 -0
  544. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_config_provenance.py +0 -0
  545. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_forge_availability.py +0 -0
  546. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_graph.py +0 -0
  547. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_self.py +0 -0
  548. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_diagnose_test_coverage.py +0 -0
  549. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  553. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_drive.py +0 -0
  554. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_escalate.py +0 -0
  555. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_fix_headless_review.py +0 -0
  556. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_gate_a.py +0 -0
  557. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_install_drift.py +0 -0
  558. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_install_skills.py +0 -0
  559. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_issue_comment.py +0 -0
  560. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_issue_create_label.py +0 -0
  561. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_issue_reopen.py +0 -0
  562. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_issue_view_list.py +0 -0
  563. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_issues.py +0 -0
  564. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_merge.py +0 -0
  565. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_assign.py +0 -0
  566. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_capture.py +0 -0
  567. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_chat_add_child.py +0 -0
  568. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_dispatch.py +0 -0
  569. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_gate_b.py +0 -0
  570. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_gate_c.py +0 -0
  571. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_order.py +0 -0
  572. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  573. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_milestone_ship.py +0 -0
  574. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_network.py +0 -0
  575. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_new_issue_chat.py +0 -0
  576. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_plans.py +0 -0
  577. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_portal.py +0 -0
  578. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_pr.py +0 -0
  579. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_pull_artifact.py +0 -0
  580. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_queue.py +0 -0
  581. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_reattach_sessions.py +0 -0
  582. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_refine_board.py +0 -0
  583. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_release_preflight.py +0 -0
  584. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_release_propagate.py +0 -0
  585. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_release_window.py +0 -0
  586. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_repo_2220.py +0 -0
  587. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  588. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_scorecard.py +0 -0
  589. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_serve_store_backend_3084.py +0 -0
  590. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_set_review_findings.py +0 -0
  591. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_advisory_terminal.py +0 -0
  592. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_contested_tag.py +0 -0
  593. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_invariant_alarms.py +0 -0
  594. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_machine_fault.py +0 -0
  595. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_merge_queue.py +0 -0
  596. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_provider.py +0 -0
  597. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_retried_3340.py +0 -0
  598. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_review_finalizing.py +0 -0
  599. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_supervisor_3366.py +0 -0
  600. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_test_failed_tag.py +0 -0
  601. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_status_usage_limit.py +0 -0
  602. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_sync_comments_873.py +0 -0
  603. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_test_plan.py +0 -0
  604. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_track.py +0 -0
  605. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_tui_update.py +0 -0
  606. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cli_wait.py +0 -0
  607. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_client.py +0 -0
  608. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_client_base_install.py +0 -0
  609. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_client_config_cache_atomic_3052.py +0 -0
  610. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_client_resource_migration_1946.py +0 -0
  611. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_commands_common.py +0 -0
  612. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_comments.py +0 -0
  613. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_completion_summary.py +0 -0
  614. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config.py +0 -0
  615. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_acceptance.py +0 -0
  616. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_audit.py +0 -0
  617. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_drift_check.py +0 -0
  618. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_effective.py +0 -0
  619. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_pricing.py +0 -0
  620. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  621. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_config_usage_gate.py +0 -0
  622. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_confirm_test.py +0 -0
  623. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_conflict_fix.py +0 -0
  624. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_conflict_fix_semantic.py +0 -0
  625. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  626. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  628. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test_runner_baseline.py +0 -0
  629. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test_runner_populated_home.py +0 -0
  630. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test_runner_routing.py +0 -0
  631. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_test_runner_toolchain.py +0 -0
  632. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_uat.py +0 -0
  633. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coord_web_sse_restart_live.py +0 -0
  634. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_coordinator_machine.py +0 -0
  635. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_cross_platform_imports.py +0 -0
  636. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dao.py +0 -0
  637. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard.py +0 -0
  638. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_api.py +0 -0
  639. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_fixture.py +0 -0
  640. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_reports.py +0 -0
  641. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_server.py +0 -0
  642. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_terminal.py +0 -0
  643. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dashboard_terminal_live.py +0 -0
  644. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_db.py +0 -0
  645. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dead_end.py +0 -0
  646. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_decomposition_chat.py +0 -0
  647. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_coord_db_backup.py +0 -0
  648. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_coord_web_dist.py +0 -0
  649. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_coord_web_rollback.py +0 -0
  650. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_db_backup_unit.py +0 -0
  651. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_drive_queue_unit.py +0 -0
  652. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_failure_notify_unit.py +0 -0
  653. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_manifest.py +0 -0
  654. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_notify_unit.py +0 -0
  655. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_units_lane.py +0 -0
  656. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deploy_web_unit.py +0 -0
  657. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deprecation_telemetry.py +0 -0
  658. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_deps.py +0 -0
  659. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_diagnose.py +0 -0
  660. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dispatch.py +0 -0
  661. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dispatch_liveness.py +0 -0
  662. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dispatch_target_validation.py +0 -0
  663. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dispatch_workers.py +0 -0
  664. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dist_name.py +0 -0
  665. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_done_housekeeping.py +0 -0
  666. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dr_azure_scripts.py +0 -0
  667. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dr_promote.py +0 -0
  668. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_dr_verify.py +0 -0
  669. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_machine_fault.py +0 -0
  670. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_blocked_rendering.py +0 -0
  671. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_launch_argv.py +0 -0
  672. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_max_parallel_config.py +0 -0
  673. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  674. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_roll_pending.py +0 -0
  675. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  676. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_sessions_snapshot.py +0 -0
  677. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_state.py +0 -0
  678. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_drive_tmux.py +0 -0
  679. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_epic_up_capability_detection.py +0 -0
  680. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  681. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_epic_up_image_provenance.py +0 -0
  682. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_errors.py +0 -0
  683. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_events.py +0 -0
  684. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_failure_class.py +0 -0
  685. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_failure_classifier.py +0 -0
  686. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_filelock.py +0 -0
  687. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  688. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fix_escalation_classifier.py +0 -0
  689. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fix_of_force_override.py +0 -0
  690. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fleet_config_health.py +0 -0
  691. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fleet_health_probes.py +0 -0
  692. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fleet_health_snapshot.py +0 -0
  693. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_fleet_watchdog.py +0 -0
  694. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_forge_availability.py +0 -0
  695. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_freshness.py +0 -0
  696. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gate_a.py +0 -0
  697. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gate_b.py +0 -0
  698. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gate_snapshot_staleness.py +0 -0
  699. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gates.py +0 -0
  700. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  701. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gen_mock_index.py +0 -0
  702. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_generated_rust_fixture.py +0 -0
  703. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_generated_rust_requests.py +0 -0
  704. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_generated_types_fixture.py +0 -0
  705. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_github_ops.py +0 -0
  706. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_github_throttle.py +0 -0
  707. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_goal.py +0 -0
  708. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_graph_health.py +0 -0
  709. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_graph_selfheal_absent_2237.py +0 -0
  710. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_gtk_native_driver.py +0 -0
  711. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_handoff.py +0 -0
  712. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_checks.py +0 -0
  713. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_cli.py +0 -0
  714. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_cli_graph.py +0 -0
  715. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_config.py +0 -0
  716. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_context.py +0 -0
  717. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_coord_tui_ci_pin.py +0 -0
  718. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_coord_web_ci_pin.py +0 -0
  719. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_deploy_lane_facts.py +0 -0
  720. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_fix.py +0 -0
  721. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_incident_regression.py +0 -0
  722. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_issues_sync_staleness.py +0 -0
  723. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_pr_churn.py +0 -0
  724. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_pypi.py +0 -0
  725. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_registry.py +0 -0
  726. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_release_cordon_probe.py +0 -0
  727. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_timer_active.py +0 -0
  728. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_toolchain.py +0 -0
  729. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_unit_drift.py +0 -0
  730. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_unit_enablement.py +0 -0
  731. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_health_wedged_drive_queue.py +0 -0
  732. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_hooks.py +0 -0
  733. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_housekeeping.py +0 -0
  734. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_human_attended_437.py +0 -0
  735. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_init.py +0 -0
  736. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_install_agent_capabilities_3515.py +0 -0
  737. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_install_agent_venv_2911.py +0 -0
  738. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  739. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_integration.py +0 -0
  740. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive.py +0 -0
  741. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_briefing_echo.py +0 -0
  742. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_pane_log_2541.py +0 -0
  743. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_prefill_state.py +0 -0
  744. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_session_relaunch.py +0 -0
  745. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_test_verdict_backstop.py +0 -0
  746. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_token_attribution.py +0 -0
  747. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_interactive_worktree.py +0 -0
  748. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_invariant_alarms.py +0 -0
  749. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_issue_store_seam.py +0 -0
  750. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_issues_sync_status.py +0 -0
  751. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_liveness_auditor.py +0 -0
  752. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_liveness_notify.py +0 -0
  753. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_lock_contention_ratchet.py +0 -0
  754. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_mac_native_driver.py +0 -0
  755. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_machine_fault.py +0 -0
  756. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_machine_metrics.py +0 -0
  757. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_machine_onboard.py +0 -0
  758. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_machine_pause.py +0 -0
  759. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_machine_stats.py +0 -0
  760. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_merge_queue.py +0 -0
  761. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_merge_verify.py +0 -0
  762. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_milestone_chat.py +0 -0
  763. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_milestone_dispatch.py +0 -0
  764. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_milestone_gate.py +0 -0
  765. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_milestone_order.py +0 -0
  766. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_milestone_seam.py +0 -0
  767. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_mock_author.py +0 -0
  768. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_model_tiering.py +0 -0
  769. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_models.py +0 -0
  770. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_models_config_labels.py +0 -0
  771. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_needs_attention.py +0 -0
  772. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_network.py +0 -0
  773. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_new_issue_chat.py +0 -0
  774. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_next_release_tag.py +0 -0
  775. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_node_shim.py +0 -0
  776. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_baseline.py +0 -0
  777. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_cli.py +0 -0
  778. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_collect.py +0 -0
  779. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_config.py +0 -0
  780. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_drive_seam.py +0 -0
  781. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_isolation.py +0 -0
  782. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_predicate.py +0 -0
  783. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_quiet_hours.py +0 -0
  784. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notifier_service.py +0 -0
  785. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notify.py +0 -0
  786. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_notify_drain.py +0 -0
  787. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_openapi.py +0 -0
  788. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_operational_defaults.py +0 -0
  789. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_overlap_fence.py +0 -0
  790. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_overlap_predict.py +0 -0
  791. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_packaged_deploy_units.py +0 -0
  792. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_parentage.py +0 -0
  793. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_paste_landed.py +0 -0
  794. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  795. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_pipeline.py +0 -0
  796. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_plan_followup_approve_plan_command.py +0 -0
  797. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_plan_followup_pr_command.py +0 -0
  798. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_plan_followup_review_command.py +0 -0
  799. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_plan_only.py +0 -0
  800. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_plan_parser.py +0 -0
  801. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_platform_paths.py +0 -0
  802. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_portal_bridge.py +0 -0
  803. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_portal_config.py +0 -0
  804. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_portal_store.py +0 -0
  805. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_portal_sync.py +0 -0
  806. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_pr_body_lint.py +0 -0
  807. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_prereqs.py +0 -0
  808. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_production_db_guard.py +0 -0
  809. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_progress.py +0 -0
  810. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_provider_seam.py +0 -0
  811. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_providers.py +0 -0
  812. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_providers_config_labels.py +0 -0
  813. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_providers_pty.py +0 -0
  814. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_provision_core.py +0 -0
  815. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_provision_machine.py +0 -0
  816. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_py_rust_mirror_inventory.py +0 -0
  817. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_quiet_hours.py +0 -0
  818. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_quiet_hours_store_2146.py +0 -0
  819. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reap_merged_sessions.py +0 -0
  820. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reap_stale_interactive_tick.py +0 -0
  821. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile.py +0 -0
  822. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_branch.py +0 -0
  823. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_completions.py +0 -0
  824. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  825. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_merges.py +0 -0
  826. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_no_agent_record.py +0 -0
  827. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_tick.py +0 -0
  828. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reconcile_usage_limit_done.py +0 -0
  829. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_refine_chat.py +0 -0
  830. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_cordon_2101.py +0 -0
  831. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  832. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_cordon_deadlock_2240.py +0 -0
  833. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  834. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_cordon_stuck_2490.py +0 -0
  835. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_gate.py +0 -0
  836. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_propagate.py +0 -0
  837. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_propagate_threshold.py +0 -0
  838. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_roll_between_legs_2854.py +0 -0
  839. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_roll_window_handoff.py +0 -0
  840. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_unified_1242.py +0 -0
  841. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_verify.py +0 -0
  842. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_release_window.py +0 -0
  843. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_remote_auto_prune.py +0 -0
  844. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_remote_interactive_reaper.py +0 -0
  845. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_add.py +0 -0
  846. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_dormancy.py +0 -0
  847. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_edit_2220.py +0 -0
  848. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_graph_fleet_2237.py +0 -0
  849. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_max_parallel_3423.py +0 -0
  850. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_repo_onboard_2220.py +0 -0
  851. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_report_public_export.py +0 -0
  852. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_report_result_push.py +0 -0
  853. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_reports.py +0 -0
  854. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_restart_cmd.py +0 -0
  855. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_retry.py +0 -0
  856. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_retry_advisory_1606.py +0 -0
  857. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_retry_escalation_classify_3360.py +0 -0
  858. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_retry_type_1636.py +0 -0
  859. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_revalidate.py +0 -0
  860. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review.py +0 -0
  861. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_end_review_without_verdict.py +0 -0
  862. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_parse_failure_diagnostic.py +0 -0
  863. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_reaffirm.py +0 -0
  864. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_state.py +0 -0
  865. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_verdict_backstop.py +0 -0
  866. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_verdict_override_audit.py +0 -0
  867. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_verdict_relay.py +0 -0
  868. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_review_zero_commits.py +0 -0
  869. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_scoped_review_wiring.py +0 -0
  870. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_scorecard.py +0 -0
  871. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_self_health.py +0 -0
  872. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_serve.py +0 -0
  873. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_serve_app.py +0 -0
  874. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_serve_app_board_trim.py +0 -0
  875. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_serve_rest_routes.py +0 -0
  876. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_session.py +0 -0
  877. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_slice_issue_attribution.py +0 -0
  878. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_smoke.py +0 -0
  879. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  880. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_smoke_live_checkout_restore.py +0 -0
  881. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_smoke_workflow.py +0 -0
  882. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_spend_ceiling.py +0 -0
  883. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_spend_ceiling_coordinator.py +0 -0
  884. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_split.py +0 -0
  885. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_split_work.py +0 -0
  886. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_sql_dialect.py +0 -0
  887. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_sqlite_connect_ratchet.py +0 -0
  888. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stage_projection.py +0 -0
  889. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stale_busy_reviewer_697.py +0 -0
  890. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stalled_pipeline.py +0 -0
  891. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_state.py +0 -0
  892. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_state_review_findings_daemon.py +0 -0
  893. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_status_fleet_footer.py +0 -0
  894. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stop_1567.py +0 -0
  895. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_store_contract.py +0 -0
  896. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_store_migrate.py +0 -0
  897. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stuck.py +0 -0
  898. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  899. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_terminal_command.py +0 -0
  900. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_author.py +0 -0
  901. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_chat.py +0 -0
  902. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_orchestrator.py +0 -0
  903. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_report.py +0 -0
  904. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_verdict_parsing.py +0 -0
  905. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_test_verdict_transcript_floor.py +0 -0
  906. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_text_io_encoding_audit.py +0 -0
  907. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_thin_client_board_audit.py +0 -0
  908. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_thin_client_config_load_1080.py +0 -0
  909. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_thin_client_daemon_routing_906.py +0 -0
  910. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_throwaway_vm.py +0 -0
  911. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_tmux_host.py +0 -0
  912. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_tmux_session.py +0 -0
  913. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_transcript_floor.py +0 -0
  914. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_tui_pty_driver.py +0 -0
  915. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_uat_checks.py +0 -0
  916. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_usage.py +0 -0
  917. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_usage_limits.py +0 -0
  918. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_usage_rollup.py +0 -0
  919. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_venv_live_install_2121.py +0 -0
  920. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_version_single_source.py +0 -0
  921. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_watch.py +0 -0
  922. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_win_native_bridge.py +0 -0
  923. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  924. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worker_env_venv_isolation.py +0 -0
  925. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worker_events.py +0 -0
  926. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worker_image_pin_sync.py +0 -0
  927. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worker_safety.py +0 -0
  928. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worker_test_scoping.py +0 -0
  929. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worktree.py +0 -0
  930. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  931. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/tests/test_write_parity.py +0 -0
  932. {code_coordinator-0.5.569 → code_coordinator-0.5.571}/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.569
3
+ Version: 0.5.571
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.569
3
+ Version: 0.5.571
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.569",
2
+ "tag": "0.5.571",
3
3
  "distance": 0,
4
- "node": "g5c759420fc3645ac55648f65ba5bfddf7ceae8f2",
4
+ "node": "g0b8e275348da7bd146b160ece1e4c28c9c8274da",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -485,6 +485,7 @@ def drive_queue_add(
485
485
  # kind is happening on that path. Merging (or fixing forward) a
486
486
  # discovered PR is deliberately left to the operator — see
487
487
  # `existing_pr_relaunch_remedy`'s own docstring.
488
+ existing_pr_resume_note = ""
488
489
  if previous is None or previous.state in STUCK_QUEUE_STATES:
489
490
  existing_match = _existing_pr_match(config_path, repo, issue)
490
491
  existing_remedy = existing_pr_relaunch_remedy(repo, issue, existing_match)
@@ -494,6 +495,24 @@ def drive_queue_add(
494
495
  f"{existing_remedy['what_happens']} Run instead: "
495
496
  f"{existing_remedy['command_or_action']}"
496
497
  )
498
+ # #3539: `existing_remedy is None` with a real *existing_match* is
499
+ # ambiguous on its own — "no PR found, start fresh" and "PR found,
500
+ # green, but still missing a gate — resume on it" both return
501
+ # `None` from `existing_pr_relaunch_remedy` (see its docstring).
502
+ # Say which one happened: silently queuing a resume with no echo
503
+ # at all would read identically to a fresh `add` and hide the exact
504
+ # trap #3539 reports (an operator with no way to tell this add is
505
+ # about to drive the SAME branch, not a new one).
506
+ if existing_match is not None and existing_match.missing_gates:
507
+ gates_list = " and ".join(existing_match.missing_gates)
508
+ existing_pr_resume_note = (
509
+ f"\nresuming on existing PR #{existing_match.number} "
510
+ f"({existing_match.branch}) — CI is green but {gates_list} "
511
+ f"{'gate is' if len(existing_match.missing_gates) == 1 else 'gates are'} "
512
+ "not yet recorded; this add will dispatch only the missing "
513
+ f"stage(s) on that branch, never a new Work leg (coord "
514
+ f"gates {repo} {issue} shows the live detail)."
515
+ )
497
516
 
498
517
  # #2247: predicted file overlap ORDERS, never refuses. Anything that goes
499
518
  # wrong in here (unreadable body, unreachable board, a failed compare)
@@ -645,6 +664,7 @@ def drive_queue_add(
645
664
  click.echo(
646
665
  f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}{fix_rounds_note}"
647
666
  f"{no_acceptance_note}{scope_downgrade_warning}{overlap_note}"
667
+ f"{existing_pr_resume_note}"
648
668
  )
649
669
 
650
670
  # #2339: say out loud when this add cannot possibly accomplish anything —
@@ -951,15 +971,32 @@ def _existing_pr_match(
951
971
  answer than `coord.merge_queue.plan()`'s own `PLAN_READY` verdict — it
952
972
  reads raw `failed_checks`/`in_flight_checks` only and does not account
953
973
  for `merge_queue._ci_checks_are_stale` (a green check that silently
954
- outlived a base move), review state, or any other merge gate. The
955
- issue's own design accepted either condition ("all green OR `coord merge
956
- --plan` reads READY"), and `coord merge --only` re-runs its own full gate
957
- check before actually merging either way, so the worst case from the gap
958
- is a confusing round trip (recommended here, still BLOCKED there), never
959
- an incorrect merge. Wiring the fuller verdict in would need this call
960
- site to assemble `plan()`'s board/GhOps/smoke-verdict inputs for a
961
- single PR lookup — a bigger, riskier change than this fix-round's scope;
962
- left as a known gap rather than attempted half-wired.
974
+ outlived a base move). The issue's own design accepted either condition
975
+ ("all green OR `coord merge --plan` reads READY"), and `coord merge
976
+ --only` re-runs its own full gate check before actually merging either
977
+ way, so the worst case from the gap is a confusing round trip
978
+ (recommended here, still BLOCKED there), never an incorrect merge.
979
+ Wiring the fuller verdict in would need this call site to assemble
980
+ `plan()`'s board/GhOps/smoke-verdict inputs for a single PR lookup — a
981
+ bigger, riskier change than this fix-round's scope; left as a known gap
982
+ rather than attempted half-wired.
983
+
984
+ `missing_gates` (#3539), unlike `all_green`, DOES reuse the real gate
985
+ decision — `coord.gates.build_gate_report`, the exact function `coord
986
+ gates` prints and that wraps `coord.merge_queue`'s own
987
+ `requires_review`/`scan_approved_reviews`/`requires_smoke`/
988
+ `evaluate_smoke_verdict` — rather than a second guess, closing the
989
+ quadraui#1109 gap: a PR can be all-green on CI while `coord gates`
990
+ still reports `review`/`test` BLOCKED, and the #2377 guard's old
991
+ "merge it" advice for an all-green PR was then impossible (`coord merge
992
+ --only` itself refused with `enqueue blocked by review gate`). Only
993
+ computed when `all_green` — a red PR's gate state is moot, the caller
994
+ refuses on CI alone either way. Fails open toward "missing" (NEVER
995
+ toward "satisfied"): an unreadable board/config, or a PR whose work
996
+ chain `build_gate_report` can't resolve a decision for, reports every
997
+ gate as still missing rather than claiming a merge is ready when a live
998
+ `coord merge --only` might still refuse it (#2096: unconfirmed success
999
+ is a defect).
963
1000
  """
964
1001
  coordinates = _repo_coordinates(config_path, repo)
965
1002
  if coordinates is None:
@@ -990,14 +1027,64 @@ def _existing_pr_match(
990
1027
  # reported", which `all_green` below already reads as not-green.
991
1028
  checks = []
992
1029
  all_green = bool(checks) and not failed_checks(checks) and not in_flight_checks(checks)
1030
+ missing_gates = _missing_required_gates(config_path, repo, issue) if all_green else ()
993
1031
  return ExistingPrMatch(
994
1032
  number=number,
995
1033
  branch=str(pr.get("headRefName") or ""),
996
1034
  url=str(pr.get("url") or ""),
997
1035
  all_green=all_green,
1036
+ missing_gates=missing_gates,
998
1037
  )
999
1038
 
1000
1039
 
1040
+ def _missing_required_gates(config_path: Path, repo: str, issue: int) -> tuple[str, ...]:
1041
+ """#3539: which of ``("review", "test")`` are still required-but-not-ok
1042
+ for *repo*#*issue*, per `coord.gates.build_gate_report` — the SAME
1043
+ review/test decision `coord gates` prints and `coord merge` itself
1044
+ gates on (#2096: one question, one answer; never a second, driftable
1045
+ guess at "is this PR actually ready").
1046
+
1047
+ Fails open toward "missing", never toward "satisfied": any read failure
1048
+ (unreadable config, no board, an exception inside `build_gate_report`
1049
+ itself) or a report with no resolved decisions at all (no work-like
1050
+ assignment `build_gate_report` could select a winner from) reports
1051
+ BOTH gates missing. A false "missing" here costs one operator-visible
1052
+ resume note on an add that may turn out to be a no-op once the real
1053
+ gates are read live again a moment later; a false "satisfied" would
1054
+ reproduce the exact #3539 incident — advising ``coord merge --only``
1055
+ over a PR a live merge attempt still refuses.
1056
+
1057
+ The board comes from ``coord.board_service.read_board()``, NOT
1058
+ ``coord.state.build_board()`` (#615/#906): `coord drive-queue add` has
1059
+ no whole-command daemon reroute, so a thin client reading the local DB
1060
+ here would see an empty board, resolve no decisions, and fail open to
1061
+ "both gates missing" on every add — technically safe, uselessly noisy.
1062
+ `read_board()` is the one place the local-vs-daemon decision is made
1063
+ (GET /board on a thin client, the local DB otherwise), which is also
1064
+ why no entry is needed in `tests/test_thin_client_board_audit.py`'s
1065
+ ``COMMANDS_ALLOWLIST``: there is no direct local-board call site to
1066
+ allowlist.
1067
+ """
1068
+ try:
1069
+ from coord import github_ops # noqa: PLC0415
1070
+ from coord.board_service import read_board # noqa: PLC0415
1071
+ from coord.commands._common import _load_config # noqa: PLC0415
1072
+ from coord.gates import build_gate_report # noqa: PLC0415
1073
+
1074
+ cfg = _load_config(config_path)
1075
+ board = read_board()
1076
+ report = build_gate_report(board, cfg, repo, issue, gh_ops=github_ops)
1077
+ except (Exception, SystemExit): # noqa: BLE001 — fail-open to "missing"
1078
+ return ("review", "test")
1079
+ by_gate = {d.gate: d for d in report.decisions}
1080
+ missing = []
1081
+ for gate in ("review", "test"):
1082
+ decision = by_gate.get(gate)
1083
+ if decision is None or (decision.required and not decision.ok):
1084
+ missing.append(gate)
1085
+ return tuple(missing)
1086
+
1087
+
1001
1088
  def _predict_overlap(
1002
1089
  config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
1003
1090
  ) -> tuple[Prediction, str, str]:
@@ -6433,6 +6520,17 @@ def _blocked_escalation_command(
6433
6520
  behaviour) purely so every OTHER existing caller/test of this function
6434
6521
  that has no config to hand keeps working unchanged; the real `tick`
6435
6522
  call sites below always pass their own.
6523
+
6524
+ #3539: `existing_pr_relaunch_remedy` returning ``None`` is no longer
6525
+ proof that *match* itself is ``None`` — a green PR with Test and/or
6526
+ Review never recorded ALSO returns ``None`` (see that function's own
6527
+ docstring), on purpose, so a plain `add` can resume on it. That case
6528
+ still HAS a PR and HAS been dispatched, so it must not fall through to
6529
+ `_requeue_command`'s blind ``remove && add`` either — remove would
6530
+ discard a completed, green work cycle for no reason. Propose the plain
6531
+ `add` (no `remove` first) instead; `_requeue_command` stays reserved for
6532
+ the one case its own docstring names: *match* itself is ``None``,
6533
+ i.e. nothing was ever dispatched for this row at all.
6436
6534
  """
6437
6535
  if is_merge_gate_block_reason(reason):
6438
6536
  parsed = parse_key(key)
@@ -6446,6 +6544,10 @@ def _blocked_escalation_command(
6446
6544
  remedy = existing_pr_relaunch_remedy(repo, issue, match)
6447
6545
  if remedy is not None:
6448
6546
  return remedy["command_or_action"]
6547
+ if match is not None:
6548
+ # #3539: green PR, gate(s) not yet recorded — resume via a
6549
+ # plain `add`, never the blind `remove && add` requeue below.
6550
+ return f"coord drive-queue add {repo} {issue}"
6449
6551
  return _requeue_command(entry, key)
6450
6552
 
6451
6553
 
@@ -4315,51 +4315,84 @@ class ExistingPrMatch:
4315
4315
  built it — :func:`coord.commands.drive_queue._existing_pr_match`, the
4316
4316
  one place that owns the `gh pr list` + checks read this module stays
4317
4317
  pure of.
4318
+
4319
+ *missing_gates* (#3539) is the subset of ``("review", "test")`` that
4320
+ `coord.gates.build_gate_report` — the SAME read `coord gates`/`coord
4321
+ merge` themselves use, never a second guess (#2096: one question, one
4322
+ answer) — reports as still required-but-not-ok for this PR's work
4323
+ chain. Empty by default so every pre-#3539 construction of this
4324
+ dataclass (every existing test that only ever set *all_green*) keeps
4325
+ reading as "fully gated" — i.e. byte-identical old behaviour — without
4326
+ being touched.
4318
4327
  """
4319
4328
 
4320
4329
  number: int
4321
4330
  branch: str
4322
4331
  url: str
4323
4332
  all_green: bool
4333
+ missing_gates: tuple[str, ...] = ()
4324
4334
 
4325
4335
 
4326
4336
  def existing_pr_relaunch_remedy(
4327
4337
  repo: str, issue: int, match: "ExistingPrMatch | None"
4328
4338
  ) -> dict[str, str] | None:
4329
- """#2377: the option (and `drive-queue add` refusal message) *match*
4330
- recommends INSTEAD OF a blind ``remove && add`` relaunch — or ``None``
4331
- when *match* is ``None`` (today's only behaviour unchanged: no PR on the
4332
- conventional branch name(s), start fresh).
4333
-
4334
- Two shapes, both refusing the relaunch — a red/stale-checks PR is NOT a
4335
- green light to requeue either: something else may already be mid-fixing
4336
- that branch, and a fresh drive launched on top of it is exactly the "at
4337
- best wasted work, at worst clobbering it mid-flight" risk #2377 opens
4338
- with. Merging a discovered PR is deliberately NOT done here — surfacing
4339
- it (or refusing the relaunch) is enough; merging stays a `coord merge`
4340
- decision.
4339
+ """#2377/#3539: the option (and `drive-queue add` refusal message)
4340
+ *match* recommends INSTEAD OF a blind ``remove && add`` relaunch — or
4341
+ ``None`` when *match* is ``None`` (no PR on the conventional branch
4342
+ name(s), start fresh) OR when *match* is green but still carries
4343
+ unrecorded gates (#3539 — see below): both ``None`` shapes mean "let
4344
+ this `add` proceed", not "nothing was found".
4345
+
4346
+ Three shapes:
4347
+
4348
+ * **red / stale checks** — refuse; something else may already be
4349
+ mid-fixing that branch, and a fresh drive launched on top of it is
4350
+ exactly the "at best wasted work, at worst clobbering it mid-flight"
4351
+ risk #2377 opens with.
4352
+ * **green, but Test and/or Review never recorded** (#3539 — the
4353
+ quadraui#1109/PR#1253 incident: CI all green, yet `coord gates`
4354
+ showed both `review` and `test` BLOCKED, and the ``merge it instead``
4355
+ advice below was impossible — `coord merge --only` itself refused
4356
+ with ``enqueue blocked by review gate``). Refusing here would strand
4357
+ the entry with no way to ever collect the missing verdicts. Returning
4358
+ ``None`` lets the `add` proceed and the queue's own drive resume on
4359
+ the EXISTING branch — `decide()` only ever dispatches a fresh Work
4360
+ leg when ``state.work_aid`` is unset (see `coord/drive.py`), which it
4361
+ is not here, so this can only ever run the missing stage(s) (Test
4362
+ dispatch, Review dispatch) forward to merge, never restart Work.
4363
+ * **green and every gate already satisfied** — truly done: refuse and
4364
+ point at ``coord merge --only`` instead of relaunching a fresh drive
4365
+ over it. Merging is deliberately NOT done here — surfacing it (or
4366
+ refusing the relaunch) is enough; merging stays a `coord merge`
4367
+ decision.
4341
4368
  """
4342
4369
  if match is None:
4343
4370
  return None
4344
4371
  key = entry_key(repo, issue)
4345
- if match.all_green:
4372
+ if not match.all_green:
4346
4373
  return {
4347
- "label": "Merge existing PR",
4348
- "command_or_action": f"coord merge --only {key}",
4374
+ "label": "Inspect existing PR",
4375
+ "command_or_action": merge_plan_inspect_command(repo),
4349
4376
  "what_happens": (
4350
- f"PR #{match.number} ({match.branch}) already carries this "
4351
- "work with every check green — merge it instead of "
4377
+ f"PR #{match.number} ({match.branch}) already exists for "
4378
+ "this entry, but its checks are not all green — fix it "
4379
+ "forward (or confirm by hand it is truly dead) before "
4352
4380
  "relaunching a fresh drive over it."
4353
4381
  ),
4354
4382
  }
4383
+ if match.missing_gates:
4384
+ # #3539: deliberately no refusal dict — see the docstring's second
4385
+ # shape. Returning `None` here is the whole fix: it lets `add`
4386
+ # proceed instead of stranding the entry on an impossible "merge
4387
+ # it" when `coord merge --only` would itself refuse.
4388
+ return None
4355
4389
  return {
4356
- "label": "Inspect existing PR",
4357
- "command_or_action": merge_plan_inspect_command(repo),
4390
+ "label": "Merge existing PR",
4391
+ "command_or_action": f"coord merge --only {key}",
4358
4392
  "what_happens": (
4359
- f"PR #{match.number} ({match.branch}) already exists for this "
4360
- "entry, but its checks are not all green — fix it forward (or "
4361
- "confirm by hand it is truly dead) before relaunching a fresh "
4362
- "drive over it."
4393
+ f"PR #{match.number} ({match.branch}) already carries this "
4394
+ "work with every check green — merge it instead of "
4395
+ "relaunching a fresh drive over it."
4363
4396
  ),
4364
4397
  }
4365
4398
 
@@ -370,11 +370,18 @@ class WinCalls(Protocol):
370
370
  def launch_in_terminal(self, command: str, cwd: str, terminal_app: str) -> int: ...
371
371
 
372
372
  def find_top_window(self, pid: int, timeout_s: float) -> int:
373
- """Poll for the launched process's real top-level window, returning
374
- its handle once found. Raises :class:`WinNativeRuntimeError` if none
375
- appears within *timeout_s* — this is the "launch" step's own
376
- confirmation that the process didn't just start, but actually
377
- produced a window (#2096)."""
373
+ """Poll for *pid*'s (or one of its descendant processes') real
374
+ top-level window, returning its handle once found. Raises
375
+ :class:`WinNativeRuntimeError` if none appears within *timeout_s* —
376
+ this is the "launch" step's own confirmation that the process
377
+ didn't just start, but actually produced a window (#2096).
378
+
379
+ *pid* is not always the real app's own pid: ``subprocess.Popen(...,
380
+ shell=True)`` on Windows spawns ``cmd.exe`` as the immediate child
381
+ and returns *its* pid, while the real app (e.g. ``vimcode.exe``) is
382
+ a grandchild with a different pid that ``cmd.exe`` itself never
383
+ owns a window for (#3542). Implementations must search *pid*'s
384
+ whole descendant-process tree, not just *pid* itself."""
378
385
  ...
379
386
 
380
387
  def move_window(self, hwnd: int, x: int, y: int, width: int, height: int) -> None: ...
@@ -857,12 +864,28 @@ class Win32Calls:
857
864
 
858
865
  def _logonui_running_in_session(self, session_id: int) -> bool:
859
866
  """``True`` iff ``LogonUI.exe`` (the Windows lock-screen host
860
- process) is running in *session_id* — walked via a
861
- ``CreateToolhelp32Snapshot`` process snapshot, the same mechanism
862
- Task Manager itself uses, rather than anything that could be
863
- confused by a differently-named process (the module docstring's
864
- "kill only the PID this driver itself launched" safety note applies
865
- equally here: this is read-only enumeration, never a kill)."""
867
+ process) is running in *session_id* — walked via
868
+ :meth:`_snapshot_processes`, the same mechanism Task Manager itself
869
+ uses, rather than anything that could be confused by a differently-
870
+ named process (the module docstring's "kill only the PID this
871
+ driver itself launched" safety note applies equally here: this is
872
+ read-only enumeration, never a kill)."""
873
+ ctypes = self._ctypes
874
+ for pid, _ppid, name in self._snapshot_processes():
875
+ if name.lower() == "logonui.exe":
876
+ proc_session = ctypes.wintypes.DWORD()
877
+ self._kernel32.ProcessIdToSessionId(pid, ctypes.byref(proc_session))
878
+ if proc_session.value == session_id:
879
+ return True
880
+ return False
881
+
882
+ def _snapshot_processes(self) -> list[tuple[int, int, str]]:
883
+ """Every currently running process as ``(pid, parent_pid,
884
+ exe_name)``, via a single ``CreateToolhelp32Snapshot`` walk — the
885
+ same mechanism Task Manager itself uses. Read-only enumeration,
886
+ shared by :meth:`_logonui_running_in_session` (#3510) and
887
+ :meth:`_descendant_pids` (#3542); never used to kill (see the
888
+ module docstring's safety note)."""
866
889
  ctypes = self._ctypes
867
890
  kernel32 = self._kernel32
868
891
  TH32CS_SNAPPROCESS = 0x00000002
@@ -880,48 +903,81 @@ class Win32Calls:
880
903
 
881
904
  snapshot = kernel32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
882
905
  if not snapshot or snapshot == -1:
883
- return False
906
+ return []
907
+ out: list[tuple[int, int, str]] = []
884
908
  try:
885
909
  entry = PROCESSENTRY32()
886
910
  entry.dwSize = ctypes.sizeof(PROCESSENTRY32)
887
911
  if not kernel32.Process32First(snapshot, ctypes.byref(entry)):
888
- return False
912
+ return []
889
913
  while True:
890
914
  name = entry.szExeFile.decode("mbcs", errors="ignore")
891
- if name.lower() == "logonui.exe":
892
- proc_session = ctypes.wintypes.DWORD()
893
- kernel32.ProcessIdToSessionId(
894
- entry.th32ProcessID, ctypes.byref(proc_session),
895
- )
896
- if proc_session.value == session_id:
897
- return True
915
+ out.append((entry.th32ProcessID, entry.th32ParentProcessID, name))
898
916
  if not kernel32.Process32Next(snapshot, ctypes.byref(entry)):
899
- return False
917
+ break
900
918
  finally:
901
919
  kernel32.CloseHandle(snapshot)
920
+ return out
921
+
922
+ def _descendant_pids(self, root_pid: int) -> set[int]:
923
+ """*root_pid* plus every process it transitively spawned (child,
924
+ grandchild, ...) — a fresh :meth:`_snapshot_processes` walk each
925
+ call, since the real app may not have started yet the first time
926
+ this is polled.
927
+
928
+ #3542: ``launch``/``launch_in_terminal`` don't always return the
929
+ real app's own pid — ``subprocess.Popen(..., shell=True)`` returns
930
+ ``cmd.exe``'s pid, with the real app (``vimcode.exe``) a grandchild
931
+ that ``cmd.exe`` itself never owns a window for. Searching the
932
+ whole descendant tree finds the real app's window regardless of
933
+ how many shell/console hosts sit between the returned pid and it.
934
+ """
935
+ children: dict[int, list[int]] = {}
936
+ for pid, ppid, _name in self._snapshot_processes():
937
+ children.setdefault(ppid, []).append(pid)
938
+ result = {root_pid}
939
+ frontier = [root_pid]
940
+ while frontier:
941
+ current = frontier.pop()
942
+ for child in children.get(current, ()):
943
+ if child not in result:
944
+ result.add(child)
945
+ frontier.append(child)
946
+ return result
902
947
 
903
948
  def find_top_window(self, pid: int, timeout_s: float) -> int:
904
949
  ctypes = self._ctypes
905
950
  deadline = time.monotonic() + timeout_s
906
951
  found: list[int] = []
907
-
908
- @ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_void_p, ctypes.c_void_p)
952
+ candidate_pids: set[int] = {pid}
953
+ # `WINFUNCTYPE` (stdcall) only exists in ctypes on real Windows —
954
+ # real runs always go through it (Win32Calls.__init__ guards
955
+ # off-Windows construction), but falling back to `CFUNCTYPE` off-
956
+ # Windows is what lets this method's descendant-walk logic be
957
+ # exercised by a scripted fake on Linux/macOS too (#3542), the same
958
+ # "unit-testable on any platform" seam the module docstring
959
+ # describes for the rest of this class.
960
+ win_functype = getattr(ctypes, "WINFUNCTYPE", ctypes.CFUNCTYPE)
961
+
962
+ @win_functype(ctypes.c_bool, ctypes.c_void_p, ctypes.c_void_p)
909
963
  def _enum_proc(hwnd, _lparam):
910
964
  owner_pid = ctypes.wintypes.DWORD()
911
965
  self._user32.GetWindowThreadProcessId(hwnd, ctypes.byref(owner_pid))
912
- if owner_pid.value == pid and self._user32.IsWindowVisible(hwnd):
966
+ if owner_pid.value in candidate_pids and self._user32.IsWindowVisible(hwnd):
913
967
  found.append(hwnd)
914
968
  return False
915
969
  return True
916
970
 
917
971
  while time.monotonic() < deadline:
972
+ candidate_pids = self._descendant_pids(pid)
918
973
  found.clear()
919
974
  self._user32.EnumWindows(_enum_proc, 0)
920
975
  if found:
921
976
  return found[0]
922
977
  time.sleep(0.1)
923
978
  raise WinNativeRuntimeError(
924
- f"no visible top-level window appeared for pid={pid} within {timeout_s}s"
979
+ f"no visible top-level window appeared for pid={pid} or any of "
980
+ f"its child processes within {timeout_s}s"
925
981
  )
926
982
 
927
983
  def is_window_alive(self, hwnd: int) -> bool:
@@ -921,6 +921,76 @@ def test_add_still_refuses_a_requeue_over_an_already_blocked_entry_with_a_green_
921
921
  assert f"coord merge --only {REPO}#1753" in result.output
922
922
 
923
923
 
924
+ def test_add_accepts_a_requeue_over_a_blocked_entry_with_a_green_pr_missing_gates(
925
+ cli, seed, monkeypatch
926
+ ):
927
+ """#3539's actual end-to-end fix, driven through the real CLI: the exact
928
+ shape `test_add_still_refuses_a_requeue_over_an_already_blocked_entry_
929
+ with_a_green_pr` above pins as a REFUSAL (a `blocked` entry with a green
930
+ matching PR) must now instead be ACCEPTED when that PR's Test and/or
931
+ Review were never recorded — the quadraui#1109/PR#1253 incident: CI
932
+ green, `coord gates` showing both BLOCKED, and the old 'merge it
933
+ instead' advice impossible (`coord merge --only` itself refused). The
934
+ `add` must succeed and print the new resume note naming the PR and the
935
+ still-missing gate(s), never the #2377 refusal exception."""
936
+ from coord.drive_queue import ExistingPrMatch
937
+
938
+ seed(issues={1753: "open"})
939
+ cli("add", REPO, "1753")
940
+ state._update_drive_queue_entry_local(REPO, 1753, state=STATE_BLOCKED)
941
+
942
+ monkeypatch.setattr(
943
+ "coord.commands.drive_queue._existing_pr_match",
944
+ lambda config_path, repo, issue: ExistingPrMatch(
945
+ number=4242,
946
+ branch="issue-1753-some-fix",
947
+ url="https://github.com/example/claude-coordinator/pull/4242",
948
+ all_green=True,
949
+ missing_gates=("review", "test"),
950
+ ),
951
+ )
952
+
953
+ result = cli("add", REPO, "1753", "--max-fix-rounds", "3")
954
+
955
+ assert result.exit_code == 0, result.output
956
+ assert "4242" in result.output
957
+ assert "resuming on existing PR #4242" in result.output
958
+ assert "review and test" in result.output
959
+ assert "gates are not yet recorded" in result.output
960
+ assert f"coord gates {REPO} 1753" in result.output
961
+ # Accepted, not refused — never the #2377 merge-it exception text.
962
+ assert f"coord merge --only {REPO}#1753" not in result.output
963
+ assert queued(1753) is not None
964
+
965
+
966
+ def test_add_resume_note_names_a_single_missing_gate_in_the_singular(
967
+ cli, seed, monkeypatch
968
+ ):
969
+ """Same accept path, but only ONE gate missing — the note's wording must
970
+ track the singular/plural split (`existing_pr_resume_note`'s own
971
+ ``'gate is' if len(...) == 1 else 'gates are'`` branch)."""
972
+ from coord.drive_queue import ExistingPrMatch
973
+
974
+ seed(issues={1753: "open"})
975
+
976
+ monkeypatch.setattr(
977
+ "coord.commands.drive_queue._existing_pr_match",
978
+ lambda config_path, repo, issue: ExistingPrMatch(
979
+ number=4242,
980
+ branch="issue-1753-some-fix",
981
+ url="https://github.com/example/claude-coordinator/pull/4242",
982
+ all_green=True,
983
+ missing_gates=("test",),
984
+ ),
985
+ )
986
+
987
+ result = cli("add", REPO, "1753")
988
+
989
+ assert result.exit_code == 0, result.output
990
+ assert "resuming on existing PR #4242" in result.output
991
+ assert "test gate is not yet recorded" in result.output
992
+
993
+
924
994
  def test_blocked_escalation_command_proposes_merge_over_requeue_when_pr_is_green(
925
995
  monkeypatch, config_file,
926
996
  ):
@@ -986,6 +1056,43 @@ def test_blocked_escalation_command_still_requeues_when_no_pr_matches(
986
1056
  )
987
1057
 
988
1058
 
1059
+ def test_blocked_escalation_command_proposes_a_plain_add_when_pr_is_green_but_ungated(
1060
+ monkeypatch, config_file,
1061
+ ):
1062
+ """#3539's non-blocking follow-up: a green PR whose gates were never
1063
+ recorded makes `existing_pr_relaunch_remedy` return `None` for a REASON
1064
+ other than 'no PR matched' (see that function's own docstring). This
1065
+ call site must not conflate the two `None` shapes and fall through to
1066
+ `_requeue_command`'s blind `remove && add` — that would discard a
1067
+ completed, green work cycle for nothing. It must propose a plain `add`
1068
+ (no `remove` first) instead, same as the #3539 `drive-queue add` fix
1069
+ itself resumes on."""
1070
+ from coord.commands.drive_queue import _blocked_escalation_command
1071
+ from coord.drive_queue import ExistingPrMatch, entry_key
1072
+
1073
+ monkeypatch.setattr(
1074
+ "coord.commands.drive_queue._existing_pr_match",
1075
+ lambda config_path, repo, issue: ExistingPrMatch(
1076
+ number=1253,
1077
+ branch="issue-1109-fix",
1078
+ url="https://github.com/example/quadraui/pull/1253",
1079
+ all_green=True,
1080
+ missing_gates=("review", "test"),
1081
+ ),
1082
+ )
1083
+ reason = (
1084
+ "work adv-1 exited ADVISORY with no commits on its branch "
1085
+ "(3/3 attempts) — nothing was pushed, so there is nothing to test, "
1086
+ "review, or merge, and retrying has not produced a different outcome."
1087
+ )
1088
+ key = entry_key(OTHER_REPO, 1109)
1089
+
1090
+ command = _blocked_escalation_command(None, key, reason, config_path=config_file)
1091
+
1092
+ assert command == f"coord drive-queue add {OTHER_REPO} 1109"
1093
+ assert "remove" not in command
1094
+
1095
+
989
1096
  def test_a_declared_file_is_checked_against_a_live_branchs_real_diff(
990
1097
  cli, declare, seed, branch_diff,
991
1098
  ):
@@ -2977,6 +2977,22 @@ def test_no_test_verdict_yet_waits_for_coord_to_dispatch_the_stage():
2977
2977
  assert action.command == ()
2978
2978
 
2979
2979
 
2980
+ def test_resuming_on_an_existing_pr_with_no_test_or_review_recorded_never_redispatches_work():
2981
+ """#3539: the exact quadraui#1109/PR#1253 shape, pinned at `decide()`
2982
+ itself — a `coord drive-queue add` the #2377/#3539 guard now ACCEPTS
2983
+ (CI green, but neither Test nor Review ever recorded) resumes by
2984
+ launching `coord drive` on this same (repo, issue) again. The guard's
2985
+ whole premise that this can only ever run the missing stage(s) forward,
2986
+ never restart Work, rests on `decide()` branching on `state.work_aid`
2987
+ alone (see its own `if not state.work_aid:` dispatch-work arm) — this
2988
+ pins that: a `work_aid`-bearing, branch-bearing, `done` state with BOTH
2989
+ gates unrecorded must wait for the Test stage, never re-dispatch Work."""
2990
+ action = step(done_work(work_test_state=""))
2991
+ assert action.kind == WAIT
2992
+ assert action.command == ()
2993
+ assert not action.label.startswith("WORK:")
2994
+
2995
+
2980
2996
  def test_skip_test_records_the_verdict_through_the_test_cli():
2981
2997
  """The CLI, never record_test_verdict() — see #1384."""
2982
2998
  action = step(done_work(), DriveOptions(machine="precision", skip_test=True))