code-coordinator 0.5.287__tar.gz → 0.5.288__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 (888) hide show
  1. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/cli.py +3 -0
  7. code_coordinator-0.5.288/coord/commands/machine.py +476 -0
  8. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/status.py +54 -0
  9. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/config.py +26 -2
  10. code_coordinator-0.5.288/coord/machine_onboard.py +1139 -0
  11. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/repo_edit.py +57 -0
  12. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coordinator.example.yml +30 -0
  13. code_coordinator-0.5.288/tests/test_machine_onboard.py +633 -0
  14. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/workflows/cargo-test.yml +0 -0
  25. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/.gitignore +0 -0
  28. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/GOAL.md +0 -0
  30. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/LICENSE +0 -0
  31. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/README.md +0 -0
  33. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/client.py +0 -0
  65. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/drive.py +0 -0
  74. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/drive_queue.py +0 -0
  75. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/pr.py +0 -0
  85. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/release.py +0 -0
  86. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/repo.py +0 -0
  87. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/report.py +0 -0
  88. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/review.py +0 -0
  89. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/scorecard.py +0 -0
  90. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/sessions.py +0 -0
  91. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/setup.py +0 -0
  92. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/store_migrate.py +0 -0
  93. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/confirm_test.py +0 -0
  99. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/conflict_fix.py +0 -0
  100. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dao.py +0 -0
  101. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dashboard/__init__.py +0 -0
  102. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dashboard/fixture.py +0 -0
  103. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dashboard/index.html +0 -0
  104. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dashboard/server.py +0 -0
  105. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dashboard/terminal.py +0 -0
  106. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/db.py +0 -0
  107. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dead_end.py +0 -0
  108. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/decomposition_chat.py +0 -0
  109. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/README.md +0 -0
  110. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-agent.service +0 -0
  111. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-db-backup.service +0 -0
  112. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-db-backup.sh +0 -0
  113. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-db-backup.timer +0 -0
  114. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-drive-queue.service +0 -0
  115. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-drive-queue.timer +0 -0
  116. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-failure-notify.service +0 -0
  117. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-fleet-watchdog.service +0 -0
  118. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  119. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-notify.service +0 -0
  120. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-notify.timer +0 -0
  121. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-release-propagate.service +0 -0
  122. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-release-propagate.timer +0 -0
  123. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-release-window.service +0 -0
  124. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-release-window.timer +0 -0
  125. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-serve.service +0 -0
  126. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-web-dist-build.service +0 -0
  127. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-web-dist-build.timer +0 -0
  128. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy/coord-web.service +0 -0
  129. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy_manifest.py +0 -0
  130. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deploy_units.py +0 -0
  131. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/events.py +0 -0
  139. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/agent_install.py +0 -0
  156. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/cargo_targets.py +0 -0
  157. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/claude_binary.py +0 -0
  158. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/coord_web_ci_pin.py +0 -0
  159. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/deploy_lane_facts.py +0 -0
  160. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/disk.py +0 -0
  161. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/fleet_board.py +0 -0
  162. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  163. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/fleet_phantom.py +0 -0
  164. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/fleet_unit_drift.py +0 -0
  165. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/graph.py +0 -0
  166. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/graphify_cli.py +0 -0
  167. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/index_lock.py +0 -0
  168. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/issues_sync_staleness.py +0 -0
  169. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/plan_usage.py +0 -0
  170. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/release_cordon.py +0 -0
  171. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/repo_state.py +0 -0
  172. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/spawned_coord.py +0 -0
  173. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/stalled_pipeline.py +0 -0
  174. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/timer_active.py +0 -0
  175. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/toolchain.py +0 -0
  176. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/unit_drift.py +0 -0
  177. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/unit_enablement.py +0 -0
  178. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/checks/worktrees.py +0 -0
  179. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/cli.py +0 -0
  180. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/context.py +0 -0
  181. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/fleet_snapshot.py +0 -0
  182. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/models.py +0 -0
  183. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/pypi.py +0 -0
  184. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/registry.py +0 -0
  185. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/render.py +0 -0
  186. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/health/units.py +0 -0
  187. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/hooks.py +0 -0
  188. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/housekeeping.py +0 -0
  189. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/interactive.py +0 -0
  190. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/issue_store.py +0 -0
  191. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/issues_sync_status.py +0 -0
  192. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/liveness_auditor.py +0 -0
  193. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/models.py +0 -0
  201. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/network.py +0 -0
  202. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/new_issue_chat.py +0 -0
  203. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/__init__.py +0 -0
  204. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/baseline.py +0 -0
  205. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/cli.py +0 -0
  206. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/collect.py +0 -0
  207. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/digest.py +0 -0
  208. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/models.py +0 -0
  209. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/predicate.py +0 -0
  210. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/service.py +0 -0
  211. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/store.py +0 -0
  212. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notifier/transport.py +0 -0
  213. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/notify.py +0 -0
  214. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/openapi.py +0 -0
  215. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/overlap_fence.py +0 -0
  216. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/overlap_predict.py +0 -0
  217. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/parentage.py +0 -0
  218. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/parentage_github.py +0 -0
  219. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/pipeline.py +0 -0
  220. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/plan_parser.py +0 -0
  221. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/plans.py +0 -0
  222. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/platform_paths.py +0 -0
  223. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/portal_bridge.py +0 -0
  224. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/portal_store.py +0 -0
  225. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/portal_sync.py +0 -0
  226. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/pr_body_lint.py +0 -0
  227. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/prereqs.py +0 -0
  228. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/providers/claude_pty.py +0 -0
  233. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/providers/opencode.py +0 -0
  234. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/queue_diagnose.py +0 -0
  235. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/reconcile.py +0 -0
  236. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/reconcile_tick.py +0 -0
  237. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/refine_chat.py +0 -0
  238. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/release_cordon.py +0 -0
  239. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/release_propagate.py +0 -0
  240. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/repo_onboard.py +0 -0
  243. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/reports.py +0 -0
  244. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/rest_schema.py +0 -0
  245. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/revalidate.py +0 -0
  246. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/review.py +0 -0
  247. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/scorecard.py +0 -0
  248. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/self_health.py +0 -0
  249. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/serve_app.py +0 -0
  250. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  251. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  252. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  253. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/portal-followup/SKILL.md +0 -0
  256. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/release-now/SKILL.md +0 -0
  257. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  258. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  259. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/skills/update-issue/SKILL.md +0 -0
  260. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/smoke.py +0 -0
  261. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/state.py +0 -0
  266. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/store_migrate.py +0 -0
  267. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/test_author.py +0 -0
  268. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/test_chat.py +0 -0
  269. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/test_orchestrator.py +0 -0
  270. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/test_report.py +0 -0
  271. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/tui_release.py +0 -0
  272. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/usage.py +0 -0
  273. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/usage_limits.py +0 -0
  274. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/usage_rollup.py +0 -0
  275. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/coord/worker_events.py +0 -0
  276. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-agent.service +0 -0
  277. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-db-backup.service +0 -0
  278. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-db-backup.sh +0 -0
  279. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-db-backup.timer +0 -0
  280. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-drive-queue.service +0 -0
  281. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-drive-queue.timer +0 -0
  282. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-failure-notify.service +0 -0
  283. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-failure-notify.sh +0 -0
  284. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-fleet-watchdog.service +0 -0
  285. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-fleet-watchdog.timer +0 -0
  286. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-notify.service +0 -0
  287. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-notify.timer +0 -0
  288. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-release-propagate.service +0 -0
  289. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-release-propagate.timer +0 -0
  290. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-release-window.service +0 -0
  291. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-release-window.timer +0 -0
  292. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-serve.service +0 -0
  293. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-web-dist-build.service +0 -0
  294. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-web-dist-build.sh +0 -0
  295. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-web-dist-build.timer +0 -0
  296. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-web-rollback.sh +0 -0
  297. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/coord-web.service +0 -0
  298. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/deploy/node-shim.sh +0 -0
  299. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  300. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ADR_COORD_WEB_CI.md +0 -0
  301. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ADR_COORD_WEB_DIST.md +0 -0
  302. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/AGENT_OPERATIONS.md +0 -0
  303. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ARCHITECTURE.md +0 -0
  304. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ARCH_SECURITY_GATES.md +0 -0
  305. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/COCKPIT.md +0 -0
  306. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/CONTROL_CENTER.md +0 -0
  307. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/COST_DISCIPLINE.md +0 -0
  308. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/CROSS_PLATFORM.md +0 -0
  309. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/CUSTOMER_FACING_APPS.md +0 -0
  310. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/CUSTOMER_PORTAL.md +0 -0
  311. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/DRIVE_QUEUE.md +0 -0
  312. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/EPHEMERAL_WORKERS.md +0 -0
  313. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/FORGE_MIGRATION.md +0 -0
  314. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/GRAPHIFY_SETUP.md +0 -0
  315. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ISSUE_GUIDANCE.md +0 -0
  316. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/MAC_MINI.md +0 -0
  317. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  318. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/NOTIFIER.md +0 -0
  319. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/OPENCODE_VERIFICATION.md +0 -0
  320. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/OPERATING_GOTCHAS.md +0 -0
  321. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/OPERATOR_GUIDES.md +0 -0
  322. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/ORACLE_LOOP.md +0 -0
  323. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/PHONE_WEBAPP.md +0 -0
  324. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/PIPELINE_V2.md +0 -0
  325. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/PLATFORM_EVOLUTION.md +0 -0
  326. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/SECOND_BACKEND.md +0 -0
  327. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/STORE_SERVICE.md +0 -0
  328. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  329. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/WEB_CONTROL_CENTER.md +0 -0
  330. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/WSL_WINDOWS_WORKER.md +0 -0
  331. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/mocks/web/README.md +0 -0
  332. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/mocks/web/_tokens.css +0 -0
  333. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/mocks/web/issue-detail.html +0 -0
  334. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/mocks/web/pipeline-narrow.html +0 -0
  335. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/docs/mocks/web/pipeline-wide.html +0 -0
  336. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/graphify-out/.gitignore +0 -0
  337. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/install-agent.sh +0 -0
  338. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/pyproject.toml +0 -0
  339. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/audit_review_verdict_overrides.py +0 -0
  340. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  341. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/build-worker-image.sh +0 -0
  342. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/coordinator-machine.py +0 -0
  343. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/epic-down.sh +0 -0
  344. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/epic-up.sh +0 -0
  345. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/preflight.sh +0 -0
  346. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/provision-worker.sh +0 -0
  347. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  348. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  349. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/azure-workers/verify-github-token.sh +0 -0
  350. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/check_gh_argv_containment.py +0 -0
  351. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/codegen.py +0 -0
  352. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/coord-test-runner.sh +0 -0
  353. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/coord-venv-rollback.sh +0 -0
  354. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/drive-batch.sh +0 -0
  355. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/fleet_watchdog.py +0 -0
  356. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/gen_board_fixture.py +0 -0
  357. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/gen_mock_index.py +0 -0
  358. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/next_release_tag.py +0 -0
  359. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/run_tests_in_populated_home.sh +0 -0
  360. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/run_tests_without_gh.sh +0 -0
  361. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/smoke_437_interactive.py +0 -0
  362. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/verify_878_review_capture.py +0 -0
  363. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/verify_release_published.py +0 -0
  364. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/scripts/verify_release_wheel.py +0 -0
  365. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/setup.cfg +0 -0
  366. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/SMOKE_SET.md +0 -0
  367. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/__init__.py +0 -0
  368. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-37/conftest.py +0 -0
  369. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-37/contract.md +0 -0
  370. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-37/manifest.yml +0 -0
  371. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  372. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  373. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/contract.md +0 -0
  374. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  375. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  376. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/manifest.yml +0 -0
  377. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  378. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-51/tsconfig.json +0 -0
  379. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  380. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/backends.py +0 -0
  381. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/conftest.py +0 -0
  382. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/board-pipeline-basic.json +0 -0
  383. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  384. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  385. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  386. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  387. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/all_pass.json +0 -0
  388. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  389. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/mixed_fail.json +0 -0
  390. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  391. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  392. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/skip.json +0 -0
  393. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/playwright/truncated.json +0 -0
  394. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  395. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  396. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  397. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  398. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  399. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  400. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  401. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  402. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_acceptance.py +0 -0
  403. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_acceptance_drivers.py +0 -0
  404. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent.py +0 -0
  405. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_api_error.py +0 -0
  406. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_app.py +0 -0
  407. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_branch_base.py +0 -0
  408. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_branch_capture.py +0 -0
  409. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_config_free_1712.py +0 -0
  410. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_deploy_units_endpoint.py +0 -0
  411. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_dirty_worktree.py +0 -0
  412. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  413. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_graph_self_heal.py +0 -0
  414. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_health_h3.py +0 -0
  415. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_idle_restart.py +0 -0
  416. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_push_failure.py +0 -0
  417. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_reap.py +0 -0
  418. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_repos_and_pull.py +0 -0
  419. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_restart_services_endpoint.py +0 -0
  420. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_skills_self_heal.py +0 -0
  421. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_startup_diagnostics.py +0 -0
  422. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_update.py +0 -0
  423. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_update_bluegreen.py +0 -0
  424. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_usage_limit.py +0 -0
  425. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_agent_zero_commit.py +0 -0
  426. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ambient_home_isolation.py +0 -0
  427. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_approve_dependency_busy_2804.py +0 -0
  428. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_approve_reject_plan.py +0 -0
  429. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_approve_usage_gate.py +0 -0
  430. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_approved_work_2532.py +0 -0
  431. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_assignment_already_recorded_daemon.py +0 -0
  432. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_audit_log.py +0 -0
  433. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_audit_outcome.py +0 -0
  434. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_audit_query.py +0 -0
  435. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_auto_loop.py +0 -0
  436. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_auto_release_publish_2035.py +0 -0
  437. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_backend_selection.py +0 -0
  438. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_base_checkout_restore.py +0 -0
  439. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_block_log.py +0 -0
  440. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_cap_762.py +0 -0
  441. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_fixture.py +0 -0
  442. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_read_path.py +0 -0
  443. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_schema.py +0 -0
  444. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_service.py +0 -0
  445. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_state.py +0 -0
  446. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_board_wire.py +0 -0
  447. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_brain.py +0 -0
  448. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_branch_model.py +0 -0
  449. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_bug_intake.py +0 -0
  450. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_build_worker_image_env_update.py +0 -0
  451. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cargo_cache.py +0 -0
  452. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_check_gh_argv_containment.py +0 -0
  453. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ci_acceptance_gate_1950.py +0 -0
  454. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ci_fix.py +0 -0
  455. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ci_gitlab.py +0 -0
  456. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ci_parity_2091.py +0 -0
  457. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_ci_store.py +0 -0
  458. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_claim.py +0 -0
  459. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_claude_md_budget.py +0 -0
  460. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_acceptance.py +0 -0
  461. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_assign.py +0 -0
  462. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  463. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_assign_interactive_remote.py +0 -0
  464. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_assign_provider.py +0 -0
  465. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  466. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_audit.py +0 -0
  467. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_chat_continue.py +0 -0
  468. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_decide.py +0 -0
  469. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_diagnose_config_provenance.py +0 -0
  470. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_diagnose_forge_availability.py +0 -0
  471. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_diagnose_graph.py +0 -0
  472. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_diagnose_self.py +0 -0
  473. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_doctor.py +0 -0
  474. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_doctor_config_free_1801.py +0 -0
  475. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  476. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_drive.py +0 -0
  477. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_drive_queue.py +0 -0
  478. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_escalate.py +0 -0
  479. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_fix_headless_review.py +0 -0
  480. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_gate_a.py +0 -0
  481. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_install_drift.py +0 -0
  482. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_install_skills.py +0 -0
  483. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_issue_comment.py +0 -0
  484. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_issue_create_label.py +0 -0
  485. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_issue_reopen.py +0 -0
  486. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_issue_view_list.py +0 -0
  487. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_merge.py +0 -0
  488. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_assign.py +0 -0
  489. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_capture.py +0 -0
  490. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_chat_add_child.py +0 -0
  491. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_dispatch.py +0 -0
  492. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_gate_b.py +0 -0
  493. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_gate_c.py +0 -0
  494. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_order.py +0 -0
  495. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  496. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_milestone_ship.py +0 -0
  497. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_network.py +0 -0
  498. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_new_issue_chat.py +0 -0
  499. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_plans.py +0 -0
  500. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_portal.py +0 -0
  501. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_pr.py +0 -0
  502. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_pull_artifact.py +0 -0
  503. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_queue.py +0 -0
  504. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_reattach_sessions.py +0 -0
  505. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_refine_board.py +0 -0
  506. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_release_preflight.py +0 -0
  507. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_release_propagate.py +0 -0
  508. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_release_window.py +0 -0
  509. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_repo_2220.py +0 -0
  510. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  511. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_scorecard.py +0 -0
  512. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_set_review_findings.py +0 -0
  513. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_advisory_terminal.py +0 -0
  514. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_contested_tag.py +0 -0
  515. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_merge_queue.py +0 -0
  516. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_provider.py +0 -0
  517. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_review_finalizing.py +0 -0
  518. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_test_failed_tag.py +0 -0
  519. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_status_usage_limit.py +0 -0
  520. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_sync_comments_873.py +0 -0
  521. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_test_plan.py +0 -0
  522. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_track.py +0 -0
  523. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_tui_update.py +0 -0
  524. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cli_wait.py +0 -0
  525. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_client_base_install.py +0 -0
  526. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_commands_common.py +0 -0
  527. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_comments.py +0 -0
  528. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_completion_summary.py +0 -0
  529. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config.py +0 -0
  530. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config_acceptance.py +0 -0
  531. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config_audit.py +0 -0
  532. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config_pricing.py +0 -0
  533. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  534. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_config_usage_gate.py +0 -0
  535. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_confirm_test.py +0 -0
  536. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_conflict_fix.py +0 -0
  537. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_conflict_fix_semantic.py +0 -0
  538. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  539. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_test.py +0 -0
  540. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_test_runner_baseline.py +0 -0
  541. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_test_runner_populated_home.py +0 -0
  542. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_test_runner_routing.py +0 -0
  543. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_test_runner_toolchain.py +0 -0
  544. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_uat.py +0 -0
  545. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coord_web_sse_restart_live.py +0 -0
  546. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_coordinator_machine.py +0 -0
  547. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_cross_platform_imports.py +0 -0
  548. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dao.py +0 -0
  549. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dashboard.py +0 -0
  550. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dashboard_fixture.py +0 -0
  551. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dashboard_terminal.py +0 -0
  552. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dashboard_terminal_live.py +0 -0
  553. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_db.py +0 -0
  554. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dead_end.py +0 -0
  555. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_decomposition_chat.py +0 -0
  556. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_coord_db_backup.py +0 -0
  557. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_coord_web_dist.py +0 -0
  558. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_coord_web_rollback.py +0 -0
  559. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_drive_queue_unit.py +0 -0
  560. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_failure_notify_unit.py +0 -0
  561. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_manifest.py +0 -0
  562. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_notify_unit.py +0 -0
  563. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_units_lane.py +0 -0
  564. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deploy_web_unit.py +0 -0
  565. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_deps.py +0 -0
  566. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_diagnose.py +0 -0
  567. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dispatch.py +0 -0
  568. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dispatch_target_validation.py +0 -0
  569. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_dist_name.py +0 -0
  570. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_done_housekeeping.py +0 -0
  571. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive.py +0 -0
  572. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue.py +0 -0
  573. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue_blocked_rendering.py +0 -0
  574. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue_launch_argv.py +0 -0
  575. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  576. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue_roll_pending.py +0 -0
  577. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  578. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_state.py +0 -0
  579. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_drive_tmux.py +0 -0
  580. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_epic_up_capability_detection.py +0 -0
  581. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  582. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_epic_up_image_provenance.py +0 -0
  583. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_errors.py +0 -0
  584. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_events.py +0 -0
  585. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_failure_class.py +0 -0
  586. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_filelock.py +0 -0
  587. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  588. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_fix_of_force_override.py +0 -0
  589. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_fleet_config_health.py +0 -0
  590. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_fleet_health_probes.py +0 -0
  591. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_fleet_health_snapshot.py +0 -0
  592. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_fleet_watchdog.py +0 -0
  593. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_forge_availability.py +0 -0
  594. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_freshness.py +0 -0
  595. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gate_a.py +0 -0
  596. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gate_b.py +0 -0
  597. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gate_snapshot_staleness.py +0 -0
  598. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gates.py +0 -0
  599. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  600. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_gen_mock_index.py +0 -0
  601. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_generated_rust_fixture.py +0 -0
  602. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_generated_types_fixture.py +0 -0
  603. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_github_ops.py +0 -0
  604. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_github_throttle.py +0 -0
  605. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_goal.py +0 -0
  606. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_graph_health.py +0 -0
  607. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_graph_selfheal_absent_2237.py +0 -0
  608. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_handoff.py +0 -0
  609. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_checks.py +0 -0
  610. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_cli.py +0 -0
  611. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_cli_graph.py +0 -0
  612. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_config.py +0 -0
  613. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_context.py +0 -0
  614. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_coord_web_ci_pin.py +0 -0
  615. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_deploy_lane_facts.py +0 -0
  616. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_fix.py +0 -0
  617. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_incident_regression.py +0 -0
  618. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_issues_sync_staleness.py +0 -0
  619. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_pypi.py +0 -0
  620. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_registry.py +0 -0
  621. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_release_cordon_probe.py +0 -0
  622. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_timer_active.py +0 -0
  623. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_toolchain.py +0 -0
  624. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_unit_drift.py +0 -0
  625. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_health_unit_enablement.py +0 -0
  626. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_hooks.py +0 -0
  627. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_human_attended_437.py +0 -0
  628. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_init.py +0 -0
  629. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_install_agent_venv_2911.py +0 -0
  630. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_integration.py +0 -0
  631. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_briefing_echo.py +0 -0
  632. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_pane_log_2541.py +0 -0
  633. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_prefill_state.py +0 -0
  634. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_session_relaunch.py +0 -0
  635. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_test_verdict_backstop.py +0 -0
  636. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_token_attribution.py +0 -0
  637. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_interactive_worktree.py +0 -0
  638. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_issue_store_seam.py +0 -0
  639. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_issues_sync_status.py +0 -0
  640. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_liveness_auditor.py +0 -0
  641. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_liveness_notify.py +0 -0
  642. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_lock_contention_ratchet.py +0 -0
  643. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_machine_pause.py +0 -0
  644. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_merge_queue.py +0 -0
  645. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_merge_verify.py +0 -0
  646. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_milestone_chat.py +0 -0
  647. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_milestone_dispatch.py +0 -0
  648. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_milestone_gate.py +0 -0
  649. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_milestone_order.py +0 -0
  650. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_milestone_seam.py +0 -0
  651. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_mock_author.py +0 -0
  652. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_model_tiering.py +0 -0
  653. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_models.py +0 -0
  654. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_models_config_labels.py +0 -0
  655. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_needs_attention.py +0 -0
  656. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_network.py +0 -0
  657. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_new_issue_chat.py +0 -0
  658. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_next_release_tag.py +0 -0
  659. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_node_shim.py +0 -0
  660. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_baseline.py +0 -0
  661. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_cli.py +0 -0
  662. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_collect.py +0 -0
  663. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_config.py +0 -0
  664. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_drive_seam.py +0 -0
  665. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_isolation.py +0 -0
  666. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_predicate.py +0 -0
  667. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_quiet_hours.py +0 -0
  668. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notifier_service.py +0 -0
  669. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notify.py +0 -0
  670. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_notify_drain.py +0 -0
  671. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_openapi.py +0 -0
  672. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_operational_defaults.py +0 -0
  673. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_overlap_fence.py +0 -0
  674. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_overlap_predict.py +0 -0
  675. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_packaged_deploy_units.py +0 -0
  676. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_parentage.py +0 -0
  677. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_paste_landed.py +0 -0
  678. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  679. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_pipeline.py +0 -0
  680. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_plan_followup_approve_plan_command.py +0 -0
  681. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_plan_followup_pr_command.py +0 -0
  682. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_plan_followup_review_command.py +0 -0
  683. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_plan_only.py +0 -0
  684. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_plan_parser.py +0 -0
  685. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_platform_paths.py +0 -0
  686. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_portal_bridge.py +0 -0
  687. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_portal_config.py +0 -0
  688. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_portal_store.py +0 -0
  689. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_portal_sync.py +0 -0
  690. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_pr_body_lint.py +0 -0
  691. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_prereqs.py +0 -0
  692. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_production_db_guard.py +0 -0
  693. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_progress.py +0 -0
  694. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_provider_seam.py +0 -0
  695. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_providers.py +0 -0
  696. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_providers_config_labels.py +0 -0
  697. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_providers_pty.py +0 -0
  698. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_quiet_hours.py +0 -0
  699. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_quiet_hours_store_2146.py +0 -0
  700. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reap_merged_sessions.py +0 -0
  701. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reap_stale_interactive_tick.py +0 -0
  702. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile.py +0 -0
  703. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_branch.py +0 -0
  704. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_completions.py +0 -0
  705. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  706. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_merges.py +0 -0
  707. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_no_agent_record.py +0 -0
  708. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_tick.py +0 -0
  709. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reconcile_usage_limit_done.py +0 -0
  710. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_refine_chat.py +0 -0
  711. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_cordon_2101.py +0 -0
  712. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  713. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_cordon_deadlock_2240.py +0 -0
  714. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_cordon_stuck_2490.py +0 -0
  715. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_propagate.py +0 -0
  716. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_propagate_threshold.py +0 -0
  717. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_roll_between_legs_2854.py +0 -0
  718. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_roll_window_handoff.py +0 -0
  719. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_unified_1242.py +0 -0
  720. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_verify.py +0 -0
  721. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_release_window.py +0 -0
  722. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_remote_auto_prune.py +0 -0
  723. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_remote_interactive_reaper.py +0 -0
  724. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_repo_add.py +0 -0
  725. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_repo_edit_2220.py +0 -0
  726. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_repo_graph_fleet_2237.py +0 -0
  727. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_repo_onboard_2220.py +0 -0
  728. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_report_result_push.py +0 -0
  729. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_reports.py +0 -0
  730. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_retry.py +0 -0
  731. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_retry_advisory_1606.py +0 -0
  732. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_retry_type_1636.py +0 -0
  733. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_revalidate.py +0 -0
  734. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review.py +0 -0
  735. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_end_review_without_verdict.py +0 -0
  736. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_parse_failure_diagnostic.py +0 -0
  737. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_reaffirm.py +0 -0
  738. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_state.py +0 -0
  739. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_verdict_backstop.py +0 -0
  740. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_verdict_override_audit.py +0 -0
  741. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_verdict_relay.py +0 -0
  742. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_review_zero_commits.py +0 -0
  743. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_scoped_review_wiring.py +0 -0
  744. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_scorecard.py +0 -0
  745. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_self_health.py +0 -0
  746. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_serve.py +0 -0
  747. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_serve_app_board_trim.py +0 -0
  748. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_serve_rest_routes.py +0 -0
  749. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_session.py +0 -0
  750. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_slice_issue_attribution.py +0 -0
  751. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_smoke.py +0 -0
  752. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_smoke_live_checkout_restore.py +0 -0
  753. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_smoke_workflow.py +0 -0
  754. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_spend_ceiling.py +0 -0
  755. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_spend_ceiling_coordinator.py +0 -0
  756. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_split.py +0 -0
  757. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_split_work.py +0 -0
  758. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_sql_dialect.py +0 -0
  759. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_sqlite_connect_ratchet.py +0 -0
  760. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stage_projection.py +0 -0
  761. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stale_busy_reviewer_697.py +0 -0
  762. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stalled_pipeline.py +0 -0
  763. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_state.py +0 -0
  764. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_state_review_findings_daemon.py +0 -0
  765. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_status_fleet_footer.py +0 -0
  766. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stop_1567.py +0 -0
  767. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_store_contract.py +0 -0
  768. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_store_migrate.py +0 -0
  769. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stuck.py +0 -0
  770. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  771. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_terminal_command.py +0 -0
  772. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_author.py +0 -0
  773. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_chat.py +0 -0
  774. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_orchestrator.py +0 -0
  775. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_report.py +0 -0
  776. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_verdict_parsing.py +0 -0
  777. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_test_verdict_transcript_floor.py +0 -0
  778. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_text_io_encoding_audit.py +0 -0
  779. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_thin_client_board_audit.py +0 -0
  780. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_thin_client_config_load_1080.py +0 -0
  781. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_thin_client_daemon_routing_906.py +0 -0
  782. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_tmux_host.py +0 -0
  783. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_tmux_session.py +0 -0
  784. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_usage.py +0 -0
  786. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_usage_limits.py +0 -0
  787. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_usage_rollup.py +0 -0
  788. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_venv_live_install_2121.py +0 -0
  789. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_version_single_source.py +0 -0
  790. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_watch.py +0 -0
  791. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  792. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worker_env_venv_isolation.py +0 -0
  793. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worker_events.py +0 -0
  794. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worker_image_pin_sync.py +0 -0
  795. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worker_safety.py +0 -0
  796. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worker_test_scoping.py +0 -0
  797. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worktree.py +0 -0
  798. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  799. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/test_write_parity.py +0 -0
  800. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tests/write_parity.py +0 -0
  801. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/.github/workflows/release-tui.yml +0 -0
  802. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/Cargo.lock +0 -0
  803. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/Cargo.toml +0 -0
  804. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/cargo-config-local-quadraui.toml.example +0 -0
  805. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/approved.rs +0 -0
  806. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/doc_tabs.rs +0 -0
  811. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/drive.rs +0 -0
  812. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/drive_queue.rs +0 -0
  813. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/escalation.rs +0 -0
  814. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/events.rs +0 -0
  815. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/fixtures.rs +0 -0
  816. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/fleet_health.rs +0 -0
  817. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/fleet_sessions.rs +0 -0
  818. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/fleet_terminals.rs +0 -0
  819. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/format.rs +0 -0
  820. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/milestone_dag.rs +0 -0
  821. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/mod.rs +0 -0
  822. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/msv.rs +0 -0
  823. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/pipeline.rs +0 -0
  824. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/plans.rs +0 -0
  825. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/render.rs +0 -0
  826. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/reports.rs +0 -0
  827. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/sessions.rs +0 -0
  828. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/settings_ui.rs +0 -0
  829. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/sidebar.rs +0 -0
  830. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/terminal.rs +0 -0
  831. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/tests.rs +0 -0
  832. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/types/generated.rs +0 -0
  833. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/types.rs +0 -0
  834. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/app/workspace.rs +0 -0
  835. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/bin/gtk.rs +0 -0
  836. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/commands.rs +0 -0
  837. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/lib.rs +0 -0
  838. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/main.rs +0 -0
  839. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/src/settings.rs +0 -0
  840. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  841. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/contract.md +0 -0
  842. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  843. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  844. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  845. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  846. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  847. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/contract.md +0 -0
  848. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  849. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  850. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  851. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  852. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  853. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  854. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  855. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  856. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  857. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  858. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  859. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  860. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  861. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  862. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/contract.md +0 -0
  863. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  864. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  865. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  866. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  867. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  868. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  869. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  870. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  871. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  872. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  873. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  874. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  875. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  876. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  877. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/contract.md +0 -0
  878. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  879. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  880. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  881. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  882. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  883. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  884. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  885. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  886. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/acceptance.rs +0 -0
  887. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/tui/tests/cli.rs +0 -0
  888. {code_coordinator-0.5.287 → code_coordinator-0.5.288}/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.287
3
+ Version: 0.5.288
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.287
3
+ Version: 0.5.288
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
@@ -92,6 +92,7 @@ coord/interactive.py
92
92
  coord/issue_store.py
93
93
  coord/issues_sync_status.py
94
94
  coord/liveness_auditor.py
95
+ coord/machine_onboard.py
95
96
  coord/machine_pause.py
96
97
  coord/merge_queue.py
97
98
  coord/milestone_chat.py
@@ -168,6 +169,7 @@ coord/commands/gate_a.py
168
169
  coord/commands/gates.py
169
170
  coord/commands/issues.py
170
171
  coord/commands/lifecycle.py
172
+ coord/commands/machine.py
171
173
  coord/commands/merge.py
172
174
  coord/commands/milestone.py
173
175
  coord/commands/plan_followup.py
@@ -603,6 +605,7 @@ tests/test_issues_sync_status.py
603
605
  tests/test_liveness_auditor.py
604
606
  tests/test_liveness_notify.py
605
607
  tests/test_lock_contention_ratchet.py
608
+ tests/test_machine_onboard.py
606
609
  tests/test_machine_pause.py
607
610
  tests/test_merge_queue.py
608
611
  tests/test_merge_verify.py
@@ -62,6 +62,7 @@
62
62
  "coord/commands/gates.py",
63
63
  "coord/commands/issues.py",
64
64
  "coord/commands/lifecycle.py",
65
+ "coord/commands/machine.py",
65
66
  "coord/commands/merge.py",
66
67
  "coord/commands/milestone.py",
67
68
  "coord/commands/plan_followup.py",
@@ -178,6 +179,7 @@
178
179
  "coord/issue_store.py",
179
180
  "coord/issues_sync_status.py",
180
181
  "coord/liveness_auditor.py",
182
+ "coord/machine_onboard.py",
181
183
  "coord/machine_pause.py",
182
184
  "coord/merge_queue.py",
183
185
  "coord/milestone_chat.py",
@@ -629,6 +631,7 @@
629
631
  "tests/test_liveness_auditor.py",
630
632
  "tests/test_liveness_notify.py",
631
633
  "tests/test_lock_contention_ratchet.py",
634
+ "tests/test_machine_onboard.py",
632
635
  "tests/test_machine_pause.py",
633
636
  "tests/test_merge_queue.py",
634
637
  "tests/test_merge_verify.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.287",
2
+ "tag": "0.5.288",
3
3
  "distance": 0,
4
- "node": "g9301f73a7d9cb01987024a21890ff9eff768b19c",
4
+ "node": "gc15b59071ef9a73aaca54a53587f2604b0d0fbe0",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -141,6 +141,7 @@ from coord.commands.drive import (
141
141
  )
142
142
  from coord.commands.drive_queue import drive_queue_group
143
143
  from coord.commands.lifecycle import done, housekeeping, notify, resume, serve, web
144
+ from coord.commands.machine import machine_group
144
145
  from coord.commands.milestone import milestone_group
145
146
  from coord.commands.plans import plans_cmd
146
147
  from coord.commands.release import release_group, release_preflight
@@ -492,6 +493,8 @@ main.add_command(release_preflight)
492
493
  main.add_command(release_group)
493
494
  # #2220: repo onboarding + its verifier.
494
495
  main.add_command(repo_group)
496
+ # #2915: the machine-side analogue — machine onboarding + its verifier.
497
+ main.add_command(machine_group)
495
498
  main.add_command(migrate_to_postgres)
496
499
  main.add_command(tui_group)
497
500
 
@@ -0,0 +1,476 @@
1
+ """``coord machine add`` / ``coord machine doctor`` — onboarding a machine, and
2
+ checking that it actually happened (#2915).
3
+
4
+ The machine-side analogue of ``coord repo add`` / ``coord repo doctor``
5
+ (#2220), and it exists for the same reason, stated in #2220's own rationale: a
6
+ runbook is the weakest available answer *"because nothing checks it."*
7
+
8
+ Adding a machine is still a hand-assembled sequence reconstructed from four
9
+ documents that do not cross-reference each other (``docs/AGENT_OPERATIONS.md``,
10
+ ``docs/GRAPHIFY_SETUP.md``, ``docs/MAC_MINI.md``, ``docs/WSL_WINDOWS_WORKER.md``),
11
+ and onboarding ``dell64`` on 2026-08-28 cost six separately-hand-found silent
12
+ failures. :mod:`coord.machine_onboard` names each one; this module is the CLI
13
+ over it, plus the write half.
14
+
15
+ **``doctor`` is the one that matters most** — same judgement #2220 made. But
16
+ ``add`` is not merely a convenience here, because two of the six failures are
17
+ *write-time* defects that no verifier can catch after the fact:
18
+
19
+ * **incident 2** — ``host: dell64`` resolved to a LAN device that shared the
20
+ name, not the tailnet node. So ``add`` refuses a ``--host`` that does not
21
+ resolve to the tailnet address which answers ``/health``, rather than
22
+ trusting the string.
23
+ * **incident 4** — a ``repo_paths`` KEY that named the checkout's *directory*
24
+ (``claude-coordinator``) instead of the fleet's *repo name*
25
+ (``code-coordinator``) made the **entire** ``coordinator.yml`` fail to load,
26
+ for every machine. So ``add`` validates every ``--repos`` entry against the
27
+ config's own ``repos:`` names, derives the ``repo_paths`` keys from those
28
+ names, and — like every other write in ``coord.commands.repo`` — re-parses
29
+ the edit into a temp file and **refuses to write** if the result would not
30
+ load.
31
+
32
+ Everything ``add`` cannot safely automate (installing the agent, cloning each
33
+ repo, graphify, linger) it prints as explicit residue, and ``doctor`` then
34
+ verifies each one from live state.
35
+ """
36
+
37
+ from __future__ import annotations
38
+
39
+ import sys
40
+ from pathlib import Path
41
+
42
+ import click
43
+
44
+ from coord.commands._common import _CONFIG_OPTION, _load_config
45
+
46
+ # The same write-target rules `coord repo add` uses: the TRACKED config in the
47
+ # coord-settings checkout, never the `~/.coord/` symlink (#1779/#1832), and
48
+ # never onto a checkout that is behind its upstream (#2861).
49
+ from coord.commands.repo import _guard_settings_fresh, _resolve_write_target
50
+ from coord.fleet_config_health import TRACKED_CONFIG_REL, default_settings_dir
51
+
52
+
53
+ @click.group(
54
+ "machine",
55
+ help="Add a machine to the fleet, and verify it is actually onboarded.",
56
+ )
57
+ def machine_group() -> None:
58
+ """Machine onboarding (#2915)."""
59
+
60
+
61
+ def _parse_csv(value: str | None) -> list[str]:
62
+ return [item.strip() for item in (value or "").split(",") if item.strip()]
63
+
64
+
65
+ def _parse_repo_paths(
66
+ repos: list[str], overrides: tuple[str, ...], default_tmpl: str
67
+ ) -> dict[str, str]:
68
+ """``{repo_name: path}`` for every ``--repos`` entry.
69
+
70
+ ``--repo-path repo=/path`` overrides one repo; everything else gets
71
+ ``default_tmpl`` with ``{repo}`` substituted. The KEYS are always the repo
72
+ names passed in — never a path basename — which is the whole point (see
73
+ the module docstring's incident 4).
74
+ """
75
+ paths = {repo: default_tmpl.format(repo=repo) for repo in repos}
76
+ for override in overrides:
77
+ if "=" not in override:
78
+ raise click.ClickException(
79
+ f"--repo-path must be REPO=PATH, got {override!r}"
80
+ )
81
+ repo, _, path = override.partition("=")
82
+ repo, path = repo.strip(), path.strip()
83
+ if repo not in paths:
84
+ raise click.ClickException(
85
+ f"--repo-path names {repo!r}, which is not in --repos {repos}"
86
+ )
87
+ paths[repo] = path
88
+ return paths
89
+
90
+
91
+ def _validate_host(
92
+ name: str, host: str, *, verify: bool, timeout: float
93
+ ) -> list[str]:
94
+ """Refuse a ``--host`` that does not resolve to this node's tailnet address.
95
+
96
+ #2915 incident 2: ``host: dell64`` resolved to a LAN DHCP/DNS entry that
97
+ shared the name with the tailnet node, so the board read ``[timeout]``
98
+ while ``tailscale ping`` and the agent's own ``/health`` were both
99
+ perfectly healthy — a symptom indistinguishable from a dead agent, a
100
+ firewall, or a crashed unit. Writing that string into ``coordinator.yml``
101
+ is what made it a config-level fact nobody rechecked.
102
+
103
+ Reuses #2912's :func:`coord.network.check_host_resolution` rather than a
104
+ second implementation. Returns advisory lines to print; **raises** only on
105
+ a definite mismatch. An *unanswerable* comparison (no local ``tailscale``,
106
+ the node is not in this box's peer list, the host does not resolve here at
107
+ all) is deliberately not a refusal: "unknown" is not "wrong", and failing
108
+ closed there would make it impossible to onboard a machine from a box that
109
+ is not itself on the tailnet.
110
+ """
111
+ from coord import network # noqa: PLC0415
112
+ from coord.models import Machine # noqa: PLC0415
113
+
114
+ if not verify:
115
+ return [
116
+ "⚠ --no-verify-host: `host:` was NOT checked against the tailnet. "
117
+ "A LAN DNS entry sharing this name silently shadows MagicDNS and "
118
+ "the board then reads [timeout] on a perfectly healthy agent "
119
+ "(#2912/#2915)."
120
+ ]
121
+
122
+ probe = Machine(name=name, host=host)
123
+ result = network.check_host_resolution(probe, network.tailscale_ip_map(timeout=timeout))
124
+ if result.matches is False:
125
+ raise click.ClickException(
126
+ f"refusing to write: {result.reason}.\n"
127
+ f" Fix: --host {result.magicdns_fqdn} (the MagicDNS FQDN, which a "
128
+ "LAN DNS entry cannot shadow)\n"
129
+ " Override (rarely right): --no-verify-host. Nothing was written."
130
+ )
131
+ if result.matches is True:
132
+ lines = [f"✓ host {host} resolves to {result.resolved_ip} (this node's tailnet address)"]
133
+ if result.magicdns_fqdn and host != result.magicdns_fqdn:
134
+ lines.append(
135
+ f" note: the MagicDNS FQDN is {result.magicdns_fqdn} — preferring "
136
+ "it over a bare hostname is what makes a future LAN DNS "
137
+ "collision impossible rather than merely absent today."
138
+ )
139
+ return lines
140
+ return [
141
+ f"? host {host} could not be checked against the tailnet — "
142
+ f"{result.reason}. Writing anyway (unknown is not wrong)."
143
+ ]
144
+
145
+
146
+ @machine_group.command(
147
+ "add",
148
+ help=(
149
+ "Write a new machine's coordinator.yml entry into the coord-settings "
150
+ "checkout — validating that `host:` resolves to the tailnet address "
151
+ "and that every --repos entry names a real repo — then print the "
152
+ "residue it deliberately did NOT do."
153
+ ),
154
+ )
155
+ @click.argument("name")
156
+ @click.option("--host", "host", required=True, help="Tailnet hostname (prefer the MagicDNS FQDN).")
157
+ @click.option(
158
+ "--capabilities", "capabilities_csv", default=None,
159
+ help="Comma-separated capabilities this machine's toolchain actually backs.",
160
+ )
161
+ @click.option(
162
+ "--repos", "repos_csv", default=None,
163
+ help=(
164
+ "Comma-separated repo NAMES from the config's own `repos:` block — "
165
+ "not directory names. A key that names no configured repo makes the "
166
+ "WHOLE coordinator.yml fail to load (#2915)."
167
+ ),
168
+ )
169
+ @click.option(
170
+ "--repo-path", "repo_path_overrides", multiple=True, metavar="REPO=PATH",
171
+ help="Override one repo's clone path. Repeatable. Default: ~/src/<repo>.",
172
+ )
173
+ @click.option(
174
+ "--repo-path-template", "repo_path_tmpl", default="~/src/{repo}", show_default=True,
175
+ help="Path template for repos with no --repo-path override. `{repo}` is substituted.",
176
+ )
177
+ @click.option(
178
+ "--max-workers", type=int, default=None,
179
+ help="Per-machine override of concurrency.max_workers (#1417). Omit for the fleet default.",
180
+ )
181
+ @click.option(
182
+ "--verify-host/--no-verify-host", "verify_host", default=True, show_default=True,
183
+ help="Check `host:` resolves to this node's tailnet address before writing (#2912).",
184
+ )
185
+ @click.option(
186
+ "--skip-freshness-check", "skip_freshness", is_flag=True, default=False,
187
+ help=(
188
+ "Do NOT compare the config checkout to its upstream before writing. "
189
+ "Rarely right: an entry written onto a stale base looks clean in the "
190
+ "diff (#2861)."
191
+ ),
192
+ )
193
+ @click.option(
194
+ "--timeout", default=5.0, show_default=True, type=float,
195
+ help="Timeout for the tailnet host check (seconds).",
196
+ )
197
+ @click.option(
198
+ "--dry-run", is_flag=True, default=False,
199
+ help="Print the edited config and the residue without writing anything.",
200
+ )
201
+ @click.option(
202
+ "--config", "config_path", type=click.Path(path_type=Path), default=None,
203
+ help="coordinator.yml to edit. Default: the coord-settings tracked file.",
204
+ )
205
+ def machine_add( # noqa: PLR0913 — one option per thing the command can set
206
+ name: str,
207
+ host: str,
208
+ capabilities_csv: str | None,
209
+ repos_csv: str | None,
210
+ repo_path_overrides: tuple[str, ...],
211
+ repo_path_tmpl: str,
212
+ max_workers: int | None,
213
+ verify_host: bool, # noqa: FBT001
214
+ skip_freshness: bool, # noqa: FBT001
215
+ timeout: float,
216
+ dry_run: bool, # noqa: FBT001
217
+ config_path: Path | None,
218
+ ) -> None:
219
+ from coord.config import load as load_config # noqa: PLC0415
220
+ from coord.repo_edit import ( # noqa: PLC0415
221
+ RepoEditError,
222
+ insert_machine_entry,
223
+ render_machine_entry,
224
+ )
225
+
226
+ target = _resolve_write_target(config_path)
227
+ # #2861: before ANY read of the file the edit is derived from, not just
228
+ # before the write — the failure mode is deriving new content from a
229
+ # stale base, and the resulting diff looks perfectly clean.
230
+ _guard_settings_fresh(target, enabled=not skip_freshness)
231
+ original = target.read_text(encoding="utf-8")
232
+
233
+ try:
234
+ cfg = load_config(target)
235
+ except Exception as exc: # noqa: BLE001
236
+ raise click.ClickException(f"{target} does not currently load: {exc}") from exc
237
+
238
+ if any(m.name == name for m in cfg.machines):
239
+ raise click.ClickException(
240
+ f"machine {name!r} already has a machines[] entry in {target} — use "
241
+ f"`coord machine doctor {name}` to find what is actually missing."
242
+ )
243
+
244
+ # ── #2915 incident 4: validate repo names BEFORE writing ─────────────
245
+ known_repos = [r.name for r in cfg.repos]
246
+ repos = _parse_csv(repos_csv)
247
+ unknown = [r for r in repos if r not in known_repos]
248
+ if unknown:
249
+ raise click.ClickException(
250
+ f"unknown repo(s) {unknown} — coordinator.yml's `repos:` block has "
251
+ f"{sorted(known_repos)}. These are repo NAMES, not checkout "
252
+ "directory names; the two routinely differ. A `repo_paths` key "
253
+ "that names no configured repo makes the ENTIRE coordinator.yml "
254
+ "fail to load — for every machine, not just this one (#2915). "
255
+ "Nothing was written."
256
+ )
257
+ repo_paths = _parse_repo_paths(repos, repo_path_overrides, repo_path_tmpl)
258
+
259
+ for line in _validate_host(name, host, verify=verify_host, timeout=timeout):
260
+ click.echo(line, err=line.startswith(("⚠", "?")))
261
+
262
+ entry = render_machine_entry(
263
+ name, host,
264
+ capabilities=_parse_csv(capabilities_csv),
265
+ repo_paths=repo_paths,
266
+ max_workers=max_workers,
267
+ )
268
+ try:
269
+ updated = insert_machine_entry(original, entry)
270
+ except RepoEditError as exc:
271
+ raise click.ClickException(str(exc)) from exc
272
+
273
+ # ── Seatbelt: the edit must produce a config that LOADS and contains
274
+ # what we think it contains. #2220's whole thesis, and the specific
275
+ # protection against incident 4 — a bad machines[] entry takes the whole
276
+ # fleet's config down, so this must never be written optimistically.
277
+ import tempfile # noqa: PLC0415
278
+
279
+ with tempfile.NamedTemporaryFile(
280
+ "w", suffix=".yml", delete=False, encoding="utf-8"
281
+ ) as fh:
282
+ fh.write(updated)
283
+ probe_path = Path(fh.name)
284
+ try:
285
+ new_cfg = load_config(probe_path)
286
+ except Exception as exc: # noqa: BLE001
287
+ raise click.ClickException(
288
+ f"refusing to write: the edited config does not parse ({exc}). "
289
+ f"{target} is unchanged — which matters more here than anywhere "
290
+ "else, since a bad machines[] entry stops the config loading for "
291
+ "the WHOLE fleet (#2915)."
292
+ ) from exc
293
+ finally:
294
+ probe_path.unlink(missing_ok=True)
295
+
296
+ landed = next((m for m in new_cfg.machines if m.name == name), None)
297
+ if landed is None:
298
+ raise click.ClickException(
299
+ f"refusing to write: the edit parsed but machine {name!r} is not in "
300
+ f"the result. {target} is unchanged."
301
+ )
302
+ missing = [r for r in repos if r not in (landed.repos or [])]
303
+ if missing:
304
+ raise click.ClickException(
305
+ f"refusing to write: the edit parsed but {name!r} does not list "
306
+ f"repo(s) {missing}. {target} is unchanged."
307
+ )
308
+ unmapped = [r for r in repos if not landed.repo_path(r)]
309
+ if unmapped:
310
+ raise click.ClickException(
311
+ f"refusing to write: the edit parsed but {name!r} has no repo_paths "
312
+ f"entry for {unmapped} — dispatch would be refused for exactly "
313
+ f"those repos (#1801). {target} is unchanged."
314
+ )
315
+
316
+ if dry_run:
317
+ click.echo(f"--dry-run: would write {target}")
318
+ click.echo(updated)
319
+ else:
320
+ target.write_text(updated, encoding="utf-8")
321
+ click.echo(f"✓ wrote machines[{name}] to {target}")
322
+ click.echo(f" host: {host}")
323
+ click.echo(f" capabilities: {landed.capabilities or '[]'}")
324
+ click.echo(f" repos: {landed.repos or '[]'}")
325
+ for repo in landed.repos or []:
326
+ click.echo(f" {repo}: {landed.repo_path(repo)}")
327
+
328
+ _print_add_residue(target=target, name=name, host=host, repo_paths=repo_paths)
329
+
330
+
331
+ def _print_add_residue(
332
+ *, target: Path, name: str, host: str, repo_paths: dict[str, str]
333
+ ) -> None:
334
+ """What ``coord machine add`` deliberately did NOT do.
335
+
336
+ Same posture as ``coord repo add``'s residue block: the steps skipped here
337
+ are the ones a wrong guess makes *worse* (installing a venv, cloning
338
+ repos, enabling linger on someone else's box), and they are exactly what
339
+ ``coord machine doctor`` then verifies from live state. Printing an
340
+ honest residue beats pretending completeness — that pretence is how
341
+ ``dell64`` looked onboarded while six things were silently broken.
342
+ """
343
+ click.echo("")
344
+ click.echo("NOT DONE — these need a human, and `coord machine doctor` checks each:")
345
+ tracked = default_settings_dir() / TRACKED_CONFIG_REL
346
+ if target == tracked:
347
+ click.echo(
348
+ f" 1. commit + push in {default_settings_dir()}, then `git pull` on "
349
+ "the daemon host — the fleet runs the COMMITTED config. Check the "
350
+ "daemon's ~/.coord/coordinator.yml is still a SYMLINK into that "
351
+ "checkout: if it has been replaced by a regular file, a correctly "
352
+ "committed-and-pushed edit has no effect and nothing says so "
353
+ "(#2915). `coord diagnose --config` reports this."
354
+ )
355
+ else:
356
+ click.echo(
357
+ f" 1. commit + push {target} wherever it is tracked, then `git "
358
+ "pull` on the daemon host — the fleet runs the COMMITTED config."
359
+ )
360
+ click.echo(
361
+ f" 2. install the agent on {host}: `install-agent.sh`. If a previous "
362
+ "run failed partway, DELETE ~/.coord-venv first — a partial venv "
363
+ "poisons every retry (#2915), and the venv must stay a plain, "
364
+ "NON-editable PyPI install (#402/#2569)."
365
+ )
366
+ click.echo(
367
+ f" 3. give {name} its own ~/.coord/coordinator.yml (a symlink into the "
368
+ "coord-settings checkout) BEFORE starting the agent. An agent that "
369
+ "comes up config-free publishes no capabilities at all, and every "
370
+ "config-vs-/health cross-check then reads as absence rather than truth."
371
+ )
372
+ click.echo(
373
+ f" 4. clone each repo onto {name} — these are the worker WORKTREE "
374
+ "BASES, not convenience checkouts; without one, every dispatch of "
375
+ "that repo here is refused while `coord status` stays green:"
376
+ )
377
+ for repo, path in (repo_paths or {"<each repo>": "~/src/<repo>"}).items():
378
+ click.echo(f" {repo}: {path}")
379
+ click.echo(
380
+ f" 5. `loginctl enable-linger \"$USER\"` on {host} — without it "
381
+ "coord-agent dies at the next logout/reboot and never comes back, and "
382
+ "nothing distinguishes that from a machine being switched off."
383
+ )
384
+ click.echo(
385
+ " 6. install graphify and set `core.hooksPath .githooks` in each "
386
+ "clone. Without the CLI every graph query on that machine degrades to "
387
+ "grep SILENTLY (docs/GRAPHIFY_SETUP.md); `coord repo doctor <repo> "
388
+ "--fix` does the machine-local half once the clones exist."
389
+ )
390
+ click.echo("")
391
+ click.echo(f"Then: coord machine doctor {name} --ssh")
392
+
393
+
394
+ @machine_group.command(
395
+ "doctor",
396
+ help=(
397
+ "Probe all onboarding layers for a machine and report per-layer "
398
+ "status: config, network (does `host:` reach THIS machine?), agent "
399
+ "(live /health), repo clones, graph, and runtime (the agent's venv "
400
+ "and whether it survives logout). Reads LIVE state, not config. "
401
+ "Exits non-zero on any CRIT so it can gate."
402
+ ),
403
+ )
404
+ @click.argument("name")
405
+ @_CONFIG_OPTION
406
+ @click.option(
407
+ "--timeout", default=3.0, show_default=True, type=float,
408
+ help="Per-machine /health timeout (seconds).",
409
+ )
410
+ @click.option(
411
+ "--ssh/--no-ssh", "probe_ssh", default=False, show_default=True,
412
+ help=(
413
+ "Also SSH in to check systemd linger — the one thing /health cannot "
414
+ "see, because an agent answering a probe only proves the user manager "
415
+ "is up right now."
416
+ ),
417
+ )
418
+ @click.option(
419
+ "--ssh-timeout", default=20.0, show_default=True, type=float,
420
+ help="Timeout for the --ssh linger probe (seconds).",
421
+ )
422
+ @click.option(
423
+ "--verbose", "-v", is_flag=True, default=False,
424
+ help="Show passing checks too, not just the residue.",
425
+ )
426
+ def machine_doctor( # noqa: PLR0913 — one option per thing the command can do
427
+ name: str,
428
+ config_path: Path,
429
+ timeout: float,
430
+ probe_ssh: bool, # noqa: FBT001
431
+ ssh_timeout: float,
432
+ verbose: bool, # noqa: FBT001
433
+ ) -> None:
434
+ from coord import machine_onboard, network # noqa: PLC0415
435
+ from coord.network import check_all # noqa: PLC0415
436
+
437
+ cfg = _load_config(config_path)
438
+
439
+ if not any(m.name == name for m in cfg.machines):
440
+ known = [m.name for m in cfg.machines]
441
+ click.echo(
442
+ f"error: machine {name!r} is not in coordinator.yml (have: {known})",
443
+ err=True,
444
+ )
445
+ # Still render the report — `config.machine_missing` IS the finding,
446
+ # and a caller gating on this deserves the same structured output.
447
+ facts = machine_onboard.MachineFacts(name=name, configured=False)
448
+ for line in machine_onboard.format_report(
449
+ machine_onboard.evaluate(facts), verbose=verbose
450
+ ):
451
+ click.echo(line)
452
+ sys.exit(1)
453
+
454
+ # Probe the WHOLE fleet, not just this machine: `agent.version_skew` is
455
+ # "vs the fleet", which needs the others' /health to have an answer at
456
+ # all. It is the same sweep `coord status` does and costs the same.
457
+ statuses = check_all(cfg.machines, timeout=timeout)
458
+ facts = machine_onboard.gather_facts(
459
+ cfg, name,
460
+ statuses=statuses,
461
+ ts_map=network.tailscale_ip_map(timeout=timeout) or {},
462
+ probe_ssh=probe_ssh,
463
+ ssh_timeout=ssh_timeout,
464
+ )
465
+ report = machine_onboard.evaluate(facts)
466
+ for line in machine_onboard.format_report(report, verbose=verbose):
467
+ click.echo(line)
468
+ if not probe_ssh:
469
+ click.echo("")
470
+ click.echo(
471
+ " → systemd linger was NOT checked (/health cannot see it). "
472
+ f"Re-run with --ssh, or `ssh {facts.host} 'loginctl show-user "
473
+ "\"$USER\" --property=Linger'`."
474
+ )
475
+ if not report.ok:
476
+ sys.exit(1)
@@ -1279,6 +1279,39 @@ def _repo_onboarding_lines(cfg, statuses) -> list[tuple[bool, str]]:
1279
1279
  return out
1280
1280
 
1281
1281
 
1282
+ def _machine_onboarding_lines(cfg, machine, statuses, ts_map) -> list[tuple[bool, str]]:
1283
+ """Render one machine's onboarding residue as ``coord doctor`` lines
1284
+ (:mod:`coord.machine_onboard`, #2915).
1285
+
1286
+ The machine-side counterpart of :func:`_repo_onboarding_lines`, and the
1287
+ wiring #2915 asks for: a half-onboarded *machine* shows up in the fleet
1288
+ report without anyone remembering to ask. ``dell64`` was onboarded through
1289
+ six separately-silent failures and the only thing that ever noticed any of
1290
+ them was an operator reading logs by hand.
1291
+
1292
+ Costs **zero** extra round trips — it re-reads the ``/health`` body this
1293
+ command already fetched, and the ``ts_map`` it already resolved once for
1294
+ the #2912 host check. No SSH, so ``runtime.linger`` stays UNKNOWN here and
1295
+ is never surfaced (UNKNOWN is not a problem); ``coord machine doctor
1296
+ <name> --ssh`` is what answers it.
1297
+
1298
+ Mirrors :func:`_unit_drift_lines`/:func:`_release_lag_lines`: same
1299
+ computation as the dedicated command (#2096's "two surfaces, one function"
1300
+ rule), projected into doctor's output. Best-effort — a machine whose facts
1301
+ can't be gathered is skipped rather than breaking the fleet report.
1302
+ """
1303
+ from coord import machine_onboard # noqa: PLC0415
1304
+
1305
+ try:
1306
+ facts = machine_onboard.gather_facts(
1307
+ cfg, machine.name, statuses=statuses, ts_map=ts_map or {}
1308
+ )
1309
+ report = machine_onboard.evaluate(facts)
1310
+ except Exception: # noqa: BLE001 — never break the fleet report
1311
+ return []
1312
+ return machine_onboard.doctor_summary_lines(report)
1313
+
1314
+
1282
1315
  def _release_lag_lines(report) -> list[tuple[bool, str]]:
1283
1316
  """Render a :class:`coord.release_verify.VerifyReport`'s findings as
1284
1317
  ``coord doctor`` lines (#2082).
@@ -1435,6 +1468,27 @@ def doctor(
1435
1468
  if is_problem:
1436
1469
  any_problem = True
1437
1470
 
1471
+ # #2915: is this MACHINE only half-onboarded? Costs nothing extra —
1472
+ # reuses the `/health` body and the `ts_map` already resolved above.
1473
+ # Deliberately only graphify + the agent venv — the two layers
1474
+ # nothing else in this command renders. Repo-clone presence is
1475
+ # deliberately NOT folded in a second time here: the #1712
1476
+ # cross-check immediately above (`_health_vs_config_lines`) already
1477
+ # answers "is a declared repo actually being served" for both the
1478
+ # total-loss and #2219 partial-drift shapes, under its own
1479
+ # `CRIT repos: ...` name — folding `clones` in too printed the same
1480
+ # defect twice under two names (caught in review of #2915). See
1481
+ # `machine_onboard.DOCTOR_LIVE_LAYERS` for the full reasoning, and
1482
+ # for why network/agent are excluded the same way. Placed BEFORE
1483
+ # the tool_versions early-continue below for the same reason #1712's
1484
+ # cross-check is: "the graph CLI is missing" and "this repo isn't
1485
+ # cloned" must not be skipped just because the agent is also too old
1486
+ # to report probes.
1487
+ for is_problem, line in _machine_onboarding_lines(cfg, m, statuses, ts_map):
1488
+ click.echo(line)
1489
+ if is_problem:
1490
+ any_problem = True
1491
+
1438
1492
  raw_probes = health.get("tool_versions")
1439
1493
  if not raw_probes:
1440
1494
  click.echo(