code-coordinator 0.5.497__tar.gz → 0.5.498__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 (898) hide show
  1. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/release.py +55 -3
  5. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/release_propagate.py +49 -0
  6. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_release_propagate.py +148 -2
  7. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_propagate.py +62 -0
  8. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.claude/commands/board.md +0 -0
  9. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.claude/commands/complete-session.md +0 -0
  10. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.claude/commands/coordinator.md +0 -0
  11. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.githooks/_lib.sh +0 -0
  12. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.githooks/post-checkout +0 -0
  13. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.githooks/post-commit +0 -0
  14. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.githooks/post-merge +0 -0
  15. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.github/coord-ci-acceptance.yml +0 -0
  17. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.github/workflows/auto-release.yml +0 -0
  18. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.github/workflows/publish.yml +0 -0
  19. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.github/workflows/test.yml +0 -0
  20. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/.gitignore +0 -0
  21. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/CLAUDE.md +0 -0
  22. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/GOAL.md +0 -0
  23. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/LICENSE +0 -0
  24. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/MANIFEST.in +0 -0
  25. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/README.md +0 -0
  26. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/SOURCES.txt +0 -0
  27. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/dependency_links.txt +0 -0
  28. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/entry_points.txt +0 -0
  29. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/requires.txt +0 -0
  30. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_file_list.json +0 -0
  31. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/code_coordinator.egg-info/top_level.txt +0 -0
  32. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/__init__.py +0 -0
  33. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/_board_mapping.py +0 -0
  34. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/acceptance.py +0 -0
  35. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/acceptance_drivers.py +0 -0
  36. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agent.py +0 -0
  37. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agent_app.py +0 -0
  38. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agent_update.py +0 -0
  39. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agents/opencode/.gitignore +0 -0
  40. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agents/opencode/agents/work.md +0 -0
  41. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/agents/opencode/routing.jsonc +0 -0
  42. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/approved_work.py +0 -0
  43. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/audit.py +0 -0
  44. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/auto_loop.py +0 -0
  45. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/backup.py +0 -0
  46. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/block_log.py +0 -0
  47. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/board_schema.py +0 -0
  48. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/board_service.py +0 -0
  49. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/board_wire.py +0 -0
  50. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/brain.py +0 -0
  51. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/branch_model.py +0 -0
  52. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/bug_intake.py +0 -0
  53. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/cargo_cache.py +0 -0
  54. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/ci_fix.py +0 -0
  55. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/ci_github.py +0 -0
  56. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/ci_gitlab.py +0 -0
  57. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/claude_setup_token.py +0 -0
  60. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/client.py +0 -0
  62. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/codegen.py +0 -0
  63. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/backup.py +0 -0
  69. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/codegen.py +0 -0
  71. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/dr.py +0 -0
  74. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/store_migrate.py +0 -0
  95. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/config.py +0 -0
  100. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/db.py +0 -0
  110. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-backup.service +0 -0
  115. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-backup.timer +0 -0
  116. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.service +0 -0
  117. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.sh +0 -0
  118. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.timer +0 -0
  119. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.service +0 -0
  120. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.timer +0 -0
  121. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.service +0 -0
  122. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.timer +0 -0
  123. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-failure-notify.service +0 -0
  124. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.service +0 -0
  125. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  126. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-notify.service +0 -0
  127. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-notify.timer +0 -0
  128. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.service +0 -0
  129. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.timer +0 -0
  130. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.service +0 -0
  131. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.timer +0 -0
  132. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-serve.service +0 -0
  133. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.service +0 -0
  134. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.timer +0 -0
  135. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy/coord-web.service +0 -0
  136. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy_manifest.py +0 -0
  137. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deploy_units.py +0 -0
  138. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deprecation_telemetry.py +0 -0
  139. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/deps.py +0 -0
  140. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/diagnose.py +0 -0
  141. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dispatch_liveness.py +0 -0
  143. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dist_name.py +0 -0
  144. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dr_promote.py +0 -0
  145. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/dr_verify.py +0 -0
  146. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/drive.py +0 -0
  147. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/drive_queue.py +0 -0
  148. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/drive_state.py +0 -0
  149. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/events.py +0 -0
  150. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/failure_class.py +0 -0
  151. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/failure_classifier.py +0 -0
  152. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/filelock.py +0 -0
  153. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/fleet_config_health.py +0 -0
  154. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/forge_availability.py +0 -0
  155. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/freshness.py +0 -0
  156. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/gate_a.py +0 -0
  157. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/gate_b.py +0 -0
  158. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/gate_snapshot.py +0 -0
  159. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/gates.py +0 -0
  160. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/gen_board_fixture.py +0 -0
  161. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/github_ops.py +0 -0
  162. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/github_throttle.py +0 -0
  163. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/goal.py +0 -0
  164. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/graph_health.py +0 -0
  165. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/__init__.py +0 -0
  166. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/aggregate.py +0 -0
  167. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/__init__.py +0 -0
  168. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/_ci_pin.py +0 -0
  169. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/agent_install.py +0 -0
  170. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/cargo_targets.py +0 -0
  171. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/claude_binary.py +0 -0
  172. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/config_drift.py +0 -0
  173. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  174. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/coord_web_ci_pin.py +0 -0
  175. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/deploy_lane_facts.py +0 -0
  176. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/disk.py +0 -0
  177. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/fleet_board.py +0 -0
  178. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  179. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/fleet_phantom.py +0 -0
  180. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/fleet_unit_drift.py +0 -0
  181. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/graph.py +0 -0
  182. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/graphify_cli.py +0 -0
  183. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/index_lock.py +0 -0
  184. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/issues_sync_staleness.py +0 -0
  185. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/plan_usage.py +0 -0
  186. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/pr_churn.py +0 -0
  187. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/release_cordon.py +0 -0
  188. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/repo_state.py +0 -0
  189. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/spawned_coord.py +0 -0
  190. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/stalled_pipeline.py +0 -0
  191. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/timer_active.py +0 -0
  192. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/toolchain.py +0 -0
  193. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/unit_drift.py +0 -0
  194. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/unit_enablement.py +0 -0
  195. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/wedged_drive_queue.py +0 -0
  196. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/checks/worktrees.py +0 -0
  197. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/cli.py +0 -0
  198. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/context.py +0 -0
  199. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/fleet_snapshot.py +0 -0
  200. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/models.py +0 -0
  201. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/pypi.py +0 -0
  202. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/registry.py +0 -0
  203. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/render.py +0 -0
  204. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/health/units.py +0 -0
  205. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/hooks.py +0 -0
  206. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/housekeeping.py +0 -0
  207. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/interactive.py +0 -0
  208. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/invariant_alarms.py +0 -0
  209. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/issue_store.py +0 -0
  210. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/issues_sync_status.py +0 -0
  211. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/liveness_auditor.py +0 -0
  212. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/machine_fault.py +0 -0
  213. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/machine_metrics.py +0 -0
  214. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/machine_onboard.py +0 -0
  215. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/machine_pause.py +0 -0
  216. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/machine_stats.py +0 -0
  217. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/merge_queue.py +0 -0
  218. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/milestone_chat.py +0 -0
  219. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/milestone_dispatch.py +0 -0
  220. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/milestone_gate.py +0 -0
  221. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/milestone_order.py +0 -0
  222. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/mock_author.py +0 -0
  223. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/models.py +0 -0
  224. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/network.py +0 -0
  225. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/new_issue_chat.py +0 -0
  226. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/__init__.py +0 -0
  227. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/baseline.py +0 -0
  228. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/cli.py +0 -0
  229. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/collect.py +0 -0
  230. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/digest.py +0 -0
  231. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/models.py +0 -0
  232. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/predicate.py +0 -0
  233. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/service.py +0 -0
  234. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/store.py +0 -0
  235. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notifier/transport.py +0 -0
  236. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/notify.py +0 -0
  237. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/openapi.py +0 -0
  238. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/overlap_fence.py +0 -0
  239. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/overlap_predict.py +0 -0
  240. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/parentage.py +0 -0
  241. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/parentage_github.py +0 -0
  242. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/pipeline.py +0 -0
  243. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/plan_parser.py +0 -0
  244. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/plans.py +0 -0
  245. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/platform_paths.py +0 -0
  246. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/portal_bridge.py +0 -0
  247. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/portal_store.py +0 -0
  248. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/portal_sync.py +0 -0
  249. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/pr_body_lint.py +0 -0
  250. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/prereqs.py +0 -0
  251. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/progress.py +0 -0
  252. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/providers/__init__.py +0 -0
  253. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/providers/base.py +0 -0
  254. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/providers/claude.py +0 -0
  255. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/providers/claude_pty.py +0 -0
  256. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/providers/opencode.py +0 -0
  257. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/queue_diagnose.py +0 -0
  258. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/reconcile.py +0 -0
  259. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/reconcile_tick.py +0 -0
  260. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/refine_chat.py +0 -0
  261. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/release_cordon.py +0 -0
  262. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/release_verify.py +0 -0
  263. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/release_window.py +0 -0
  264. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/repo_dormancy.py +0 -0
  265. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/repo_edit.py +0 -0
  266. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/repo_onboard.py +0 -0
  267. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/reports.py +0 -0
  268. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/rest_schema.py +0 -0
  269. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/revalidate.py +0 -0
  270. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/review.py +0 -0
  271. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/scorecard.py +0 -0
  272. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/self_health.py +0 -0
  273. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/serve_app.py +0 -0
  274. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  275. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  276. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  277. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  278. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  279. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/portal-followup/SKILL.md +0 -0
  280. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/release-now/SKILL.md +0 -0
  281. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  282. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  283. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/skills/update-issue/SKILL.md +0 -0
  284. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/smoke.py +0 -0
  285. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/spend_ceiling.py +0 -0
  286. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/split_work.py +0 -0
  287. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/sql.py +0 -0
  288. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/stage_projection.py +0 -0
  289. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/state.py +0 -0
  290. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/store_migrate.py +0 -0
  291. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/store_parity.py +0 -0
  292. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/templates/deploy-cloudflare.node.yml +0 -0
  293. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/test_author.py +0 -0
  294. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/test_chat.py +0 -0
  295. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/test_orchestrator.py +0 -0
  296. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/test_report.py +0 -0
  297. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/tui_release.py +0 -0
  298. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/uat_checks.py +0 -0
  299. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/usage.py +0 -0
  300. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/usage_limits.py +0 -0
  301. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/usage_rollup.py +0 -0
  302. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coord/worker_events.py +0 -0
  303. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/coordinator.example.yml +0 -0
  304. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-agent.service +0 -0
  305. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-backup.service +0 -0
  306. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-backup.timer +0 -0
  307. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-db-backup.service +0 -0
  308. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-db-backup.sh +0 -0
  309. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-db-backup.timer +0 -0
  310. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-dr-verify.service +0 -0
  311. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-dr-verify.timer +0 -0
  312. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-drive-queue.service +0 -0
  313. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-drive-queue.timer +0 -0
  314. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-failure-notify.service +0 -0
  315. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-failure-notify.sh +0 -0
  316. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.service +0 -0
  317. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.timer +0 -0
  318. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-notify.service +0 -0
  319. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-notify.timer +0 -0
  320. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-release-propagate.service +0 -0
  321. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-release-propagate.timer +0 -0
  322. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-release-window.service +0 -0
  323. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-release-window.timer +0 -0
  324. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-serve.service +0 -0
  325. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.service +0 -0
  326. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.sh +0 -0
  327. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.timer +0 -0
  328. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-web-rollback.sh +0 -0
  329. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/coord-web.service +0 -0
  330. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/deploy/node-shim.sh +0 -0
  331. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ADR_COORD_TUI_CI.md +0 -0
  332. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  333. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_CI.md +0 -0
  334. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_DIST.md +0 -0
  335. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  336. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/AGENT_OPERATIONS.md +0 -0
  337. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ARCHITECTURE.md +0 -0
  338. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ARCH_SECURITY_GATES.md +0 -0
  339. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/COCKPIT.md +0 -0
  340. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/CONTROL_CENTER.md +0 -0
  341. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/COST_DISCIPLINE.md +0 -0
  342. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/CROSS_PLATFORM.md +0 -0
  343. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/CUSTOMER_FACING_APPS.md +0 -0
  344. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/CUSTOMER_PORTAL.md +0 -0
  345. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/DATA_STORE_SELECTION.md +0 -0
  346. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/DISASTER_RECOVERY.md +0 -0
  347. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/DRIVE_QUEUE.md +0 -0
  348. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/EPHEMERAL_WORKERS.md +0 -0
  349. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/FORGE_MIGRATION.md +0 -0
  350. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/GRAPHIFY_SETUP.md +0 -0
  351. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ISSUE_GUIDANCE.md +0 -0
  352. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/MAC_MINI.md +0 -0
  353. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  354. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/NOTIFIER.md +0 -0
  355. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/OPENCODE_VERIFICATION.md +0 -0
  356. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/OPERATING_GOTCHAS.md +0 -0
  357. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/OPERATOR_GUIDES.md +0 -0
  358. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/ORACLE_LOOP.md +0 -0
  359. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/PHONE_WEBAPP.md +0 -0
  360. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/PIPELINE_V2.md +0 -0
  361. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/PLATFORM_EVOLUTION.md +0 -0
  362. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/SECOND_BACKEND.md +0 -0
  363. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/STORE_SERVICE.md +0 -0
  364. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  365. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/WEB_CONTROL_CENTER.md +0 -0
  366. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/WSL_WINDOWS_WORKER.md +0 -0
  367. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/mocks/web/README.md +0 -0
  368. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/mocks/web/_tokens.css +0 -0
  369. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/mocks/web/issue-detail.html +0 -0
  370. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-narrow.html +0 -0
  371. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-wide.html +0 -0
  372. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/graphify-out/.gitignore +0 -0
  373. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/install-agent.sh +0 -0
  374. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/pyproject.toml +0 -0
  375. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/audit_review_verdict_overrides.py +0 -0
  376. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  377. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/build-worker-image.sh +0 -0
  378. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/coordinator-machine.py +0 -0
  379. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/dr-down.sh +0 -0
  380. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/dr-up.sh +0 -0
  381. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/epic-down.sh +0 -0
  382. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/epic-up.sh +0 -0
  383. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/preflight.sh +0 -0
  384. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/provision-server.sh +0 -0
  385. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/provision-worker.sh +0 -0
  386. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  387. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  388. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/throwaway-vm.sh +0 -0
  389. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/azure-workers/verify-github-token.sh +0 -0
  390. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/check_gh_argv_containment.py +0 -0
  391. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/codegen.py +0 -0
  392. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-test-runner.sh +0 -0
  393. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  394. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  395. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  396. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  397. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/coord-venv-rollback.sh +0 -0
  398. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/drive-batch.sh +0 -0
  399. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/extract-coord-tui.sh +0 -0
  400. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/fleet_watchdog.py +0 -0
  401. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/gen_board_fixture.py +0 -0
  402. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/gen_mock_index.py +0 -0
  403. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/lib/provision-core.sh +0 -0
  404. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/next_release_tag.py +0 -0
  405. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/provision-machine.sh +0 -0
  406. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/run_tests_in_populated_home.sh +0 -0
  407. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/run_tests_without_gh.sh +0 -0
  408. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/setup-macmini.sh +0 -0
  409. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/verify-provision-noble.sh +0 -0
  411. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/verify_878_review_capture.py +0 -0
  412. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/verify_release_published.py +0 -0
  413. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/scripts/verify_release_wheel.py +0 -0
  414. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/setup.cfg +0 -0
  415. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/SMOKE_SET.md +0 -0
  416. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/__init__.py +0 -0
  417. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-37/conftest.py +0 -0
  418. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-37/contract.md +0 -0
  419. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-37/manifest.yml +0 -0
  420. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  421. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  422. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/contract.md +0 -0
  423. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  424. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  425. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/manifest.yml +0 -0
  426. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  427. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-51/tsconfig.json +0 -0
  428. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  429. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/backends.py +0 -0
  430. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/conftest.py +0 -0
  431. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-basic.json +0 -0
  432. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  433. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  434. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  435. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  436. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/all_pass.json +0 -0
  437. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  438. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/mixed_fail.json +0 -0
  439. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  440. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  441. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/skip.json +0 -0
  442. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/playwright/truncated.json +0 -0
  443. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  444. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  445. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  446. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  447. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  448. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  449. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  450. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  451. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_acceptance.py +0 -0
  452. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_acceptance_drivers.py +0 -0
  453. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent.py +0 -0
  454. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_api_error.py +0 -0
  455. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_app.py +0 -0
  456. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_branch_base.py +0 -0
  457. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_branch_capture.py +0 -0
  458. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_config_free_1712.py +0 -0
  459. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_deploy_units_endpoint.py +0 -0
  460. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_dirty_worktree.py +0 -0
  461. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  462. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_graph_self_heal.py +0 -0
  463. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_health_h3.py +0 -0
  464. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_idle_restart.py +0 -0
  465. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_push_failure.py +0 -0
  466. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_reap.py +0 -0
  467. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_repos_and_pull.py +0 -0
  468. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_restart_services_endpoint.py +0 -0
  469. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_skills_self_heal.py +0 -0
  470. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_startup_diagnostics.py +0 -0
  471. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_update.py +0 -0
  472. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_update_bluegreen.py +0 -0
  473. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_usage_limit.py +0 -0
  474. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_agent_zero_commit.py +0 -0
  475. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ambient_home_isolation.py +0 -0
  476. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approve_capability_reroute_3241.py +0 -0
  477. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approve_dependency_busy_2804.py +0 -0
  478. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approve_reject_plan.py +0 -0
  479. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approve_usage_gate.py +0 -0
  480. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approved_work_2532.py +0 -0
  481. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_approved_work_2996.py +0 -0
  482. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_assignment_already_recorded_daemon.py +0 -0
  483. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_audit_log.py +0 -0
  484. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_audit_outcome.py +0 -0
  485. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_audit_query.py +0 -0
  486. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_auto_loop.py +0 -0
  487. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_auto_release_publish_2035.py +0 -0
  488. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_backend_selection.py +0 -0
  489. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_backup.py +0 -0
  490. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_base_checkout_restore.py +0 -0
  491. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_block_log.py +0 -0
  492. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_cap_762.py +0 -0
  493. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_fixture.py +0 -0
  494. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_read_path.py +0 -0
  495. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_schema.py +0 -0
  496. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_service.py +0 -0
  497. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_state.py +0 -0
  498. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_board_wire.py +0 -0
  499. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_brain.py +0 -0
  500. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_branch_model.py +0 -0
  501. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_bug_intake.py +0 -0
  502. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_build_worker_image_env_update.py +0 -0
  503. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cargo_cache.py +0 -0
  504. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_check_gh_argv_containment.py +0 -0
  505. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_acceptance_gate_1950.py +0 -0
  506. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_fix.py +0 -0
  507. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_github.py +0 -0
  508. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_gitlab.py +0 -0
  509. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_parity_2091.py +0 -0
  510. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_ci_store.py +0 -0
  511. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_claim.py +0 -0
  512. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_claude_md_budget.py +0 -0
  513. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_claude_setup_token.py +0 -0
  514. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  520. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_audit.py +0 -0
  521. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_chat_continue.py +0 -0
  522. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_codegen.py +0 -0
  523. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_decide.py +0 -0
  524. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_capability_rules.py +0 -0
  525. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_config_provenance.py +0 -0
  526. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_forge_availability.py +0 -0
  527. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_graph.py +0 -0
  528. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_self.py +0 -0
  529. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_diagnose_test_coverage.py +0 -0
  530. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_doctor.py +0 -0
  531. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_free_1801.py +0 -0
  532. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  533. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  534. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_drive.py +0 -0
  535. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_drive_queue.py +0 -0
  536. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_escalate.py +0 -0
  537. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_fix_headless_review.py +0 -0
  538. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_gate_a.py +0 -0
  539. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_install_drift.py +0 -0
  540. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_install_skills.py +0 -0
  541. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_issue_comment.py +0 -0
  542. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_issue_create_label.py +0 -0
  543. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_issue_reopen.py +0 -0
  544. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_issue_view_list.py +0 -0
  545. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_merge.py +0 -0
  546. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_assign.py +0 -0
  547. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_capture.py +0 -0
  548. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_chat_add_child.py +0 -0
  549. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_dispatch.py +0 -0
  550. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_b.py +0 -0
  551. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_c.py +0 -0
  552. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_order.py +0 -0
  553. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  554. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_milestone_ship.py +0 -0
  555. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_network.py +0 -0
  556. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_new_issue_chat.py +0 -0
  557. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_plans.py +0 -0
  558. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_portal.py +0 -0
  559. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_pr.py +0 -0
  560. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_pull_artifact.py +0 -0
  561. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_queue.py +0 -0
  562. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_reattach_sessions.py +0 -0
  563. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_refine_board.py +0 -0
  564. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_release_preflight.py +0 -0
  565. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_release_window.py +0 -0
  566. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_repo_2220.py +0 -0
  567. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  568. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_serve_store_backend_3084.py +0 -0
  570. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_set_review_findings.py +0 -0
  571. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_advisory_terminal.py +0 -0
  572. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_contested_tag.py +0 -0
  573. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_invariant_alarms.py +0 -0
  574. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_machine_fault.py +0 -0
  575. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_merge_queue.py +0 -0
  576. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_provider.py +0 -0
  577. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_retried_3340.py +0 -0
  578. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_review_finalizing.py +0 -0
  579. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_test_failed_tag.py +0 -0
  580. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_status_usage_limit.py +0 -0
  581. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_sync_comments_873.py +0 -0
  582. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_test_plan.py +0 -0
  583. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_track.py +0 -0
  584. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_tui_update.py +0 -0
  585. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cli_wait.py +0 -0
  586. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_client.py +0 -0
  587. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_client_base_install.py +0 -0
  588. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_client_config_cache_atomic_3052.py +0 -0
  589. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_client_resource_migration_1946.py +0 -0
  590. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_commands_common.py +0 -0
  591. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_comments.py +0 -0
  592. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_completion_summary.py +0 -0
  593. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config.py +0 -0
  594. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_acceptance.py +0 -0
  595. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_audit.py +0 -0
  596. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_drift_check.py +0 -0
  597. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_pricing.py +0 -0
  598. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  599. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_config_usage_gate.py +0 -0
  600. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_confirm_test.py +0 -0
  601. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_conflict_fix.py +0 -0
  602. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_conflict_fix_semantic.py +0 -0
  603. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  604. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test.py +0 -0
  605. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  606. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test_runner_baseline.py +0 -0
  607. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test_runner_populated_home.py +0 -0
  608. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test_runner_routing.py +0 -0
  609. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_test_runner_toolchain.py +0 -0
  610. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_uat.py +0 -0
  611. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coord_web_sse_restart_live.py +0 -0
  612. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_coordinator_machine.py +0 -0
  613. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_cross_platform_imports.py +0 -0
  614. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dao.py +0 -0
  615. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard.py +0 -0
  616. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard_api.py +0 -0
  617. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard_fixture.py +0 -0
  618. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard_server.py +0 -0
  619. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard_terminal.py +0 -0
  620. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dashboard_terminal_live.py +0 -0
  621. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_db.py +0 -0
  622. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dead_end.py +0 -0
  623. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_decomposition_chat.py +0 -0
  624. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_coord_db_backup.py +0 -0
  625. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_dist.py +0 -0
  626. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_rollback.py +0 -0
  627. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_db_backup_unit.py +0 -0
  628. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_drive_queue_unit.py +0 -0
  629. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_failure_notify_unit.py +0 -0
  630. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_manifest.py +0 -0
  631. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_notify_unit.py +0 -0
  632. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_units_lane.py +0 -0
  633. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deploy_web_unit.py +0 -0
  634. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deprecation_telemetry.py +0 -0
  635. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_deps.py +0 -0
  636. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_diagnose.py +0 -0
  637. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dispatch.py +0 -0
  638. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dispatch_liveness.py +0 -0
  639. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dispatch_target_validation.py +0 -0
  640. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dispatch_workers.py +0 -0
  641. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dist_name.py +0 -0
  642. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_done_housekeeping.py +0 -0
  643. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dr_azure_scripts.py +0 -0
  644. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dr_promote.py +0 -0
  645. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_dr_verify.py +0 -0
  646. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive.py +0 -0
  647. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_machine_fault.py +0 -0
  648. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue.py +0 -0
  649. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_blocked_rendering.py +0 -0
  650. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_launch_argv.py +0 -0
  651. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_config.py +0 -0
  652. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  653. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_roll_pending.py +0 -0
  654. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  655. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_state.py +0 -0
  656. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_drive_tmux.py +0 -0
  657. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_epic_up_capability_detection.py +0 -0
  658. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  659. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_epic_up_image_provenance.py +0 -0
  660. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_errors.py +0 -0
  661. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_events.py +0 -0
  662. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_failure_class.py +0 -0
  663. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_failure_classifier.py +0 -0
  664. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_filelock.py +0 -0
  665. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  666. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fix_escalation_classifier.py +0 -0
  667. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fix_of_force_override.py +0 -0
  668. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fleet_config_health.py +0 -0
  669. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fleet_health_probes.py +0 -0
  670. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fleet_health_snapshot.py +0 -0
  671. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_fleet_watchdog.py +0 -0
  672. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_forge_availability.py +0 -0
  673. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_freshness.py +0 -0
  674. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gate_a.py +0 -0
  675. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gate_b.py +0 -0
  676. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gate_snapshot_staleness.py +0 -0
  677. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gates.py +0 -0
  678. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  679. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_gen_mock_index.py +0 -0
  680. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_generated_rust_fixture.py +0 -0
  681. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_generated_rust_requests.py +0 -0
  682. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_generated_types_fixture.py +0 -0
  683. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_github_ops.py +0 -0
  684. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_github_throttle.py +0 -0
  685. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_goal.py +0 -0
  686. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_graph_health.py +0 -0
  687. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_graph_selfheal_absent_2237.py +0 -0
  688. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_handoff.py +0 -0
  689. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_checks.py +0 -0
  690. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_cli.py +0 -0
  691. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_cli_graph.py +0 -0
  692. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_config.py +0 -0
  693. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_context.py +0 -0
  694. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_coord_tui_ci_pin.py +0 -0
  695. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_coord_web_ci_pin.py +0 -0
  696. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_deploy_lane_facts.py +0 -0
  697. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_fix.py +0 -0
  698. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_incident_regression.py +0 -0
  699. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_issues_sync_staleness.py +0 -0
  700. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_pr_churn.py +0 -0
  701. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_pypi.py +0 -0
  702. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_registry.py +0 -0
  703. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_release_cordon_probe.py +0 -0
  704. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_timer_active.py +0 -0
  705. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_toolchain.py +0 -0
  706. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_unit_drift.py +0 -0
  707. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_unit_enablement.py +0 -0
  708. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_health_wedged_drive_queue.py +0 -0
  709. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_hooks.py +0 -0
  710. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_housekeeping.py +0 -0
  711. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_human_attended_437.py +0 -0
  712. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_init.py +0 -0
  713. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_install_agent_venv_2911.py +0 -0
  714. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_integration.py +0 -0
  715. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_briefing_echo.py +0 -0
  716. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_pane_log_2541.py +0 -0
  717. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_prefill_state.py +0 -0
  718. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_session_relaunch.py +0 -0
  719. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_test_verdict_backstop.py +0 -0
  720. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_token_attribution.py +0 -0
  721. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_interactive_worktree.py +0 -0
  722. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_invariant_alarms.py +0 -0
  723. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_issue_store_seam.py +0 -0
  724. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_issues_sync_status.py +0 -0
  725. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_liveness_auditor.py +0 -0
  726. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_liveness_notify.py +0 -0
  727. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_lock_contention_ratchet.py +0 -0
  728. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_machine_fault.py +0 -0
  729. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_machine_metrics.py +0 -0
  730. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_machine_onboard.py +0 -0
  731. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_machine_pause.py +0 -0
  732. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_machine_stats.py +0 -0
  733. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_merge_queue.py +0 -0
  734. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_merge_verify.py +0 -0
  735. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_milestone_chat.py +0 -0
  736. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_milestone_dispatch.py +0 -0
  737. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_milestone_gate.py +0 -0
  738. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_milestone_order.py +0 -0
  739. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_milestone_seam.py +0 -0
  740. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_mock_author.py +0 -0
  741. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_model_tiering.py +0 -0
  742. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_models.py +0 -0
  743. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_models_config_labels.py +0 -0
  744. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_needs_attention.py +0 -0
  745. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_network.py +0 -0
  746. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_new_issue_chat.py +0 -0
  747. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_next_release_tag.py +0 -0
  748. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_node_shim.py +0 -0
  749. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_baseline.py +0 -0
  750. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_cli.py +0 -0
  751. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_collect.py +0 -0
  752. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_config.py +0 -0
  753. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_drive_seam.py +0 -0
  754. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_isolation.py +0 -0
  755. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_predicate.py +0 -0
  756. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_quiet_hours.py +0 -0
  757. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notifier_service.py +0 -0
  758. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notify.py +0 -0
  759. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_notify_drain.py +0 -0
  760. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_openapi.py +0 -0
  761. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_operational_defaults.py +0 -0
  762. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_overlap_fence.py +0 -0
  763. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_overlap_predict.py +0 -0
  764. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_packaged_deploy_units.py +0 -0
  765. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_parentage.py +0 -0
  766. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_paste_landed.py +0 -0
  767. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  768. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_pipeline.py +0 -0
  769. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_plan_followup_approve_plan_command.py +0 -0
  770. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_plan_followup_pr_command.py +0 -0
  771. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_plan_followup_review_command.py +0 -0
  772. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_plan_only.py +0 -0
  773. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_plan_parser.py +0 -0
  774. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_platform_paths.py +0 -0
  775. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_portal_bridge.py +0 -0
  776. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_portal_config.py +0 -0
  777. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_portal_store.py +0 -0
  778. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_portal_sync.py +0 -0
  779. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_pr_body_lint.py +0 -0
  780. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_prereqs.py +0 -0
  781. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_production_db_guard.py +0 -0
  782. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_progress.py +0 -0
  783. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_provider_seam.py +0 -0
  784. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_providers.py +0 -0
  785. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_providers_config_labels.py +0 -0
  786. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_providers_pty.py +0 -0
  787. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_provision_core.py +0 -0
  788. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_provision_machine.py +0 -0
  789. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_py_rust_mirror_inventory.py +0 -0
  790. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_quiet_hours.py +0 -0
  791. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_quiet_hours_store_2146.py +0 -0
  792. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reap_merged_sessions.py +0 -0
  793. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reap_stale_interactive_tick.py +0 -0
  794. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile.py +0 -0
  795. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_branch.py +0 -0
  796. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_completions.py +0 -0
  797. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  798. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_merges.py +0 -0
  799. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_no_agent_record.py +0 -0
  800. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_tick.py +0 -0
  801. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reconcile_usage_limit_done.py +0 -0
  802. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_refine_chat.py +0 -0
  803. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_cordon_2101.py +0 -0
  804. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  805. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_cordon_deadlock_2240.py +0 -0
  806. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  807. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_cordon_stuck_2490.py +0 -0
  808. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_propagate_threshold.py +0 -0
  809. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_roll_between_legs_2854.py +0 -0
  810. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_roll_window_handoff.py +0 -0
  811. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_unified_1242.py +0 -0
  812. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_verify.py +0 -0
  813. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_release_window.py +0 -0
  814. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_remote_auto_prune.py +0 -0
  815. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_remote_interactive_reaper.py +0 -0
  816. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_repo_add.py +0 -0
  817. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_repo_dormancy.py +0 -0
  818. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_repo_edit_2220.py +0 -0
  819. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_repo_graph_fleet_2237.py +0 -0
  820. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_repo_onboard_2220.py +0 -0
  821. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_report_result_push.py +0 -0
  822. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_reports.py +0 -0
  823. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_retry.py +0 -0
  824. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_retry_advisory_1606.py +0 -0
  825. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_retry_escalation_classify_3360.py +0 -0
  826. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_retry_type_1636.py +0 -0
  827. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_revalidate.py +0 -0
  828. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review.py +0 -0
  829. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_end_review_without_verdict.py +0 -0
  830. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_parse_failure_diagnostic.py +0 -0
  831. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_reaffirm.py +0 -0
  832. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_state.py +0 -0
  833. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_verdict_backstop.py +0 -0
  834. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_verdict_override_audit.py +0 -0
  835. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_verdict_relay.py +0 -0
  836. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_review_zero_commits.py +0 -0
  837. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_scoped_review_wiring.py +0 -0
  838. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_scorecard.py +0 -0
  839. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_self_health.py +0 -0
  840. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_serve.py +0 -0
  841. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_serve_app.py +0 -0
  842. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_serve_app_board_trim.py +0 -0
  843. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_serve_rest_routes.py +0 -0
  844. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_session.py +0 -0
  845. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_slice_issue_attribution.py +0 -0
  846. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_smoke.py +0 -0
  847. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  848. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_smoke_live_checkout_restore.py +0 -0
  849. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_smoke_workflow.py +0 -0
  850. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_spend_ceiling.py +0 -0
  851. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_spend_ceiling_coordinator.py +0 -0
  852. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_split.py +0 -0
  853. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_split_work.py +0 -0
  854. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_sql_dialect.py +0 -0
  855. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_sqlite_connect_ratchet.py +0 -0
  856. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stage_projection.py +0 -0
  857. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stale_busy_reviewer_697.py +0 -0
  858. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stalled_pipeline.py +0 -0
  859. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_state.py +0 -0
  860. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_state_review_findings_daemon.py +0 -0
  861. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_status_fleet_footer.py +0 -0
  862. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stop_1567.py +0 -0
  863. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_store_contract.py +0 -0
  864. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_store_migrate.py +0 -0
  865. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stuck.py +0 -0
  866. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  867. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_terminal_command.py +0 -0
  868. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_author.py +0 -0
  869. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_chat.py +0 -0
  870. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_orchestrator.py +0 -0
  871. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_report.py +0 -0
  872. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_verdict_parsing.py +0 -0
  873. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_test_verdict_transcript_floor.py +0 -0
  874. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_text_io_encoding_audit.py +0 -0
  875. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_thin_client_board_audit.py +0 -0
  876. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_thin_client_config_load_1080.py +0 -0
  877. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_thin_client_daemon_routing_906.py +0 -0
  878. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_throwaway_vm.py +0 -0
  879. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_tmux_host.py +0 -0
  880. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_tmux_session.py +0 -0
  881. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_transcript_floor.py +0 -0
  882. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_uat_checks.py +0 -0
  883. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_usage.py +0 -0
  884. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_usage_limits.py +0 -0
  885. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_usage_rollup.py +0 -0
  886. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_venv_live_install_2121.py +0 -0
  887. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_version_single_source.py +0 -0
  888. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_watch.py +0 -0
  889. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  890. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worker_env_venv_isolation.py +0 -0
  891. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worker_events.py +0 -0
  892. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worker_image_pin_sync.py +0 -0
  893. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worker_safety.py +0 -0
  894. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worker_test_scoping.py +0 -0
  895. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worktree.py +0 -0
  896. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  897. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/test_write_parity.py +0 -0
  898. {code_coordinator-0.5.497 → code_coordinator-0.5.498}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.497
3
+ Version: 0.5.498
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.497
3
+ Version: 0.5.498
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.497",
2
+ "tag": "0.5.498",
3
3
  "distance": 0,
4
- "node": "gd05a81b74292333679389936cf7cdb3edea6fd12",
4
+ "node": "g99081c11bad4947401aaeef6ccd4301a2b450952",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-19"
@@ -1722,8 +1722,32 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
1722
1722
  # never touched would undo somebody else's deliberate state.
1723
1723
  from coord.agent_update import cli_initiator # noqa: PLC0415
1724
1724
 
1725
+ # #3364: narrow further, to the hosts the RED GATE ITSELF names.
1726
+ # `--rollback-on-red` used to revert every host this run updated
1727
+ # the moment ANY of them went red — four hosts that rolled and
1728
+ # verified clean, reverted because a fifth could not roll at all.
1729
+ # A host that rolled and verified is not part of the failure just
1730
+ # because a sibling host's roll was; partial fleet convergence is
1731
+ # strictly better than reverting everyone plus the fifth's own
1732
+ # damage. `blocking_hosts` is `None` when the gate cannot attribute
1733
+ # to specific hosts (a fleet-wide finding) — that must fail toward
1734
+ # rolling back every updated host, the previous (safe) behavior,
1735
+ # never toward rolling back none of them.
1736
+ implicated = gate.blocking_hosts
1737
+ targets = (
1738
+ updated_hosts if implicated is None
1739
+ else [h for h in updated_hosts if h in implicated]
1740
+ )
1741
+ spared = [h for h in updated_hosts if h not in targets]
1742
+ if spared:
1743
+ record.spared_rollback = spared
1744
+ _out(
1745
+ " spared (rolled and verified, not named by the red gate): "
1746
+ + ", ".join(spared)
1747
+ )
1748
+
1725
1749
  down: list[str] = []
1726
- for host in updated_hosts:
1750
+ for host in targets:
1727
1751
  machine = by_name.get(host)
1728
1752
  if machine is None:
1729
1753
  continue
@@ -2948,6 +2972,20 @@ def _rollback_host(
2948
2972
  take under systemd), and only then gives up — loudly, naming the host as
2949
2973
  DOWN rather than reporting a tidy "rolling back".
2950
2974
 
2975
+ #3364: the agent answering ``/health`` again is not the end of the job
2976
+ either. ``POST /rollback`` (``agent_app.py``'s ``rollback`` handler)
2977
+ flips ``~/.coord-venv`` back and re-execs the AGENT — and, same gap
2978
+ #2069 closed for the forward ``/update`` path, nothing about that
2979
+ restarts ``coord-serve``/``coord-web``/``coord-drive-queue``. Left as
2980
+ they were, those siblings keep running out of the slot the rollback
2981
+ just deactivated — permanently orphaned on the slot the next ``/update``
2982
+ must delete and rebuild, which is exactly the #2121 occupied-slot
2983
+ deadlock this issue is about. So a confirmed agent restart here also
2984
+ triggers the same ``_restart_sibling_services`` call `_roll_python` uses,
2985
+ and a sibling that fails to come back on the reverted slot fails this
2986
+ rollback's own verdict — "the venv flipped back" is not "the host is
2987
+ back", same reasoning as #2095 for the forward roll.
2988
+
2951
2989
  #2121: *initiator* names this call on the target host's audit trail, the
2952
2990
  same as ``_roll_python``'s own ``/update`` POST a few lines up — both are
2953
2991
  automation that fires during a fleet roll with nobody at a keyboard, so
@@ -2968,9 +3006,23 @@ def _rollback_host(
2968
3006
  if status != 202:
2969
3007
  return False, str(body.get("error") or f"HTTP {status}")
2970
3008
 
3009
+ def _back_on_target(note: str) -> tuple[bool, str]:
3010
+ """The agent answered ``/health`` on the reverted slot — re-home the
3011
+ siblings onto it too (#3364) before this counts as done."""
3012
+ sib_ok, sib_detail, _sib_failed = _restart_sibling_services(
3013
+ machine, agent_port=agent_port
3014
+ )
3015
+ if sib_ok is False:
3016
+ return False, f"{note}, but {sib_detail}"
3017
+ # True (nothing failed) and None (this agent predates
3018
+ # /restart-services — no channel to have restarted anything
3019
+ # through) both still count as a rollback success: neither is a
3020
+ # service THIS call took down.
3021
+ return True, f"{note}; {sib_detail}"
3022
+
2971
3023
  back, version = _wait_agent_back(machine, agent_port=agent_port, timeout=timeout)
2972
3024
  if back:
2973
- return True, f"rolled back; agent is serving again on v{version}"
3025
+ return _back_on_target(f"rolled back; agent is serving again on v{version}")
2974
3026
 
2975
3027
  # The re-exec did not take. This is the documented systemd stall, and it
2976
3028
  # has a documented fix — apply it rather than handing the operator a
@@ -2981,7 +3033,7 @@ def _rollback_host(
2981
3033
  machine, agent_port=agent_port, timeout=min(timeout, 60.0)
2982
3034
  )
2983
3035
  if back:
2984
- return True, (
3036
+ return _back_on_target(
2985
3037
  f"rolled back; agent needed an SSH `systemctl --user restart "
2986
3038
  f"coord-agent` but is serving again on v{version}"
2987
3039
  )
@@ -419,6 +419,14 @@ OUT_OF_REACH_LANES: frozenset[str] = frozenset({"~/.coord-cli-venv", "webapp bun
419
419
  #: for a lane, and the only form a grouped finding names its lanes by.
420
420
  _LANE_LABEL = re.compile(r"^(?P<lane>.+?)\s+\((?P<host>[^()]+)\)$")
421
421
 
422
+ #: The pseudo-host ``coord/release_verify.py``'s ``verify()`` stamps on a
423
+ #: finding it cannot pin to one machine (a fleet-wide version-skew or
424
+ #: no-data finding — every ``host="(fleet)"`` call there). Named here so
425
+ #: :attr:`GateVerdict.blocking_hosts` recognises it as "not a real host" the
426
+ #: same way :func:`lane_is_out_of_reach`'s allow-list keeps a lane's gaps
427
+ #: explicit rather than inferred.
428
+ _UNATTRIBUTABLE_HOST = "(fleet)"
429
+
422
430
 
423
431
  def parse_lane_label(label: str) -> tuple[str, str] | None:
424
432
  """``"~/.coord-venv (precision)"`` -> ``("precision", "~/.coord-venv")``.
@@ -487,6 +495,36 @@ class GateVerdict:
487
495
  def red(self) -> bool:
488
496
  return self.severity == "crit"
489
497
 
498
+ @property
499
+ def blocking_hosts(self) -> frozenset[str] | None:
500
+ """Real hosts a BLOCKING finding actually names (#3364).
501
+
502
+ ``--rollback-on-red`` used to revert every host a run updated the
503
+ instant ANY of them went red — a fifth host's failure rolling back
504
+ four that verified clean. This is what lets a caller narrow to just
505
+ the hosts the red gate is actually about, the same way
506
+ :func:`attempted_scope` already narrows which lanes count.
507
+
508
+ ``None`` means "could not attribute to specific hosts" — a
509
+ fleet-wide finding like the no-``--expected``-given skew case
510
+ (``host="(fleet)"``, see ``coord/release_verify.py``'s ``verify()``)
511
+ or a finding with no host at all. A caller must fail toward that
512
+ meaning "implicates everyone this run touched", never toward
513
+ "implicates nobody" — the same "an unattributable signal blocks
514
+ every host, never none of them" rule :attr:`Quiescence.
515
+ fleet_wide_busy` already follows for busy signals. A concrete
516
+ (possibly empty, when there are no blocking findings at all) set
517
+ means every blocking finding named a real host, and rollback may
518
+ scope to exactly those.
519
+ """
520
+ hosts: set[str] = set()
521
+ for finding in self.blocking:
522
+ for host, _lane in _finding_pairs(finding):
523
+ if not host or host == _UNATTRIBUTABLE_HOST:
524
+ return None
525
+ hosts.add(host)
526
+ return frozenset(hosts)
527
+
490
528
  def to_dict(self) -> dict:
491
529
  return {
492
530
  "severity": self.severity,
@@ -1485,6 +1523,12 @@ class PropagationRecord:
1485
1523
  #: done so, or the resulting quiet fleet is indistinguishable from #2082.
1486
1524
  cordons: dict = field(default_factory=dict)
1487
1525
  rolled_back: list[str] = field(default_factory=list)
1526
+ #: #3364: hosts this run updated and verified clean but did NOT roll back
1527
+ #: even though the gate went red — because the red gate's blocking
1528
+ #: findings (:attr:`GateVerdict.blocking_hosts`) named some OTHER host,
1529
+ #: not this one. A host that rolled and verified is not part of the
1530
+ #: failure just because a sibling host's roll was.
1531
+ spared_rollback: list[str] = field(default_factory=list)
1488
1532
  released_holds: list[str] = field(default_factory=list)
1489
1533
  #: #2583: the min-releases-behind gate's own readings for this run —
1490
1534
  #: ``min_releases_behind`` is whatever this run resolved (flag > config >
@@ -1763,6 +1807,11 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
1763
1807
 
1764
1808
  if data.get("rolled_back"):
1765
1809
  lines.append(f" rolled back: {', '.join(data['rolled_back'])}")
1810
+ if data.get("spared_rollback"):
1811
+ lines.append(
1812
+ " spared (rolled and verified, not named by the red gate): "
1813
+ + ", ".join(data["spared_rollback"])
1814
+ )
1766
1815
  if data.get("released_holds"):
1767
1816
  lines.append(f" released deploy gates: {', '.join(data['released_holds'])}")
1768
1817
  if data.get("error"):
@@ -1170,6 +1170,77 @@ def test_a_host_whose_python_lane_failed_is_not_rolled_back(valid_config_path,
1170
1170
  assert rolled_back == []
1171
1171
 
1172
1172
 
1173
+ def test_a_red_gate_naming_one_host_spares_the_others(valid_config_path, state_dir,
1174
+ no_network, monkeypatch):
1175
+ """#3364: `--rollback-on-red` used to revert every host this run updated
1176
+ the instant ANY of them went red — four hosts that rolled and verified
1177
+ clean, reverted because a fifth could not roll at all. A host that
1178
+ rolled and verified is not part of the failure just because a sibling
1179
+ host's roll was; partial fleet convergence beats reverting everyone and
1180
+ re-orphaning a daemon host's serve/web for nothing."""
1181
+ from coord import release_verify as rv
1182
+
1183
+ _stub_lanes(monkeypatch)
1184
+ _stub_verify(
1185
+ monkeypatch,
1186
+ versions={"laptop": ["0.4.110"], "server": ["0.4.110"]},
1187
+ findings=[
1188
+ rv.Finding(severity="crit", host="laptop",
1189
+ lane="~/.coord-venv (laptop)", summary="stubbed"),
1190
+ ],
1191
+ )
1192
+ rolled_back: list[str] = []
1193
+ monkeypatch.setattr(
1194
+ release_cmd, "_rollback_host",
1195
+ lambda machine, **k: (rolled_back.append(machine.name), (True, "rolling back"))[1],
1196
+ )
1197
+ result = CliRunner().invoke(
1198
+ main,
1199
+ ["release", "propagate", "--config", str(valid_config_path),
1200
+ "--target", "0.4.111", "--daemon-host", "server"],
1201
+ )
1202
+ assert result.exit_code == 2, result.output
1203
+ assert rolled_back == ["laptop"], "server rolled and verified clean — it must be spared"
1204
+ record = _records(state_dir)[0]
1205
+ assert record["status"] == rp.STATUS_ROLLED_BACK
1206
+ assert record["spared_rollback"] == ["server"]
1207
+ assert "spared" in result.output
1208
+
1209
+
1210
+ def test_a_fleet_wide_finding_still_rolls_back_every_updated_host(
1211
+ valid_config_path, state_dir, no_network, monkeypatch
1212
+ ):
1213
+ """A finding `blocking_hosts` cannot attribute to a real host (`(fleet)`
1214
+ — no per-lane breakdown) must fail toward the old, safe behavior: roll
1215
+ back every host this run touched, not toward sparing everyone because
1216
+ nothing could be pinned down."""
1217
+ from coord import release_verify as rv
1218
+
1219
+ _stub_lanes(monkeypatch)
1220
+ _stub_verify(
1221
+ monkeypatch,
1222
+ versions={"laptop": ["0.4.110"], "server": ["0.4.110"]},
1223
+ findings=[
1224
+ rv.Finding(severity="crit", host="(fleet)", lane="(version skew)",
1225
+ summary="2 versions live across the fleet"),
1226
+ ],
1227
+ )
1228
+ rolled_back: list[str] = []
1229
+ monkeypatch.setattr(
1230
+ release_cmd, "_rollback_host",
1231
+ lambda machine, **k: (rolled_back.append(machine.name), (True, "rolling back"))[1],
1232
+ )
1233
+ result = CliRunner().invoke(
1234
+ main,
1235
+ ["release", "propagate", "--config", str(valid_config_path),
1236
+ "--target", "0.4.111", "--daemon-host", "server"],
1237
+ )
1238
+ assert result.exit_code == 2, result.output
1239
+ assert sorted(rolled_back) == ["laptop", "server"]
1240
+ record = _records(state_dir)[0]
1241
+ assert record["spared_rollback"] == []
1242
+
1243
+
1173
1244
  def test_a_failed_daemon_python_roll_skips_other_hosts_python_lane(
1174
1245
  valid_config_path, state_dir, no_network, monkeypatch
1175
1246
  ):
@@ -1362,6 +1433,12 @@ def test_release_rollback_hits_every_machine(valid_config_path, monkeypatch):
1362
1433
  monkeypatch.setattr(release_cmd, "_post", _fake_post)
1363
1434
  monkeypatch.setattr(release_cmd, "_get",
1364
1435
  lambda url, *, timeout: (200, {"version": "0.4.110"}))
1436
+ # #3364: the sibling-restart call this test isn't about — assert it's
1437
+ # made in the dedicated `_rollback_host` tests below instead.
1438
+ monkeypatch.setattr(
1439
+ release_cmd, "_restart_sibling_services",
1440
+ lambda *a, **k: (True, "restarted coord-serve", {}),
1441
+ )
1365
1442
  result = CliRunner().invoke(
1366
1443
  main, ["release", "rollback", "--config", str(valid_config_path), "--yes"]
1367
1444
  )
@@ -1414,6 +1491,10 @@ def test_a_rollback_rescued_by_the_ssh_restart_is_a_success(valid_config_path,
1414
1491
  "coord.commands.agent_ops._escalate_restart",
1415
1492
  lambda machine: revived.__setitem__("yes", True) or True,
1416
1493
  )
1494
+ monkeypatch.setattr(
1495
+ release_cmd, "_restart_sibling_services",
1496
+ lambda *a, **k: (True, "restarted coord-serve", {}),
1497
+ )
1417
1498
  result = CliRunner().invoke(
1418
1499
  main, ["release", "rollback", "--config", str(valid_config_path), "--yes",
1419
1500
  "--wait", "1"]
@@ -1737,7 +1818,14 @@ def test_a_stale_unit_advisory_names_the_units_remedy_not_agent_update(
1737
1818
 
1738
1819
  def test_a_crit_on_a_lane_this_run_rolled_still_reverts(valid_config_path, state_dir,
1739
1820
  no_network, monkeypatch):
1740
- """Scoping the gate is not removing it."""
1821
+ """Scoping the gate is not removing it: a crit on `laptop`'s own
1822
+ python lane — a lane THIS run rolled — must still turn the gate red and
1823
+ trigger a rollback, never get waved through as advisory.
1824
+
1825
+ #3364: which HOST that rollback then touches is a separate, narrower
1826
+ question. The finding names only `laptop`, so only `laptop` — not
1827
+ `server`, which rolled and verified clean — gets rolled back; see
1828
+ `test_a_red_gate_naming_one_host_spares_the_others` for that half."""
1741
1829
  from coord import release_verify as rv
1742
1830
 
1743
1831
  _stub_lanes(monkeypatch)
@@ -1759,7 +1847,7 @@ def test_a_crit_on_a_lane_this_run_rolled_still_reverts(valid_config_path, state
1759
1847
  "--target", "0.4.111", "--daemon-host", "server"],
1760
1848
  )
1761
1849
  assert result.exit_code == 2, result.output
1762
- assert sorted(rolled_back) == ["laptop", "server"]
1850
+ assert rolled_back == ["laptop"]
1763
1851
 
1764
1852
 
1765
1853
  def test_the_remote_tui_lane_is_recorded_as_unrollable_not_failed(
@@ -2409,6 +2497,12 @@ def test_rollback_host_posts_the_caller_supplied_initiator(monkeypatch):
2409
2497
  monkeypatch.setattr(
2410
2498
  release_cmd, "_wait_agent_back", lambda *a, **k: (True, "0.4.110")
2411
2499
  )
2500
+ # #3364: `_rollback_host` also restarts the daemon-host siblings once the
2501
+ # agent is back — not this test's concern, so stub it as clean.
2502
+ monkeypatch.setattr(
2503
+ release_cmd, "_restart_sibling_services",
2504
+ lambda *a, **k: (True, "restarted coord-serve", {}),
2505
+ )
2412
2506
 
2413
2507
  ok, detail = release_cmd._rollback_host(
2414
2508
  _machine(), agent_port=7433, timeout=5.0,
@@ -2438,6 +2532,10 @@ def test_rollback_host_without_an_initiator_omits_the_field(monkeypatch):
2438
2532
  monkeypatch.setattr(
2439
2533
  release_cmd, "_wait_agent_back", lambda *a, **k: (True, "0.4.110")
2440
2534
  )
2535
+ monkeypatch.setattr(
2536
+ release_cmd, "_restart_sibling_services",
2537
+ lambda *a, **k: (True, "restarted coord-serve", {}),
2538
+ )
2441
2539
 
2442
2540
  release_cmd._rollback_host(_machine(), agent_port=7433, timeout=5.0)
2443
2541
 
@@ -2445,6 +2543,54 @@ def test_rollback_host_without_an_initiator_omits_the_field(monkeypatch):
2445
2543
  assert "initiator" not in payload
2446
2544
 
2447
2545
 
2546
+ def test_rollback_host_restarts_the_siblings_once_the_agent_is_back(monkeypatch):
2547
+ """#3364's actual defect: `POST /rollback` (`agent_app.py`) flips the venv
2548
+ symlink and re-execs only the AGENT. Left there, `coord-serve`/
2549
+ `coord-web` keep running the slot the rollback just deactivated —
2550
+ permanently orphaned on the slot the next `/update` must delete and
2551
+ rebuild, the exact #2121 deadlock this issue reports. `_rollback_host`
2552
+ must therefore restart the siblings too, the same `_restart_sibling_
2553
+ services` call `_roll_python` makes for the forward roll."""
2554
+ monkeypatch.setattr(release_cmd, "_post", lambda *a, **k: (202, {}, ""))
2555
+ monkeypatch.setattr(
2556
+ release_cmd, "_wait_agent_back", lambda *a, **k: (True, "0.4.110")
2557
+ )
2558
+ calls: list[str] = []
2559
+ monkeypatch.setattr(
2560
+ release_cmd, "_restart_sibling_services",
2561
+ lambda machine, **k: (calls.append(machine.name), (True, "restarted coord-serve, coord-web", {}))[1],
2562
+ )
2563
+
2564
+ ok, detail = release_cmd._rollback_host(_machine(), agent_port=7433, timeout=5.0)
2565
+
2566
+ assert ok
2567
+ assert calls == ["server"], "the siblings must be restarted on the rolled-back host"
2568
+ assert "restarted coord-serve, coord-web" in detail
2569
+
2570
+
2571
+ def test_rollback_host_fails_when_a_sibling_stays_orphaned(monkeypatch):
2572
+ """A sibling that fails to restart onto the reverted slot leaves the
2573
+ fleet in exactly the orphaned-slot shape #3364 describes — that is not a
2574
+ successful rollback, whatever the agent itself did."""
2575
+ monkeypatch.setattr(release_cmd, "_post", lambda *a, **k: (202, {}, ""))
2576
+ monkeypatch.setattr(
2577
+ release_cmd, "_wait_agent_back", lambda *a, **k: (True, "0.4.110")
2578
+ )
2579
+ monkeypatch.setattr(
2580
+ release_cmd, "_restart_sibling_services",
2581
+ lambda *a, **k: (
2582
+ False,
2583
+ "restarted coord-web; FAILED to restart: coord-serve (timed out)",
2584
+ {"coord-serve": "timed out"},
2585
+ ),
2586
+ )
2587
+
2588
+ ok, detail = release_cmd._rollback_host(_machine(), agent_port=7433, timeout=5.0)
2589
+
2590
+ assert not ok, "a sibling orphaned on the reverted slot is not a success"
2591
+ assert "coord-serve" in detail
2592
+
2593
+
2448
2594
  def test_release_propagate_red_gate_rollback_names_itself(
2449
2595
  valid_config_path, state_dir, no_network, monkeypatch
2450
2596
  ):
@@ -1112,6 +1112,68 @@ def test_no_verification_at_all_is_not_a_pass_or_a_failure():
1112
1112
  assert set(verdict.unrollable) == {"tui@precision", "tui@elitebook"}
1113
1113
 
1114
1114
 
1115
+ # ──────────────────────────────────────────────────────────────────────────
1116
+ # #3364: `--rollback-on-red` must scope to the hosts the red gate actually
1117
+ # names, not to every host the run happened to update
1118
+ # ──────────────────────────────────────────────────────────────────────────
1119
+
1120
+
1121
+ def test_blocking_hosts_names_only_the_host_a_finding_blames():
1122
+ """A per-host crit finding (the common case: `coord release verify`
1123
+ stamping ``lane (host)`` for one offending machine) must scope
1124
+ `--rollback-on-red` to exactly that host — not every host this run
1125
+ updated. #3364's second defect was rolling back four clean hosts because
1126
+ a fifth went red."""
1127
+ verification = {
1128
+ "severity": "crit",
1129
+ "findings": [_finding("crit", "dellserver", "~/.coord-venv (dellserver)")],
1130
+ }
1131
+ verdict = rp.scope_verification(verification, lanes=_run_lanes())
1132
+ assert verdict.red
1133
+ assert verdict.blocking_hosts == frozenset({"dellserver"})
1134
+
1135
+
1136
+ def test_blocking_hosts_unions_a_grouped_finding():
1137
+ """The grouped ``--expected`` mismatch names several real lanes at once
1138
+ (see `test_a_grouped_finding_blocks_when_ANY_lane_in_it_is_in_scope`) —
1139
+ `blocking_hosts` must pick every real host out of it, not just the first."""
1140
+ verification = {
1141
+ "severity": "crit",
1142
+ "findings": [
1143
+ _finding("crit", "elitebook, precision",
1144
+ "~/.coord-cli-venv (elitebook), ~/.coord-venv (precision)"),
1145
+ ],
1146
+ }
1147
+ verdict = rp.scope_verification(verification, lanes=_run_lanes())
1148
+ assert verdict.red
1149
+ assert verdict.blocking_hosts == frozenset({"elitebook", "precision"})
1150
+
1151
+
1152
+ def test_blocking_hosts_is_none_for_a_fleet_wide_finding():
1153
+ """A skew/no-data finding `coord release verify` cannot pin to one
1154
+ machine is stamped ``host="(fleet)"`` (see ``release_verify.verify``'s
1155
+ ``"(version skew)"``/``"(expected version)"`` findings). `blocking_hosts`
1156
+ must read that as "cannot attribute" (``None``), not as a literal host
1157
+ named "(fleet)" — a caller must fail toward rolling back every host it
1158
+ touched, never toward a rollback that silently touches nobody."""
1159
+ verification = {
1160
+ "severity": "crit",
1161
+ "findings": [
1162
+ {"severity": "crit", "host": "(fleet)", "lane": "(version skew)",
1163
+ "summary": "2 versions live across the fleet", "detail": ""},
1164
+ ],
1165
+ }
1166
+ verdict = rp.scope_verification(verification, lanes=_run_lanes())
1167
+ assert verdict.red
1168
+ assert verdict.blocking_hosts is None
1169
+
1170
+
1171
+ def test_blocking_hosts_is_empty_when_the_gate_is_clean():
1172
+ verdict = rp.scope_verification(None, lanes=_run_lanes())
1173
+ assert not verdict.red
1174
+ assert verdict.blocking_hosts == frozenset()
1175
+
1176
+
1115
1177
  def test_the_gate_verdict_is_rendered_so_a_scoped_gate_is_never_invisible():
1116
1178
  """Scoping the gate is only safe if the scoping is legible afterwards —
1117
1179
  a check that quietly stopped checking is the failure this whole module