code-coordinator 0.5.578__tar.gz → 0.5.580__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.578 → code_coordinator-0.5.580}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agent.py +24 -1
  7. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agent_update.py +36 -31
  8. code_coordinator-0.5.580/coord/dirlink.py +124 -0
  9. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent.py +71 -0
  10. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_api_error.py +20 -37
  11. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_update_bluegreen.py +2 -1
  12. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_usage_limit.py +37 -23
  13. code_coordinator-0.5.580/tests/test_dirlink.py +192 -0
  14. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_venv_live_install_2121.py +8 -8
  15. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/.gitignore +0 -0
  28. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/GOAL.md +0 -0
  30. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/LICENSE +0 -0
  31. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/README.md +0 -0
  33. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/backup.py +0 -0
  49. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/bugbash.py +0 -0
  57. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/claude_setup_token.py +0 -0
  64. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/client.py +0 -0
  66. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/codegen.py +0 -0
  67. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/backup.py +0 -0
  73. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/bugbash.py +0 -0
  74. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/ci.py +0 -0
  76. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/codegen.py +0 -0
  77. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/dr.py +0 -0
  80. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/drive.py +0 -0
  81. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/drive_queue.py +0 -0
  82. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/gate_a.py +0 -0
  83. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/gates.py +0 -0
  84. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/issues.py +0 -0
  85. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/lifecycle.py +0 -0
  86. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/machine.py +0 -0
  87. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/merge.py +0 -0
  88. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/milestone.py +0 -0
  89. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/plan_followup.py +0 -0
  90. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/plans.py +0 -0
  91. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/portal.py +0 -0
  92. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/pr.py +0 -0
  93. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/release.py +0 -0
  94. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/repo.py +0 -0
  95. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/report.py +0 -0
  96. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/review.py +0 -0
  97. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/scorecard.py +0 -0
  98. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/sessions.py +0 -0
  99. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/setup.py +0 -0
  100. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/status.py +0 -0
  101. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/store_migrate.py +0 -0
  102. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/terminal.py +0 -0
  103. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/test_gate.py +0 -0
  104. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/commands/tui.py +0 -0
  105. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/comments.py +0 -0
  106. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/config.py +0 -0
  107. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/config_reload.py +0 -0
  108. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/confirm_test.py +0 -0
  109. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/conflict_fix.py +0 -0
  110. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dao.py +0 -0
  111. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/__init__.py +0 -0
  112. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/fixture.py +0 -0
  113. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/index.html +0 -0
  114. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/reports.html +0 -0
  115. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/server.py +0 -0
  116. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dashboard/terminal.py +0 -0
  117. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/db.py +0 -0
  118. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dead_end.py +0 -0
  119. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/decomposition_chat.py +0 -0
  120. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-backup.service +0 -0
  123. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-backup.timer +0 -0
  124. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-db-backup.service +0 -0
  125. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-db-backup.sh +0 -0
  126. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-db-backup.timer +0 -0
  127. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-dr-verify.service +0 -0
  128. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-dr-verify.timer +0 -0
  129. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-drive-queue.service +0 -0
  130. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-drive-queue.timer +0 -0
  131. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-failure-notify.service +0 -0
  132. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-fleet-watchdog.service +0 -0
  133. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  134. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-notify.service +0 -0
  135. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-notify.timer +0 -0
  136. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-release-propagate.service +0 -0
  137. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-release-propagate.timer +0 -0
  138. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-release-window.service +0 -0
  139. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-release-window.timer +0 -0
  140. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-serve.service +0 -0
  141. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-web-dist-build.service +0 -0
  142. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-web-dist-build.timer +0 -0
  143. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy/coord-web.service +0 -0
  144. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy_manifest.py +0 -0
  145. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deploy_units.py +0 -0
  146. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deprecation_telemetry.py +0 -0
  147. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/deps.py +0 -0
  148. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/diagnose.py +0 -0
  149. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dispatch.py +0 -0
  150. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dispatch_liveness.py +0 -0
  151. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dist_name.py +0 -0
  152. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dr_promote.py +0 -0
  153. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/dr_verify.py +0 -0
  154. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/drive.py +0 -0
  155. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/drive_queue.py +0 -0
  156. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/drive_sessions_snapshot.py +0 -0
  157. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/drive_state.py +0 -0
  158. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/events.py +0 -0
  159. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/failure_class.py +0 -0
  160. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/failure_classifier.py +0 -0
  161. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/filelock.py +0 -0
  162. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/fleet_config_health.py +0 -0
  163. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/forge_availability.py +0 -0
  164. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/freshness.py +0 -0
  165. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gate_a.py +0 -0
  166. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gate_b.py +0 -0
  167. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gate_snapshot.py +0 -0
  168. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gates.py +0 -0
  169. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gen_board_fixture.py +0 -0
  170. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/github_ops.py +0 -0
  171. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/github_throttle.py +0 -0
  172. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/goal.py +0 -0
  173. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/graph_health.py +0 -0
  174. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/gtk_native_driver.py +0 -0
  175. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/__init__.py +0 -0
  176. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/aggregate.py +0 -0
  177. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/__init__.py +0 -0
  178. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/_ci_pin.py +0 -0
  179. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/agent_install.py +0 -0
  180. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/cargo_targets.py +0 -0
  181. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/claude_binary.py +0 -0
  182. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/config_drift.py +0 -0
  183. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  184. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/coord_web_ci_pin.py +0 -0
  185. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/deploy_lane_facts.py +0 -0
  186. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/disk.py +0 -0
  187. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/fleet_board.py +0 -0
  188. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  189. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/fleet_phantom.py +0 -0
  190. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/fleet_unit_drift.py +0 -0
  191. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/graph.py +0 -0
  192. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/graphify_cli.py +0 -0
  193. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/index_lock.py +0 -0
  194. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/issues_sync_staleness.py +0 -0
  195. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/local_machine_identity.py +0 -0
  196. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/plan_usage.py +0 -0
  197. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/pr_churn.py +0 -0
  198. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/release_cordon.py +0 -0
  199. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/repo_state.py +0 -0
  200. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/spawned_coord.py +0 -0
  201. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/stalled_pipeline.py +0 -0
  202. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/timer_active.py +0 -0
  203. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/toolchain.py +0 -0
  204. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/unit_drift.py +0 -0
  205. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/unit_enablement.py +0 -0
  206. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/wedged_drive_queue.py +0 -0
  207. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/checks/worktrees.py +0 -0
  208. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/cli.py +0 -0
  209. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/context.py +0 -0
  210. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/fleet_snapshot.py +0 -0
  211. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/models.py +0 -0
  212. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/pypi.py +0 -0
  213. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/registry.py +0 -0
  214. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/render.py +0 -0
  215. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/health/units.py +0 -0
  216. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/hooks.py +0 -0
  217. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/housekeeping.py +0 -0
  218. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/interactive.py +0 -0
  219. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/invariant_alarms.py +0 -0
  220. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/issue_store.py +0 -0
  221. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/issues_sync_status.py +0 -0
  222. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/liveness_auditor.py +0 -0
  223. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/mac_native_driver.py +0 -0
  224. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/machine_fault.py +0 -0
  225. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/machine_metrics.py +0 -0
  226. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/machine_onboard.py +0 -0
  227. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/machine_pause.py +0 -0
  228. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/machine_stats.py +0 -0
  229. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/merge_queue.py +0 -0
  230. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/milestone_chat.py +0 -0
  231. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/milestone_dispatch.py +0 -0
  232. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/milestone_gate.py +0 -0
  233. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/milestone_order.py +0 -0
  234. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/mock_author.py +0 -0
  235. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/models.py +0 -0
  236. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/network.py +0 -0
  237. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/new_issue_chat.py +0 -0
  238. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/__init__.py +0 -0
  239. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/baseline.py +0 -0
  240. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/cli.py +0 -0
  241. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/collect.py +0 -0
  242. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/digest.py +0 -0
  243. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/models.py +0 -0
  244. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/predicate.py +0 -0
  245. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/service.py +0 -0
  246. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/store.py +0 -0
  247. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notifier/transport.py +0 -0
  248. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/notify.py +0 -0
  249. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/openapi.py +0 -0
  250. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/overlap_fence.py +0 -0
  251. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/overlap_predict.py +0 -0
  252. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/parentage.py +0 -0
  253. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/parentage_github.py +0 -0
  254. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/pipeline.py +0 -0
  255. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/plan_parser.py +0 -0
  256. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/plans.py +0 -0
  257. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/platform_paths.py +0 -0
  258. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/portal_bridge.py +0 -0
  259. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/portal_store.py +0 -0
  260. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/portal_sync.py +0 -0
  261. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/pr_body_lint.py +0 -0
  262. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/prereqs.py +0 -0
  263. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/progress.py +0 -0
  264. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/providers/__init__.py +0 -0
  265. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/providers/base.py +0 -0
  266. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/providers/claude.py +0 -0
  267. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/providers/claude_pty.py +0 -0
  268. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/providers/opencode.py +0 -0
  269. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/queue_diagnose.py +0 -0
  270. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/reconcile.py +0 -0
  271. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/reconcile_tick.py +0 -0
  272. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/refine_chat.py +0 -0
  273. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/release_cordon.py +0 -0
  274. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/release_gate.py +0 -0
  275. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/release_propagate.py +0 -0
  276. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/release_verify.py +0 -0
  277. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/release_window.py +0 -0
  278. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/repo_dormancy.py +0 -0
  279. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/repo_edit.py +0 -0
  280. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/repo_onboard.py +0 -0
  281. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/reports.py +0 -0
  282. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/rest_schema.py +0 -0
  283. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/restart_cmd.py +0 -0
  284. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/revalidate.py +0 -0
  285. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/review.py +0 -0
  286. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/scorecard.py +0 -0
  287. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/self_health.py +0 -0
  288. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/serve_app.py +0 -0
  289. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  290. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  291. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  292. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  293. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  294. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/portal-followup/SKILL.md +0 -0
  295. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/release-now/SKILL.md +0 -0
  296. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  297. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  298. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/skills/update-issue/SKILL.md +0 -0
  299. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/smoke.py +0 -0
  300. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/smoke_tags.py +0 -0
  301. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/spend_ceiling.py +0 -0
  302. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/split_work.py +0 -0
  303. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/sql.py +0 -0
  304. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/stage_projection.py +0 -0
  305. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/state.py +0 -0
  306. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/store_migrate.py +0 -0
  307. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/store_parity.py +0 -0
  308. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/templates/deploy-cloudflare.node.yml +0 -0
  309. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/test_author.py +0 -0
  310. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/test_chat.py +0 -0
  311. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/test_orchestrator.py +0 -0
  312. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/test_report.py +0 -0
  313. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/tui_pty_driver.py +0 -0
  314. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/tui_release.py +0 -0
  315. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/uat_checks.py +0 -0
  316. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/usage.py +0 -0
  317. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/usage_limits.py +0 -0
  318. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/usage_rollup.py +0 -0
  319. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/win_native_bridge.py +0 -0
  320. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/win_native_driver.py +0 -0
  321. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coord/worker_events.py +0 -0
  322. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/coordinator.example.yml +0 -0
  323. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-agent.service +0 -0
  324. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-backup.service +0 -0
  325. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-backup.timer +0 -0
  326. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-db-backup.service +0 -0
  327. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-db-backup.sh +0 -0
  328. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-db-backup.timer +0 -0
  329. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-dr-verify.service +0 -0
  330. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-dr-verify.timer +0 -0
  331. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-drive-queue.service +0 -0
  332. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-drive-queue.timer +0 -0
  333. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-failure-notify.service +0 -0
  334. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-failure-notify.sh +0 -0
  335. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-fleet-watchdog.service +0 -0
  336. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-fleet-watchdog.timer +0 -0
  337. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-notify.service +0 -0
  338. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-notify.timer +0 -0
  339. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-release-propagate.service +0 -0
  340. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-release-propagate.timer +0 -0
  341. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-release-window.service +0 -0
  342. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-release-window.timer +0 -0
  343. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-serve.service +0 -0
  344. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-web-dist-build.service +0 -0
  345. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-web-dist-build.sh +0 -0
  346. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-web-dist-build.timer +0 -0
  347. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-web-rollback.sh +0 -0
  348. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/coord-web.service +0 -0
  349. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/deploy/node-shim.sh +0 -0
  350. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ADR_COORD_TUI_CI.md +0 -0
  351. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  352. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ADR_COORD_WEB_CI.md +0 -0
  353. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ADR_COORD_WEB_DIST.md +0 -0
  354. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  355. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/AGENT_OPERATIONS.md +0 -0
  356. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ARCHITECTURE.md +0 -0
  357. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ARCH_SECURITY_GATES.md +0 -0
  358. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/COCKPIT.md +0 -0
  359. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/CONTROL_CENTER.md +0 -0
  360. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/COST_DISCIPLINE.md +0 -0
  361. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/CROSS_PLATFORM.md +0 -0
  362. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/CUSTOMER_FACING_APPS.md +0 -0
  363. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/CUSTOMER_PORTAL.md +0 -0
  364. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/DATA_STORE_SELECTION.md +0 -0
  365. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/DISASTER_RECOVERY.md +0 -0
  366. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/DRIVE_QUEUE.md +0 -0
  367. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/EPHEMERAL_WORKERS.md +0 -0
  368. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/FORGE_MIGRATION.md +0 -0
  369. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/GRAPHIFY_SETUP.md +0 -0
  370. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ISSUE_GUIDANCE.md +0 -0
  371. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/MAC_MINI.md +0 -0
  372. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  373. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/NOTIFIER.md +0 -0
  374. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/OPENCODE_VERIFICATION.md +0 -0
  375. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/OPERATING_GOTCHAS.md +0 -0
  376. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/OPERATOR_GUIDES.md +0 -0
  377. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/ORACLE_LOOP.md +0 -0
  378. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/PHONE_WEBAPP.md +0 -0
  379. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/PIPELINE_V2.md +0 -0
  380. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/PLATFORM_EVOLUTION.md +0 -0
  381. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/SECOND_BACKEND.md +0 -0
  382. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/STORE_SERVICE.md +0 -0
  383. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  384. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/WEB_CONTROL_CENTER.md +0 -0
  385. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/WSL_WINDOWS_WORKER.md +0 -0
  386. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/mocks/web/README.md +0 -0
  387. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/mocks/web/_tokens.css +0 -0
  388. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/mocks/web/issue-detail.html +0 -0
  389. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/mocks/web/pipeline-narrow.html +0 -0
  390. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/docs/mocks/web/pipeline-wide.html +0 -0
  391. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/graphify-out/.gitignore +0 -0
  392. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/install-agent.sh +0 -0
  393. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/pyproject.toml +0 -0
  394. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/audit_review_verdict_overrides.py +0 -0
  395. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  396. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/build-worker-image.sh +0 -0
  397. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/coordinator-machine.py +0 -0
  398. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/dr-down.sh +0 -0
  399. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/dr-up.sh +0 -0
  400. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/epic-down.sh +0 -0
  401. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/epic-up.sh +0 -0
  402. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/preflight.sh +0 -0
  403. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/provision-server.sh +0 -0
  404. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/provision-worker.sh +0 -0
  405. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  406. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  407. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/throwaway-vm.sh +0 -0
  408. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/azure-workers/verify-github-token.sh +0 -0
  409. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/check_gh_argv_containment.py +0 -0
  410. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/codegen.py +0 -0
  411. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-test-runner.sh +0 -0
  412. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  413. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  414. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  415. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  416. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/coord-venv-rollback.sh +0 -0
  417. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/extract-coord-tui.sh +0 -0
  419. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/fleet_watchdog.py +0 -0
  420. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/gen_board_fixture.py +0 -0
  421. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/gen_mock_index.py +0 -0
  422. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/lib/provision-core.sh +0 -0
  423. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/next_release_tag.py +0 -0
  424. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/provision-machine.sh +0 -0
  425. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/run_tests_in_populated_home.sh +0 -0
  426. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/run_tests_without_gh.sh +0 -0
  427. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/setup-macmini.sh +0 -0
  428. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/smoke_437_interactive.py +0 -0
  429. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/verify-provision-noble.sh +0 -0
  430. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/verify_878_review_capture.py +0 -0
  431. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/verify_release_published.py +0 -0
  432. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/scripts/verify_release_wheel.py +0 -0
  433. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/setup.cfg +0 -0
  434. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/SMOKE_SET.md +0 -0
  435. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/__init__.py +0 -0
  436. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-37/conftest.py +0 -0
  437. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-37/contract.md +0 -0
  438. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-37/manifest.yml +0 -0
  439. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  440. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  441. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/contract.md +0 -0
  442. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  443. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  444. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/manifest.yml +0 -0
  445. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-51/tsconfig.json +0 -0
  447. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  448. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/backends.py +0 -0
  449. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/conftest.py +0 -0
  450. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/board-pipeline-basic.json +0 -0
  451. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  452. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  453. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  454. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  455. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/all_pass.json +0 -0
  456. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  457. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/mixed_fail.json +0 -0
  458. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  459. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  460. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/skip.json +0 -0
  461. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/playwright/truncated.json +0 -0
  462. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  463. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  464. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  465. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  466. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  467. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  468. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  469. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  470. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  471. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_acceptance.py +0 -0
  472. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_acceptance_drivers.py +0 -0
  473. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_app.py +0 -0
  474. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_branch_base.py +0 -0
  475. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_branch_capture.py +0 -0
  476. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_config_free_1712.py +0 -0
  477. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_deploy_units_endpoint.py +0 -0
  478. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_dirty_worktree.py +0 -0
  479. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  480. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_graph_self_heal.py +0 -0
  481. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_health_h3.py +0 -0
  482. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_idle_restart.py +0 -0
  483. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_push_failure.py +0 -0
  484. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_reap.py +0 -0
  485. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_repos_and_pull.py +0 -0
  486. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_restart_services_endpoint.py +0 -0
  487. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_skills_self_heal.py +0 -0
  488. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_startup_diagnostics.py +0 -0
  489. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_update.py +0 -0
  490. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approve_capability_reroute_3241.py +0 -0
  493. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approve_dependency_busy_2804.py +0 -0
  494. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approve_reject_plan.py +0 -0
  495. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approve_usage_gate.py +0 -0
  496. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approved_work_2532.py +0 -0
  497. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_approved_work_2996.py +0 -0
  498. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_assignment_already_recorded_daemon.py +0 -0
  499. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_audit_log.py +0 -0
  500. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_audit_outcome.py +0 -0
  501. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_audit_query.py +0 -0
  502. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_auto_loop.py +0 -0
  503. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_auto_release_publish_2035.py +0 -0
  504. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_backend_selection.py +0 -0
  505. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_backup.py +0 -0
  506. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_schema.py +0 -0
  512. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_bugbash.py +0 -0
  519. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_check_gh_argv_containment.py +0 -0
  522. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_acceptance_gate_1950.py +0 -0
  523. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_fix.py +0 -0
  524. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_github.py +0 -0
  525. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_gitlab.py +0 -0
  526. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_parity_2091.py +0 -0
  527. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_ci_store.py +0 -0
  528. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_claim.py +0 -0
  529. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_claude_md_budget.py +0 -0
  530. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_claude_setup_token.py +0 -0
  531. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_acceptance.py +0 -0
  532. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_assign.py +0 -0
  533. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  534. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_assign_interactive_remote.py +0 -0
  535. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_assign_provider.py +0 -0
  536. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  537. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_audit.py +0 -0
  538. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_chat_continue.py +0 -0
  539. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_ci.py +0 -0
  540. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_codegen.py +0 -0
  541. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_decide.py +0 -0
  542. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_capability_rules.py +0 -0
  543. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_config_provenance.py +0 -0
  544. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_forge_availability.py +0 -0
  545. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_graph.py +0 -0
  546. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_self.py +0 -0
  547. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_diagnose_test_coverage.py +0 -0
  548. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_doctor.py +0 -0
  549. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_doctor_config_free_1801.py +0 -0
  550. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  551. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  552. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_drive_queue.py +0 -0
  554. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_escalate.py +0 -0
  555. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_fix_headless_review.py +0 -0
  556. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_gate_a.py +0 -0
  557. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_install_drift.py +0 -0
  558. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_install_skills.py +0 -0
  559. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_issue_comment.py +0 -0
  560. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_issue_create_label.py +0 -0
  561. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_issue_reopen.py +0 -0
  562. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_issue_view_list.py +0 -0
  563. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_issues.py +0 -0
  564. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_merge.py +0 -0
  565. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_assign.py +0 -0
  566. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_capture.py +0 -0
  567. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_chat_add_child.py +0 -0
  568. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_dispatch.py +0 -0
  569. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_gate_b.py +0 -0
  570. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_gate_c.py +0 -0
  571. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_order.py +0 -0
  572. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  573. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_milestone_ship.py +0 -0
  574. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_network.py +0 -0
  575. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_new_issue_chat.py +0 -0
  576. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_plans.py +0 -0
  577. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_portal.py +0 -0
  578. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_pr.py +0 -0
  579. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_pull_artifact.py +0 -0
  580. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_queue.py +0 -0
  581. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_reattach_sessions.py +0 -0
  582. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_refine_board.py +0 -0
  583. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_release_preflight.py +0 -0
  584. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_release_propagate.py +0 -0
  585. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_release_window.py +0 -0
  586. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_repo_2220.py +0 -0
  587. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  588. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_scorecard.py +0 -0
  589. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_serve_store_backend_3084.py +0 -0
  590. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_set_review_findings.py +0 -0
  591. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_advisory_terminal.py +0 -0
  592. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_contested_tag.py +0 -0
  593. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_invariant_alarms.py +0 -0
  594. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_machine_fault.py +0 -0
  595. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_merge_queue.py +0 -0
  596. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_provider.py +0 -0
  597. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_retried_3340.py +0 -0
  598. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_review_finalizing.py +0 -0
  599. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_supervisor_3366.py +0 -0
  600. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_test_failed_tag.py +0 -0
  601. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_status_usage_limit.py +0 -0
  602. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_sync_comments_873.py +0 -0
  603. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_test_plan.py +0 -0
  604. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_track.py +0 -0
  605. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_tui_update.py +0 -0
  606. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cli_wait.py +0 -0
  607. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_client.py +0 -0
  608. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_client_base_install.py +0 -0
  609. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_client_config_cache_atomic_3052.py +0 -0
  610. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_client_resource_migration_1946.py +0 -0
  611. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_commands_common.py +0 -0
  612. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_comments.py +0 -0
  613. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_completion_summary.py +0 -0
  614. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config.py +0 -0
  615. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_acceptance.py +0 -0
  616. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_audit.py +0 -0
  617. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_drift_check.py +0 -0
  618. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_effective.py +0 -0
  619. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_pricing.py +0 -0
  620. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  621. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_config_usage_gate.py +0 -0
  622. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_confirm_test.py +0 -0
  623. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_conflict_fix.py +0 -0
  624. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_conflict_fix_semantic.py +0 -0
  625. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  626. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  628. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test_runner_baseline.py +0 -0
  629. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test_runner_populated_home.py +0 -0
  630. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test_runner_routing.py +0 -0
  631. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_test_runner_toolchain.py +0 -0
  632. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_uat.py +0 -0
  633. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coord_web_sse_restart_live.py +0 -0
  634. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_coordinator_machine.py +0 -0
  635. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_cross_platform_imports.py +0 -0
  636. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dao.py +0 -0
  637. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard.py +0 -0
  638. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_api.py +0 -0
  639. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_fixture.py +0 -0
  640. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_reports.py +0 -0
  641. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_server.py +0 -0
  642. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_terminal.py +0 -0
  643. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dashboard_terminal_live.py +0 -0
  644. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_db.py +0 -0
  645. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dead_end.py +0 -0
  646. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_decomposition_chat.py +0 -0
  647. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_coord_db_backup.py +0 -0
  648. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_coord_web_dist.py +0 -0
  649. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_coord_web_rollback.py +0 -0
  650. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_db_backup_unit.py +0 -0
  651. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_drive_queue_unit.py +0 -0
  652. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_failure_notify_unit.py +0 -0
  653. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_manifest.py +0 -0
  654. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_notify_unit.py +0 -0
  655. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_units_lane.py +0 -0
  656. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deploy_web_unit.py +0 -0
  657. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deprecation_telemetry.py +0 -0
  658. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_deps.py +0 -0
  659. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_diagnose.py +0 -0
  660. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dispatch.py +0 -0
  661. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dispatch_liveness.py +0 -0
  662. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dispatch_target_validation.py +0 -0
  663. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dispatch_workers.py +0 -0
  664. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dist_name.py +0 -0
  665. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_done_housekeeping.py +0 -0
  666. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dr_azure_scripts.py +0 -0
  667. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dr_promote.py +0 -0
  668. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_dr_verify.py +0 -0
  669. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive.py +0 -0
  670. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_machine_fault.py +0 -0
  671. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue.py +0 -0
  672. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_blocked_rendering.py +0 -0
  673. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_launch_argv.py +0 -0
  674. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_max_parallel_config.py +0 -0
  675. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  676. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_roll_pending.py +0 -0
  677. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  678. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_sessions_snapshot.py +0 -0
  679. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_state.py +0 -0
  680. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_drive_tmux.py +0 -0
  681. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_epic_up_capability_detection.py +0 -0
  682. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  683. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_epic_up_image_provenance.py +0 -0
  684. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_errors.py +0 -0
  685. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_events.py +0 -0
  686. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_failure_class.py +0 -0
  687. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_failure_classifier.py +0 -0
  688. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_filelock.py +0 -0
  689. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  690. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fix_escalation_classifier.py +0 -0
  691. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fix_of_force_override.py +0 -0
  692. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fleet_config_health.py +0 -0
  693. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fleet_health_probes.py +0 -0
  694. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fleet_health_snapshot.py +0 -0
  695. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_fleet_watchdog.py +0 -0
  696. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_forge_availability.py +0 -0
  697. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_freshness.py +0 -0
  698. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gate_a.py +0 -0
  699. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gate_b.py +0 -0
  700. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gate_snapshot_staleness.py +0 -0
  701. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gates.py +0 -0
  702. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  703. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gen_mock_index.py +0 -0
  704. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_generated_rust_fixture.py +0 -0
  705. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_generated_rust_requests.py +0 -0
  706. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_generated_types_fixture.py +0 -0
  707. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_github_ops.py +0 -0
  708. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_github_throttle.py +0 -0
  709. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_goal.py +0 -0
  710. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_graph_health.py +0 -0
  711. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_graph_selfheal_absent_2237.py +0 -0
  712. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_gtk_native_driver.py +0 -0
  713. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_handoff.py +0 -0
  714. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_checks.py +0 -0
  715. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_cli.py +0 -0
  716. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_cli_graph.py +0 -0
  717. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_config.py +0 -0
  718. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_context.py +0 -0
  719. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_coord_tui_ci_pin.py +0 -0
  720. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_coord_web_ci_pin.py +0 -0
  721. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_deploy_lane_facts.py +0 -0
  722. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_fix.py +0 -0
  723. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_incident_regression.py +0 -0
  724. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_issues_sync_staleness.py +0 -0
  725. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_pr_churn.py +0 -0
  726. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_pypi.py +0 -0
  727. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_registry.py +0 -0
  728. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_release_cordon_probe.py +0 -0
  729. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_timer_active.py +0 -0
  730. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_toolchain.py +0 -0
  731. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_unit_drift.py +0 -0
  732. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_unit_enablement.py +0 -0
  733. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_health_wedged_drive_queue.py +0 -0
  734. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_hooks.py +0 -0
  735. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_housekeeping.py +0 -0
  736. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_human_attended_437.py +0 -0
  737. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_init.py +0 -0
  738. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_install_agent_capabilities_3515.py +0 -0
  739. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_install_agent_venv_2911.py +0 -0
  740. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  741. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_integration.py +0 -0
  742. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive.py +0 -0
  743. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_briefing_echo.py +0 -0
  744. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_pane_log_2541.py +0 -0
  745. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_prefill_state.py +0 -0
  746. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_session_relaunch.py +0 -0
  747. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_test_verdict_backstop.py +0 -0
  748. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_token_attribution.py +0 -0
  749. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_interactive_worktree.py +0 -0
  750. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_invariant_alarms.py +0 -0
  751. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_issue_store_seam.py +0 -0
  752. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_issues_sync_status.py +0 -0
  753. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_liveness_auditor.py +0 -0
  754. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_liveness_notify.py +0 -0
  755. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_lock_contention_ratchet.py +0 -0
  756. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_mac_native_driver.py +0 -0
  757. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_machine_fault.py +0 -0
  758. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_machine_metrics.py +0 -0
  759. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_machine_onboard.py +0 -0
  760. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_machine_pause.py +0 -0
  761. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_machine_stats.py +0 -0
  762. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_merge_queue.py +0 -0
  763. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_merge_verify.py +0 -0
  764. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_milestone_chat.py +0 -0
  765. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_milestone_dispatch.py +0 -0
  766. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_milestone_gate.py +0 -0
  767. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_milestone_order.py +0 -0
  768. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_milestone_seam.py +0 -0
  769. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_mock_author.py +0 -0
  770. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_model_tiering.py +0 -0
  771. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_models.py +0 -0
  772. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_models_config_labels.py +0 -0
  773. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_needs_attention.py +0 -0
  774. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_network.py +0 -0
  775. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_new_issue_chat.py +0 -0
  776. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_next_release_tag.py +0 -0
  777. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_node_shim.py +0 -0
  778. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_baseline.py +0 -0
  779. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_cli.py +0 -0
  780. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_collect.py +0 -0
  781. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_config.py +0 -0
  782. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_drive_seam.py +0 -0
  783. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_isolation.py +0 -0
  784. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_predicate.py +0 -0
  785. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_quiet_hours.py +0 -0
  786. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notifier_service.py +0 -0
  787. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notify.py +0 -0
  788. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_notify_drain.py +0 -0
  789. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_openapi.py +0 -0
  790. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_operational_defaults.py +0 -0
  791. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_overlap_fence.py +0 -0
  792. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_overlap_predict.py +0 -0
  793. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_packaged_deploy_units.py +0 -0
  794. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_parentage.py +0 -0
  795. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_paste_landed.py +0 -0
  796. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  797. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_pipeline.py +0 -0
  798. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_plan_followup_approve_plan_command.py +0 -0
  799. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_plan_followup_pr_command.py +0 -0
  800. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_plan_followup_review_command.py +0 -0
  801. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_plan_only.py +0 -0
  802. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_plan_parser.py +0 -0
  803. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_platform_paths.py +0 -0
  804. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_portal_bridge.py +0 -0
  805. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_portal_config.py +0 -0
  806. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_portal_store.py +0 -0
  807. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_portal_sync.py +0 -0
  808. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_pr_body_lint.py +0 -0
  809. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_prereqs.py +0 -0
  810. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_production_db_guard.py +0 -0
  811. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_progress.py +0 -0
  812. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_provider_seam.py +0 -0
  813. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_providers.py +0 -0
  814. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_providers_config_labels.py +0 -0
  815. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_providers_pty.py +0 -0
  816. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_provision_core.py +0 -0
  817. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_provision_machine.py +0 -0
  818. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_py_rust_mirror_inventory.py +0 -0
  819. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_quiet_hours.py +0 -0
  820. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_quiet_hours_store_2146.py +0 -0
  821. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reap_merged_sessions.py +0 -0
  822. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reap_stale_interactive_tick.py +0 -0
  823. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile.py +0 -0
  824. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_branch.py +0 -0
  825. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_completions.py +0 -0
  826. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  827. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_merges.py +0 -0
  828. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_no_agent_record.py +0 -0
  829. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_tick.py +0 -0
  830. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reconcile_usage_limit_done.py +0 -0
  831. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_refine_chat.py +0 -0
  832. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_cordon_2101.py +0 -0
  833. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  834. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_cordon_deadlock_2240.py +0 -0
  835. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  836. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_cordon_stuck_2490.py +0 -0
  837. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_gate.py +0 -0
  838. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_propagate.py +0 -0
  839. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_propagate_threshold.py +0 -0
  840. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_roll_between_legs_2854.py +0 -0
  841. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_roll_window_handoff.py +0 -0
  842. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_unified_1242.py +0 -0
  843. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_verify.py +0 -0
  844. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_release_window.py +0 -0
  845. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_remote_auto_prune.py +0 -0
  846. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_remote_interactive_reaper.py +0 -0
  847. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_add.py +0 -0
  848. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_dormancy.py +0 -0
  849. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_edit_2220.py +0 -0
  850. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_graph_fleet_2237.py +0 -0
  851. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_max_parallel_3423.py +0 -0
  852. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_repo_onboard_2220.py +0 -0
  853. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_report_public_export.py +0 -0
  854. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_report_result_push.py +0 -0
  855. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_reports.py +0 -0
  856. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_restart_cmd.py +0 -0
  857. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_retry.py +0 -0
  858. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_retry_advisory_1606.py +0 -0
  859. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_retry_escalation_classify_3360.py +0 -0
  860. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_retry_type_1636.py +0 -0
  861. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_revalidate.py +0 -0
  862. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review.py +0 -0
  863. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_end_review_without_verdict.py +0 -0
  864. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_parse_failure_diagnostic.py +0 -0
  865. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_reaffirm.py +0 -0
  866. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_state.py +0 -0
  867. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_verdict_backstop.py +0 -0
  868. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_verdict_override_audit.py +0 -0
  869. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_verdict_relay.py +0 -0
  870. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_review_zero_commits.py +0 -0
  871. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_scoped_review_wiring.py +0 -0
  872. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_scorecard.py +0 -0
  873. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_self_health.py +0 -0
  874. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_serve.py +0 -0
  875. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_serve_app.py +0 -0
  876. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_serve_app_board_trim.py +0 -0
  877. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_serve_rest_routes.py +0 -0
  878. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_session.py +0 -0
  879. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_slice_issue_attribution.py +0 -0
  880. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_smoke.py +0 -0
  881. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  882. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_smoke_live_checkout_restore.py +0 -0
  883. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_smoke_workflow.py +0 -0
  884. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_spend_ceiling.py +0 -0
  885. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_spend_ceiling_coordinator.py +0 -0
  886. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_split.py +0 -0
  887. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_split_work.py +0 -0
  888. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_sql_dialect.py +0 -0
  889. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_sqlite_connect_ratchet.py +0 -0
  890. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stage_projection.py +0 -0
  891. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stale_busy_reviewer_697.py +0 -0
  892. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stalled_pipeline.py +0 -0
  893. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_state.py +0 -0
  894. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_state_review_findings_daemon.py +0 -0
  895. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_status_fleet_footer.py +0 -0
  896. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stop_1567.py +0 -0
  897. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_store_contract.py +0 -0
  898. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_store_migrate.py +0 -0
  899. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stuck.py +0 -0
  900. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  901. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_terminal_command.py +0 -0
  902. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_author.py +0 -0
  903. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_chat.py +0 -0
  904. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_orchestrator.py +0 -0
  905. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_report.py +0 -0
  906. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_verdict_parsing.py +0 -0
  907. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_test_verdict_transcript_floor.py +0 -0
  908. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_text_io_encoding_audit.py +0 -0
  909. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_thin_client_board_audit.py +0 -0
  910. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_thin_client_config_load_1080.py +0 -0
  911. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_thin_client_daemon_routing_906.py +0 -0
  912. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_throwaway_vm.py +0 -0
  913. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_tmux_host.py +0 -0
  914. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_tmux_session.py +0 -0
  915. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_transcript_floor.py +0 -0
  916. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_tui_pty_driver.py +0 -0
  917. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_uat_checks.py +0 -0
  918. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_usage.py +0 -0
  919. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_usage_limits.py +0 -0
  920. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_usage_rollup.py +0 -0
  921. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_version_single_source.py +0 -0
  922. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_watch.py +0 -0
  923. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_win_native_bridge.py +0 -0
  924. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_win_native_driver.py +0 -0
  925. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  926. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worker_env_venv_isolation.py +0 -0
  927. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worker_events.py +0 -0
  928. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worker_image_pin_sync.py +0 -0
  929. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worker_safety.py +0 -0
  930. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worker_test_scoping.py +0 -0
  931. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worktree.py +0 -0
  932. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  933. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/tests/test_write_parity.py +0 -0
  934. {code_coordinator-0.5.578 → code_coordinator-0.5.580}/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.578
3
+ Version: 0.5.580
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.578
3
+ Version: 0.5.580
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.578",
2
+ "tag": "0.5.580",
3
3
  "distance": 0,
4
- "node": "g27497ebf63627571d2a865a710e3c9c502a8053d",
4
+ "node": "gd3b3a8b69209767b94d3b03aeea8d17b2a32d9f9",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -634,8 +634,31 @@ def _maybe_bash_wrap(argv: list[str], enabled: bool) -> list[str]:
634
634
  stdin pipe, and process-group kills all behave identically to a bare
635
635
  spawn. This is the upstream headline fix for the daemon-spawn freeze
636
636
  (anthropics/claude-code#56268). When disabled, the bare argv is returned.
637
+
638
+ #2843: a no-op on win32 regardless of *enabled*. `bash_wrap_spawn`
639
+ defaults to ``True`` (``ConcurrencyConfig.bash_wrap_spawn`` /
640
+ ``AgentServer.__init__``'s own default) with no platform guard anywhere
641
+ upstream of this call, so every assignment on a win32 agent — including
642
+ every fixture across ``tests/test_agent*.py`` that never explicitly sets
643
+ ``bash_wrap_spawn=False`` — silently routed through here. Two independent
644
+ reasons this must not reach a real ``bash`` on win32, not one:
645
+ (1) a POSIX shell is not guaranteed present at all (no shell, no
646
+ worktree-isolation guarantee the wrap exists to provide); and (2) even
647
+ where one IS present (Git for Windows' bundled MSYS bash on the
648
+ `windows-latest` runner), its `exec` builtin does not replace the process
649
+ image for a native (non-Cygwin/MSYS) executable the way POSIX `exec()`
650
+ does — so the "same PID, process-group kills behave identically to a
651
+ bare spawn" invariant this whole mitigation depends on does not hold,
652
+ and wrapping would be actively wrong there, not merely unavailable.
653
+ Measured root cause of the W11 cluster (#2843, child of #2680): the
654
+ worker process never spawned (or spawned under a PID the reaper's
655
+ bookkeeping didn't expect), so `_reap` observed a failure shape and the
656
+ assignment landed FAILED where every one of these tests expects
657
+ DONE/ADVISORY/REFUSED_*. This is a platform-assumption bug in THIS
658
+ function, not a process-group/Job-Objects runtime dependency — #1163
659
+ (CP-7, Job Objects) is unrelated and not needed to fix it.
637
660
  """
638
- if not enabled:
661
+ if not enabled or sys.platform == "win32":
639
662
  return argv
640
663
  return ["bash", "-c", "exec " + shlex.join(argv)]
641
664
 
@@ -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)
@@ -576,6 +576,27 @@ def test_assign_unknown_binary_marks_failed(tmp_path: Path) -> None:
576
576
  assert final.error is not None
577
577
 
578
578
 
579
+ # #2843: `_maybe_bash_wrap`'s whole `enabled=True` branch spawns a real
580
+ # `bash -c 'exec ...'` parent — a POSIX shell with POSIX `exec()` semantics
581
+ # (process-image replacement, same PID). On win32 this is now a deliberate
582
+ # no-op (see `_maybe_bash_wrap`'s own docstring): bash isn't guaranteed
583
+ # present, and Git for Windows' bundled MSYS bash doesn't give the
584
+ # same-PID/process-group invariant this mitigation depends on even when it
585
+ # is. The tests marked with this skip exist specifically to exercise that
586
+ # POSIX-only wrapping, so they skip on win32 rather than assert a behavior
587
+ # the fix deliberately disables there — root cause and measurement in
588
+ # #2843 (W11, child of #2680).
589
+ _bash_wrap_posix_only = pytest.mark.skipif(
590
+ sys.platform == "win32",
591
+ reason="exercises _maybe_bash_wrap's real bash -c 'exec ...' wrapping, "
592
+ "which coord/agent.py now no-ops on win32 (#2843) — bash isn't "
593
+ "guaranteed present, and where it is (Git for Windows' MSYS bash) its "
594
+ "exec builtin doesn't preserve the PID/process-group invariant this "
595
+ "mitigation depends on",
596
+ )
597
+
598
+
599
+ @_bash_wrap_posix_only
579
600
  def test_assign_unknown_binary_bash_wrapped_marks_failed(tmp_path: Path) -> None:
580
601
  """With the bash-wrap on, an unknown binary fails via bash exec's non-zero
581
602
  exit (#299) — the assignment still ends up FAILED."""
@@ -626,6 +647,7 @@ def test_inject_message_writes_to_worker_stdin(tmp_path: Path) -> None:
626
647
  assert "# inject: second message" in log, "inject marker missing from log"
627
648
 
628
649
 
650
+ @_bash_wrap_posix_only
629
651
  def test_maybe_bash_wrap_helper() -> None:
630
652
  """The pure wrap helper produces bash -c 'exec ...' when enabled (#299)."""
631
653
  from coord.agent import _maybe_bash_wrap
@@ -636,6 +658,28 @@ def test_maybe_bash_wrap_helper() -> None:
636
658
  assert wrapped == ["bash", "-c", "exec claude -p --allowedTools Read,Bash"]
637
659
 
638
660
 
661
+ def test_maybe_bash_wrap_is_a_noop_on_win32(monkeypatch) -> None:
662
+ """#2843: the whole point of the fix, pinned platform-independently.
663
+
664
+ `_maybe_bash_wrap` must return the bare argv on win32 even when
665
+ `enabled=True` — this is what makes `bash_wrap_spawn`'s default-True
666
+ harmless there instead of routing every assignment through a `bash`
667
+ that isn't guaranteed present (and, where it is — Git for Windows'
668
+ MSYS bash — doesn't preserve the same-PID invariant the wrap exists
669
+ for). Runs on every platform (monkeypatches `coord.agent.sys.platform`
670
+ rather than requiring an actual win32 host), so this regression-guards
671
+ the fix on the Linux/macOS CI that actually exercises it.
672
+ """
673
+ import coord.agent as agent_mod
674
+ from coord.agent import _maybe_bash_wrap
675
+
676
+ argv = ["claude", "-p"]
677
+ monkeypatch.setattr(agent_mod.sys, "platform", "win32")
678
+ assert _maybe_bash_wrap(argv, enabled=True) == argv
679
+ assert _maybe_bash_wrap(argv, enabled=False) == argv
680
+
681
+
682
+ @_bash_wrap_posix_only
639
683
  def test_spawn_bash_wrap_enabled_routes_through_bash(tmp_path: Path) -> None:
640
684
  """With bash_wrap_spawn=True, _spawn launches via bash -c 'exec ...'."""
641
685
  import coord.agent as agent_mod
@@ -4367,7 +4411,33 @@ def test_stash_artifacts_for_branch_partial_miss_logs_named_glob(
4367
4411
 
4368
4412
  # ── #1323: build_command runs before stash (fix #3) ──────────────────────────
4369
4413
 
4414
+ # #2843 investigation note (NOT the W11 reap-lifecycle cluster this issue is
4415
+ # otherwise about, and NOT #1163 either): `_run_pre_stash_build`
4416
+ # (coord/agent.py) unconditionally runs the operator-authored
4417
+ # `build_commands` string from coordinator.yml via `["/bin/sh", "-c", ...]`.
4418
+ # That's a real win32 gap — there is no `/bin/sh` on Windows — but it is a
4419
+ # DIFFERENT, pre-existing limitation from the reap-status-stuck-on-FAILED
4420
+ # signature #2843 targets (this fails a log-content assertion about the
4421
+ # build command's own output, never the assignment's status), and the two
4422
+ # tests below each hand it a POSIX-only shell snippet (`printf
4423
+ # "\\x7fELF%0200d" ...`, `exit 42`) as their `build_commands` value, so even
4424
+ # swapping the interpreter for `cmd /c` would not make them portable — the
4425
+ # fixture content itself is shell-specific, not just the dispatch mechanism.
4426
+ # Porting `build_commands` cross-platform (cmd.exe/PowerShell translation of
4427
+ # an arbitrary operator-authored shell string) is real, separate scope this
4428
+ # slice does not take on; skip rather than half-port.
4429
+ _build_command_posix_only = pytest.mark.skipif(
4430
+ sys.platform == "win32",
4431
+ reason="build_commands (coordinator.yml) runs via `/bin/sh -c` "
4432
+ "(coord.agent._run_pre_stash_build) and these two tests' own "
4433
+ "build_commands values are POSIX shell snippets — no `/bin/sh` on "
4434
+ "Windows, and no portable stand-in without a cross-platform "
4435
+ "build_commands port (separate from #2843's W11 reap-lifecycle cluster "
4436
+ "and from #1163's Job Objects/ConPTY/junctions scope)",
4437
+ )
4438
+
4370
4439
 
4440
+ @_build_command_posix_only
4371
4441
  def test_stash_artifacts_build_command_runs_before_glob(tmp_path: Path) -> None:
4372
4442
  """build_command is run in the worktree before the artifact glob (#1323 fix #3).
4373
4443
 
@@ -4432,6 +4502,7 @@ def test_stash_artifacts_build_command_runs_before_glob(tmp_path: Path) -> None:
4432
4502
  assert "pre-stash build" in log_text
4433
4503
 
4434
4504
 
4505
+ @_build_command_posix_only
4435
4506
  def test_stash_artifacts_build_command_logged_on_failure(tmp_path: Path) -> None:
4436
4507
  """A failing build_command is logged but does not abort the stash (#1323 fix #3).
4437
4508
 
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import json
18
18
  import subprocess
19
+ import sys
19
20
  from pathlib import Path
20
21
 
21
22
  import pytest
@@ -47,10 +48,6 @@ def repo_local_only(tmp_path: Path) -> Path:
47
48
  return repo
48
49
 
49
50
 
50
- def _shell_quote(s: str) -> str:
51
- return "'" + s.replace("'", "'\\''") + "'"
52
-
53
-
54
51
  # The #1563 evidence, verbatim shape.
55
52
  _ERROR_RESULT_EVENT = {
56
53
  "type": "result",
@@ -81,11 +78,18 @@ _OK_RESULT_EVENT = {
81
78
  }
82
79
 
83
80
 
84
- def _printf_lines(*events: dict) -> str:
85
- """Shell snippet that prints each event as one NDJSON line."""
86
- return "; ".join(
87
- f"printf '%s\\n' {_shell_quote(json.dumps(e))}" for e in events
88
- )
81
+ # Portable replacement for the POSIX-only `["/bin/sh", "-c", "printf ..."]`
82
+ # fake worker shape (#2725/#2843): `_print_lines_argv` runs the equivalent via
83
+ # `sys.executable -c` instead of a shell — no `/bin/sh` dependency, which is
84
+ # absent on Windows and was failing every test in this file at spawn time
85
+ # regardless of the `_maybe_bash_wrap` default (#2843's OTHER root cause,
86
+ # independent of the bash-wrap-default fix in `coord/agent.py`).
87
+ def _print_lines_argv(*events: dict, exit_code: int = 0) -> list[str]:
88
+ """One NDJSON line per *event*, printed via a real python child process."""
89
+ script = "".join(f"print({json.dumps(e)!r})\n" for e in events)
90
+ if exit_code:
91
+ script += f"import sys; sys.exit({exit_code})\n"
92
+ return [sys.executable, "-c", script]
89
93
 
90
94
 
91
95
  def test_terminal_api_error_recorded_failed(
@@ -100,10 +104,7 @@ def test_terminal_api_error_recorded_failed(
100
104
  repos=["api"],
101
105
  repo_paths={"api": str(repo_local_only)},
102
106
  state_dir=tmp_path / "state",
103
- worker_command=lambda spec: [
104
- "/bin/sh", "-c",
105
- _printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT),
106
- ],
107
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT),
107
108
  )
108
109
  spec = AssignmentSpec(
109
110
  repo_name="api",
@@ -134,10 +135,7 @@ def test_terminal_api_error_appears_in_log(
134
135
  repos=["api"],
135
136
  repo_paths={"api": str(repo_local_only)},
136
137
  state_dir=tmp_path / "state",
137
- worker_command=lambda spec: [
138
- "/bin/sh", "-c",
139
- _printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT),
140
- ],
138
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT),
141
139
  )
142
140
  spec = AssignmentSpec(
143
141
  repo_name="api",
@@ -168,10 +166,7 @@ def test_normal_successful_result_still_done(
168
166
  repos=["api"],
169
167
  repo_paths={"api": str(repo_local_only)},
170
168
  state_dir=tmp_path / "state",
171
- worker_command=lambda spec: [
172
- "/bin/sh", "-c",
173
- _printf_lines(_INIT_EVENT, _OK_RESULT_EVENT),
174
- ],
169
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _OK_RESULT_EVENT),
175
170
  )
176
171
  spec = AssignmentSpec(
177
172
  repo_name="api",
@@ -203,10 +198,7 @@ def test_transient_error_then_internal_retry_success_still_done(
203
198
  repos=["api"],
204
199
  repo_paths={"api": str(repo_local_only)},
205
200
  state_dir=tmp_path / "state",
206
- worker_command=lambda spec: [
207
- "/bin/sh", "-c",
208
- _printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT, _OK_RESULT_EVENT),
209
- ],
201
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT, _OK_RESULT_EVENT),
210
202
  )
211
203
  spec = AssignmentSpec(
212
204
  repo_name="api",
@@ -239,10 +231,7 @@ def test_terminal_api_error_with_nonzero_exit(
239
231
  repos=["api"],
240
232
  repo_paths={"api": str(repo_local_only)},
241
233
  state_dir=tmp_path / "state",
242
- worker_command=lambda spec: [
243
- "/bin/sh", "-c",
244
- f"{_printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT)}; exit 1",
245
- ],
234
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT, exit_code=1),
246
235
  )
247
236
  spec = AssignmentSpec(
248
237
  repo_name="api",
@@ -275,10 +264,7 @@ def test_terminal_api_error_still_captures_claude_session_id(
275
264
  repos=["api"],
276
265
  repo_paths={"api": str(repo_local_only)},
277
266
  state_dir=tmp_path / "state",
278
- worker_command=lambda spec: [
279
- "/bin/sh", "-c",
280
- _printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT),
281
- ],
267
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT),
282
268
  )
283
269
  spec = AssignmentSpec(
284
270
  repo_name="api",
@@ -325,10 +311,7 @@ def test_reap_parses_the_terminal_log_only_once(
325
311
  repos=["api"],
326
312
  repo_paths={"api": str(repo_local_only)},
327
313
  state_dir=tmp_path / "state",
328
- worker_command=lambda spec: [
329
- "/bin/sh", "-c",
330
- _printf_lines(_INIT_EVENT, _ERROR_RESULT_EVENT),
331
- ],
314
+ worker_command=lambda spec: _print_lines_argv(_INIT_EVENT, _ERROR_RESULT_EVENT),
332
315
  )
333
316
  spec = AssignmentSpec(
334
317
  repo_name="api",
@@ -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