code-coordinator 0.5.579__tar.gz → 0.5.581__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 (934) hide show
  1. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agent_update.py +36 -31
  7. code_coordinator-0.5.581/coord/dirlink.py +124 -0
  8. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/review.py +29 -2
  9. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_update_bluegreen.py +2 -1
  10. code_coordinator-0.5.581/tests/test_dirlink.py +192 -0
  11. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review.py +39 -0
  12. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_venv_live_install_2121.py +8 -8
  13. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/.gitignore +0 -0
  26. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/GOAL.md +0 -0
  28. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/LICENSE +0 -0
  29. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/README.md +0 -0
  31. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/backup.py +0 -0
  48. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/bugbash.py +0 -0
  56. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/ci_fix.py +0 -0
  58. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/ci_gitlab.py +0 -0
  60. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/claude_setup_token.py +0 -0
  63. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/client.py +0 -0
  65. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/codegen.py +0 -0
  66. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/backup.py +0 -0
  72. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/bugbash.py +0 -0
  73. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/ci.py +0 -0
  75. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/codegen.py +0 -0
  76. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/dispatch.py +0 -0
  77. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/dispatch_workers.py +0 -0
  78. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/dr.py +0 -0
  79. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/drive.py +0 -0
  80. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/drive_queue.py +0 -0
  81. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/machine.py +0 -0
  86. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/merge.py +0 -0
  87. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/milestone.py +0 -0
  88. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/plan_followup.py +0 -0
  89. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/plans.py +0 -0
  90. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/portal.py +0 -0
  91. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/pr.py +0 -0
  92. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/release.py +0 -0
  93. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/store_migrate.py +0 -0
  101. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/terminal.py +0 -0
  102. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/test_gate.py +0 -0
  103. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/commands/tui.py +0 -0
  104. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/comments.py +0 -0
  105. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/config.py +0 -0
  106. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/config_reload.py +0 -0
  107. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/confirm_test.py +0 -0
  108. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/conflict_fix.py +0 -0
  109. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dao.py +0 -0
  110. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/__init__.py +0 -0
  111. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/fixture.py +0 -0
  112. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/index.html +0 -0
  113. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/reports.html +0 -0
  114. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/server.py +0 -0
  115. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dashboard/terminal.py +0 -0
  116. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/db.py +0 -0
  117. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dead_end.py +0 -0
  118. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/decomposition_chat.py +0 -0
  119. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/README.md +0 -0
  120. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-agent.service +0 -0
  121. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-backup.service +0 -0
  122. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-backup.timer +0 -0
  123. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-db-backup.service +0 -0
  124. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-db-backup.sh +0 -0
  125. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-db-backup.timer +0 -0
  126. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-dr-verify.service +0 -0
  127. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-dr-verify.timer +0 -0
  128. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-drive-queue.service +0 -0
  129. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-drive-queue.timer +0 -0
  130. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-failure-notify.service +0 -0
  131. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-fleet-watchdog.service +0 -0
  132. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  133. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-notify.service +0 -0
  134. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-notify.timer +0 -0
  135. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-release-propagate.service +0 -0
  136. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-release-propagate.timer +0 -0
  137. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-release-window.service +0 -0
  138. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-release-window.timer +0 -0
  139. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-serve.service +0 -0
  140. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-web-dist-build.service +0 -0
  141. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-web-dist-build.timer +0 -0
  142. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy/coord-web.service +0 -0
  143. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy_manifest.py +0 -0
  144. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deploy_units.py +0 -0
  145. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deprecation_telemetry.py +0 -0
  146. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/deps.py +0 -0
  147. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/diagnose.py +0 -0
  148. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dispatch.py +0 -0
  149. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dispatch_liveness.py +0 -0
  150. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dr_promote.py +0 -0
  152. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/dr_verify.py +0 -0
  153. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/drive.py +0 -0
  154. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/drive_queue.py +0 -0
  155. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/drive_sessions_snapshot.py +0 -0
  156. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/drive_state.py +0 -0
  157. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/events.py +0 -0
  158. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/failure_class.py +0 -0
  159. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/failure_classifier.py +0 -0
  160. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/filelock.py +0 -0
  161. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/fleet_config_health.py +0 -0
  162. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/forge_availability.py +0 -0
  163. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/freshness.py +0 -0
  164. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gate_a.py +0 -0
  165. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gate_b.py +0 -0
  166. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gate_snapshot.py +0 -0
  167. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gates.py +0 -0
  168. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gen_board_fixture.py +0 -0
  169. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/github_ops.py +0 -0
  170. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/github_throttle.py +0 -0
  171. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/goal.py +0 -0
  172. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/graph_health.py +0 -0
  173. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/gtk_native_driver.py +0 -0
  174. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/__init__.py +0 -0
  175. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/aggregate.py +0 -0
  176. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/__init__.py +0 -0
  177. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/_ci_pin.py +0 -0
  178. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/agent_install.py +0 -0
  179. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/cargo_targets.py +0 -0
  180. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/claude_binary.py +0 -0
  181. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/config_drift.py +0 -0
  182. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  183. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/coord_web_ci_pin.py +0 -0
  184. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/deploy_lane_facts.py +0 -0
  185. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/disk.py +0 -0
  186. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/fleet_board.py +0 -0
  187. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  188. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/fleet_phantom.py +0 -0
  189. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/fleet_unit_drift.py +0 -0
  190. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/graph.py +0 -0
  191. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/graphify_cli.py +0 -0
  192. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/index_lock.py +0 -0
  193. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/issues_sync_staleness.py +0 -0
  194. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/local_machine_identity.py +0 -0
  195. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/plan_usage.py +0 -0
  196. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/pr_churn.py +0 -0
  197. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/release_cordon.py +0 -0
  198. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/repo_state.py +0 -0
  199. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/spawned_coord.py +0 -0
  200. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/stalled_pipeline.py +0 -0
  201. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/timer_active.py +0 -0
  202. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/toolchain.py +0 -0
  203. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/unit_drift.py +0 -0
  204. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/unit_enablement.py +0 -0
  205. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/wedged_drive_queue.py +0 -0
  206. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/checks/worktrees.py +0 -0
  207. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/cli.py +0 -0
  208. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/context.py +0 -0
  209. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/fleet_snapshot.py +0 -0
  210. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/models.py +0 -0
  211. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/pypi.py +0 -0
  212. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/registry.py +0 -0
  213. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/render.py +0 -0
  214. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/health/units.py +0 -0
  215. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/hooks.py +0 -0
  216. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/housekeeping.py +0 -0
  217. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/interactive.py +0 -0
  218. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/invariant_alarms.py +0 -0
  219. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/issue_store.py +0 -0
  220. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/issues_sync_status.py +0 -0
  221. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/liveness_auditor.py +0 -0
  222. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/mac_native_driver.py +0 -0
  223. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/machine_fault.py +0 -0
  224. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/machine_metrics.py +0 -0
  225. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/machine_onboard.py +0 -0
  226. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/machine_pause.py +0 -0
  227. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/machine_stats.py +0 -0
  228. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/merge_queue.py +0 -0
  229. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/milestone_chat.py +0 -0
  230. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/milestone_dispatch.py +0 -0
  231. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/milestone_gate.py +0 -0
  232. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/milestone_order.py +0 -0
  233. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/mock_author.py +0 -0
  234. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/models.py +0 -0
  235. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/network.py +0 -0
  236. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/new_issue_chat.py +0 -0
  237. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/__init__.py +0 -0
  238. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/baseline.py +0 -0
  239. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/cli.py +0 -0
  240. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/collect.py +0 -0
  241. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/digest.py +0 -0
  242. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/models.py +0 -0
  243. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/predicate.py +0 -0
  244. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/service.py +0 -0
  245. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/store.py +0 -0
  246. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notifier/transport.py +0 -0
  247. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/notify.py +0 -0
  248. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/openapi.py +0 -0
  249. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/overlap_fence.py +0 -0
  250. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/overlap_predict.py +0 -0
  251. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/parentage.py +0 -0
  252. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/parentage_github.py +0 -0
  253. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/pipeline.py +0 -0
  254. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/plan_parser.py +0 -0
  255. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/plans.py +0 -0
  256. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/platform_paths.py +0 -0
  257. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/portal_bridge.py +0 -0
  258. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/portal_store.py +0 -0
  259. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/portal_sync.py +0 -0
  260. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/pr_body_lint.py +0 -0
  261. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/prereqs.py +0 -0
  262. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/progress.py +0 -0
  263. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/providers/__init__.py +0 -0
  264. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/providers/base.py +0 -0
  265. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/providers/claude.py +0 -0
  266. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/providers/claude_pty.py +0 -0
  267. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/providers/opencode.py +0 -0
  268. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/queue_diagnose.py +0 -0
  269. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/reconcile.py +0 -0
  270. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/reconcile_tick.py +0 -0
  271. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/refine_chat.py +0 -0
  272. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/release_cordon.py +0 -0
  273. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/release_gate.py +0 -0
  274. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/release_propagate.py +0 -0
  275. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/release_verify.py +0 -0
  276. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/release_window.py +0 -0
  277. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/repo_dormancy.py +0 -0
  278. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/repo_edit.py +0 -0
  279. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/repo_onboard.py +0 -0
  280. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/reports.py +0 -0
  281. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/rest_schema.py +0 -0
  282. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/restart_cmd.py +0 -0
  283. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/revalidate.py +0 -0
  284. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/scorecard.py +0 -0
  285. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/self_health.py +0 -0
  286. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/serve_app.py +0 -0
  287. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  288. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  289. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  290. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  291. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/portal-followup/SKILL.md +0 -0
  293. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/release-now/SKILL.md +0 -0
  294. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  295. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  296. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/skills/update-issue/SKILL.md +0 -0
  297. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/smoke.py +0 -0
  298. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/smoke_tags.py +0 -0
  299. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/spend_ceiling.py +0 -0
  300. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/split_work.py +0 -0
  301. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/sql.py +0 -0
  302. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/stage_projection.py +0 -0
  303. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/state.py +0 -0
  304. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/store_migrate.py +0 -0
  305. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/store_parity.py +0 -0
  306. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/templates/deploy-cloudflare.node.yml +0 -0
  307. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/test_author.py +0 -0
  308. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/test_chat.py +0 -0
  309. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/test_orchestrator.py +0 -0
  310. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/test_report.py +0 -0
  311. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/tui_pty_driver.py +0 -0
  312. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/usage_rollup.py +0 -0
  317. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/win_native_bridge.py +0 -0
  318. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/win_native_driver.py +0 -0
  319. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coord/worker_events.py +0 -0
  320. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/coordinator.example.yml +0 -0
  321. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-agent.service +0 -0
  322. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-backup.service +0 -0
  323. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-backup.timer +0 -0
  324. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-db-backup.service +0 -0
  325. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-db-backup.sh +0 -0
  326. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-db-backup.timer +0 -0
  327. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-dr-verify.service +0 -0
  328. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-dr-verify.timer +0 -0
  329. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-drive-queue.service +0 -0
  330. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-drive-queue.timer +0 -0
  331. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-failure-notify.service +0 -0
  332. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-failure-notify.sh +0 -0
  333. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-fleet-watchdog.service +0 -0
  334. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-fleet-watchdog.timer +0 -0
  335. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-notify.service +0 -0
  336. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-notify.timer +0 -0
  337. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-release-propagate.service +0 -0
  338. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-release-propagate.timer +0 -0
  339. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-release-window.service +0 -0
  340. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-release-window.timer +0 -0
  341. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-serve.service +0 -0
  342. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-web-dist-build.service +0 -0
  343. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-web-dist-build.sh +0 -0
  344. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-web-dist-build.timer +0 -0
  345. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-web-rollback.sh +0 -0
  346. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/coord-web.service +0 -0
  347. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/deploy/node-shim.sh +0 -0
  348. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ADR_COORD_TUI_CI.md +0 -0
  349. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  350. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ADR_COORD_WEB_CI.md +0 -0
  351. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ADR_COORD_WEB_DIST.md +0 -0
  352. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  353. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/AGENT_OPERATIONS.md +0 -0
  354. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ARCHITECTURE.md +0 -0
  355. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ARCH_SECURITY_GATES.md +0 -0
  356. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/COCKPIT.md +0 -0
  357. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/CONTROL_CENTER.md +0 -0
  358. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/COST_DISCIPLINE.md +0 -0
  359. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/CROSS_PLATFORM.md +0 -0
  360. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/CUSTOMER_FACING_APPS.md +0 -0
  361. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/CUSTOMER_PORTAL.md +0 -0
  362. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/DATA_STORE_SELECTION.md +0 -0
  363. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/DISASTER_RECOVERY.md +0 -0
  364. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/DRIVE_QUEUE.md +0 -0
  365. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/EPHEMERAL_WORKERS.md +0 -0
  366. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/FORGE_MIGRATION.md +0 -0
  367. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/GRAPHIFY_SETUP.md +0 -0
  368. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ISSUE_GUIDANCE.md +0 -0
  369. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/MAC_MINI.md +0 -0
  370. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  371. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/NOTIFIER.md +0 -0
  372. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/OPENCODE_VERIFICATION.md +0 -0
  373. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/OPERATING_GOTCHAS.md +0 -0
  374. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/OPERATOR_GUIDES.md +0 -0
  375. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/WSL_WINDOWS_WORKER.md +0 -0
  384. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/mocks/web/README.md +0 -0
  385. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/mocks/web/_tokens.css +0 -0
  386. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/mocks/web/issue-detail.html +0 -0
  387. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/mocks/web/pipeline-narrow.html +0 -0
  388. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/docs/mocks/web/pipeline-wide.html +0 -0
  389. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/graphify-out/.gitignore +0 -0
  390. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/install-agent.sh +0 -0
  391. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/pyproject.toml +0 -0
  392. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/audit_review_verdict_overrides.py +0 -0
  393. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  394. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/build-worker-image.sh +0 -0
  395. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/coordinator-machine.py +0 -0
  396. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/dr-down.sh +0 -0
  397. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/dr-up.sh +0 -0
  398. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/epic-down.sh +0 -0
  399. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/epic-up.sh +0 -0
  400. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/preflight.sh +0 -0
  401. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/provision-server.sh +0 -0
  402. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/provision-worker.sh +0 -0
  403. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  404. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  405. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/throwaway-vm.sh +0 -0
  406. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/azure-workers/verify-github-token.sh +0 -0
  407. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/check_gh_argv_containment.py +0 -0
  408. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/codegen.py +0 -0
  409. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-test-runner.sh +0 -0
  410. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  411. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  412. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  413. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  414. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/coord-venv-rollback.sh +0 -0
  415. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/extract-coord-tui.sh +0 -0
  417. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/fleet_watchdog.py +0 -0
  418. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/gen_mock_index.py +0 -0
  420. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/lib/provision-core.sh +0 -0
  421. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/next_release_tag.py +0 -0
  422. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/provision-machine.sh +0 -0
  423. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/run_tests_in_populated_home.sh +0 -0
  424. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/run_tests_without_gh.sh +0 -0
  425. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/setup-macmini.sh +0 -0
  426. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/smoke_437_interactive.py +0 -0
  427. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/verify-provision-noble.sh +0 -0
  428. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/verify_878_review_capture.py +0 -0
  429. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/verify_release_published.py +0 -0
  430. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/scripts/verify_release_wheel.py +0 -0
  431. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/setup.cfg +0 -0
  432. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/SMOKE_SET.md +0 -0
  433. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/__init__.py +0 -0
  434. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/contract.md +0 -0
  440. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  441. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  442. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/manifest.yml +0 -0
  443. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-51/tsconfig.json +0 -0
  445. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/backends.py +0 -0
  447. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  452. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  465. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_acceptance.py +0 -0
  470. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_acceptance_drivers.py +0 -0
  471. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent.py +0 -0
  472. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_api_error.py +0 -0
  473. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_app.py +0 -0
  474. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_branch_base.py +0 -0
  475. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_branch_capture.py +0 -0
  476. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_config_free_1712.py +0 -0
  477. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_deploy_units_endpoint.py +0 -0
  478. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_dirty_worktree.py +0 -0
  479. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  480. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_graph_self_heal.py +0 -0
  481. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_health_h3.py +0 -0
  482. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_idle_restart.py +0 -0
  483. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_push_failure.py +0 -0
  484. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_reap.py +0 -0
  485. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_repos_and_pull.py +0 -0
  486. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_restart_services_endpoint.py +0 -0
  487. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_skills_self_heal.py +0 -0
  488. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_startup_diagnostics.py +0 -0
  489. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_update.py +0 -0
  490. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approve_capability_reroute_3241.py +0 -0
  494. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approve_dependency_busy_2804.py +0 -0
  495. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approved_work_2532.py +0 -0
  498. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_approved_work_2996.py +0 -0
  499. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_assignment_already_recorded_daemon.py +0 -0
  500. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_audit_log.py +0 -0
  501. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_audit_outcome.py +0 -0
  502. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_audit_query.py +0 -0
  503. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_auto_loop.py +0 -0
  504. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_auto_release_publish_2035.py +0 -0
  505. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_backend_selection.py +0 -0
  506. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_backup.py +0 -0
  507. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_schema.py +0 -0
  513. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_bugbash.py +0 -0
  520. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_check_gh_argv_containment.py +0 -0
  523. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_fix.py +0 -0
  525. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_github.py +0 -0
  526. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_gitlab.py +0 -0
  527. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_parity_2091.py +0 -0
  528. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_ci_store.py +0 -0
  529. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_claim.py +0 -0
  530. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_claude_md_budget.py +0 -0
  531. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_claude_setup_token.py +0 -0
  532. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_ci.py +0 -0
  541. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_codegen.py +0 -0
  542. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_decide.py +0 -0
  543. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_capability_rules.py +0 -0
  544. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_config_provenance.py +0 -0
  545. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_forge_availability.py +0 -0
  546. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_graph.py +0 -0
  547. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_self.py +0 -0
  548. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_diagnose_test_coverage.py +0 -0
  549. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  553. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_drive.py +0 -0
  554. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_drive_queue.py +0 -0
  555. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_issue_comment.py +0 -0
  561. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_issue_create_label.py +0 -0
  562. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_issue_reopen.py +0 -0
  563. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_issue_view_list.py +0 -0
  564. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_issues.py +0 -0
  565. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_pr.py +0 -0
  580. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_pull_artifact.py +0 -0
  581. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_queue.py +0 -0
  582. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_reattach_sessions.py +0 -0
  583. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_refine_board.py +0 -0
  584. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_release_preflight.py +0 -0
  585. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_release_propagate.py +0 -0
  586. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_release_window.py +0 -0
  587. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_repo_2220.py +0 -0
  588. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  589. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_scorecard.py +0 -0
  590. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_serve_store_backend_3084.py +0 -0
  591. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_set_review_findings.py +0 -0
  592. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_advisory_terminal.py +0 -0
  593. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_contested_tag.py +0 -0
  594. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_invariant_alarms.py +0 -0
  595. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_machine_fault.py +0 -0
  596. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_merge_queue.py +0 -0
  597. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_provider.py +0 -0
  598. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_retried_3340.py +0 -0
  599. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_review_finalizing.py +0 -0
  600. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_supervisor_3366.py +0 -0
  601. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_test_failed_tag.py +0 -0
  602. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_status_usage_limit.py +0 -0
  603. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_sync_comments_873.py +0 -0
  604. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_test_plan.py +0 -0
  605. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_track.py +0 -0
  606. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_tui_update.py +0 -0
  607. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cli_wait.py +0 -0
  608. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_client.py +0 -0
  609. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_client_base_install.py +0 -0
  610. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_client_config_cache_atomic_3052.py +0 -0
  611. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_client_resource_migration_1946.py +0 -0
  612. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_commands_common.py +0 -0
  613. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_comments.py +0 -0
  614. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_completion_summary.py +0 -0
  615. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config.py +0 -0
  616. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_acceptance.py +0 -0
  617. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_audit.py +0 -0
  618. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_drift_check.py +0 -0
  619. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_effective.py +0 -0
  620. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_pricing.py +0 -0
  621. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  622. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_config_usage_gate.py +0 -0
  623. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_confirm_test.py +0 -0
  624. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  627. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test.py +0 -0
  628. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  629. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test_runner_baseline.py +0 -0
  630. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test_runner_populated_home.py +0 -0
  631. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test_runner_routing.py +0 -0
  632. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_test_runner_toolchain.py +0 -0
  633. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_uat.py +0 -0
  634. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coord_web_sse_restart_live.py +0 -0
  635. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_coordinator_machine.py +0 -0
  636. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_cross_platform_imports.py +0 -0
  637. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dao.py +0 -0
  638. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard.py +0 -0
  639. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_api.py +0 -0
  640. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_fixture.py +0 -0
  641. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_reports.py +0 -0
  642. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_server.py +0 -0
  643. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_terminal.py +0 -0
  644. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dashboard_terminal_live.py +0 -0
  645. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_db.py +0 -0
  646. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dead_end.py +0 -0
  647. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_decomposition_chat.py +0 -0
  648. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_coord_db_backup.py +0 -0
  649. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_coord_web_dist.py +0 -0
  650. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_coord_web_rollback.py +0 -0
  651. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_db_backup_unit.py +0 -0
  652. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_drive_queue_unit.py +0 -0
  653. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_failure_notify_unit.py +0 -0
  654. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_manifest.py +0 -0
  655. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_notify_unit.py +0 -0
  656. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_units_lane.py +0 -0
  657. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deploy_web_unit.py +0 -0
  658. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deprecation_telemetry.py +0 -0
  659. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_deps.py +0 -0
  660. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_diagnose.py +0 -0
  661. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dispatch.py +0 -0
  662. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dispatch_liveness.py +0 -0
  663. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dispatch_target_validation.py +0 -0
  664. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dispatch_workers.py +0 -0
  665. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dist_name.py +0 -0
  666. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_done_housekeeping.py +0 -0
  667. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dr_azure_scripts.py +0 -0
  668. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dr_promote.py +0 -0
  669. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_dr_verify.py +0 -0
  670. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive.py +0 -0
  671. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_machine_fault.py +0 -0
  672. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue.py +0 -0
  673. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_blocked_rendering.py +0 -0
  674. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_launch_argv.py +0 -0
  675. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_max_parallel_config.py +0 -0
  676. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  677. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_roll_pending.py +0 -0
  678. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  679. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_sessions_snapshot.py +0 -0
  680. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_state.py +0 -0
  681. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_drive_tmux.py +0 -0
  682. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_epic_up_capability_detection.py +0 -0
  683. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  684. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_epic_up_image_provenance.py +0 -0
  685. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_errors.py +0 -0
  686. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_events.py +0 -0
  687. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_failure_class.py +0 -0
  688. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_failure_classifier.py +0 -0
  689. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_filelock.py +0 -0
  690. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  691. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fix_escalation_classifier.py +0 -0
  692. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fix_of_force_override.py +0 -0
  693. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fleet_config_health.py +0 -0
  694. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fleet_health_probes.py +0 -0
  695. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fleet_health_snapshot.py +0 -0
  696. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_fleet_watchdog.py +0 -0
  697. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_forge_availability.py +0 -0
  698. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_freshness.py +0 -0
  699. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gate_a.py +0 -0
  700. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gate_b.py +0 -0
  701. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gate_snapshot_staleness.py +0 -0
  702. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gates.py +0 -0
  703. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  704. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gen_mock_index.py +0 -0
  705. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_generated_rust_fixture.py +0 -0
  706. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_generated_rust_requests.py +0 -0
  707. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_generated_types_fixture.py +0 -0
  708. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_github_ops.py +0 -0
  709. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_github_throttle.py +0 -0
  710. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_goal.py +0 -0
  711. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_graph_health.py +0 -0
  712. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_graph_selfheal_absent_2237.py +0 -0
  713. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_gtk_native_driver.py +0 -0
  714. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_handoff.py +0 -0
  715. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_checks.py +0 -0
  716. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_cli.py +0 -0
  717. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_cli_graph.py +0 -0
  718. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_config.py +0 -0
  719. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_context.py +0 -0
  720. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_coord_tui_ci_pin.py +0 -0
  721. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_coord_web_ci_pin.py +0 -0
  722. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_deploy_lane_facts.py +0 -0
  723. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_fix.py +0 -0
  724. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_incident_regression.py +0 -0
  725. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_issues_sync_staleness.py +0 -0
  726. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_pr_churn.py +0 -0
  727. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_pypi.py +0 -0
  728. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_registry.py +0 -0
  729. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_release_cordon_probe.py +0 -0
  730. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_timer_active.py +0 -0
  731. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_toolchain.py +0 -0
  732. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_unit_drift.py +0 -0
  733. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_unit_enablement.py +0 -0
  734. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_health_wedged_drive_queue.py +0 -0
  735. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_hooks.py +0 -0
  736. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_housekeeping.py +0 -0
  737. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_human_attended_437.py +0 -0
  738. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_init.py +0 -0
  739. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_install_agent_capabilities_3515.py +0 -0
  740. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_install_agent_venv_2911.py +0 -0
  741. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  742. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_integration.py +0 -0
  743. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive.py +0 -0
  744. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_briefing_echo.py +0 -0
  745. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_pane_log_2541.py +0 -0
  746. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_prefill_state.py +0 -0
  747. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_session_relaunch.py +0 -0
  748. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_test_verdict_backstop.py +0 -0
  749. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_token_attribution.py +0 -0
  750. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_interactive_worktree.py +0 -0
  751. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_invariant_alarms.py +0 -0
  752. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_issue_store_seam.py +0 -0
  753. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_issues_sync_status.py +0 -0
  754. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_liveness_auditor.py +0 -0
  755. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_liveness_notify.py +0 -0
  756. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_lock_contention_ratchet.py +0 -0
  757. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_mac_native_driver.py +0 -0
  758. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_machine_fault.py +0 -0
  759. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_machine_metrics.py +0 -0
  760. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_machine_onboard.py +0 -0
  761. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_machine_pause.py +0 -0
  762. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_machine_stats.py +0 -0
  763. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_merge_queue.py +0 -0
  764. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_merge_verify.py +0 -0
  765. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_milestone_chat.py +0 -0
  766. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_milestone_dispatch.py +0 -0
  767. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_milestone_gate.py +0 -0
  768. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_milestone_order.py +0 -0
  769. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_milestone_seam.py +0 -0
  770. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_mock_author.py +0 -0
  771. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_model_tiering.py +0 -0
  772. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_models.py +0 -0
  773. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_models_config_labels.py +0 -0
  774. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_needs_attention.py +0 -0
  775. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_network.py +0 -0
  776. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_new_issue_chat.py +0 -0
  777. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_next_release_tag.py +0 -0
  778. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_node_shim.py +0 -0
  779. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_baseline.py +0 -0
  780. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_cli.py +0 -0
  781. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_collect.py +0 -0
  782. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_config.py +0 -0
  783. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_drive_seam.py +0 -0
  784. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_isolation.py +0 -0
  785. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_predicate.py +0 -0
  786. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_quiet_hours.py +0 -0
  787. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notifier_service.py +0 -0
  788. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notify.py +0 -0
  789. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_notify_drain.py +0 -0
  790. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_openapi.py +0 -0
  791. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_operational_defaults.py +0 -0
  792. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_overlap_fence.py +0 -0
  793. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_overlap_predict.py +0 -0
  794. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_packaged_deploy_units.py +0 -0
  795. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_parentage.py +0 -0
  796. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_paste_landed.py +0 -0
  797. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  798. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_pipeline.py +0 -0
  799. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_plan_followup_approve_plan_command.py +0 -0
  800. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_plan_followup_pr_command.py +0 -0
  801. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_plan_followup_review_command.py +0 -0
  802. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_plan_only.py +0 -0
  803. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_plan_parser.py +0 -0
  804. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_platform_paths.py +0 -0
  805. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_portal_bridge.py +0 -0
  806. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_portal_config.py +0 -0
  807. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_portal_store.py +0 -0
  808. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_portal_sync.py +0 -0
  809. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_pr_body_lint.py +0 -0
  810. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_prereqs.py +0 -0
  811. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_production_db_guard.py +0 -0
  812. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_progress.py +0 -0
  813. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_provider_seam.py +0 -0
  814. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_providers.py +0 -0
  815. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_providers_config_labels.py +0 -0
  816. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_providers_pty.py +0 -0
  817. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_provision_core.py +0 -0
  818. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_provision_machine.py +0 -0
  819. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_py_rust_mirror_inventory.py +0 -0
  820. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_quiet_hours.py +0 -0
  821. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_quiet_hours_store_2146.py +0 -0
  822. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reap_merged_sessions.py +0 -0
  823. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reap_stale_interactive_tick.py +0 -0
  824. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile.py +0 -0
  825. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_branch.py +0 -0
  826. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_completions.py +0 -0
  827. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  828. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_merges.py +0 -0
  829. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_no_agent_record.py +0 -0
  830. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_tick.py +0 -0
  831. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reconcile_usage_limit_done.py +0 -0
  832. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_refine_chat.py +0 -0
  833. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_cordon_2101.py +0 -0
  834. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  835. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_cordon_deadlock_2240.py +0 -0
  836. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  837. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_cordon_stuck_2490.py +0 -0
  838. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_gate.py +0 -0
  839. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_propagate.py +0 -0
  840. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_propagate_threshold.py +0 -0
  841. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_roll_between_legs_2854.py +0 -0
  842. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_roll_window_handoff.py +0 -0
  843. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_unified_1242.py +0 -0
  844. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_verify.py +0 -0
  845. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_release_window.py +0 -0
  846. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_remote_auto_prune.py +0 -0
  847. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_remote_interactive_reaper.py +0 -0
  848. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_add.py +0 -0
  849. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_dormancy.py +0 -0
  850. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_edit_2220.py +0 -0
  851. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_graph_fleet_2237.py +0 -0
  852. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_max_parallel_3423.py +0 -0
  853. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_repo_onboard_2220.py +0 -0
  854. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_report_public_export.py +0 -0
  855. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_report_result_push.py +0 -0
  856. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_reports.py +0 -0
  857. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_restart_cmd.py +0 -0
  858. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_retry.py +0 -0
  859. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_retry_advisory_1606.py +0 -0
  860. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_retry_escalation_classify_3360.py +0 -0
  861. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_retry_type_1636.py +0 -0
  862. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_revalidate.py +0 -0
  863. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_end_review_without_verdict.py +0 -0
  864. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_parse_failure_diagnostic.py +0 -0
  865. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_reaffirm.py +0 -0
  866. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_state.py +0 -0
  867. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_verdict_backstop.py +0 -0
  868. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_verdict_override_audit.py +0 -0
  869. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_verdict_relay.py +0 -0
  870. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_review_zero_commits.py +0 -0
  871. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_scoped_review_wiring.py +0 -0
  872. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_scorecard.py +0 -0
  873. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_self_health.py +0 -0
  874. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_serve.py +0 -0
  875. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_serve_app.py +0 -0
  876. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_serve_app_board_trim.py +0 -0
  877. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_serve_rest_routes.py +0 -0
  878. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_session.py +0 -0
  879. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_slice_issue_attribution.py +0 -0
  880. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_smoke.py +0 -0
  881. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  882. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_smoke_live_checkout_restore.py +0 -0
  883. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_smoke_workflow.py +0 -0
  884. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_spend_ceiling.py +0 -0
  885. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_spend_ceiling_coordinator.py +0 -0
  886. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_split.py +0 -0
  887. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_split_work.py +0 -0
  888. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_sql_dialect.py +0 -0
  889. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_sqlite_connect_ratchet.py +0 -0
  890. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stage_projection.py +0 -0
  891. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stale_busy_reviewer_697.py +0 -0
  892. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stalled_pipeline.py +0 -0
  893. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_state.py +0 -0
  894. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_state_review_findings_daemon.py +0 -0
  895. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_status_fleet_footer.py +0 -0
  896. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stop_1567.py +0 -0
  897. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_store_contract.py +0 -0
  898. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_store_migrate.py +0 -0
  899. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stuck.py +0 -0
  900. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  901. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_terminal_command.py +0 -0
  902. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_author.py +0 -0
  903. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_chat.py +0 -0
  904. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_orchestrator.py +0 -0
  905. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_report.py +0 -0
  906. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_verdict_parsing.py +0 -0
  907. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_test_verdict_transcript_floor.py +0 -0
  908. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_text_io_encoding_audit.py +0 -0
  909. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_thin_client_board_audit.py +0 -0
  910. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_thin_client_config_load_1080.py +0 -0
  911. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_thin_client_daemon_routing_906.py +0 -0
  912. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_throwaway_vm.py +0 -0
  913. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_tmux_host.py +0 -0
  914. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_tmux_session.py +0 -0
  915. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_transcript_floor.py +0 -0
  916. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_tui_pty_driver.py +0 -0
  917. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_uat_checks.py +0 -0
  918. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_usage.py +0 -0
  919. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_usage_limits.py +0 -0
  920. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_usage_rollup.py +0 -0
  921. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_version_single_source.py +0 -0
  922. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_watch.py +0 -0
  923. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_win_native_bridge.py +0 -0
  924. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_win_native_driver.py +0 -0
  925. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  926. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worker_env_venv_isolation.py +0 -0
  927. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worker_events.py +0 -0
  928. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worker_image_pin_sync.py +0 -0
  929. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worker_safety.py +0 -0
  930. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worker_test_scoping.py +0 -0
  931. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worktree.py +0 -0
  932. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  933. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/tests/test_write_parity.py +0 -0
  934. {code_coordinator-0.5.579 → code_coordinator-0.5.581}/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.579
3
+ Version: 0.5.581
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.579
3
+ Version: 0.5.581
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
@@ -70,6 +70,7 @@ coord/deploy_units.py
70
70
  coord/deprecation_telemetry.py
71
71
  coord/deps.py
72
72
  coord/diagnose.py
73
+ coord/dirlink.py
73
74
  coord/dispatch.py
74
75
  coord/dispatch_liveness.py
75
76
  coord/dist_name.py
@@ -619,6 +620,7 @@ tests/test_deploy_web_unit.py
619
620
  tests/test_deprecation_telemetry.py
620
621
  tests/test_deps.py
621
622
  tests/test_diagnose.py
623
+ tests/test_dirlink.py
622
624
  tests/test_dispatch.py
623
625
  tests/test_dispatch_liveness.py
624
626
  tests/test_dispatch_target_validation.py
@@ -132,6 +132,7 @@
132
132
  "coord/deprecation_telemetry.py",
133
133
  "coord/deps.py",
134
134
  "coord/diagnose.py",
135
+ "coord/dirlink.py",
135
136
  "coord/dispatch.py",
136
137
  "coord/dispatch_liveness.py",
137
138
  "coord/dist_name.py",
@@ -646,6 +647,7 @@
646
647
  "tests/test_deprecation_telemetry.py",
647
648
  "tests/test_deps.py",
648
649
  "tests/test_diagnose.py",
650
+ "tests/test_dirlink.py",
649
651
  "tests/test_dispatch.py",
650
652
  "tests/test_dispatch_liveness.py",
651
653
  "tests/test_dispatch_target_validation.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.579",
2
+ "tag": "0.5.581",
3
3
  "distance": 0,
4
- "node": "gffb8247183c93a6cbb6c084e08884f093c485a20",
4
+ "node": "gddd52c1866379f925abed84a0ccd3f93fb94e7ad",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -13,11 +13,16 @@ An update must be all-or-nothing.
13
13
  The fix: never write into the venv that's live. Install the target version
14
14
  into a **fresh** venv — one of two fixed "slots" next to the live one
15
15
  (``~/.coord-venv.blue`` / ``~/.coord-venv.green``) — smoke-check it, and
16
- only then flip a symlink so ``~/.coord-venv`` always resolves to one
17
- *complete* slot, old or new, never a mix. Rename of a symlink onto an
18
- existing path is atomic on POSIX (same filesystem), so any `coord`
19
- invocation racing the flip sees either the fully-old or the fully-new
20
- install — there is no observable in-between state.
16
+ only then flip a directory link (see :mod:`coord.dirlink`) so
17
+ ``~/.coord-venv`` always resolves to one *complete* slot, old or new, never
18
+ a mix. Rename of a symlink onto an existing path is atomic on POSIX (same
19
+ filesystem), so any `coord` invocation racing the flip sees either the
20
+ fully-old or the fully-new install — there is no observable in-between
21
+ state. #2842: POSIX uses a symlink for exactly that atomicity guarantee;
22
+ win32 has no directory-reparse-point equivalent of an atomic rename-over,
23
+ so there the flip is best-effort (old link removed, new one renamed in
24
+ immediately after) rather than a silent single-platform fiction — see
25
+ :mod:`coord.dirlink` for the full reasoning.
21
26
 
22
27
  Using exactly two named slots (rather than a fresh directory per release)
23
28
  also gives rollback for free: the slot that was live before the swap is
@@ -86,6 +91,7 @@ from dataclasses import dataclass
86
91
  from pathlib import Path
87
92
 
88
93
  from coord import restart_cmd
94
+ from coord.dirlink import is_dir_link, make_dir_link, read_dir_link, replace_dir_link
89
95
  from coord.platform_paths import venv_exe, venv_pip, venv_python
90
96
 
91
97
  _log = logging.getLogger(__name__)
@@ -391,23 +397,24 @@ def current_slot(venv_dir: Path) -> Path | None:
391
397
  way, since ``install-agent.sh`` creates ``~/.coord-venv`` as a real
392
398
  directory.
393
399
  """
394
- if not venv_dir.is_symlink():
400
+ if not is_dir_link(venv_dir):
395
401
  return None
396
- target = venv_dir.readlink()
402
+ target = read_dir_link(venv_dir)
397
403
  if not target.is_absolute():
398
404
  target = (venv_dir.parent / target).resolve()
399
405
  return target
400
406
 
401
407
 
402
408
  def ensure_symlink_layout(venv_dir: Path) -> Path:
403
- """Migrate *venv_dir* to the blue/green symlink layout if it isn't already.
404
-
405
- Idempotent: if *venv_dir* is already a symlink, just returns its current
406
- target. Otherwise renames the existing plain directory into the
407
- ``.blue`` slot and replaces *venv_dir* with a symlink pointing at it.
408
- This is the one-time, one-machine migration every pre-#1241 install
409
- needs; every update after that stays in the symlink layout, so this
410
- becomes a no-op for the rest of that machine's life.
409
+ """Migrate *venv_dir* to the blue/green link layout if it isn't already.
410
+
411
+ Idempotent: if *venv_dir* is already a directory link (a symlink on
412
+ POSIX, a junction on win32 — see :mod:`coord.dirlink`), just returns
413
+ its current target. Otherwise renames the existing plain directory
414
+ into the ``.blue`` slot and replaces *venv_dir* with a link pointing at
415
+ it. This is the one-time, one-machine migration every pre-#1241
416
+ install needs; every update after that stays in the link layout, so
417
+ this becomes a no-op for the rest of that machine's life.
411
418
  """
412
419
  existing = current_slot(venv_dir)
413
420
  if existing is not None:
@@ -418,13 +425,13 @@ def ensure_symlink_layout(venv_dir: Path) -> Path:
418
425
  if blue.exists():
419
426
  # Should be unreachable — `blue`/`green` only ever come into being
420
427
  # via this function or `perform_update`, both gated on `venv_dir`
421
- # not already being a symlink. Refuse rather than clobber whatever
422
- # is there.
428
+ # not already being a directory link. Refuse rather than clobber
429
+ # whatever is there.
423
430
  raise FileExistsError(
424
431
  f"{blue} already exists — refusing to migrate {venv_dir} over it"
425
432
  )
426
433
  venv_dir.rename(blue)
427
- venv_dir.symlink_to(blue, target_is_directory=True)
434
+ make_dir_link(venv_dir, blue)
428
435
  return blue
429
436
 
430
437
 
@@ -517,20 +524,18 @@ def running_slot(venv_dir: Path) -> Path | None:
517
524
 
518
525
 
519
526
  def _atomic_swap(venv_dir: Path, new_slot: Path) -> None:
520
- """Flip *venv_dir* to point at *new_slot* in one filesystem operation.
521
-
522
- Builds the new symlink at a temp path next to *venv_dir* and renames it
523
- directly onto *venv_dir* — ``rename()`` replacing an existing path is
524
- atomic on POSIX when both are on the same filesystem (true here: both
525
- are siblings under the same parent directory), so any `coord`
526
- invocation racing this always sees either the old, complete slot or the
527
- new, complete slot — never a half-updated ``venv_dir``.
527
+ """Flip *venv_dir* to point at *new_slot*.
528
+
529
+ Delegates to :func:`coord.dirlink.replace_dir_link`: atomic on POSIX
530
+ (a symlink `rename()` onto an existing path is a single filesystem
531
+ operation there, so any `coord` invocation racing this always sees
532
+ either the old, complete slot or the new, complete slot — never a
533
+ half-updated ``venv_dir``) and best-effort on win32, where a directory
534
+ junction has no equivalent single-syscall replace (#2842) — see that
535
+ module's docstring for the platform difference this does *not* paper
536
+ over.
528
537
  """
529
- tmp_link = venv_dir.parent / f".{venv_dir.name}.next-link"
530
- if tmp_link.is_symlink() or tmp_link.exists():
531
- tmp_link.unlink()
532
- tmp_link.symlink_to(new_slot, target_is_directory=True)
533
- tmp_link.replace(venv_dir)
538
+ replace_dir_link(venv_dir, new_slot)
534
539
 
535
540
 
536
541
  def _smoke_check(slot: Path, *, target_version: str | None) -> tuple[bool, str | None, str]:
@@ -0,0 +1,124 @@
1
+ """Cross-platform directory links: symlinks on POSIX, junctions on win32 (#2842).
2
+
3
+ ``coord.agent_update``'s blue/green venv swap used to call
4
+ ``Path.symlink_to``/``Path.readlink``/``Path.is_symlink`` directly, which is
5
+ POSIX-correct but breaks two ways on win32:
6
+
7
+ 1. **Creating a directory symlink needs a privilege** most installs don't
8
+ have (Developer Mode or ``SeCreateSymbolicLinkPrivilege``) — relying on it
9
+ is not portable even when it happens to be available on a given box.
10
+ 2. **Replacing an existing directory symlink via ``os.replace``/
11
+ ``Path.replace`` fails outright** with ``[WinError 5] Access is denied``.
12
+ The POSIX guarantee that ``rename(2)`` atomically replaces a symlink has
13
+ no direct win32 equivalent for directory reparse points.
14
+
15
+ The portable substitute is a **directory junction**
16
+ (``_winapi.CreateJunction``, the same thing ``mklink /J`` produces), which
17
+ needs no special privilege. This is the identical substitution #1163 (CP-7)
18
+ already names for the git-worktree symlink problem — so this module is
19
+ intentionally generic (it knows nothing about venvs or worktrees) and
20
+ *both* call sites should route through it rather than each growing their
21
+ own win32 branch. :mod:`coord.agent_update` is the first consumer; #1163's
22
+ worktree-junction work should become the second rather than reinventing
23
+ this.
24
+
25
+ Junctions are not atomically swappable the way a POSIX symlink rename is —
26
+ there is no win32 "replace this directory reparse point with that one in
27
+ one syscall" primitive — so :func:`replace_dir_link` is atomic on POSIX
28
+ (same guarantee ``coord.agent_update`` already documents) and best-effort
29
+ on win32: the old link is removed (not its target — see
30
+ :func:`remove_dir_link`) and the new one renamed into place immediately
31
+ after, which leaves a sub-millisecond window with no link rather than no
32
+ atomicity guarantee at all. That is a real, documented platform difference,
33
+ not a silent gap: see ``coord.agent_update._atomic_swap``.
34
+ """
35
+
36
+ from __future__ import annotations
37
+
38
+ import sys
39
+ from pathlib import Path
40
+
41
+
42
+ def make_dir_link(link_path: Path, target: Path) -> None:
43
+ """Create a directory link at *link_path* pointing at *target*.
44
+
45
+ POSIX: a directory symlink (``Path.symlink_to``). win32: a directory
46
+ junction (``_winapi.CreateJunction``), which — unlike a Windows
47
+ symlink — needs no Developer Mode / ``SeCreateSymbolicLinkPrivilege``.
48
+ """
49
+ if sys.platform == "win32":
50
+ import _winapi # noqa: PLC0415 -- win32-only stdlib module
51
+
52
+ _winapi.CreateJunction(str(target), str(link_path))
53
+ else:
54
+ link_path.symlink_to(target, target_is_directory=True)
55
+
56
+
57
+ def remove_dir_link(link_path: Path) -> None:
58
+ """Remove the link itself at *link_path* — never the directory it
59
+ points at.
60
+
61
+ POSIX: ``Path.unlink()`` on a symlink removes the link, not its
62
+ target. win32: a junction is a reparse point on an otherwise-empty
63
+ directory entry, removed with ``Path.rmdir()`` rather than
64
+ ``shutil.rmtree`` — a recursive ``rmtree`` would be wrong here since a
65
+ junction is transparent to many APIs, and could walk straight through
66
+ it into the target and delete *its* contents instead of just the link.
67
+ """
68
+ if sys.platform == "win32":
69
+ link_path.rmdir()
70
+ else:
71
+ link_path.unlink()
72
+
73
+
74
+ def is_dir_link(path: Path) -> bool:
75
+ """Whether *path* is a directory link this module manages.
76
+
77
+ A symlink on POSIX; a symlink *or* a junction on win32 — both are
78
+ reparse points, and :func:`make_dir_link` only ever produces a
79
+ junction there, but a pre-existing or hand-made symlink should still
80
+ be recognized rather than silently mishandled.
81
+ """
82
+ if path.is_symlink():
83
+ return True
84
+ if sys.platform == "win32":
85
+ is_junction = getattr(path, "is_junction", None)
86
+ if is_junction is not None:
87
+ return is_junction()
88
+ return False
89
+
90
+
91
+ def read_dir_link(link_path: Path) -> Path:
92
+ """Return the literal target *link_path* was created pointing at.
93
+
94
+ ``Path.readlink()`` resolves junctions as well as symlinks on win32
95
+ (support landed in CPython 3.8), so one call covers both platforms.
96
+ """
97
+ return link_path.readlink()
98
+
99
+
100
+ def replace_dir_link(link_path: Path, target: Path) -> None:
101
+ """Flip *link_path* to point at *target*, replacing whatever (if
102
+ anything) is there.
103
+
104
+ Builds the new link at a temp path next to *link_path* first, so a
105
+ failure constructing it never touches the existing link. Atomic on
106
+ POSIX — the temp link is ``rename()``d directly onto *link_path*,
107
+ which POSIX guarantees replaces an existing path (symlink or
108
+ otherwise) in one filesystem operation when both are on the same
109
+ filesystem (true here: siblings under the same parent). Best-effort on
110
+ win32 — there is no equivalent single-syscall replace for a directory
111
+ reparse point, so the old link is removed and the new one renamed into
112
+ place immediately after; see the module docstring.
113
+ """
114
+ tmp_link = link_path.parent / f".{link_path.name}.next-link"
115
+ if is_dir_link(tmp_link) or tmp_link.exists():
116
+ remove_dir_link(tmp_link) if is_dir_link(tmp_link) else tmp_link.unlink()
117
+ make_dir_link(tmp_link, target)
118
+
119
+ if sys.platform == "win32":
120
+ if is_dir_link(link_path):
121
+ remove_dir_link(link_path)
122
+ tmp_link.rename(link_path)
123
+ else:
124
+ tmp_link.replace(link_path)
@@ -3712,8 +3712,29 @@ def dispatch_review(
3712
3712
  # never match the merge-time `branch_patch_id`, which is computed from an
3713
3713
  # uncapped compare-API diff). The display copy shown to the reviewer is
3714
3714
  # then truncated locally from the same fetch — no second `gh` call.
3715
+ #
3716
+ # #2364: `pr` can legitimately be `None` here — the drive-queue path
3717
+ # opens PRs lazily, so "review ran before the PR existed" is a normal
3718
+ # timing, not an edge case. Previously that made `full_diff_text`
3719
+ # (and therefore `review_patch_id` below) permanently `None` for such
3720
+ # a review, which in turn made every later `review-reaffirm` against
3721
+ # it fail forever with "missing patch-id data" even though the stored
3722
+ # verdict was a real `approve`. Fall back to a direct branch-vs-base
3723
+ # compare diff — the exact same API `github_ops.get_branch_patch_id`
3724
+ # uses at merge time to fingerprint `branch_patch_id` — so the two
3725
+ # sides of the "did the content change" question are always computed
3726
+ # the same way, whether or not a PR happens to exist yet.
3715
3727
  _diff = diff_fetcher or github_ops.pr_diff
3716
- full_diff_text = _diff(repo.github, pr["number"], max_chars=None) if pr else None
3728
+ if pr:
3729
+ full_diff_text = _diff(repo.github, pr["number"], max_chars=None)
3730
+ else:
3731
+ _compare_diff_pre_pr = compare_diff_fetcher or github_ops.get_compare_diff
3732
+ try:
3733
+ full_diff_text = _compare_diff_pre_pr(
3734
+ repo.github, base_branch, completed.branch
3735
+ )
3736
+ except Exception: # noqa: BLE001 — fail-safe: missing diff is not blocking
3737
+ full_diff_text = None
3717
3738
 
3718
3739
  # #3196: cross-check `pr_diff`'s file list against a fresh, explicit
3719
3740
  # compare of the branch's own current refs before trusting it. A
@@ -3730,7 +3751,13 @@ def dispatch_review(
3730
3751
  # untrustworthy (not just that one file — a diff computed against
3731
3752
  # the wrong base is wrong throughout), so it's replaced outright by
3732
3753
  # the compare's own diff rather than patched.
3733
- if full_diff_text:
3754
+ #
3755
+ # #2364: skip entirely when `pr` is `None` — `full_diff_text` above
3756
+ # already came straight from `get_compare_diff`/*compare_diff_fetcher*,
3757
+ # the exact source this cross-check would otherwise fetch again to
3758
+ # corroborate it against. Re-running it would just spend two more
3759
+ # `gh` calls to confirm a diff agrees with itself.
3760
+ if full_diff_text and pr:
3734
3761
  _compare_files = compare_files_fetcher or github_ops.get_compare_files
3735
3762
  try:
3736
3763
  known_files = _compare_files(repo.github, base_branch, completed.branch)
@@ -24,6 +24,7 @@ from coord.agent_update import (
24
24
  perform_update,
25
25
  rollback,
26
26
  )
27
+ from coord.dirlink import is_dir_link
27
28
  from coord.platform_paths import venv_bin, venv_exe, venv_pip, venv_python
28
29
 
29
30
  #: #2684 (W4): `current_slot()`/`ensure_symlink_layout()` call `Path.resolve()`
@@ -159,7 +160,7 @@ class TestSymlinkLayout:
159
160
  active = ensure_symlink_layout(venv_dir)
160
161
 
161
162
  assert active == tmp_path / ".coord-venv.blue"
162
- assert venv_dir.is_symlink()
163
+ assert is_dir_link(venv_dir)
163
164
  assert _same_path(current_slot(venv_dir), active)
164
165
  assert (venv_dir / "marker").read_text() == "original install\n"
165
166
 
@@ -0,0 +1,192 @@
1
+ """``coord.dirlink`` -- directory links, symlink on POSIX / junction on win32 (#2842).
2
+
3
+ The win32 ``_winapi.CreateJunction`` call itself can't run on this (Linux)
4
+ CI box -- same reasoning as ``tests/test_platform_paths.py``'s Windows
5
+ cases: there is no real win32 API to call. So the win32-branch tests here
6
+ monkeypatch ``sys.platform`` and stub ``coord.dirlink``'s own
7
+ ``make_dir_link``/``remove_dir_link``/``is_dir_link`` to assert on
8
+ *orchestration* -- the thing #2842 is actually about (no atomic
9
+ single-syscall replace on that platform, so the old link must be removed
10
+ before the new one is renamed in) -- rather than on the win32 API call
11
+ itself, which only a real Windows box can exercise.
12
+
13
+ The POSIX-branch tests run the real production code path against the real
14
+ filesystem: no stubbing, because there's nothing to stub.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import sys
20
+ from pathlib import Path
21
+
22
+ import pytest
23
+
24
+ from coord.dirlink import (
25
+ is_dir_link,
26
+ make_dir_link,
27
+ read_dir_link,
28
+ remove_dir_link,
29
+ replace_dir_link,
30
+ )
31
+
32
+
33
+ # ── POSIX: real symlinks, real filesystem ───────────────────────────────
34
+
35
+
36
+ def test_make_dir_link_creates_a_real_symlink(tmp_path: Path) -> None:
37
+ if sys.platform == "win32":
38
+ pytest.skip("POSIX-only: exercises the real symlink branch")
39
+ target = tmp_path / "target"
40
+ target.mkdir()
41
+ link = tmp_path / "link"
42
+
43
+ make_dir_link(link, target)
44
+
45
+ assert link.is_symlink()
46
+ assert is_dir_link(link)
47
+ assert read_dir_link(link) == target
48
+
49
+
50
+ def test_is_dir_link_false_for_plain_directory_and_missing_path(tmp_path: Path) -> None:
51
+ plain = tmp_path / "plain"
52
+ plain.mkdir()
53
+ assert not is_dir_link(plain)
54
+ assert not is_dir_link(tmp_path / "does-not-exist")
55
+
56
+
57
+ def test_replace_dir_link_atomically_flips_to_a_new_target(tmp_path: Path) -> None:
58
+ if sys.platform == "win32":
59
+ pytest.skip("POSIX-only: exercises the real symlink rename branch")
60
+ blue = tmp_path / "slot.blue"
61
+ green = tmp_path / "slot.green"
62
+ blue.mkdir()
63
+ green.mkdir()
64
+ (blue / "marker").write_text("blue\n")
65
+ (green / "marker").write_text("green\n")
66
+ link = tmp_path / "venv"
67
+
68
+ make_dir_link(link, blue)
69
+ assert (link / "marker").read_text() == "blue\n"
70
+
71
+ replace_dir_link(link, green)
72
+
73
+ assert read_dir_link(link) == green
74
+ assert (link / "marker").read_text() == "green\n"
75
+ # Both generations survive the flip -- only the link moved.
76
+ assert (blue / "marker").read_text() == "blue\n"
77
+ # The temp link used mid-swap doesn't leak into the directory listing.
78
+ assert sorted(p.name for p in tmp_path.iterdir()) == [
79
+ "slot.blue",
80
+ "slot.green",
81
+ "venv",
82
+ ]
83
+
84
+
85
+ def test_replace_dir_link_cleans_up_a_stale_temp_link(tmp_path: Path) -> None:
86
+ if sys.platform == "win32":
87
+ pytest.skip("POSIX-only: exercises the real symlink branch")
88
+ target = tmp_path / "target"
89
+ target.mkdir()
90
+ link = tmp_path / "venv"
91
+ # Simulate a previous swap that died mid-flight, leaving the temp link
92
+ # behind -- `replace_dir_link` must not trip over it on the next call.
93
+ stale_tmp = tmp_path / ".venv.next-link"
94
+ stale_tmp.symlink_to(target, target_is_directory=True)
95
+
96
+ replace_dir_link(link, target)
97
+
98
+ assert read_dir_link(link) == target
99
+ assert not stale_tmp.exists()
100
+
101
+
102
+ def test_remove_dir_link_removes_the_link_not_the_target(tmp_path: Path) -> None:
103
+ if sys.platform == "win32":
104
+ pytest.skip("POSIX-only: exercises the real symlink branch")
105
+ target = tmp_path / "target"
106
+ target.mkdir()
107
+ (target / "marker").write_text("still here\n")
108
+ link = tmp_path / "link"
109
+ make_dir_link(link, target)
110
+
111
+ remove_dir_link(link)
112
+
113
+ assert not link.exists()
114
+ assert (target / "marker").read_text() == "still here\n"
115
+
116
+
117
+ # ── win32: orchestration, stubbed at the module seam ────────────────────
118
+
119
+
120
+ def test_replace_dir_link_on_win32_removes_old_link_before_renaming(
121
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
122
+ ) -> None:
123
+ """#2842: the bug this issue is about. win32 has no single-syscall
124
+ "replace this directory link with that one" the way POSIX `rename()`
125
+ does, so `replace_dir_link` must fall back to remove-then-rename on
126
+ that platform instead of calling `Path.replace()` on an existing
127
+ directory reparse point (which is exactly the `[WinError 5]` from the
128
+ issue). This asserts the fallback actually happens, in order, rather
129
+ than attempting the POSIX-only atomic path.
130
+ """
131
+ import coord.dirlink as dirlink_module
132
+
133
+ monkeypatch.setattr(dirlink_module.sys, "platform", "win32")
134
+ calls: list[tuple[str, Path]] = []
135
+
136
+ def fake_make_dir_link(link_path: Path, target: Path) -> None:
137
+ calls.append(("make", link_path))
138
+ link_path.mkdir()
139
+
140
+ def fake_remove_dir_link(link_path: Path) -> None:
141
+ calls.append(("remove", link_path))
142
+ link_path.rmdir()
143
+
144
+ monkeypatch.setattr(dirlink_module, "make_dir_link", fake_make_dir_link)
145
+ monkeypatch.setattr(dirlink_module, "remove_dir_link", fake_remove_dir_link)
146
+ monkeypatch.setattr(dirlink_module, "is_dir_link", lambda p: p.exists())
147
+
148
+ link = tmp_path / "venv"
149
+ link.mkdir()
150
+ target = tmp_path / "slot.green"
151
+ target.mkdir()
152
+ tmp_link = tmp_path / ".venv.next-link"
153
+
154
+ dirlink_module.replace_dir_link(link, target)
155
+
156
+ assert calls == [("make", tmp_link), ("remove", link)]
157
+ assert link.exists()
158
+ assert not tmp_link.exists()
159
+
160
+
161
+ def test_replace_dir_link_on_win32_skips_remove_when_nothing_is_there_yet(
162
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
163
+ ) -> None:
164
+ """The first-ever migration (#1241's `ensure_symlink_layout`) swaps a
165
+ link into a path that doesn't exist yet -- `remove_dir_link` must not
166
+ be called (and must not raise) in that case, on either platform.
167
+ """
168
+ import coord.dirlink as dirlink_module
169
+
170
+ monkeypatch.setattr(dirlink_module.sys, "platform", "win32")
171
+ calls: list[str] = []
172
+
173
+ def fake_make_dir_link(link_path: Path, target: Path) -> None:
174
+ calls.append("make")
175
+ link_path.mkdir()
176
+
177
+ def fake_remove_dir_link(link_path: Path) -> None:
178
+ calls.append("remove")
179
+ link_path.rmdir()
180
+
181
+ monkeypatch.setattr(dirlink_module, "make_dir_link", fake_make_dir_link)
182
+ monkeypatch.setattr(dirlink_module, "remove_dir_link", fake_remove_dir_link)
183
+ monkeypatch.setattr(dirlink_module, "is_dir_link", lambda p: p.exists())
184
+
185
+ link = tmp_path / "venv" # does not exist yet
186
+ target = tmp_path / "slot.blue"
187
+ target.mkdir()
188
+
189
+ dirlink_module.replace_dir_link(link, target)
190
+
191
+ assert calls == ["make"]
192
+ assert link.exists()
@@ -3202,6 +3202,45 @@ def test_dispatch_review_captures_patch_id(
3202
3202
  assert result.review_patch_id == "patchid-xyz"
3203
3203
 
3204
3204
 
3205
+ def test_dispatch_review_captures_patch_id_without_pr(
3206
+ two_machine_config: Config,
3207
+ ) -> None:
3208
+ """#2364: a review can legitimately run before a PR exists yet (the
3209
+ drive-queue path opens PRs lazily) — `review_patch_id` must still get
3210
+ populated in that case, via a direct branch-vs-base compare diff rather
3211
+ than `gh pr diff` (which needs a PR number). Without this,
3212
+ `review-reaffirm` permanently refuses every such approval with "missing
3213
+ patch-id data" no matter how trivial a later delta is."""
3214
+ board = Board()
3215
+ completed = _completed_assignment(machine="laptop")
3216
+ client = _FakeHTTPClient({"id": "patchid-no-pr-1"})
3217
+ compare_calls: list[tuple[str, str, str]] = []
3218
+
3219
+ def _compare_diff(repo_github: str, base: str, head: str) -> str | None:
3220
+ compare_calls.append((repo_github, base, head))
3221
+ return "diff --git a/f.py b/f.py\n+x\n"
3222
+
3223
+ result = dispatch_review(
3224
+ completed, board, two_machine_config,
3225
+ http_client=client,
3226
+ pr_lookup=lambda repo_github, **kw: None, # no PR open yet
3227
+ claude_md_reader=lambda p: "",
3228
+ issue_body_fetcher=lambda repo, num: "",
3229
+ remote_branch_checker=lambda repo, branch: True,
3230
+ branch_sha_fetcher=lambda repo, branch: "deadbeef1234",
3231
+ patch_id_computer=lambda diff_text: "patchid-no-pr",
3232
+ compare_diff_fetcher=_compare_diff,
3233
+ )
3234
+
3235
+ assert result is not None
3236
+ assert result.pr_url is None
3237
+ assert result.review_patch_id == "patchid-no-pr"
3238
+ # The compare diff must be fetched against the branch's own base/head —
3239
+ # the same shape `github_ops.get_branch_patch_id` uses at merge time —
3240
+ # not `gh pr diff` (which has no PR number to call with).
3241
+ assert compare_calls and compare_calls[0][2] == completed.branch
3242
+
3243
+
3205
3244
  def test_dispatch_review_tolerates_patch_id_fetch_failure(
3206
3245
  two_machine_config: Config,
3207
3246
  ) -> None:
@@ -41,6 +41,7 @@ from coord.agent_update import (
41
41
  rollback,
42
42
  )
43
43
  from coord.audit import query_audit_log
44
+ from coord.platform_paths import venv_bin, venv_exe, venv_pip, venv_python
44
45
 
45
46
  @pytest.fixture
46
47
  def proc_root(tmp_path: Path) -> Path:
@@ -87,19 +88,18 @@ def _run_stub(*, version: str = "9.9.9", calls: list | None = None):
87
88
  calls.append(cmd)
88
89
  if "-m" in cmd and "venv" in cmd:
89
90
  slot = Path(cmd[-1])
90
- (slot / "bin").mkdir(parents=True, exist_ok=True)
91
- for name in ("python", "pip", "coord"):
92
- f = slot / "bin" / name
93
- f.write_text("#!/bin/sh\n")
94
- f.chmod(0o755)
91
+ venv_bin(slot).mkdir(parents=True, exist_ok=True)
92
+ for target in (venv_python(slot), venv_pip(slot), venv_exe(slot, "coord")):
93
+ target.write_text("#!/bin/sh\n")
94
+ target.chmod(0o755)
95
95
  (slot / "VERSION").write_text(version)
96
96
  return subprocess.CompletedProcess(cmd, 0, "created\n", "")
97
- if cmd[0].endswith("/bin/pip") and "install" in cmd:
97
+ if Path(cmd[0]) == venv_pip(Path(cmd[0]).parent.parent) and "install" in cmd:
98
98
  return subprocess.CompletedProcess(cmd, 0, "Successfully installed\n", "")
99
- if cmd[0].endswith("/bin/python") and "-c" in cmd:
99
+ if Path(cmd[0]) == venv_python(Path(cmd[0]).parent.parent) and "-c" in cmd:
100
100
  slot = Path(cmd[0]).parent.parent
101
101
  return subprocess.CompletedProcess(cmd, 0, f"{_slot_version(slot)}\n", "")
102
- if cmd[0].endswith("/bin/coord") and "--version" in cmd:
102
+ if Path(cmd[0]) == venv_exe(Path(cmd[0]).parent.parent, "coord") and "--version" in cmd:
103
103
  slot = Path(cmd[0]).parent.parent
104
104
  return subprocess.CompletedProcess(
105
105
  cmd, 0, f"coord, version {_slot_version(slot)}\n", ""