code-coordinator 0.5.284__tar.gz → 0.5.286__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.284 → code_coordinator-0.5.286}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent.py +18 -2
  5. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/status.py +47 -0
  6. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/network.py +146 -0
  7. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/prereqs.py +30 -0
  8. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/smoke.py +12 -0
  9. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent.py +48 -0
  10. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor.py +61 -1
  11. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_network.py +109 -0
  12. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_prereqs.py +24 -0
  13. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/.gitignore +0 -0
  27. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/GOAL.md +0 -0
  29. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/LICENSE +0 -0
  30. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/README.md +0 -0
  32. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/client.py +0 -0
  66. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/merge.py +0 -0
  81. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/milestone.py +0 -0
  82. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/plan_followup.py +0 -0
  83. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/plans.py +0 -0
  84. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/portal.py +0 -0
  85. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/pr.py +0 -0
  86. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/store_migrate.py +0 -0
  94. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/terminal.py +0 -0
  95. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/test_gate.py +0 -0
  96. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/commands/tui.py +0 -0
  97. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/comments.py +0 -0
  98. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/config.py +0 -0
  99. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/config_reload.py +0 -0
  100. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/confirm_test.py +0 -0
  101. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/db.py +0 -0
  109. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/decomposition_chat.py +0 -0
  111. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/README.md +0 -0
  112. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-agent.service +0 -0
  113. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.service +0 -0
  114. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.sh +0 -0
  115. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-db-backup.timer +0 -0
  116. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-drive-queue.service +0 -0
  117. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-drive-queue.timer +0 -0
  118. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-failure-notify.service +0 -0
  119. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-fleet-watchdog.service +0 -0
  120. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  121. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/events.py +0 -0
  141. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/issues_sync_staleness.py +0 -0
  171. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/plan_usage.py +0 -0
  172. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/release_cordon.py +0 -0
  173. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/stalled_pipeline.py +0 -0
  176. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/timer_active.py +0 -0
  177. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/toolchain.py +0 -0
  178. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/unit_drift.py +0 -0
  179. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/unit_enablement.py +0 -0
  180. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/checks/worktrees.py +0 -0
  181. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/cli.py +0 -0
  182. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/context.py +0 -0
  183. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/fleet_snapshot.py +0 -0
  184. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/models.py +0 -0
  185. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/pypi.py +0 -0
  186. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/registry.py +0 -0
  187. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/render.py +0 -0
  188. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/health/units.py +0 -0
  189. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/hooks.py +0 -0
  190. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/housekeeping.py +0 -0
  191. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/interactive.py +0 -0
  192. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/issue_store.py +0 -0
  193. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/issues_sync_status.py +0 -0
  194. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/liveness_auditor.py +0 -0
  195. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/machine_pause.py +0 -0
  196. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/merge_queue.py +0 -0
  197. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_chat.py +0 -0
  198. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_dispatch.py +0 -0
  199. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_gate.py +0 -0
  200. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/milestone_order.py +0 -0
  201. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/mock_author.py +0 -0
  202. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/models.py +0 -0
  203. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/new_issue_chat.py +0 -0
  204. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/__init__.py +0 -0
  205. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/baseline.py +0 -0
  206. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/cli.py +0 -0
  207. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/collect.py +0 -0
  208. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/digest.py +0 -0
  209. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/models.py +0 -0
  210. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/predicate.py +0 -0
  211. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/service.py +0 -0
  212. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/store.py +0 -0
  213. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notifier/transport.py +0 -0
  214. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/notify.py +0 -0
  215. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/openapi.py +0 -0
  216. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/overlap_fence.py +0 -0
  217. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/overlap_predict.py +0 -0
  218. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/parentage.py +0 -0
  219. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/parentage_github.py +0 -0
  220. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/pipeline.py +0 -0
  221. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/plan_parser.py +0 -0
  222. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/plans.py +0 -0
  223. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/platform_paths.py +0 -0
  224. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_bridge.py +0 -0
  225. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_store.py +0 -0
  226. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/portal_sync.py +0 -0
  227. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/pr_body_lint.py +0 -0
  228. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/claude_pty.py +0 -0
  233. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/providers/opencode.py +0 -0
  234. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/queue_diagnose.py +0 -0
  235. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reconcile.py +0 -0
  236. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reconcile_tick.py +0 -0
  237. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/refine_chat.py +0 -0
  238. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_cordon.py +0 -0
  239. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_propagate.py +0 -0
  240. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/repo_edit.py +0 -0
  243. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/repo_onboard.py +0 -0
  244. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/reports.py +0 -0
  245. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/rest_schema.py +0 -0
  246. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/revalidate.py +0 -0
  247. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/review.py +0 -0
  248. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/scorecard.py +0 -0
  249. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/self_health.py +0 -0
  250. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/serve_app.py +0 -0
  251. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  252. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  253. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  254. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  256. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/portal-followup/SKILL.md +0 -0
  257. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/release-now/SKILL.md +0 -0
  258. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  259. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  260. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/skills/update-issue/SKILL.md +0 -0
  261. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/state.py +0 -0
  266. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/store_migrate.py +0 -0
  267. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_author.py +0 -0
  268. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_chat.py +0 -0
  269. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_orchestrator.py +0 -0
  270. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/test_report.py +0 -0
  271. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/tui_release.py +0 -0
  272. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage.py +0 -0
  273. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage_limits.py +0 -0
  274. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/usage_rollup.py +0 -0
  275. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coord/worker_events.py +0 -0
  276. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/coordinator.example.yml +0 -0
  277. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-agent.service +0 -0
  278. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.service +0 -0
  279. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.sh +0 -0
  280. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-db-backup.timer +0 -0
  281. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-drive-queue.service +0 -0
  282. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-drive-queue.timer +0 -0
  283. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-failure-notify.service +0 -0
  284. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-failure-notify.sh +0 -0
  285. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-fleet-watchdog.service +0 -0
  286. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-fleet-watchdog.timer +0 -0
  287. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-notify.service +0 -0
  288. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-notify.timer +0 -0
  289. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-propagate.service +0 -0
  290. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-propagate.timer +0 -0
  291. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-window.service +0 -0
  292. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-release-window.timer +0 -0
  293. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-serve.service +0 -0
  294. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.service +0 -0
  295. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.sh +0 -0
  296. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-dist-build.timer +0 -0
  297. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web-rollback.sh +0 -0
  298. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/coord-web.service +0 -0
  299. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/deploy/node-shim.sh +0 -0
  300. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  301. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_CI.md +0 -0
  302. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ADR_COORD_WEB_DIST.md +0 -0
  303. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/AGENT_OPERATIONS.md +0 -0
  304. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ARCHITECTURE.md +0 -0
  305. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ARCH_SECURITY_GATES.md +0 -0
  306. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/COCKPIT.md +0 -0
  307. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CONTROL_CENTER.md +0 -0
  308. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/COST_DISCIPLINE.md +0 -0
  309. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CROSS_PLATFORM.md +0 -0
  310. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CUSTOMER_FACING_APPS.md +0 -0
  311. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/CUSTOMER_PORTAL.md +0 -0
  312. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/DRIVE_QUEUE.md +0 -0
  313. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/EPHEMERAL_WORKERS.md +0 -0
  314. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/FORGE_MIGRATION.md +0 -0
  315. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/GRAPHIFY_SETUP.md +0 -0
  316. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ISSUE_GUIDANCE.md +0 -0
  317. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/MAC_MINI.md +0 -0
  318. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  319. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/NOTIFIER.md +0 -0
  320. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPENCODE_VERIFICATION.md +0 -0
  321. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPERATING_GOTCHAS.md +0 -0
  322. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/OPERATOR_GUIDES.md +0 -0
  323. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/ORACLE_LOOP.md +0 -0
  324. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PHONE_WEBAPP.md +0 -0
  325. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PIPELINE_V2.md +0 -0
  326. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/PLATFORM_EVOLUTION.md +0 -0
  327. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/SECOND_BACKEND.md +0 -0
  328. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/STORE_SERVICE.md +0 -0
  329. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  330. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/WEB_CONTROL_CENTER.md +0 -0
  331. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/WSL_WINDOWS_WORKER.md +0 -0
  332. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/README.md +0 -0
  333. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/_tokens.css +0 -0
  334. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/issue-detail.html +0 -0
  335. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/pipeline-narrow.html +0 -0
  336. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/docs/mocks/web/pipeline-wide.html +0 -0
  337. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/graphify-out/.gitignore +0 -0
  338. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/install-agent.sh +0 -0
  339. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/pyproject.toml +0 -0
  340. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/audit_review_verdict_overrides.py +0 -0
  341. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  342. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/build-worker-image.sh +0 -0
  343. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/coordinator-machine.py +0 -0
  344. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/epic-down.sh +0 -0
  345. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/epic-up.sh +0 -0
  346. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/preflight.sh +0 -0
  347. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/provision-worker.sh +0 -0
  348. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  349. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  350. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/azure-workers/verify-github-token.sh +0 -0
  351. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/check_gh_argv_containment.py +0 -0
  352. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/codegen.py +0 -0
  353. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/coord-test-runner.sh +0 -0
  354. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/coord-venv-rollback.sh +0 -0
  355. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/drive-batch.sh +0 -0
  356. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/fleet_watchdog.py +0 -0
  357. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/gen_board_fixture.py +0 -0
  358. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/gen_mock_index.py +0 -0
  359. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/next_release_tag.py +0 -0
  360. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/run_tests_in_populated_home.sh +0 -0
  361. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/run_tests_without_gh.sh +0 -0
  362. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/smoke_437_interactive.py +0 -0
  363. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_878_review_capture.py +0 -0
  364. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_release_published.py +0 -0
  365. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/scripts/verify_release_wheel.py +0 -0
  366. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/setup.cfg +0 -0
  367. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/SMOKE_SET.md +0 -0
  368. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/__init__.py +0 -0
  369. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/conftest.py +0 -0
  370. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/contract.md +0 -0
  371. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/manifest.yml +0 -0
  372. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  373. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  374. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/contract.md +0 -0
  375. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  376. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  377. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/manifest.yml +0 -0
  378. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  379. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-51/tsconfig.json +0 -0
  380. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  381. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/backends.py +0 -0
  382. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/conftest.py +0 -0
  383. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/board-pipeline-basic.json +0 -0
  384. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  385. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  386. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  387. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  388. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/all_pass.json +0 -0
  389. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  390. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/mixed_fail.json +0 -0
  391. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  392. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  393. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/skip.json +0 -0
  394. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/playwright/truncated.json +0 -0
  395. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  396. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  397. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  398. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  399. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  400. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  401. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  402. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  403. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_acceptance.py +0 -0
  404. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_acceptance_drivers.py +0 -0
  405. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_api_error.py +0 -0
  406. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_app.py +0 -0
  407. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_branch_base.py +0 -0
  408. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_branch_capture.py +0 -0
  409. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_config_free_1712.py +0 -0
  410. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_deploy_units_endpoint.py +0 -0
  411. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_dirty_worktree.py +0 -0
  412. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  413. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_graph_self_heal.py +0 -0
  414. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_health_h3.py +0 -0
  415. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_idle_restart.py +0 -0
  416. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_push_failure.py +0 -0
  417. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_reap.py +0 -0
  418. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_repos_and_pull.py +0 -0
  419. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_restart_services_endpoint.py +0 -0
  420. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_skills_self_heal.py +0 -0
  421. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_startup_diagnostics.py +0 -0
  422. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_update.py +0 -0
  423. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_update_bluegreen.py +0 -0
  424. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_usage_limit.py +0 -0
  425. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_agent_zero_commit.py +0 -0
  426. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ambient_home_isolation.py +0 -0
  427. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_dependency_busy_2804.py +0 -0
  428. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_reject_plan.py +0 -0
  429. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approve_usage_gate.py +0 -0
  430. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_approved_work_2532.py +0 -0
  431. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_assignment_already_recorded_daemon.py +0 -0
  432. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_log.py +0 -0
  433. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_outcome.py +0 -0
  434. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_audit_query.py +0 -0
  435. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_auto_loop.py +0 -0
  436. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_auto_release_publish_2035.py +0 -0
  437. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_backend_selection.py +0 -0
  438. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_base_checkout_restore.py +0 -0
  439. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_block_log.py +0 -0
  440. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_cap_762.py +0 -0
  441. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_fixture.py +0 -0
  442. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_read_path.py +0 -0
  443. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_schema.py +0 -0
  444. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_service.py +0 -0
  445. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_state.py +0 -0
  446. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_board_wire.py +0 -0
  447. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_brain.py +0 -0
  448. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_branch_model.py +0 -0
  449. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_bug_intake.py +0 -0
  450. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_build_worker_image_env_update.py +0 -0
  451. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cargo_cache.py +0 -0
  452. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_check_gh_argv_containment.py +0 -0
  453. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_acceptance_gate_1950.py +0 -0
  454. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_fix.py +0 -0
  455. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_gitlab.py +0 -0
  456. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_parity_2091.py +0 -0
  457. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_ci_store.py +0 -0
  458. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_claim.py +0 -0
  459. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_claude_md_budget.py +0 -0
  460. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_acceptance.py +0 -0
  461. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign.py +0 -0
  462. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  463. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_interactive_remote.py +0 -0
  464. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_provider.py +0 -0
  465. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  466. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_audit.py +0 -0
  467. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_chat_continue.py +0 -0
  468. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_decide.py +0 -0
  469. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_config_provenance.py +0 -0
  470. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_forge_availability.py +0 -0
  471. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_graph.py +0 -0
  472. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_diagnose_self.py +0 -0
  473. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor_config_free_1801.py +0 -0
  474. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  475. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_drive.py +0 -0
  476. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_drive_queue.py +0 -0
  477. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_escalate.py +0 -0
  478. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_fix_headless_review.py +0 -0
  479. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_gate_a.py +0 -0
  480. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_install_drift.py +0 -0
  481. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_install_skills.py +0 -0
  482. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_comment.py +0 -0
  483. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_create_label.py +0 -0
  484. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_reopen.py +0 -0
  485. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_issue_view_list.py +0 -0
  486. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_merge.py +0 -0
  487. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_assign.py +0 -0
  488. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_capture.py +0 -0
  489. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_chat_add_child.py +0 -0
  490. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_dispatch.py +0 -0
  491. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_gate_b.py +0 -0
  492. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_gate_c.py +0 -0
  493. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_order.py +0 -0
  494. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  495. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_milestone_ship.py +0 -0
  496. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_network.py +0 -0
  497. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_new_issue_chat.py +0 -0
  498. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_plans.py +0 -0
  499. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_portal.py +0 -0
  500. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_pr.py +0 -0
  501. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_pull_artifact.py +0 -0
  502. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_queue.py +0 -0
  503. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_reattach_sessions.py +0 -0
  504. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_refine_board.py +0 -0
  505. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_preflight.py +0 -0
  506. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_propagate.py +0 -0
  507. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_release_window.py +0 -0
  508. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_repo_2220.py +0 -0
  509. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  510. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_scorecard.py +0 -0
  511. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_set_review_findings.py +0 -0
  512. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_advisory_terminal.py +0 -0
  513. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_contested_tag.py +0 -0
  514. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_merge_queue.py +0 -0
  515. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_provider.py +0 -0
  516. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_review_finalizing.py +0 -0
  517. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_test_failed_tag.py +0 -0
  518. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_status_usage_limit.py +0 -0
  519. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_sync_comments_873.py +0 -0
  520. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_test_plan.py +0 -0
  521. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_track.py +0 -0
  522. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_tui_update.py +0 -0
  523. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cli_wait.py +0 -0
  524. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_client_base_install.py +0 -0
  525. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_commands_common.py +0 -0
  526. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_comments.py +0 -0
  527. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_completion_summary.py +0 -0
  528. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config.py +0 -0
  529. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_acceptance.py +0 -0
  530. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_audit.py +0 -0
  531. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_pricing.py +0 -0
  532. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  533. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_config_usage_gate.py +0 -0
  534. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_confirm_test.py +0 -0
  535. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_conflict_fix.py +0 -0
  536. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_conflict_fix_semantic.py +0 -0
  537. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  538. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test.py +0 -0
  539. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_baseline.py +0 -0
  540. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_populated_home.py +0 -0
  541. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_routing.py +0 -0
  542. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_test_runner_toolchain.py +0 -0
  543. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_uat.py +0 -0
  544. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coord_web_sse_restart_live.py +0 -0
  545. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_coordinator_machine.py +0 -0
  546. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_cross_platform_imports.py +0 -0
  547. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dao.py +0 -0
  548. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard.py +0 -0
  549. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_fixture.py +0 -0
  550. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_terminal.py +0 -0
  551. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dashboard_terminal_live.py +0 -0
  552. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_db.py +0 -0
  553. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dead_end.py +0 -0
  554. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_decomposition_chat.py +0 -0
  555. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_db_backup.py +0 -0
  556. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_web_dist.py +0 -0
  557. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_coord_web_rollback.py +0 -0
  558. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_drive_queue_unit.py +0 -0
  559. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_failure_notify_unit.py +0 -0
  560. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_manifest.py +0 -0
  561. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_notify_unit.py +0 -0
  562. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_units_lane.py +0 -0
  563. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deploy_web_unit.py +0 -0
  564. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_deps.py +0 -0
  565. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_diagnose.py +0 -0
  566. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dispatch.py +0 -0
  567. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dispatch_target_validation.py +0 -0
  568. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_dist_name.py +0 -0
  569. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_done_housekeeping.py +0 -0
  570. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive.py +0 -0
  571. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue.py +0 -0
  572. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_blocked_rendering.py +0 -0
  573. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_launch_argv.py +0 -0
  574. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  575. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_roll_pending.py +0 -0
  576. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  577. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_state.py +0 -0
  578. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_drive_tmux.py +0 -0
  579. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_capability_detection.py +0 -0
  580. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  581. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_epic_up_image_provenance.py +0 -0
  582. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_errors.py +0 -0
  583. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_events.py +0 -0
  584. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_failure_class.py +0 -0
  585. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_filelock.py +0 -0
  586. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  587. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fix_of_force_override.py +0 -0
  588. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_config_health.py +0 -0
  589. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_health_probes.py +0 -0
  590. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_health_snapshot.py +0 -0
  591. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_fleet_watchdog.py +0 -0
  592. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_forge_availability.py +0 -0
  593. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_freshness.py +0 -0
  594. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_a.py +0 -0
  595. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_b.py +0 -0
  596. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gate_snapshot_staleness.py +0 -0
  597. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gates.py +0 -0
  598. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  599. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_gen_mock_index.py +0 -0
  600. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_generated_rust_fixture.py +0 -0
  601. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_generated_types_fixture.py +0 -0
  602. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_github_ops.py +0 -0
  603. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_github_throttle.py +0 -0
  604. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_goal.py +0 -0
  605. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_graph_health.py +0 -0
  606. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_graph_selfheal_absent_2237.py +0 -0
  607. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_handoff.py +0 -0
  608. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_checks.py +0 -0
  609. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_cli.py +0 -0
  610. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_cli_graph.py +0 -0
  611. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_config.py +0 -0
  612. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_context.py +0 -0
  613. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_coord_web_ci_pin.py +0 -0
  614. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_deploy_lane_facts.py +0 -0
  615. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_fix.py +0 -0
  616. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_incident_regression.py +0 -0
  617. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_issues_sync_staleness.py +0 -0
  618. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_pypi.py +0 -0
  619. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_registry.py +0 -0
  620. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_release_cordon_probe.py +0 -0
  621. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_timer_active.py +0 -0
  622. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_toolchain.py +0 -0
  623. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_unit_drift.py +0 -0
  624. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_health_unit_enablement.py +0 -0
  625. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_hooks.py +0 -0
  626. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_human_attended_437.py +0 -0
  627. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_init.py +0 -0
  628. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_install_agent_venv_2911.py +0 -0
  629. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_integration.py +0 -0
  630. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_briefing_echo.py +0 -0
  631. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_pane_log_2541.py +0 -0
  632. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_prefill_state.py +0 -0
  633. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_session_relaunch.py +0 -0
  634. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_test_verdict_backstop.py +0 -0
  635. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_token_attribution.py +0 -0
  636. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_interactive_worktree.py +0 -0
  637. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_issue_store_seam.py +0 -0
  638. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_issues_sync_status.py +0 -0
  639. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_liveness_auditor.py +0 -0
  640. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_liveness_notify.py +0 -0
  641. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_lock_contention_ratchet.py +0 -0
  642. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_machine_pause.py +0 -0
  643. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_merge_queue.py +0 -0
  644. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_merge_verify.py +0 -0
  645. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_chat.py +0 -0
  646. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_dispatch.py +0 -0
  647. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_gate.py +0 -0
  648. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_order.py +0 -0
  649. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_milestone_seam.py +0 -0
  650. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_mock_author.py +0 -0
  651. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_model_tiering.py +0 -0
  652. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_models.py +0 -0
  653. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_models_config_labels.py +0 -0
  654. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_needs_attention.py +0 -0
  655. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_new_issue_chat.py +0 -0
  656. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_next_release_tag.py +0 -0
  657. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_node_shim.py +0 -0
  658. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_baseline.py +0 -0
  659. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_cli.py +0 -0
  660. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_collect.py +0 -0
  661. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_config.py +0 -0
  662. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_drive_seam.py +0 -0
  663. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_isolation.py +0 -0
  664. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_predicate.py +0 -0
  665. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_quiet_hours.py +0 -0
  666. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notifier_service.py +0 -0
  667. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notify.py +0 -0
  668. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_notify_drain.py +0 -0
  669. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_openapi.py +0 -0
  670. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_operational_defaults.py +0 -0
  671. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_overlap_fence.py +0 -0
  672. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_overlap_predict.py +0 -0
  673. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_packaged_deploy_units.py +0 -0
  674. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_parentage.py +0 -0
  675. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_paste_landed.py +0 -0
  676. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  677. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_pipeline.py +0 -0
  678. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_approve_plan_command.py +0 -0
  679. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_pr_command.py +0 -0
  680. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_followup_review_command.py +0 -0
  681. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_only.py +0 -0
  682. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_plan_parser.py +0 -0
  683. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_platform_paths.py +0 -0
  684. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_bridge.py +0 -0
  685. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_config.py +0 -0
  686. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_store.py +0 -0
  687. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_portal_sync.py +0 -0
  688. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_pr_body_lint.py +0 -0
  689. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_production_db_guard.py +0 -0
  690. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_progress.py +0 -0
  691. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_provider_seam.py +0 -0
  692. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers.py +0 -0
  693. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers_config_labels.py +0 -0
  694. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_providers_pty.py +0 -0
  695. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_quiet_hours.py +0 -0
  696. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_quiet_hours_store_2146.py +0 -0
  697. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reap_merged_sessions.py +0 -0
  698. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reap_stale_interactive_tick.py +0 -0
  699. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile.py +0 -0
  700. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_branch.py +0 -0
  701. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_completions.py +0 -0
  702. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  703. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_merges.py +0 -0
  704. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_no_agent_record.py +0 -0
  705. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_tick.py +0 -0
  706. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reconcile_usage_limit_done.py +0 -0
  707. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_refine_chat.py +0 -0
  708. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_2101.py +0 -0
  709. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  710. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_deadlock_2240.py +0 -0
  711. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_cordon_stuck_2490.py +0 -0
  712. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_propagate.py +0 -0
  713. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_propagate_threshold.py +0 -0
  714. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_roll_between_legs_2854.py +0 -0
  715. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_roll_window_handoff.py +0 -0
  716. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_unified_1242.py +0 -0
  717. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_verify.py +0 -0
  718. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_release_window.py +0 -0
  719. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_remote_auto_prune.py +0 -0
  720. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_remote_interactive_reaper.py +0 -0
  721. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_add.py +0 -0
  722. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_edit_2220.py +0 -0
  723. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_graph_fleet_2237.py +0 -0
  724. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_repo_onboard_2220.py +0 -0
  725. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_report_result_push.py +0 -0
  726. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_reports.py +0 -0
  727. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry.py +0 -0
  728. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry_advisory_1606.py +0 -0
  729. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_retry_type_1636.py +0 -0
  730. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_revalidate.py +0 -0
  731. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review.py +0 -0
  732. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_end_review_without_verdict.py +0 -0
  733. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_parse_failure_diagnostic.py +0 -0
  734. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_reaffirm.py +0 -0
  735. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_state.py +0 -0
  736. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_backstop.py +0 -0
  737. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_override_audit.py +0 -0
  738. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_verdict_relay.py +0 -0
  739. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_review_zero_commits.py +0 -0
  740. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_scoped_review_wiring.py +0 -0
  741. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_scorecard.py +0 -0
  742. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_self_health.py +0 -0
  743. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve.py +0 -0
  744. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve_app_board_trim.py +0 -0
  745. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_serve_rest_routes.py +0 -0
  746. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_session.py +0 -0
  747. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_slice_issue_attribution.py +0 -0
  748. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke.py +0 -0
  749. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke_live_checkout_restore.py +0 -0
  750. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_smoke_workflow.py +0 -0
  751. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_spend_ceiling.py +0 -0
  752. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_spend_ceiling_coordinator.py +0 -0
  753. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_split.py +0 -0
  754. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_split_work.py +0 -0
  755. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_sql_dialect.py +0 -0
  756. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_sqlite_connect_ratchet.py +0 -0
  757. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stage_projection.py +0 -0
  758. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stale_busy_reviewer_697.py +0 -0
  759. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stalled_pipeline.py +0 -0
  760. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_state.py +0 -0
  761. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_state_review_findings_daemon.py +0 -0
  762. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_status_fleet_footer.py +0 -0
  763. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stop_1567.py +0 -0
  764. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_store_contract.py +0 -0
  765. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_store_migrate.py +0 -0
  766. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stuck.py +0 -0
  767. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  768. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_terminal_command.py +0 -0
  769. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_author.py +0 -0
  770. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_chat.py +0 -0
  771. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_orchestrator.py +0 -0
  772. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_report.py +0 -0
  773. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_verdict_parsing.py +0 -0
  774. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_test_verdict_transcript_floor.py +0 -0
  775. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_text_io_encoding_audit.py +0 -0
  776. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_board_audit.py +0 -0
  777. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_config_load_1080.py +0 -0
  778. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_thin_client_daemon_routing_906.py +0 -0
  779. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_tmux_host.py +0 -0
  780. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_tmux_session.py +0 -0
  781. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_transcript_floor.py +0 -0
  782. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage.py +0 -0
  783. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage_limits.py +0 -0
  784. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_usage_rollup.py +0 -0
  785. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_venv_live_install_2121.py +0 -0
  786. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_version_single_source.py +0 -0
  787. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_watch.py +0 -0
  788. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  789. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_env_venv_isolation.py +0 -0
  790. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_events.py +0 -0
  791. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_image_pin_sync.py +0 -0
  792. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_safety.py +0 -0
  793. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worker_test_scoping.py +0 -0
  794. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worktree.py +0 -0
  795. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  796. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/test_write_parity.py +0 -0
  797. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tests/write_parity.py +0 -0
  798. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/.github/workflows/release-tui.yml +0 -0
  799. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/Cargo.lock +0 -0
  800. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/Cargo.toml +0 -0
  801. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/cargo-config-local-quadraui.toml.example +0 -0
  802. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/approved.rs +0 -0
  803. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/audit.rs +0 -0
  804. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/chat.rs +0 -0
  805. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/data.rs +0 -0
  806. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/dialogs.rs +0 -0
  807. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/doc_tabs.rs +0 -0
  808. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/drive.rs +0 -0
  809. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/drive_queue.rs +0 -0
  810. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/escalation.rs +0 -0
  811. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/events.rs +0 -0
  812. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fixtures.rs +0 -0
  813. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_health.rs +0 -0
  814. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_sessions.rs +0 -0
  815. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/fleet_terminals.rs +0 -0
  816. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/format.rs +0 -0
  817. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/milestone_dag.rs +0 -0
  818. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/mod.rs +0 -0
  819. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/msv.rs +0 -0
  820. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/pipeline.rs +0 -0
  821. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/plans.rs +0 -0
  822. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/render.rs +0 -0
  823. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/reports.rs +0 -0
  824. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/sessions.rs +0 -0
  825. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/settings_ui.rs +0 -0
  826. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/sidebar.rs +0 -0
  827. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/terminal.rs +0 -0
  828. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/tests.rs +0 -0
  829. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/types/generated.rs +0 -0
  830. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/types.rs +0 -0
  831. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/app/workspace.rs +0 -0
  832. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/bin/gtk.rs +0 -0
  833. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/commands.rs +0 -0
  834. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/lib.rs +0 -0
  835. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/main.rs +0 -0
  836. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/src/settings.rs +0 -0
  837. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  838. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/contract.md +0 -0
  839. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  840. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  841. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  842. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  843. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  844. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/contract.md +0 -0
  845. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  846. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  847. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  848. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  849. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  850. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  851. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  852. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  853. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  854. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  855. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  856. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  857. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  858. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  859. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/contract.md +0 -0
  860. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  861. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  862. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  863. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  864. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  865. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  866. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  867. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  868. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  869. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  870. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  871. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  872. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  873. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  874. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/contract.md +0 -0
  875. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  876. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  877. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  878. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  879. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  880. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  881. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  882. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  883. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/acceptance.rs +0 -0
  884. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/tui/tests/cli.rs +0 -0
  885. {code_coordinator-0.5.284 → code_coordinator-0.5.286}/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.284
3
+ Version: 0.5.286
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.284
3
+ Version: 0.5.286
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.284",
2
+ "tag": "0.5.286",
3
3
  "distance": 0,
4
- "node": "g2da25f7ff60c998587ccf57e1adf473b56233829",
4
+ "node": "g5eb1427bf97a93b3a32f4abe3eee184541e12d6d",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -6130,14 +6130,30 @@ class AgentServer:
6130
6130
 
6131
6131
  See `_tool_versions_ttl` for why: probing shells out per tool, and
6132
6132
  `/health` is polled frequently.
6133
+
6134
+ #2913: `probe_all()` normally restricts probing to `self.capabilities`
6135
+ so a plain CLI-only machine never pays to probe a browser or GTK4 it
6136
+ never claimed. A config-free agent's `self.capabilities` is `[]` by
6137
+ construction — it has nothing of its own to declare; the coordinator
6138
+ supplies capabilities from its OWN `coordinator.yml` at dispatch time
6139
+ (docs/EPHEMERAL_WORKERS.md). Probing only `self.capabilities` there
6140
+ means `/health.tool_versions` never covers cargo, python3, or any
6141
+ other capability-gated tool, so `unmet_capabilities()` — the #1570 D
6142
+ cross-check `dispatch_smoke` relies on before routing capability-
6143
+ gated work here — finds nothing to compare and fails OPEN, not
6144
+ closed, exactly backwards from what #1570 D exists to guarantee.
6145
+ Probe every known capability instead for a config-free agent: it has
6146
+ no legitimate narrower set to restrict to anyway, since it doesn't
6147
+ know what the coordinator is about to route to it.
6133
6148
  """
6134
6149
  now = time.time()
6135
6150
  cached = self._tool_versions_cache
6136
6151
  if cached is not None and (now - cached[0]) < self._tool_versions_ttl:
6137
6152
  return cached[1]
6138
- from coord.prereqs import probe_all, tool_versions_summary
6153
+ from coord.prereqs import ALL_CAPABILITY_NAMES, probe_all, tool_versions_summary
6139
6154
 
6140
- summary = tool_versions_summary(probe_all(self.capabilities))
6155
+ probe_caps = ALL_CAPABILITY_NAMES if self.config_free_reason is not None else self.capabilities
6156
+ summary = tool_versions_summary(probe_all(probe_caps))
6141
6157
  self._tool_versions_cache = (now, summary)
6142
6158
  return summary
6143
6159
 
@@ -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.
@@ -382,6 +382,24 @@ CAPABILITY_PREREQS: tuple[Prereq, ...] = (
382
382
 
383
383
  ALL_PREREQS: tuple[Prereq, ...] = BASELINE_PREREQS + CAPABILITY_PREREQS
384
384
 
385
+ # Every capability name any `CAPABILITY_PREREQS` entry gates, in one place
386
+ # (#2913). `probe_all()` restricts probing to a caller-supplied capability
387
+ # set so a normal, fully-configured machine never pays to probe a browser
388
+ # or GTK4 it never claimed — but that same restriction silently defeats
389
+ # `unmet_capabilities()` for a config-free agent (docs/EPHEMERAL_WORKERS.md):
390
+ # its OWN `capabilities` is `[]` by construction (nothing to declare — the
391
+ # coordinator's `coordinator.yml` supplies capabilities at dispatch time,
392
+ # not this process), so `probe_all(self.capabilities)` never probes cargo,
393
+ # python3, or any other capability-gated tool, and the #1570 D cross-check
394
+ # has nothing to compare against. `AgentServer._cached_tool_versions`
395
+ # (coord/agent.py) passes this set instead of `self.capabilities` for a
396
+ # config-free agent, so `/health` always reports the truth about what is
397
+ # actually on the box regardless of what config, if any, this process
398
+ # itself holds.
399
+ ALL_CAPABILITY_NAMES: frozenset[str] = frozenset(
400
+ p.capability for p in CAPABILITY_PREREQS if p.capability is not None
401
+ )
402
+
385
403
 
386
404
  def _parse_version(text: str, pattern: str) -> str | None:
387
405
  match = re.search(pattern, text)
@@ -515,6 +533,18 @@ def unmet_capabilities(
515
533
  `CAPABILITY_PREREQS` names it) is silently skipped, not flagged — an
516
534
  unprobed claim is not (yet) a *known-broken* one; this only reports
517
535
  claims this module can actually verify.
536
+
537
+ The `p is None` skip is meant for exactly one case: an agent whose
538
+ `/health` predates this module probing that particular tool at all.
539
+ Before #2913 it also silently swallowed a second, permanent case — a
540
+ config-free agent (`self.capabilities == []`) whose `probes` therefore
541
+ never included the caller's `required_caps` in the first place, so
542
+ `dispatch_smoke`'s #1570 D cross-check verified nothing for exactly the
543
+ machines it exists to protect. `AgentServer._cached_tool_versions`
544
+ closes that by probing `ALL_CAPABILITY_NAMES` (not `self.capabilities`)
545
+ when the agent is config-free, so `probes` passed in here now genuinely
546
+ covers every capability this function is asked about, and `p is None`
547
+ goes back to meaning only "predates the probe" — see coord/agent.py.
518
548
  """
519
549
  unmet: dict[str, list[str]] = {}
520
550
  for cap in capabilities:
@@ -436,6 +436,18 @@ def _capability_probe_reasons(
436
436
  would be strictly worse than the blind trust this replaces. Only an
437
437
  *explicit* probe failure refuses routing.
438
438
 
439
+ #2913: this used to fail open the same way for a config-free agent too
440
+ — `tool_versions` was present (baseline `git`/`gh`) but never covered
441
+ `required_caps`, since a config-free agent has no `capabilities` of its
442
+ own to probe against and `AgentServer._cached_tool_versions` used to
443
+ restrict probing to exactly that empty list. `unmet_capabilities` then
444
+ found nothing to compare and returned `{}`, indistinguishable from
445
+ "probed and clean". Fixed at the source: a config-free agent now probes
446
+ every known capability (`coord.prereqs.ALL_CAPABILITY_NAMES`) regardless
447
+ of what it declares, so `tool_versions` here genuinely covers
448
+ `required_caps` and this function's refusal path works the same for a
449
+ config-free agent as for a fully-configured one.
450
+
439
451
  Never raises — a connectivity hiccup here just skips the extra check;
440
452
  the POST to `/assign` right after this call in `dispatch_smoke` is the
441
453
  real reachability test and fails closed on its own if the machine is
@@ -231,6 +231,54 @@ def test_health_tool_versions_is_cached(tmp_path: Path) -> None:
231
231
  assert third == first
232
232
 
233
233
 
234
+ def test_health_tool_versions_probes_everything_when_config_free(
235
+ tmp_path: Path,
236
+ ) -> None:
237
+ """#2913: a config-free agent declares `capabilities=[]` by design
238
+ (docs/EPHEMERAL_WORKERS.md) — the coordinator's own `coordinator.yml`
239
+ supplies capabilities at dispatch time, not this process. Restricting
240
+ `/health.tool_versions` to `self.capabilities` (empty) meant the #1570 D
241
+ cross-check in `dispatch_smoke` never had cargo/python3/etc. to compare
242
+ against and silently failed OPEN for exactly the machines it exists to
243
+ protect. A config-free agent must now probe every known capability
244
+ regardless of its own (empty) declared list."""
245
+ from coord.prereqs import ALL_CAPABILITY_NAMES
246
+
247
+ server = AgentServer(
248
+ machine_name="ephemeral-1",
249
+ capabilities=[],
250
+ repos=[],
251
+ state_dir=tmp_path / "state",
252
+ worktree_writable_settings_files=[],
253
+ config_free_reason="no local coordinator.yml and no board service",
254
+ )
255
+ tool_versions = server.health()["tool_versions"]
256
+ assert "cargo" in tool_versions
257
+ assert "python3" in tool_versions
258
+ assert "gtk4" in tool_versions
259
+ assert "node" in tool_versions
260
+ # Sanity: the probed set really does cover every capability-gated tool,
261
+ # not just a hardcoded couple of names.
262
+ probed_capabilities = {
263
+ info["capability"] for info in tool_versions.values() if info["capability"]
264
+ }
265
+ assert probed_capabilities == set(ALL_CAPABILITY_NAMES)
266
+
267
+
268
+ def test_health_tool_versions_stays_restricted_when_not_config_free(
269
+ tmp_path: Path,
270
+ ) -> None:
271
+ """A normal, fully-configured agent (`config_free_reason=None`, the
272
+ default) must NOT gain the config-free agent's wider probe — `_server`
273
+ declares only `capabilities=["python"]`, so `cargo`/`gtk4` stay absent,
274
+ same as before #2913."""
275
+ server = _server(tmp_path)
276
+ tool_versions = server.health()["tool_versions"]
277
+ assert "python3" in tool_versions
278
+ assert "cargo" not in tool_versions
279
+ assert "gtk4" not in tool_versions
280
+
281
+
234
282
  def test_assign_success(tmp_path: Path) -> None:
235
283
  repo = _init_repo(tmp_path / "repo")
236
284
  server = _server(tmp_path, repo_path=repo)
@@ -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
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import socket
6
7
  from unittest.mock import MagicMock, patch
7
8
 
@@ -276,3 +277,111 @@ class TestCleanWorktrees:
276
277
  result = network.clean_worktrees(_m())
277
278
  assert result["ok"] is False
278
279
  assert "invalid JSON" in result["error"]
280
+
281
+
282
+ class TestTailscaleIpMap:
283
+ """#2912: `tailscale status --json` parsing — best-effort, fails soft."""
284
+
285
+ def _fake_run(self, stdout: str, returncode: int = 0):
286
+ result = MagicMock()
287
+ result.returncode = returncode
288
+ result.stdout = stdout
289
+ return result
290
+
291
+ def test_parses_self_and_peers(self) -> None:
292
+ payload = {
293
+ "Self": {
294
+ "HostName": "dellserver",
295
+ "DNSName": "dellserver.tailf46ef8.ts.net.",
296
+ "TailscaleIPs": ["100.97.107.88", "fd7a:115c:a1e0::4c3b:6b58"],
297
+ },
298
+ "Peer": {
299
+ "abc": {
300
+ "HostName": "dell64",
301
+ "DNSName": "dell64.tailf46ef8.ts.net.",
302
+ "TailscaleIPs": ["100.118.111.76", "fd7a:115c:a1e0::f430:6f4d"],
303
+ },
304
+ },
305
+ }
306
+ with patch.object(
307
+ network.subprocess, "run",
308
+ return_value=self._fake_run(json.dumps(payload)),
309
+ ):
310
+ out = network.tailscale_ip_map()
311
+ assert out == {
312
+ "dellserver": ("100.97.107.88", "dellserver.tailf46ef8.ts.net"),
313
+ "dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net"),
314
+ }
315
+
316
+ def test_missing_cli_returns_none(self) -> None:
317
+ with patch.object(network.subprocess, "run", side_effect=FileNotFoundError()):
318
+ assert network.tailscale_ip_map() is None
319
+
320
+ def test_nonzero_exit_returns_none(self) -> None:
321
+ with patch.object(
322
+ network.subprocess, "run", return_value=self._fake_run("", returncode=1)
323
+ ):
324
+ assert network.tailscale_ip_map() is None
325
+
326
+ def test_invalid_json_returns_none(self) -> None:
327
+ with patch.object(
328
+ network.subprocess, "run", return_value=self._fake_run("not json")
329
+ ):
330
+ assert network.tailscale_ip_map() is None
331
+
332
+ def test_timeout_returns_none(self) -> None:
333
+ with patch.object(
334
+ network.subprocess, "run",
335
+ side_effect=network.subprocess.TimeoutExpired(cmd="tailscale", timeout=5),
336
+ ):
337
+ assert network.tailscale_ip_map() is None
338
+
339
+
340
+ class TestCheckHostResolution:
341
+ """#2912: is `host:` pointed at the RIGHT tailnet address?"""
342
+
343
+ def test_no_tailscale_available_is_unknown(self) -> None:
344
+ result = network.check_host_resolution(_m(name="dell64", host="dell64"), None)
345
+ assert result.matches is None
346
+
347
+ def test_node_not_in_peer_list_is_unknown(self) -> None:
348
+ result = network.check_host_resolution(
349
+ _m(name="dell64", host="dell64"), {"otherbox": ("100.1.1.1", "otherbox.ts.net")}
350
+ )
351
+ assert result.matches is None
352
+
353
+ def test_matching_address_is_ok(self) -> None:
354
+ machine = _m(name="dell64", host="dell64.tailf46ef8.ts.net")
355
+ ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
356
+ with patch.object(network, "resolve_host_ip", return_value="100.118.111.76"):
357
+ result = network.check_host_resolution(machine, ts_map)
358
+ assert result.matches is True
359
+
360
+ def test_lan_shadow_mismatch_is_flagged(self) -> None:
361
+ """The exact #2912 scenario: `host: dell64` resolves to the Windows
362
+ LAN box (192.168.1.183) instead of dell64's own tailnet address."""
363
+ machine = _m(name="dell64", host="dell64")
364
+ ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
365
+ with patch.object(network, "resolve_host_ip", return_value="192.168.1.183"):
366
+ result = network.check_host_resolution(machine, ts_map)
367
+ assert result.matches is False
368
+ assert result.tailnet_ip == "100.118.111.76"
369
+ assert result.magicdns_fqdn == "dell64.tailf46ef8.ts.net"
370
+ assert "192.168.1.183" in result.reason
371
+
372
+ def test_unresolvable_host_is_unknown(self) -> None:
373
+ machine = _m(name="dell64", host="dell64.invalid")
374
+ ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
375
+ with patch.object(network, "resolve_host_ip", return_value=None):
376
+ result = network.check_host_resolution(machine, ts_map)
377
+ assert result.matches is None
378
+
379
+ def test_falls_back_to_host_short_label_when_name_not_found(self) -> None:
380
+ """`machine.name` doesn't have to match tailscale's `HostName` —
381
+ e.g. an alias in coordinator.yml — so the host's own short label is
382
+ tried too before giving up."""
383
+ machine = _m(name="my-dell-alias", host="dell64.lan")
384
+ ts_map = {"dell64": ("100.118.111.76", "dell64.tailf46ef8.ts.net")}
385
+ with patch.object(network, "resolve_host_ip", return_value="100.118.111.76"):
386
+ result = network.check_host_resolution(machine, ts_map)
387
+ assert result.matches is True
@@ -178,6 +178,30 @@ class TestProbeAll:
178
178
  "meets_floor": None, "capability": None, "ok": False,
179
179
  }
180
180
 
181
+ def test_all_capability_names_probes_every_capability_prereq(self) -> None:
182
+ """#2913: `ALL_CAPABILITY_NAMES` is what `AgentServer` probes for a
183
+ config-free agent in place of its own (empty) `capabilities` — it
184
+ must actually cover every `CAPABILITY_PREREQS` entry, else the
185
+ cross-check it exists to unblock would quietly narrow again."""
186
+ with patch("coord.prereqs.shutil.which", return_value=None):
187
+ probes = prereqs.probe_all(prereqs.ALL_CAPABILITY_NAMES)
188
+ expected_tools = {p.tool for p in prereqs.CAPABILITY_PREREQS} | {"git", "gh"}
189
+ assert set(probes) == expected_tools
190
+
191
+
192
+ class TestAllCapabilityNames:
193
+ def test_matches_every_declared_capability(self) -> None:
194
+ declared = {
195
+ p.capability for p in prereqs.CAPABILITY_PREREQS if p.capability is not None
196
+ }
197
+ assert prereqs.ALL_CAPABILITY_NAMES == declared
198
+
199
+ def test_nonempty(self) -> None:
200
+ # A regression guard against this collapsing to an empty set (e.g. a
201
+ # future refactor of CAPABILITY_PREREQS dropping `capability` values)
202
+ # and silently making the #2913 fix probe nothing again.
203
+ assert prereqs.ALL_CAPABILITY_NAMES
204
+
181
205
 
182
206
  class TestUnmetCapabilities:
183
207
  def test_empty_when_capability_backs_out(self) -> None: