code-coordinator 0.5.283__tar.gz → 0.5.285__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 (885) hide show
  1. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/status.py +47 -0
  7. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/network.py +146 -0
  8. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/install-agent.sh +63 -2
  9. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_doctor.py +61 -1
  10. code_coordinator-0.5.285/tests/test_install_agent_venv_2911.py +225 -0
  11. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_network.py +109 -0
  12. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/workflows/cargo-test.yml +0 -0
  23. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/.gitignore +0 -0
  26. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/GOAL.md +0 -0
  28. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/LICENSE +0 -0
  29. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/README.md +0 -0
  31. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/ci_fix.py +0 -0
  58. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/ci_gitlab.py +0 -0
  60. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/client.py +0 -0
  64. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/pr.py +0 -0
  84. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/store_migrate.py +0 -0
  92. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/config.py +0 -0
  97. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/confirm_test.py +0 -0
  99. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/conflict_fix.py +0 -0
  100. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dao.py +0 -0
  101. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dashboard/__init__.py +0 -0
  102. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dashboard/fixture.py +0 -0
  103. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dashboard/index.html +0 -0
  104. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dashboard/server.py +0 -0
  105. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dashboard/terminal.py +0 -0
  106. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/db.py +0 -0
  107. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dead_end.py +0 -0
  108. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/decomposition_chat.py +0 -0
  109. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/README.md +0 -0
  110. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-agent.service +0 -0
  111. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-db-backup.service +0 -0
  112. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-db-backup.sh +0 -0
  113. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-db-backup.timer +0 -0
  114. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-drive-queue.service +0 -0
  115. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-drive-queue.timer +0 -0
  116. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-failure-notify.service +0 -0
  117. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-fleet-watchdog.service +0 -0
  118. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  119. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-notify.service +0 -0
  120. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-notify.timer +0 -0
  121. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-release-propagate.service +0 -0
  122. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-release-propagate.timer +0 -0
  123. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-release-window.service +0 -0
  124. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-release-window.timer +0 -0
  125. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-serve.service +0 -0
  126. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-web-dist-build.service +0 -0
  127. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-web-dist-build.timer +0 -0
  128. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy/coord-web.service +0 -0
  129. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy_manifest.py +0 -0
  130. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deploy_units.py +0 -0
  131. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/events.py +0 -0
  139. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/agent_install.py +0 -0
  156. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/cargo_targets.py +0 -0
  157. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/claude_binary.py +0 -0
  158. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/coord_web_ci_pin.py +0 -0
  159. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/deploy_lane_facts.py +0 -0
  160. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/disk.py +0 -0
  161. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/fleet_board.py +0 -0
  162. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  163. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/fleet_phantom.py +0 -0
  164. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/fleet_unit_drift.py +0 -0
  165. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/graph.py +0 -0
  166. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/graphify_cli.py +0 -0
  167. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/index_lock.py +0 -0
  168. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/issues_sync_staleness.py +0 -0
  169. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/plan_usage.py +0 -0
  170. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/release_cordon.py +0 -0
  171. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/repo_state.py +0 -0
  172. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/spawned_coord.py +0 -0
  173. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/stalled_pipeline.py +0 -0
  174. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/timer_active.py +0 -0
  175. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/toolchain.py +0 -0
  176. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/unit_drift.py +0 -0
  177. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/unit_enablement.py +0 -0
  178. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/checks/worktrees.py +0 -0
  179. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/cli.py +0 -0
  180. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/context.py +0 -0
  181. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/fleet_snapshot.py +0 -0
  182. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/models.py +0 -0
  183. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/pypi.py +0 -0
  184. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/registry.py +0 -0
  185. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/render.py +0 -0
  186. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/health/units.py +0 -0
  187. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/hooks.py +0 -0
  188. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/housekeeping.py +0 -0
  189. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/interactive.py +0 -0
  190. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/issue_store.py +0 -0
  191. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/issues_sync_status.py +0 -0
  192. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/liveness_auditor.py +0 -0
  193. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/models.py +0 -0
  201. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/new_issue_chat.py +0 -0
  202. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/__init__.py +0 -0
  203. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/baseline.py +0 -0
  204. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/cli.py +0 -0
  205. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/collect.py +0 -0
  206. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/digest.py +0 -0
  207. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/models.py +0 -0
  208. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/predicate.py +0 -0
  209. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/service.py +0 -0
  210. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/store.py +0 -0
  211. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notifier/transport.py +0 -0
  212. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/notify.py +0 -0
  213. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/openapi.py +0 -0
  214. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/overlap_fence.py +0 -0
  215. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/overlap_predict.py +0 -0
  216. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/parentage.py +0 -0
  217. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/parentage_github.py +0 -0
  218. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/pipeline.py +0 -0
  219. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/plan_parser.py +0 -0
  220. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/plans.py +0 -0
  221. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/platform_paths.py +0 -0
  222. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/portal_bridge.py +0 -0
  223. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/portal_store.py +0 -0
  224. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/portal_sync.py +0 -0
  225. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/pr_body_lint.py +0 -0
  226. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/prereqs.py +0 -0
  227. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/progress.py +0 -0
  228. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/providers/__init__.py +0 -0
  229. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/providers/base.py +0 -0
  230. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/providers/claude.py +0 -0
  231. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/providers/claude_pty.py +0 -0
  232. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/providers/opencode.py +0 -0
  233. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/queue_diagnose.py +0 -0
  234. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/reconcile.py +0 -0
  235. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/reconcile_tick.py +0 -0
  236. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/refine_chat.py +0 -0
  237. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/release_cordon.py +0 -0
  238. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/release_propagate.py +0 -0
  239. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/release_verify.py +0 -0
  240. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/release_window.py +0 -0
  241. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/repo_edit.py +0 -0
  242. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/repo_onboard.py +0 -0
  243. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/reports.py +0 -0
  244. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/rest_schema.py +0 -0
  245. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/revalidate.py +0 -0
  246. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/review.py +0 -0
  247. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/scorecard.py +0 -0
  248. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/self_health.py +0 -0
  249. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/serve_app.py +0 -0
  250. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  251. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  252. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  253. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/portal-followup/SKILL.md +0 -0
  256. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/release-now/SKILL.md +0 -0
  257. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  258. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  259. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/skills/update-issue/SKILL.md +0 -0
  260. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/smoke.py +0 -0
  261. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/state.py +0 -0
  266. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/store_migrate.py +0 -0
  267. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/test_author.py +0 -0
  268. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/test_chat.py +0 -0
  269. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/test_orchestrator.py +0 -0
  270. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/test_report.py +0 -0
  271. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/tui_release.py +0 -0
  272. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/usage.py +0 -0
  273. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/usage_limits.py +0 -0
  274. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/usage_rollup.py +0 -0
  275. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coord/worker_events.py +0 -0
  276. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/coordinator.example.yml +0 -0
  277. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-agent.service +0 -0
  278. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-db-backup.service +0 -0
  279. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-db-backup.sh +0 -0
  280. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-db-backup.timer +0 -0
  281. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-drive-queue.service +0 -0
  282. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-drive-queue.timer +0 -0
  283. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-failure-notify.service +0 -0
  284. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-failure-notify.sh +0 -0
  285. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-fleet-watchdog.service +0 -0
  286. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-fleet-watchdog.timer +0 -0
  287. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-notify.service +0 -0
  288. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-notify.timer +0 -0
  289. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-release-propagate.service +0 -0
  290. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-release-propagate.timer +0 -0
  291. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-release-window.service +0 -0
  292. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-release-window.timer +0 -0
  293. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-serve.service +0 -0
  294. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-web-dist-build.service +0 -0
  295. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-web-dist-build.sh +0 -0
  296. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-web-dist-build.timer +0 -0
  297. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-web-rollback.sh +0 -0
  298. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/coord-web.service +0 -0
  299. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/deploy/node-shim.sh +0 -0
  300. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  301. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ADR_COORD_WEB_CI.md +0 -0
  302. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ADR_COORD_WEB_DIST.md +0 -0
  303. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/AGENT_OPERATIONS.md +0 -0
  304. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ARCHITECTURE.md +0 -0
  305. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ARCH_SECURITY_GATES.md +0 -0
  306. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/COCKPIT.md +0 -0
  307. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/CONTROL_CENTER.md +0 -0
  308. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/COST_DISCIPLINE.md +0 -0
  309. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/CROSS_PLATFORM.md +0 -0
  310. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/CUSTOMER_FACING_APPS.md +0 -0
  311. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/CUSTOMER_PORTAL.md +0 -0
  312. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/DRIVE_QUEUE.md +0 -0
  313. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/EPHEMERAL_WORKERS.md +0 -0
  314. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/FORGE_MIGRATION.md +0 -0
  315. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/GRAPHIFY_SETUP.md +0 -0
  316. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ISSUE_GUIDANCE.md +0 -0
  317. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/MAC_MINI.md +0 -0
  318. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  319. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/NOTIFIER.md +0 -0
  320. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/OPENCODE_VERIFICATION.md +0 -0
  321. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/OPERATING_GOTCHAS.md +0 -0
  322. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/OPERATOR_GUIDES.md +0 -0
  323. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/ORACLE_LOOP.md +0 -0
  324. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/PHONE_WEBAPP.md +0 -0
  325. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/PIPELINE_V2.md +0 -0
  326. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/PLATFORM_EVOLUTION.md +0 -0
  327. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/SECOND_BACKEND.md +0 -0
  328. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/STORE_SERVICE.md +0 -0
  329. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  330. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/WEB_CONTROL_CENTER.md +0 -0
  331. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/WSL_WINDOWS_WORKER.md +0 -0
  332. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/mocks/web/README.md +0 -0
  333. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/mocks/web/_tokens.css +0 -0
  334. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/mocks/web/issue-detail.html +0 -0
  335. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/mocks/web/pipeline-narrow.html +0 -0
  336. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/docs/mocks/web/pipeline-wide.html +0 -0
  337. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/graphify-out/.gitignore +0 -0
  338. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/pyproject.toml +0 -0
  339. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/audit_review_verdict_overrides.py +0 -0
  340. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  341. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/build-worker-image.sh +0 -0
  342. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/coordinator-machine.py +0 -0
  343. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/epic-down.sh +0 -0
  344. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/epic-up.sh +0 -0
  345. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/preflight.sh +0 -0
  346. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/provision-worker.sh +0 -0
  347. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  348. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  349. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/azure-workers/verify-github-token.sh +0 -0
  350. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/check_gh_argv_containment.py +0 -0
  351. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/codegen.py +0 -0
  352. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/coord-test-runner.sh +0 -0
  353. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/coord-venv-rollback.sh +0 -0
  354. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/drive-batch.sh +0 -0
  355. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/fleet_watchdog.py +0 -0
  356. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/gen_board_fixture.py +0 -0
  357. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/gen_mock_index.py +0 -0
  358. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/next_release_tag.py +0 -0
  359. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/run_tests_in_populated_home.sh +0 -0
  360. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/run_tests_without_gh.sh +0 -0
  361. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/smoke_437_interactive.py +0 -0
  362. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/verify_878_review_capture.py +0 -0
  363. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/verify_release_published.py +0 -0
  364. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/scripts/verify_release_wheel.py +0 -0
  365. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/setup.cfg +0 -0
  366. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/SMOKE_SET.md +0 -0
  367. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/__init__.py +0 -0
  368. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-37/conftest.py +0 -0
  369. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-37/contract.md +0 -0
  370. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-37/manifest.yml +0 -0
  371. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  372. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  373. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/contract.md +0 -0
  374. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  375. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  376. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/manifest.yml +0 -0
  377. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  378. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-51/tsconfig.json +0 -0
  379. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  380. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/backends.py +0 -0
  381. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/conftest.py +0 -0
  382. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/board-pipeline-basic.json +0 -0
  383. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  384. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  385. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  386. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  387. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/all_pass.json +0 -0
  388. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  389. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/mixed_fail.json +0 -0
  390. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  391. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  392. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/skip.json +0 -0
  393. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/playwright/truncated.json +0 -0
  394. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  395. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  396. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  397. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  398. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  399. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  400. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  401. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  402. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_acceptance.py +0 -0
  403. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_acceptance_drivers.py +0 -0
  404. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent.py +0 -0
  405. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_api_error.py +0 -0
  406. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_app.py +0 -0
  407. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_branch_base.py +0 -0
  408. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_branch_capture.py +0 -0
  409. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_config_free_1712.py +0 -0
  410. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_deploy_units_endpoint.py +0 -0
  411. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_dirty_worktree.py +0 -0
  412. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  413. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_graph_self_heal.py +0 -0
  414. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_health_h3.py +0 -0
  415. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_idle_restart.py +0 -0
  416. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_push_failure.py +0 -0
  417. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_reap.py +0 -0
  418. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_repos_and_pull.py +0 -0
  419. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_restart_services_endpoint.py +0 -0
  420. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_skills_self_heal.py +0 -0
  421. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_startup_diagnostics.py +0 -0
  422. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_update.py +0 -0
  423. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_update_bluegreen.py +0 -0
  424. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_usage_limit.py +0 -0
  425. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_agent_zero_commit.py +0 -0
  426. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ambient_home_isolation.py +0 -0
  427. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_approve_dependency_busy_2804.py +0 -0
  428. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_approve_reject_plan.py +0 -0
  429. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_approve_usage_gate.py +0 -0
  430. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_approved_work_2532.py +0 -0
  431. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_assignment_already_recorded_daemon.py +0 -0
  432. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_audit_log.py +0 -0
  433. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_audit_outcome.py +0 -0
  434. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_audit_query.py +0 -0
  435. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_auto_loop.py +0 -0
  436. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_auto_release_publish_2035.py +0 -0
  437. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_backend_selection.py +0 -0
  438. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_base_checkout_restore.py +0 -0
  439. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_block_log.py +0 -0
  440. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_cap_762.py +0 -0
  441. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_fixture.py +0 -0
  442. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_read_path.py +0 -0
  443. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_schema.py +0 -0
  444. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_service.py +0 -0
  445. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_state.py +0 -0
  446. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_board_wire.py +0 -0
  447. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_brain.py +0 -0
  448. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_branch_model.py +0 -0
  449. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_bug_intake.py +0 -0
  450. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_build_worker_image_env_update.py +0 -0
  451. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cargo_cache.py +0 -0
  452. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_check_gh_argv_containment.py +0 -0
  453. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ci_acceptance_gate_1950.py +0 -0
  454. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ci_fix.py +0 -0
  455. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ci_gitlab.py +0 -0
  456. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ci_parity_2091.py +0 -0
  457. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_ci_store.py +0 -0
  458. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_claim.py +0 -0
  459. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_claude_md_budget.py +0 -0
  460. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_acceptance.py +0 -0
  461. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_assign.py +0 -0
  462. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  463. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_assign_interactive_remote.py +0 -0
  464. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_assign_provider.py +0 -0
  465. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  466. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_audit.py +0 -0
  467. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_chat_continue.py +0 -0
  468. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_decide.py +0 -0
  469. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_diagnose_config_provenance.py +0 -0
  470. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_diagnose_forge_availability.py +0 -0
  471. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_diagnose_graph.py +0 -0
  472. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_diagnose_self.py +0 -0
  473. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_doctor_config_free_1801.py +0 -0
  474. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  475. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_drive.py +0 -0
  476. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_drive_queue.py +0 -0
  477. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_escalate.py +0 -0
  478. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_fix_headless_review.py +0 -0
  479. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_gate_a.py +0 -0
  480. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_install_drift.py +0 -0
  481. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_install_skills.py +0 -0
  482. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_issue_comment.py +0 -0
  483. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_issue_create_label.py +0 -0
  484. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_issue_reopen.py +0 -0
  485. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_issue_view_list.py +0 -0
  486. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_merge.py +0 -0
  487. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_assign.py +0 -0
  488. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_capture.py +0 -0
  489. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_chat_add_child.py +0 -0
  490. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_dispatch.py +0 -0
  491. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_gate_b.py +0 -0
  492. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_gate_c.py +0 -0
  493. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_order.py +0 -0
  494. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  495. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_milestone_ship.py +0 -0
  496. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_network.py +0 -0
  497. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_new_issue_chat.py +0 -0
  498. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_plans.py +0 -0
  499. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_portal.py +0 -0
  500. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_pr.py +0 -0
  501. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_pull_artifact.py +0 -0
  502. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_queue.py +0 -0
  503. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_reattach_sessions.py +0 -0
  504. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_refine_board.py +0 -0
  505. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_release_preflight.py +0 -0
  506. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_release_propagate.py +0 -0
  507. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_release_window.py +0 -0
  508. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_repo_2220.py +0 -0
  509. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  510. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_scorecard.py +0 -0
  511. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_set_review_findings.py +0 -0
  512. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_advisory_terminal.py +0 -0
  513. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_contested_tag.py +0 -0
  514. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_merge_queue.py +0 -0
  515. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_provider.py +0 -0
  516. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_review_finalizing.py +0 -0
  517. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_test_failed_tag.py +0 -0
  518. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_status_usage_limit.py +0 -0
  519. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_sync_comments_873.py +0 -0
  520. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_test_plan.py +0 -0
  521. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_track.py +0 -0
  522. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_tui_update.py +0 -0
  523. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cli_wait.py +0 -0
  524. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_client_base_install.py +0 -0
  525. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_commands_common.py +0 -0
  526. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_comments.py +0 -0
  527. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_completion_summary.py +0 -0
  528. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config.py +0 -0
  529. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config_acceptance.py +0 -0
  530. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config_audit.py +0 -0
  531. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config_pricing.py +0 -0
  532. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  533. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_config_usage_gate.py +0 -0
  534. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_confirm_test.py +0 -0
  535. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_conflict_fix.py +0 -0
  536. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_conflict_fix_semantic.py +0 -0
  537. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  538. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_test.py +0 -0
  539. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_test_runner_baseline.py +0 -0
  540. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_test_runner_populated_home.py +0 -0
  541. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_test_runner_routing.py +0 -0
  542. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_test_runner_toolchain.py +0 -0
  543. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_uat.py +0 -0
  544. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coord_web_sse_restart_live.py +0 -0
  545. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_coordinator_machine.py +0 -0
  546. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_cross_platform_imports.py +0 -0
  547. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dao.py +0 -0
  548. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dashboard.py +0 -0
  549. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dashboard_fixture.py +0 -0
  550. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dashboard_terminal.py +0 -0
  551. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dashboard_terminal_live.py +0 -0
  552. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_db.py +0 -0
  553. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dead_end.py +0 -0
  554. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_decomposition_chat.py +0 -0
  555. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_coord_db_backup.py +0 -0
  556. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_coord_web_dist.py +0 -0
  557. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_coord_web_rollback.py +0 -0
  558. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_drive_queue_unit.py +0 -0
  559. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_failure_notify_unit.py +0 -0
  560. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_manifest.py +0 -0
  561. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_notify_unit.py +0 -0
  562. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_units_lane.py +0 -0
  563. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deploy_web_unit.py +0 -0
  564. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_deps.py +0 -0
  565. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_diagnose.py +0 -0
  566. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dispatch.py +0 -0
  567. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dispatch_target_validation.py +0 -0
  568. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_dist_name.py +0 -0
  569. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_done_housekeeping.py +0 -0
  570. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive.py +0 -0
  571. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue.py +0 -0
  572. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue_blocked_rendering.py +0 -0
  573. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue_launch_argv.py +0 -0
  574. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  575. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue_roll_pending.py +0 -0
  576. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  577. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_state.py +0 -0
  578. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_drive_tmux.py +0 -0
  579. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_epic_up_capability_detection.py +0 -0
  580. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  581. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_epic_up_image_provenance.py +0 -0
  582. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_errors.py +0 -0
  583. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_events.py +0 -0
  584. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_failure_class.py +0 -0
  585. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_filelock.py +0 -0
  586. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  587. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_fix_of_force_override.py +0 -0
  588. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_fleet_config_health.py +0 -0
  589. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_fleet_health_probes.py +0 -0
  590. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_fleet_health_snapshot.py +0 -0
  591. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_fleet_watchdog.py +0 -0
  592. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_forge_availability.py +0 -0
  593. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_freshness.py +0 -0
  594. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gate_a.py +0 -0
  595. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gate_b.py +0 -0
  596. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gate_snapshot_staleness.py +0 -0
  597. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gates.py +0 -0
  598. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  599. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_gen_mock_index.py +0 -0
  600. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_generated_rust_fixture.py +0 -0
  601. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_generated_types_fixture.py +0 -0
  602. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_github_ops.py +0 -0
  603. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_github_throttle.py +0 -0
  604. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_goal.py +0 -0
  605. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_graph_health.py +0 -0
  606. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_graph_selfheal_absent_2237.py +0 -0
  607. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_handoff.py +0 -0
  608. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_checks.py +0 -0
  609. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_cli.py +0 -0
  610. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_cli_graph.py +0 -0
  611. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_config.py +0 -0
  612. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_context.py +0 -0
  613. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_coord_web_ci_pin.py +0 -0
  614. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_deploy_lane_facts.py +0 -0
  615. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_fix.py +0 -0
  616. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_incident_regression.py +0 -0
  617. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_issues_sync_staleness.py +0 -0
  618. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_pypi.py +0 -0
  619. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_registry.py +0 -0
  620. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_release_cordon_probe.py +0 -0
  621. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_timer_active.py +0 -0
  622. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_toolchain.py +0 -0
  623. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_unit_drift.py +0 -0
  624. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_health_unit_enablement.py +0 -0
  625. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_hooks.py +0 -0
  626. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_human_attended_437.py +0 -0
  627. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_init.py +0 -0
  628. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_integration.py +0 -0
  629. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_briefing_echo.py +0 -0
  630. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_pane_log_2541.py +0 -0
  631. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_prefill_state.py +0 -0
  632. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_session_relaunch.py +0 -0
  633. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_test_verdict_backstop.py +0 -0
  634. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_token_attribution.py +0 -0
  635. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_interactive_worktree.py +0 -0
  636. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_issue_store_seam.py +0 -0
  637. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_issues_sync_status.py +0 -0
  638. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_liveness_auditor.py +0 -0
  639. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_liveness_notify.py +0 -0
  640. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_lock_contention_ratchet.py +0 -0
  641. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_machine_pause.py +0 -0
  642. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_merge_queue.py +0 -0
  643. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_merge_verify.py +0 -0
  644. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_milestone_chat.py +0 -0
  645. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_milestone_dispatch.py +0 -0
  646. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_milestone_gate.py +0 -0
  647. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_milestone_order.py +0 -0
  648. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_milestone_seam.py +0 -0
  649. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_mock_author.py +0 -0
  650. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_model_tiering.py +0 -0
  651. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_models.py +0 -0
  652. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_models_config_labels.py +0 -0
  653. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_needs_attention.py +0 -0
  654. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_new_issue_chat.py +0 -0
  655. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_next_release_tag.py +0 -0
  656. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_node_shim.py +0 -0
  657. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_baseline.py +0 -0
  658. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_cli.py +0 -0
  659. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_collect.py +0 -0
  660. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_config.py +0 -0
  661. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_drive_seam.py +0 -0
  662. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_isolation.py +0 -0
  663. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_predicate.py +0 -0
  664. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_quiet_hours.py +0 -0
  665. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notifier_service.py +0 -0
  666. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notify.py +0 -0
  667. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_notify_drain.py +0 -0
  668. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_openapi.py +0 -0
  669. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_operational_defaults.py +0 -0
  670. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_overlap_fence.py +0 -0
  671. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_overlap_predict.py +0 -0
  672. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_packaged_deploy_units.py +0 -0
  673. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_parentage.py +0 -0
  674. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_paste_landed.py +0 -0
  675. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  676. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_pipeline.py +0 -0
  677. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_plan_followup_approve_plan_command.py +0 -0
  678. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_plan_followup_pr_command.py +0 -0
  679. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_plan_followup_review_command.py +0 -0
  680. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_plan_only.py +0 -0
  681. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_plan_parser.py +0 -0
  682. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_platform_paths.py +0 -0
  683. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_portal_bridge.py +0 -0
  684. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_portal_config.py +0 -0
  685. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_portal_store.py +0 -0
  686. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_portal_sync.py +0 -0
  687. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_pr_body_lint.py +0 -0
  688. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_prereqs.py +0 -0
  689. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_production_db_guard.py +0 -0
  690. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_progress.py +0 -0
  691. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_provider_seam.py +0 -0
  692. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_providers.py +0 -0
  693. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_providers_config_labels.py +0 -0
  694. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_providers_pty.py +0 -0
  695. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_quiet_hours.py +0 -0
  696. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_quiet_hours_store_2146.py +0 -0
  697. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reap_merged_sessions.py +0 -0
  698. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reap_stale_interactive_tick.py +0 -0
  699. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile.py +0 -0
  700. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_branch.py +0 -0
  701. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_completions.py +0 -0
  702. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  703. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_merges.py +0 -0
  704. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_no_agent_record.py +0 -0
  705. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_tick.py +0 -0
  706. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reconcile_usage_limit_done.py +0 -0
  707. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_refine_chat.py +0 -0
  708. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_cordon_2101.py +0 -0
  709. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  710. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_cordon_deadlock_2240.py +0 -0
  711. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_cordon_stuck_2490.py +0 -0
  712. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_propagate.py +0 -0
  713. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_propagate_threshold.py +0 -0
  714. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_roll_between_legs_2854.py +0 -0
  715. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_roll_window_handoff.py +0 -0
  716. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_unified_1242.py +0 -0
  717. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_verify.py +0 -0
  718. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_release_window.py +0 -0
  719. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_remote_auto_prune.py +0 -0
  720. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_remote_interactive_reaper.py +0 -0
  721. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_repo_add.py +0 -0
  722. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_repo_edit_2220.py +0 -0
  723. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_repo_graph_fleet_2237.py +0 -0
  724. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_repo_onboard_2220.py +0 -0
  725. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_report_result_push.py +0 -0
  726. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_reports.py +0 -0
  727. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_retry.py +0 -0
  728. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_retry_advisory_1606.py +0 -0
  729. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_retry_type_1636.py +0 -0
  730. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_revalidate.py +0 -0
  731. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review.py +0 -0
  732. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_end_review_without_verdict.py +0 -0
  733. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_parse_failure_diagnostic.py +0 -0
  734. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_reaffirm.py +0 -0
  735. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_state.py +0 -0
  736. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_verdict_backstop.py +0 -0
  737. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_verdict_override_audit.py +0 -0
  738. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_verdict_relay.py +0 -0
  739. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_review_zero_commits.py +0 -0
  740. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_scoped_review_wiring.py +0 -0
  741. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_scorecard.py +0 -0
  742. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_self_health.py +0 -0
  743. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_serve.py +0 -0
  744. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_serve_app_board_trim.py +0 -0
  745. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_serve_rest_routes.py +0 -0
  746. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_session.py +0 -0
  747. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_slice_issue_attribution.py +0 -0
  748. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_smoke.py +0 -0
  749. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_smoke_live_checkout_restore.py +0 -0
  750. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_smoke_workflow.py +0 -0
  751. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_spend_ceiling.py +0 -0
  752. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_spend_ceiling_coordinator.py +0 -0
  753. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_split.py +0 -0
  754. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_split_work.py +0 -0
  755. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_sql_dialect.py +0 -0
  756. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_sqlite_connect_ratchet.py +0 -0
  757. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stage_projection.py +0 -0
  758. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stale_busy_reviewer_697.py +0 -0
  759. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stalled_pipeline.py +0 -0
  760. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_state.py +0 -0
  761. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_state_review_findings_daemon.py +0 -0
  762. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_status_fleet_footer.py +0 -0
  763. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stop_1567.py +0 -0
  764. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_store_contract.py +0 -0
  765. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_store_migrate.py +0 -0
  766. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stuck.py +0 -0
  767. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  768. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_terminal_command.py +0 -0
  769. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_author.py +0 -0
  770. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_chat.py +0 -0
  771. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_orchestrator.py +0 -0
  772. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_report.py +0 -0
  773. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_verdict_parsing.py +0 -0
  774. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_test_verdict_transcript_floor.py +0 -0
  775. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_text_io_encoding_audit.py +0 -0
  776. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_thin_client_board_audit.py +0 -0
  777. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_thin_client_config_load_1080.py +0 -0
  778. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_thin_client_daemon_routing_906.py +0 -0
  779. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_tmux_host.py +0 -0
  780. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_tmux_session.py +0 -0
  781. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_transcript_floor.py +0 -0
  782. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_usage.py +0 -0
  783. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_usage_limits.py +0 -0
  784. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_usage_rollup.py +0 -0
  785. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_venv_live_install_2121.py +0 -0
  786. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_version_single_source.py +0 -0
  787. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_watch.py +0 -0
  788. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  789. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worker_env_venv_isolation.py +0 -0
  790. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worker_events.py +0 -0
  791. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worker_image_pin_sync.py +0 -0
  792. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worker_safety.py +0 -0
  793. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worker_test_scoping.py +0 -0
  794. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worktree.py +0 -0
  795. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  796. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/test_write_parity.py +0 -0
  797. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tests/write_parity.py +0 -0
  798. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/.github/workflows/release-tui.yml +0 -0
  799. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/Cargo.lock +0 -0
  800. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/Cargo.toml +0 -0
  801. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/cargo-config-local-quadraui.toml.example +0 -0
  802. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/approved.rs +0 -0
  803. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/audit.rs +0 -0
  804. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/chat.rs +0 -0
  805. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/data.rs +0 -0
  806. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/dialogs.rs +0 -0
  807. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/doc_tabs.rs +0 -0
  808. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/drive.rs +0 -0
  809. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/drive_queue.rs +0 -0
  810. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/escalation.rs +0 -0
  811. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/events.rs +0 -0
  812. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/fixtures.rs +0 -0
  813. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/fleet_health.rs +0 -0
  814. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/fleet_sessions.rs +0 -0
  815. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/fleet_terminals.rs +0 -0
  816. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/format.rs +0 -0
  817. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/milestone_dag.rs +0 -0
  818. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/mod.rs +0 -0
  819. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/msv.rs +0 -0
  820. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/pipeline.rs +0 -0
  821. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/plans.rs +0 -0
  822. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/render.rs +0 -0
  823. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/reports.rs +0 -0
  824. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/sessions.rs +0 -0
  825. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/settings_ui.rs +0 -0
  826. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/sidebar.rs +0 -0
  827. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/terminal.rs +0 -0
  828. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/tests.rs +0 -0
  829. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/types/generated.rs +0 -0
  830. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/types.rs +0 -0
  831. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/app/workspace.rs +0 -0
  832. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/bin/gtk.rs +0 -0
  833. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/commands.rs +0 -0
  834. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/lib.rs +0 -0
  835. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/main.rs +0 -0
  836. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/src/settings.rs +0 -0
  837. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  838. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/contract.md +0 -0
  839. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  840. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  841. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  842. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  843. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  844. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/contract.md +0 -0
  845. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  846. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  847. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  848. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  849. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  850. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  851. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  852. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  853. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  854. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  855. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  856. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  857. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  858. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  859. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/contract.md +0 -0
  860. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  861. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  862. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  863. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  864. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  865. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  866. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  867. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  868. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  869. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  870. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  871. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  872. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  873. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  874. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/contract.md +0 -0
  875. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  876. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  877. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  878. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  879. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  880. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  881. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  882. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  883. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/acceptance.rs +0 -0
  884. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/cli.rs +0 -0
  885. {code_coordinator-0.5.283 → code_coordinator-0.5.285}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.283
3
+ Version: 0.5.285
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.283
3
+ Version: 0.5.285
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
@@ -589,6 +589,7 @@ tests/test_health_unit_enablement.py
589
589
  tests/test_hooks.py
590
590
  tests/test_human_attended_437.py
591
591
  tests/test_init.py
592
+ tests/test_install_agent_venv_2911.py
592
593
  tests/test_integration.py
593
594
  tests/test_interactive_briefing_echo.py
594
595
  tests/test_interactive_pane_log_2541.py
@@ -615,6 +615,7 @@
615
615
  "tests/test_hooks.py",
616
616
  "tests/test_human_attended_437.py",
617
617
  "tests/test_init.py",
618
+ "tests/test_install_agent_venv_2911.py",
618
619
  "tests/test_integration.py",
619
620
  "tests/test_interactive_briefing_echo.py",
620
621
  "tests/test_interactive_pane_log_2541.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.283",
2
+ "tag": "0.5.285",
3
3
  "distance": 0,
4
- "node": "g4b5eca8c49f1e13cbcaea527779fa44b44583acb",
4
+ "node": "g20de37c9769bbedc43a885378d37737a25b31ac4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -923,6 +923,39 @@ def status(config_path: Path, machine_filter: str | None, no_reconcile: bool, ti
923
923
  click.echo("FLEET: ? (health footer unavailable — coord health for detail)")
924
924
 
925
925
 
926
+ def _host_resolution_lines(machine, ts_map: dict[str, tuple[str, str]] | None) -> list[tuple[bool, str]]:
927
+ """#2912: does ``host:`` actually resolve to THIS machine's tailnet
928
+ address? A LAN DHCP/DNS entry that shares a name with a tailnet node
929
+ (e.g. a WSL2 box named ``dell64`` whose Windows host also registers
930
+ ``dell64.lan``) shadows MagicDNS in the resolver order — HTTP-by-name
931
+ times out against the wrong LAN device while ``tailscale ping`` and the
932
+ agent's own ``/health`` are both perfectly healthy, so the symptom is
933
+ indistinguishable from a dead agent, a firewall, or a crashed unit.
934
+
935
+ Fires regardless of whether the machine is currently reachable — that's
936
+ the whole point: it names the cause a plain "unreachable" cannot, and it
937
+ also catches a collision BEFORE it manifests as an outage. Silent when
938
+ ``coord.network.check_host_resolution`` can't determine an answer (no
939
+ local ``tailscale``, node not in this box's peer list, ``host:`` doesn't
940
+ resolve at all) — those are absence-of-evidence, not a finding.
941
+
942
+ Pure function over :func:`coord.network.check_host_resolution`'s result
943
+ — no I/O of its own — so it's testable without a live tailnet.
944
+ """
945
+ from coord import network # noqa: PLC0415
946
+
947
+ result = network.check_host_resolution(machine, ts_map)
948
+ if result.matches is not False:
949
+ return []
950
+ return [(
951
+ True,
952
+ f" ✗ CRIT machines.host_resolves_offtailnet: {result.reason} "
953
+ f"(#2912). Remedy: set `host: {result.magicdns_fqdn}` in "
954
+ "coordinator.yml — the MagicDNS FQDN — instead of the bare "
955
+ "hostname, which a LAN DNS entry can shadow.",
956
+ )]
957
+
958
+
926
959
  def _health_vs_config_lines(machine, health: dict) -> list[tuple[bool, str]]:
927
960
  """Cross-check a machine's ``/health`` against what ``coordinator.yml``
928
961
  declares for it. Returns ``(is_problem, line)`` pairs (#1712).
@@ -1323,6 +1356,7 @@ def doctor(
1323
1356
  expected: str | None,
1324
1357
  use_pypi: bool,
1325
1358
  ) -> None:
1359
+ from coord import network
1326
1360
  from coord.network import check_all
1327
1361
  from coord.prereqs import ToolProbe, unmet_capabilities
1328
1362
 
@@ -1339,10 +1373,23 @@ def doctor(
1339
1373
  sys.exit(2)
1340
1374
 
1341
1375
  statuses = check_all(machines, timeout=timeout)
1376
+ # #2912: resolved once, locally, up front — every machine's `host:` is
1377
+ # checked against the SAME local tailscale peer list, and a single
1378
+ # `tailscale status --json` covers the whole fleet. `None` when
1379
+ # tailscale isn't available on THIS box; `_host_resolution_lines`
1380
+ # renders nothing in that case rather than fabricating a mismatch.
1381
+ ts_map = network.tailscale_ip_map(timeout=timeout)
1342
1382
  any_problem = False
1343
1383
  for s in statuses:
1344
1384
  m = s.machine
1345
1385
  click.echo(f"{m.name} ({m.host}):")
1386
+ # Runs even when unreachable — that's the case this exists for:
1387
+ # naming why "unreachable" is misleading instead of leaving it
1388
+ # indistinguishable from a dead agent or a crashed unit.
1389
+ for is_problem, line in _host_resolution_lines(m, ts_map):
1390
+ click.echo(line)
1391
+ if is_problem:
1392
+ any_problem = True
1346
1393
  if not s.is_online:
1347
1394
  click.echo(f" ✗ unreachable — {s.reason}")
1348
1395
  any_problem = True
@@ -8,7 +8,9 @@ a generic "offline".
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import json
11
12
  import socket
13
+ import subprocess
12
14
  import time
13
15
  from concurrent.futures import ThreadPoolExecutor
14
16
  from dataclasses import dataclass
@@ -119,6 +121,150 @@ def check_all(
119
121
  return list(pool.map(lambda m: check_machine(m, timeout=timeout), machines))
120
122
 
121
123
 
124
+ # #2912: `coord doctor` checks reachability by resolving `host:` and hitting
125
+ # it — but never checks whether `host:` resolves to the RIGHT thing. A LAN
126
+ # DHCP/DNS entry that happens to share a name with a tailnet node (e.g. a
127
+ # WSL2 box named `dell64` whose Windows host also registers `dell64.lan`)
128
+ # shadows MagicDNS in the resolver order: `tailscale ping <name>` succeeds
129
+ # (it talks to tailscaled directly, not the resolver) while plain HTTP by
130
+ # name times out against the wrong LAN device — indistinguishable from a
131
+ # dead agent, a firewall, or a crashed unit. The two helpers below let
132
+ # `coord doctor` name that specific cause instead.
133
+
134
+
135
+ def tailscale_ip_map(timeout: float = 5.0) -> dict[str, tuple[str, str]] | None:
136
+ """Map each tailnet node's short hostname (lowercased) to its
137
+ ``(tailnet_ipv4, magicdns_fqdn)``, read from the LOCAL machine's own
138
+ ``tailscale status --json`` — i.e. what THIS box's tailscaled believes,
139
+ which is what its own DNS resolver should agree with.
140
+
141
+ Returns ``None`` when the ``tailscale`` CLI is missing, not logged in,
142
+ or anything else goes wrong. This check is best-effort and must fail
143
+ soft: a probe that cannot tell tailnet truth from LAN truth must stay
144
+ silent rather than fabricate a mismatch.
145
+ """
146
+ try:
147
+ result = subprocess.run(
148
+ ["tailscale", "status", "--json"],
149
+ capture_output=True,
150
+ text=True,
151
+ timeout=timeout,
152
+ )
153
+ except (OSError, subprocess.TimeoutExpired):
154
+ return None
155
+ if result.returncode != 0:
156
+ return None
157
+ try:
158
+ data = json.loads(result.stdout)
159
+ except ValueError:
160
+ return None
161
+
162
+ nodes = list((data.get("Peer") or {}).values())
163
+ self_node = data.get("Self")
164
+ if self_node:
165
+ nodes.append(self_node)
166
+
167
+ out: dict[str, tuple[str, str]] = {}
168
+ for node in nodes:
169
+ if not isinstance(node, dict):
170
+ continue
171
+ host_name = (node.get("HostName") or "").strip().lower()
172
+ if not host_name:
173
+ continue
174
+ ipv4 = next(
175
+ (ip for ip in (node.get("TailscaleIPs") or []) if ":" not in ip), None
176
+ )
177
+ if not ipv4:
178
+ continue
179
+ dns_name = (node.get("DNSName") or "").rstrip(".")
180
+ out[host_name] = (ipv4, dns_name)
181
+ return out
182
+
183
+
184
+ def resolve_host_ip(host: str, timeout: float = 5.0) -> str | None:
185
+ """Resolve *host* via normal system DNS/hosts resolution — the same
186
+ resolution path plain HTTP-by-name takes. ``None`` on any failure."""
187
+ old_timeout = socket.getdefaulttimeout()
188
+ socket.setdefaulttimeout(timeout)
189
+ try:
190
+ return socket.gethostbyname(host)
191
+ except OSError:
192
+ return None
193
+ finally:
194
+ socket.setdefaulttimeout(old_timeout)
195
+
196
+
197
+ @dataclass
198
+ class HostResolutionCheck:
199
+ """Does a machine's configured ``host:`` resolve to ITS tailnet address?
200
+
201
+ ``matches is None`` means "could not determine" (no local ``tailscale``,
202
+ the node wasn't found in this box's peer list, or ``host:`` didn't
203
+ resolve at all) — that's a different, softer story than ``False``
204
+ ("resolved, but to the wrong place") and callers must not conflate them.
205
+ """
206
+
207
+ matches: bool | None
208
+ resolved_ip: str | None = None
209
+ tailnet_ip: str | None = None
210
+ magicdns_fqdn: str | None = None
211
+ reason: str = ""
212
+
213
+
214
+ def check_host_resolution(
215
+ machine: Machine, ts_map: dict[str, tuple[str, str]] | None
216
+ ) -> HostResolutionCheck:
217
+ """Compare ``machine.host``'s DNS resolution against what *ts_map*
218
+ (from :func:`tailscale_ip_map`) says this tailnet node's real address
219
+ is. Pure function of its inputs — no I/O — so it's unit-testable
220
+ without a live tailnet or DNS resolver.
221
+ """
222
+ if ts_map is None:
223
+ return HostResolutionCheck(
224
+ matches=None, reason="tailscale not available locally — skipped"
225
+ )
226
+
227
+ peer = ts_map.get(machine.name.strip().lower())
228
+ if peer is None:
229
+ # `machine.name` and `machine.host`'s leading label don't always
230
+ # agree (host aliases, an already-FQDN host, ...) — fall back to
231
+ # the host's own short label before giving up.
232
+ peer = ts_map.get(machine.host.split(".")[0].strip().lower())
233
+ if peer is None:
234
+ return HostResolutionCheck(
235
+ matches=None,
236
+ reason=f"{machine.name!r} not found in local tailscale peer list — skipped",
237
+ )
238
+
239
+ tailnet_ip, magicdns_fqdn = peer
240
+ resolved = resolve_host_ip(machine.host)
241
+ if resolved is None:
242
+ return HostResolutionCheck(
243
+ matches=None,
244
+ tailnet_ip=tailnet_ip,
245
+ magicdns_fqdn=magicdns_fqdn,
246
+ reason=f"{machine.host!r} did not resolve at all",
247
+ )
248
+ if resolved == tailnet_ip:
249
+ return HostResolutionCheck(
250
+ matches=True,
251
+ resolved_ip=resolved,
252
+ tailnet_ip=tailnet_ip,
253
+ magicdns_fqdn=magicdns_fqdn,
254
+ )
255
+ return HostResolutionCheck(
256
+ matches=False,
257
+ resolved_ip=resolved,
258
+ tailnet_ip=tailnet_ip,
259
+ magicdns_fqdn=magicdns_fqdn,
260
+ reason=(
261
+ f"{machine.host!r} resolves to {resolved}, not this machine's "
262
+ f"tailnet address {tailnet_ip} — a LAN DNS entry is very likely "
263
+ "shadowing MagicDNS for this name"
264
+ ),
265
+ )
266
+
267
+
122
268
  @dataclass
123
269
  class StatusResult:
124
270
  """Result of fetching /status from an agent.
@@ -36,6 +36,9 @@ echo "=== code-coordinator agent installer ==="
36
36
  python3 --version | grep -qE "3\.(1[2-9]|[2-9][0-9])" || {
37
37
  echo "error: Python 3.12+ required"; exit 1
38
38
  }
39
+ # Used later to size the apt hint if `python3 -m venv` fails; failure here
40
+ # just means the hint falls back to the unversioned package name.
41
+ PY_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}")' 2>/dev/null || echo "")
39
42
 
40
43
  # Check claude CLI
41
44
  which claude >/dev/null 2>&1 || {
@@ -44,11 +47,59 @@ which claude >/dev/null 2>&1 || {
44
47
  }
45
48
 
46
49
  # Create/update venv
47
- if [ -d "$VENV_DIR" ]; then
50
+ #
51
+ # #2911: a first run that fails partway (e.g. Ubuntu 24.04 shipping python3
52
+ # without ensurepip) can leave $VENV_DIR existing with a bin/ that has
53
+ # python3 but no pip. Trusting `-d "$VENV_DIR"` alone then skips
54
+ # `python3 -m venv` on retry and the script dies later at
55
+ # "$VENV_DIR/bin/pip: No such file or directory" - a message that names pip,
56
+ # not the actual problem. Validate the venv is actually usable instead of
57
+ # just present, and recreate it if not. Also trap failures so a venv this
58
+ # run itself created (but never finished installing into) doesn't poison
59
+ # the next retry either.
60
+ CREATED_VENV=0
61
+ on_exit() {
62
+ local status=$?
63
+ if [ "$status" -ne 0 ] && [ "$CREATED_VENV" -eq 1 ] && [ -d "$VENV_DIR" ]; then
64
+ echo "" >&2
65
+ echo "install failed - removing the venv this run created at $VENV_DIR" >&2
66
+ echo "so the next attempt starts clean instead of finding a partial one." >&2
67
+ rm -rf "$VENV_DIR"
68
+ fi
69
+ exit "$status"
70
+ }
71
+ trap on_exit EXIT
72
+
73
+ if [ -d "$VENV_DIR" ] && [ -x "$VENV_DIR/bin/pip" ]; then
48
74
  echo "Updating existing installation at $VENV_DIR..."
49
75
  else
76
+ if [ -d "$VENV_DIR" ]; then
77
+ echo "Existing $VENV_DIR has no bin/pip (partial or failed install) - recreating..."
78
+ # Note: if a `coord agent update` blue/green swap (coord/agent_update.py)
79
+ # has ever run here, $VENV_DIR is normally a symlink to
80
+ # .coord-venv.blue/.coord-venv.green, not a plain directory — but a
81
+ # symlink with a working bin/pip would have taken the branch above,
82
+ # so reaching here means it's either a plain broken directory (the
83
+ # common first-install case this fix targets) or an already-broken
84
+ # symlink. `rm -rf` on a symlink unlinks just the symlink, not its
85
+ # target, which would strand the real blue/green slot on disk; that's
86
+ # an existing-corruption corner case outside a first-install script's
87
+ # scope, not something this fix introduces.
88
+ rm -rf "$VENV_DIR"
89
+ fi
50
90
  echo "Creating virtual environment at $VENV_DIR..."
51
- python3 -m venv "$VENV_DIR"
91
+ CREATED_VENV=1
92
+ if ! python3 -m venv "$VENV_DIR"; then
93
+ echo "" >&2
94
+ echo "error: 'python3 -m venv' failed to create $VENV_DIR." >&2
95
+ echo " On Debian/Ubuntu this usually means venv/ensurepip support isn't installed:" >&2
96
+ if [ -n "$PY_VERSION" ]; then
97
+ echo " sudo apt install python3-venv python${PY_VERSION}-venv" >&2
98
+ else
99
+ echo " sudo apt install python3-venv" >&2
100
+ fi
101
+ exit 1
102
+ fi
52
103
  fi
53
104
 
54
105
  # Install/upgrade
@@ -56,6 +107,16 @@ fi
56
107
  "$VENV_DIR/bin/pip" install --upgrade "$INSTALL_SOURCE" -q
57
108
  echo "Installed: $("$VENV_DIR/bin/coord" version)"
58
109
 
110
+ # The venv is now fully installed and verified working (coord version printed
111
+ # above). Disarm the cleanup trap here: everything from this point on
112
+ # (machine-name detection, the systemd unit, node shims, systemctl,
113
+ # loginctl) is unrelated to venv creation, and a failure in any of it must
114
+ # NOT delete a venv that already works — that would poison the retry with a
115
+ # from-scratch pip re-install just to get back to the same later failure
116
+ # (#2911 review).
117
+ trap - EXIT
118
+ CREATED_VENV=0
119
+
59
120
  # Detect machine name if not provided
60
121
  if [ -z "$MACHINE_NAME" ]; then
61
122
  MACHINE_NAME=$(hostname -s)
@@ -16,8 +16,13 @@ from coord.commands.status import doctor
16
16
  from coord.network import ONLINE, OFFLINE, MachineStatus
17
17
 
18
18
 
19
- def _run_doctor(config_path, monkeypatch, statuses, *, extra_args=None):
19
+ def _run_doctor(config_path, monkeypatch, statuses, *, extra_args=None, ts_map=None):
20
20
  monkeypatch.setattr(network_mod, "check_all", lambda *a, **k: statuses)
21
+ # #2912: default the new host-resolution check to "tailscale not
22
+ # available" (matches=None, silent) so every PRE-EXISTING test here
23
+ # stays hermetic and unaffected — tests that actually exercise the
24
+ # check pass their own `ts_map`.
25
+ monkeypatch.setattr(network_mod, "tailscale_ip_map", lambda *a, **k: ts_map)
21
26
  runner = CliRunner()
22
27
  # #2082: doctor resolves --expected from PyPI by default now. Default
23
28
  # these tests to --no-pypi so they stay hermetic (no real network call);
@@ -101,6 +106,61 @@ def test_doctor_flags_unreachable_machine(valid_config_path, monkeypatch) -> Non
101
106
  assert "connection refused" in result.output
102
107
 
103
108
 
109
+ def test_doctor_names_lan_dns_shadow_even_when_unreachable(
110
+ valid_config_path, monkeypatch,
111
+ ) -> None:
112
+ """#2912: `laptop`'s `host: laptop.tailnet` resolving to something other
113
+ than laptop's own tailnet address must be named EVEN on the branch that
114
+ reports "unreachable" — that's the whole failure mode: a DNS shadow
115
+ makes a healthy agent look dead with no clue why."""
116
+ from coord.config import load
117
+
118
+ cfg = load(valid_config_path)
119
+ statuses = [
120
+ MachineStatus(machine=cfg.machines[0], state=network_mod.TIMEOUT, reason="timed out"),
121
+ MachineStatus(
122
+ machine=cfg.machines[1], state=ONLINE,
123
+ health=_health({"git": _ok_probe(), "gh": _ok_probe()}, cfg.machines[1]),
124
+ ),
125
+ ]
126
+ ts_map = {"laptop": ("100.64.0.1", "laptop.tailf46ef8.ts.net")}
127
+ monkeypatch.setattr(
128
+ network_mod, "resolve_host_ip", lambda host, **k: "192.168.1.183"
129
+ )
130
+ result = _run_doctor(valid_config_path, monkeypatch, statuses, ts_map=ts_map)
131
+ assert result.exit_code == 1
132
+ assert "machines.host_resolves_offtailnet" in result.output
133
+ assert "100.64.0.1" in result.output
134
+ assert "laptop.tailf46ef8.ts.net" in result.output
135
+ assert "unreachable" in result.output
136
+
137
+
138
+ def test_doctor_is_silent_when_host_matches_tailnet_address(
139
+ valid_config_path, monkeypatch,
140
+ ) -> None:
141
+ from coord.config import load
142
+
143
+ cfg = load(valid_config_path)
144
+ statuses = [
145
+ MachineStatus(
146
+ machine=m, state=ONLINE,
147
+ health=_health({"git": _ok_probe(), "gh": _ok_probe()}, m),
148
+ )
149
+ for m in cfg.machines
150
+ ]
151
+ ts_map = {
152
+ "laptop": ("100.64.0.1", "laptop.tailf46ef8.ts.net"),
153
+ "server": ("100.64.0.2", "server.tailf46ef8.ts.net"),
154
+ }
155
+ monkeypatch.setattr(
156
+ network_mod, "resolve_host_ip",
157
+ lambda host, **k: {"laptop.tailnet": "100.64.0.1", "server.tailnet": "100.64.0.2"}[host],
158
+ )
159
+ result = _run_doctor(valid_config_path, monkeypatch, statuses, ts_map=ts_map)
160
+ assert result.exit_code == 0, result.output
161
+ assert "host_resolves_offtailnet" not in result.output
162
+
163
+
104
164
  def test_doctor_flags_missing_baseline_tool(valid_config_path, monkeypatch) -> None:
105
165
  from coord.config import load
106
166
 
@@ -0,0 +1,225 @@
1
+ """install-agent.sh: a partial ``~/.coord-venv`` must not poison retries (#2911).
2
+
3
+ A first run that fails partway (e.g. Ubuntu 24.04 shipping python3 without
4
+ ensurepip) can leave ``$VENV_DIR`` existing with a ``bin/`` that has
5
+ ``python3`` but no ``pip``. The pre-fix script trusted ``-d "$VENV_DIR"``
6
+ alone, so a retry skipped ``python3 -m venv`` entirely and died later at
7
+ ``"$VENV_DIR/bin/pip": No such file or directory`` — a message that names
8
+ pip, not the actual problem — and the only way out was ``rm -rf
9
+ ~/.coord-venv`` by hand.
10
+
11
+ This drives the real ``install-agent.sh`` end to end (not just a snippet)
12
+ in an isolated ``$HOME``, with ``python3``/``systemctl``/``loginctl``/
13
+ ``claude`` stubbed out on ``$PATH`` so it never touches the real system.
14
+ Three scenarios, matching the issue:
15
+
16
+ * a venv left over from a run that failed inside ``python3 -m venv``
17
+ (``bin/`` with no ``pip``) is detected as unusable and recreated, so the
18
+ retry succeeds instead of re-failing at ``bin/pip``;
19
+ * when ``python3 -m venv`` itself fails (the ensurepip case), the script
20
+ exits non-zero with a message naming the apt package to install, and
21
+ removes the venv directory it just created rather than leaving a
22
+ poisoned one behind for the next retry;
23
+ * an already-good venv (``bin/pip`` present) is left alone and just
24
+ updated in place — no spurious recreation.
25
+ * a failure *after* the venv is fully installed (e.g. ``systemctl
26
+ --user daemon-reload`` failing with "Failed to connect to bus" because
27
+ the SSH session has no lingering user session yet — the exact reason
28
+ the next line is ``loginctl enable-linger``) must NOT delete the
29
+ now-working venv: only a failure during venv creation/pip install
30
+ should trigger cleanup, otherwise the retry has to re-download and
31
+ re-install everything from scratch just to reach the same later
32
+ failure again.
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import os
38
+ import stat
39
+ import subprocess
40
+ from pathlib import Path
41
+
42
+ import pytest
43
+
44
+ from .conftest import POSIX_BASH
45
+
46
+ REPO_ROOT = Path(__file__).resolve().parent.parent
47
+ INSTALLER = REPO_ROOT / "install-agent.sh"
48
+
49
+
50
+ def _write_exe(path: Path, body: str) -> None:
51
+ path.write_text(body)
52
+ path.chmod(path.stat().st_mode | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
53
+
54
+
55
+ def _make_fake_bin(tmp_path: Path, *, venv_fails: bool, systemctl_fails: bool = False) -> Path:
56
+ """A directory of stub commands so the script never touches the real system."""
57
+ fake_bin = tmp_path / "fake-bin"
58
+ fake_bin.mkdir()
59
+
60
+ venv_failure_snippet = (
61
+ """
62
+ echo "Error: Command '['$target/bin/python3', '-Im', 'ensurepip', ...]'"
63
+ "returned non-zero exit status 1." >&2
64
+ echo "The virtual environment was not created successfully because" >&2
65
+ echo "ensurepip is not available." >&2
66
+ exit 1
67
+ """
68
+ if venv_fails
69
+ else ""
70
+ )
71
+
72
+ _write_exe(
73
+ fake_bin / "python3",
74
+ f"""#!/usr/bin/env bash
75
+ if [ "$1" = "--version" ]; then
76
+ echo "Python 3.12.3"
77
+ exit 0
78
+ fi
79
+ if [ "$1" = "-c" ]; then
80
+ echo "3.12"
81
+ exit 0
82
+ fi
83
+ if [ "$1" = "-m" ] && [ "$2" = "venv" ]; then
84
+ target="$3"
85
+ mkdir -p "$target/bin"
86
+ printf '#!/bin/sh\\n' > "$target/bin/python3"
87
+ chmod +x "$target/bin/python3"
88
+ {venv_failure_snippet}
89
+ for name in pip coord; do
90
+ printf '#!/bin/sh\\necho "coord, version 9.9.9"\\n' > "$target/bin/$name"
91
+ chmod +x "$target/bin/$name"
92
+ done
93
+ exit 0
94
+ fi
95
+ echo "fake python3: unhandled args: $*" >&2
96
+ exit 1
97
+ """,
98
+ )
99
+
100
+ if systemctl_fails:
101
+ # Simulate the real-world "Failed to connect to bus" error: on a
102
+ # brand-new SSH session there is no lingering user session yet, so
103
+ # `systemctl --user ...` fails until `loginctl enable-linger` runs
104
+ # (which is the *next* line in install-agent.sh — too late for this
105
+ # call).
106
+ _write_exe(
107
+ fake_bin / "systemctl",
108
+ '#!/usr/bin/env bash\necho "Failed to connect to bus: No such file or directory" >&2\nexit 1\n',
109
+ )
110
+ else:
111
+ _write_exe(fake_bin / "systemctl", "#!/usr/bin/env bash\nexit 0\n")
112
+
113
+ for noop in ("loginctl", "claude"):
114
+ _write_exe(fake_bin / noop, "#!/usr/bin/env bash\nexit 0\n")
115
+
116
+ return fake_bin
117
+
118
+
119
+ def _run_installer(tmp_path: Path, fake_bin: Path, *, extra_path: str = "") -> subprocess.CompletedProcess:
120
+ home = tmp_path / "home"
121
+ home.mkdir(exist_ok=True)
122
+ env = dict(os.environ)
123
+ path_parts = [str(fake_bin)]
124
+ if extra_path:
125
+ path_parts.append(extra_path)
126
+ path_parts.append(env.get("PATH", "/usr/bin:/bin"))
127
+ env["PATH"] = ":".join(path_parts)
128
+ env["HOME"] = str(home)
129
+ return subprocess.run(
130
+ [POSIX_BASH, str(INSTALLER), "--machine", "testhost"],
131
+ cwd=tmp_path,
132
+ env=env,
133
+ capture_output=True,
134
+ text=True,
135
+ timeout=30,
136
+ )
137
+
138
+
139
+ def test_partial_venv_from_a_failed_run_is_recreated_not_trusted(tmp_path: Path) -> None:
140
+ """A leftover venv with bin/python3 but no bin/pip must not take the
141
+ "existing installation" branch — that's exactly what died at bin/pip
142
+ on retry pre-fix."""
143
+ fake_bin = _make_fake_bin(tmp_path, venv_fails=False)
144
+ home = tmp_path / "home"
145
+ home.mkdir()
146
+ venv_dir = home / ".coord-venv"
147
+ (venv_dir / "bin").mkdir(parents=True)
148
+ (venv_dir / "bin" / "python3").write_text("#!/bin/sh\n")
149
+ (venv_dir / "bin" / "python3").chmod(0o755)
150
+ # Deliberately no bin/pip: this is the partial state left by ensurepip
151
+ # failing partway through `python3 -m venv`.
152
+
153
+ result = _run_installer(tmp_path, fake_bin)
154
+
155
+ assert result.returncode == 0, result.stdout + result.stderr
156
+ assert "Updating existing installation" not in result.stdout
157
+ assert "recreating" in result.stdout
158
+ assert (venv_dir / "bin" / "pip").exists()
159
+ assert (venv_dir / "bin" / "coord").exists()
160
+
161
+
162
+ def test_venv_creation_failure_exits_with_apt_hint_and_cleans_up(tmp_path: Path) -> None:
163
+ """The ensurepip case: `python3 -m venv` itself fails. The script must
164
+ exit non-zero naming the apt package (not a bare "no such file: pip"
165
+ later on), and must not leave a poisoned venv dir behind for the next
166
+ retry."""
167
+ fake_bin = _make_fake_bin(tmp_path, venv_fails=True)
168
+
169
+ result = _run_installer(tmp_path, fake_bin)
170
+
171
+ assert result.returncode != 0
172
+ assert "apt install" in result.stderr
173
+ assert "python3.12-venv" in result.stderr or "python3-venv" in result.stderr
174
+ home = tmp_path / "home"
175
+ assert not (home / ".coord-venv").exists(), (
176
+ "a venv this run created but never finished installing into must be "
177
+ "removed, not left behind to poison the next retry"
178
+ )
179
+
180
+
181
+ def test_already_good_venv_is_updated_in_place_not_recreated(tmp_path: Path) -> None:
182
+ """An existing venv with a working bin/pip is the happy path: skip
183
+ `python3 -m venv` entirely and just reinstall into it."""
184
+ fake_bin = _make_fake_bin(tmp_path, venv_fails=False)
185
+ home = tmp_path / "home"
186
+ home.mkdir()
187
+ venv_dir = home / ".coord-venv"
188
+ (venv_dir / "bin").mkdir(parents=True)
189
+ for name in ("python3", "pip", "coord"):
190
+ _write_exe(venv_dir / "bin" / name, '#!/bin/sh\necho "coord, version 9.9.9"\n')
191
+ marker = venv_dir / "bin" / "coord"
192
+ before = marker.read_bytes()
193
+
194
+ result = _run_installer(tmp_path, fake_bin)
195
+
196
+ assert result.returncode == 0, result.stdout + result.stderr
197
+ assert "Updating existing installation" in result.stdout
198
+ assert "recreating" not in result.stdout
199
+ # untouched by a `python3 -m venv` recreation (the fake would overwrite it)
200
+ assert marker.read_bytes() == before
201
+
202
+
203
+ def test_failure_after_venv_installed_does_not_delete_the_working_venv(tmp_path: Path) -> None:
204
+ """The cleanup trap must be scoped to venv creation/pip install, not the
205
+ whole script (#2911 review). `systemctl --user daemon-reload` failing
206
+ with "Failed to connect to bus" — the ordinary first-run case before
207
+ `loginctl enable-linger` has ever run — happens *after* the venv is
208
+ fully created and installed into. That must exit non-zero but leave the
209
+ now-working venv alone: deleting it would force the retry to re-download
210
+ and re-install code-coordinator from scratch just to reach the exact
211
+ same systemd failure again."""
212
+ fake_bin = _make_fake_bin(tmp_path, venv_fails=False, systemctl_fails=True)
213
+
214
+ result = _run_installer(tmp_path, fake_bin)
215
+
216
+ assert result.returncode != 0, result.stdout + result.stderr
217
+ home = tmp_path / "home"
218
+ venv_dir = home / ".coord-venv"
219
+ assert venv_dir.exists(), (
220
+ "a venv that finished creation and pip install successfully must "
221
+ "survive a later, unrelated failure (systemd here) instead of being "
222
+ "deleted by the cleanup trap"
223
+ )
224
+ assert (venv_dir / "bin" / "pip").exists()
225
+ assert (venv_dir / "bin" / "coord").exists()