code-coordinator 0.5.496__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.496 → code_coordinator-0.5.498}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/drive_queue.py +287 -5
  5. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/release.py +55 -3
  6. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/overlap_predict.py +86 -0
  7. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_propagate.py +49 -0
  8. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_drive_queue.py +149 -0
  9. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_propagate.py +148 -2
  10. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_overlap_predict.py +56 -0
  11. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_propagate.py +62 -0
  12. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/.gitignore +0 -0
  25. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/GOAL.md +0 -0
  27. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/LICENSE +0 -0
  28. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/README.md +0 -0
  30. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/approved_work.py +0 -0
  47. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/backup.py +0 -0
  50. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/claude_setup_token.py +0 -0
  64. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/client.py +0 -0
  66. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/codegen.py +0 -0
  67. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/backup.py +0 -0
  73. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/codegen.py +0 -0
  75. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/dr.py +0 -0
  78. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/drive.py +0 -0
  79. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/machine.py +0 -0
  84. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/pr.py +0 -0
  90. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/repo.py +0 -0
  91. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/report.py +0 -0
  92. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/review.py +0 -0
  93. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/scorecard.py +0 -0
  94. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/sessions.py +0 -0
  95. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/setup.py +0 -0
  96. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/status.py +0 -0
  97. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/store_migrate.py +0 -0
  98. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/terminal.py +0 -0
  99. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/test_gate.py +0 -0
  100. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/commands/tui.py +0 -0
  101. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/comments.py +0 -0
  102. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/config.py +0 -0
  103. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/config_reload.py +0 -0
  104. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/confirm_test.py +0 -0
  105. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/conflict_fix.py +0 -0
  106. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dao.py +0 -0
  107. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/__init__.py +0 -0
  108. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/fixture.py +0 -0
  109. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/index.html +0 -0
  110. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/server.py +0 -0
  111. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dashboard/terminal.py +0 -0
  112. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/db.py +0 -0
  113. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dead_end.py +0 -0
  114. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/decomposition_chat.py +0 -0
  115. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/README.md +0 -0
  116. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-agent.service +0 -0
  117. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-backup.service +0 -0
  118. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-backup.timer +0 -0
  119. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.service +0 -0
  120. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.sh +0 -0
  121. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-db-backup.timer +0 -0
  122. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.service +0 -0
  123. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-dr-verify.timer +0 -0
  124. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.service +0 -0
  125. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-drive-queue.timer +0 -0
  126. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-failure-notify.service +0 -0
  127. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.service +0 -0
  128. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  129. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-notify.service +0 -0
  130. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-notify.timer +0 -0
  131. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.service +0 -0
  132. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-propagate.timer +0 -0
  133. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.service +0 -0
  134. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-release-window.timer +0 -0
  135. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-serve.service +0 -0
  136. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.service +0 -0
  137. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web-dist-build.timer +0 -0
  138. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy/coord-web.service +0 -0
  139. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy_manifest.py +0 -0
  140. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deploy_units.py +0 -0
  141. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deprecation_telemetry.py +0 -0
  142. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/deps.py +0 -0
  143. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/diagnose.py +0 -0
  144. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dispatch.py +0 -0
  145. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dispatch_liveness.py +0 -0
  146. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dist_name.py +0 -0
  147. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dr_promote.py +0 -0
  148. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/dr_verify.py +0 -0
  149. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive.py +0 -0
  150. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive_queue.py +0 -0
  151. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/drive_state.py +0 -0
  152. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/events.py +0 -0
  153. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/failure_class.py +0 -0
  154. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/failure_classifier.py +0 -0
  155. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/filelock.py +0 -0
  156. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/fleet_config_health.py +0 -0
  157. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/forge_availability.py +0 -0
  158. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/freshness.py +0 -0
  159. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_a.py +0 -0
  160. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_b.py +0 -0
  161. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gate_snapshot.py +0 -0
  162. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gates.py +0 -0
  163. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/gen_board_fixture.py +0 -0
  164. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/github_ops.py +0 -0
  165. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/github_throttle.py +0 -0
  166. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/goal.py +0 -0
  167. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/graph_health.py +0 -0
  168. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/__init__.py +0 -0
  169. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/aggregate.py +0 -0
  170. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/__init__.py +0 -0
  171. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/_ci_pin.py +0 -0
  172. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/agent_install.py +0 -0
  173. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/cargo_targets.py +0 -0
  174. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/claude_binary.py +0 -0
  175. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/config_drift.py +0 -0
  176. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  177. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/coord_web_ci_pin.py +0 -0
  178. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/deploy_lane_facts.py +0 -0
  179. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/disk.py +0 -0
  180. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_board.py +0 -0
  181. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  182. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_phantom.py +0 -0
  183. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/fleet_unit_drift.py +0 -0
  184. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/graph.py +0 -0
  185. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/graphify_cli.py +0 -0
  186. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/index_lock.py +0 -0
  187. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/issues_sync_staleness.py +0 -0
  188. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/plan_usage.py +0 -0
  189. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/pr_churn.py +0 -0
  190. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/release_cordon.py +0 -0
  191. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/repo_state.py +0 -0
  192. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/spawned_coord.py +0 -0
  193. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/stalled_pipeline.py +0 -0
  194. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/timer_active.py +0 -0
  195. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/toolchain.py +0 -0
  196. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/unit_drift.py +0 -0
  197. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/unit_enablement.py +0 -0
  198. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/wedged_drive_queue.py +0 -0
  199. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/checks/worktrees.py +0 -0
  200. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/cli.py +0 -0
  201. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/context.py +0 -0
  202. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/fleet_snapshot.py +0 -0
  203. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/models.py +0 -0
  204. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/pypi.py +0 -0
  205. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/registry.py +0 -0
  206. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/render.py +0 -0
  207. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/health/units.py +0 -0
  208. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/hooks.py +0 -0
  209. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/housekeeping.py +0 -0
  210. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/interactive.py +0 -0
  211. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/invariant_alarms.py +0 -0
  212. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/issue_store.py +0 -0
  213. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/issues_sync_status.py +0 -0
  214. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/liveness_auditor.py +0 -0
  215. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_fault.py +0 -0
  216. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_metrics.py +0 -0
  217. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_onboard.py +0 -0
  218. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_pause.py +0 -0
  219. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/machine_stats.py +0 -0
  220. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/merge_queue.py +0 -0
  221. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_chat.py +0 -0
  222. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_dispatch.py +0 -0
  223. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_gate.py +0 -0
  224. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/milestone_order.py +0 -0
  225. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/mock_author.py +0 -0
  226. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/models.py +0 -0
  227. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/network.py +0 -0
  228. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/new_issue_chat.py +0 -0
  229. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/__init__.py +0 -0
  230. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/baseline.py +0 -0
  231. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/cli.py +0 -0
  232. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/collect.py +0 -0
  233. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/digest.py +0 -0
  234. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/models.py +0 -0
  235. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/predicate.py +0 -0
  236. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/service.py +0 -0
  237. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/store.py +0 -0
  238. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notifier/transport.py +0 -0
  239. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/notify.py +0 -0
  240. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/openapi.py +0 -0
  241. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/overlap_fence.py +0 -0
  242. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/parentage.py +0 -0
  243. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/parentage_github.py +0 -0
  244. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/pipeline.py +0 -0
  245. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/plan_parser.py +0 -0
  246. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/plans.py +0 -0
  247. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/platform_paths.py +0 -0
  248. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_bridge.py +0 -0
  249. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_store.py +0 -0
  250. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/portal_sync.py +0 -0
  251. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/pr_body_lint.py +0 -0
  252. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/prereqs.py +0 -0
  253. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/progress.py +0 -0
  254. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/__init__.py +0 -0
  255. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/base.py +0 -0
  256. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/claude.py +0 -0
  257. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/claude_pty.py +0 -0
  258. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/providers/opencode.py +0 -0
  259. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/queue_diagnose.py +0 -0
  260. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reconcile.py +0 -0
  261. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reconcile_tick.py +0 -0
  262. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/refine_chat.py +0 -0
  263. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_cordon.py +0 -0
  264. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_verify.py +0 -0
  265. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/release_window.py +0 -0
  266. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_dormancy.py +0 -0
  267. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_edit.py +0 -0
  268. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/repo_onboard.py +0 -0
  269. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/reports.py +0 -0
  270. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/rest_schema.py +0 -0
  271. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/revalidate.py +0 -0
  272. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/review.py +0 -0
  273. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/scorecard.py +0 -0
  274. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/self_health.py +0 -0
  275. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/serve_app.py +0 -0
  276. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  277. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  278. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  279. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  280. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  281. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/portal-followup/SKILL.md +0 -0
  282. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/release-now/SKILL.md +0 -0
  283. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  284. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  285. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/skills/update-issue/SKILL.md +0 -0
  286. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/smoke.py +0 -0
  287. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/spend_ceiling.py +0 -0
  288. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/split_work.py +0 -0
  289. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/sql.py +0 -0
  290. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/stage_projection.py +0 -0
  291. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/state.py +0 -0
  292. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/store_migrate.py +0 -0
  293. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/store_parity.py +0 -0
  294. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/templates/deploy-cloudflare.node.yml +0 -0
  295. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_author.py +0 -0
  296. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_chat.py +0 -0
  297. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_orchestrator.py +0 -0
  298. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/test_report.py +0 -0
  299. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/tui_release.py +0 -0
  300. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/uat_checks.py +0 -0
  301. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage.py +0 -0
  302. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage_limits.py +0 -0
  303. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/usage_rollup.py +0 -0
  304. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coord/worker_events.py +0 -0
  305. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/coordinator.example.yml +0 -0
  306. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-agent.service +0 -0
  307. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-backup.service +0 -0
  308. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-backup.timer +0 -0
  309. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.service +0 -0
  310. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.sh +0 -0
  311. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-db-backup.timer +0 -0
  312. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-dr-verify.service +0 -0
  313. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-dr-verify.timer +0 -0
  314. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-drive-queue.service +0 -0
  315. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-drive-queue.timer +0 -0
  316. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-failure-notify.service +0 -0
  317. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-failure-notify.sh +0 -0
  318. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.service +0 -0
  319. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-fleet-watchdog.timer +0 -0
  320. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-notify.service +0 -0
  321. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-notify.timer +0 -0
  322. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-propagate.service +0 -0
  323. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-propagate.timer +0 -0
  324. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-window.service +0 -0
  325. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-release-window.timer +0 -0
  326. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-serve.service +0 -0
  327. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.service +0 -0
  328. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.sh +0 -0
  329. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-dist-build.timer +0 -0
  330. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web-rollback.sh +0 -0
  331. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/coord-web.service +0 -0
  332. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/deploy/node-shim.sh +0 -0
  333. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_TUI_CI.md +0 -0
  334. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  335. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_CI.md +0 -0
  336. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_COORD_WEB_DIST.md +0 -0
  337. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  338. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/AGENT_OPERATIONS.md +0 -0
  339. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ARCHITECTURE.md +0 -0
  340. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ARCH_SECURITY_GATES.md +0 -0
  341. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/COCKPIT.md +0 -0
  342. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CONTROL_CENTER.md +0 -0
  343. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/COST_DISCIPLINE.md +0 -0
  344. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CROSS_PLATFORM.md +0 -0
  345. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CUSTOMER_FACING_APPS.md +0 -0
  346. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/CUSTOMER_PORTAL.md +0 -0
  347. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DATA_STORE_SELECTION.md +0 -0
  348. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DISASTER_RECOVERY.md +0 -0
  349. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/DRIVE_QUEUE.md +0 -0
  350. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/EPHEMERAL_WORKERS.md +0 -0
  351. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/FORGE_MIGRATION.md +0 -0
  352. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/GRAPHIFY_SETUP.md +0 -0
  353. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ISSUE_GUIDANCE.md +0 -0
  354. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/MAC_MINI.md +0 -0
  355. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  356. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/NOTIFIER.md +0 -0
  357. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPENCODE_VERIFICATION.md +0 -0
  358. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPERATING_GOTCHAS.md +0 -0
  359. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/OPERATOR_GUIDES.md +0 -0
  360. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/ORACLE_LOOP.md +0 -0
  361. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PHONE_WEBAPP.md +0 -0
  362. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PIPELINE_V2.md +0 -0
  363. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/PLATFORM_EVOLUTION.md +0 -0
  364. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/SECOND_BACKEND.md +0 -0
  365. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/STORE_SERVICE.md +0 -0
  366. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  367. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/WEB_CONTROL_CENTER.md +0 -0
  368. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/WSL_WINDOWS_WORKER.md +0 -0
  369. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/README.md +0 -0
  370. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/_tokens.css +0 -0
  371. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/issue-detail.html +0 -0
  372. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-narrow.html +0 -0
  373. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/docs/mocks/web/pipeline-wide.html +0 -0
  374. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/graphify-out/.gitignore +0 -0
  375. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/install-agent.sh +0 -0
  376. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/pyproject.toml +0 -0
  377. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/audit_review_verdict_overrides.py +0 -0
  378. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  379. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/build-worker-image.sh +0 -0
  380. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/coordinator-machine.py +0 -0
  381. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/dr-down.sh +0 -0
  382. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/dr-up.sh +0 -0
  383. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/epic-down.sh +0 -0
  384. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/epic-up.sh +0 -0
  385. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/preflight.sh +0 -0
  386. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/provision-server.sh +0 -0
  387. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/provision-worker.sh +0 -0
  388. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  389. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  390. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/throwaway-vm.sh +0 -0
  391. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/azure-workers/verify-github-token.sh +0 -0
  392. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/check_gh_argv_containment.py +0 -0
  393. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/codegen.py +0 -0
  394. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-test-runner.sh +0 -0
  395. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  396. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  397. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  398. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  399. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/coord-venv-rollback.sh +0 -0
  400. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/drive-batch.sh +0 -0
  401. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/extract-coord-tui.sh +0 -0
  402. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/fleet_watchdog.py +0 -0
  403. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/gen_board_fixture.py +0 -0
  404. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/gen_mock_index.py +0 -0
  405. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/lib/provision-core.sh +0 -0
  406. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/next_release_tag.py +0 -0
  407. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/provision-machine.sh +0 -0
  408. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/run_tests_in_populated_home.sh +0 -0
  409. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/run_tests_without_gh.sh +0 -0
  410. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/setup-macmini.sh +0 -0
  411. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/smoke_437_interactive.py +0 -0
  412. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify-provision-noble.sh +0 -0
  413. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_878_review_capture.py +0 -0
  414. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_release_published.py +0 -0
  415. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/scripts/verify_release_wheel.py +0 -0
  416. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/setup.cfg +0 -0
  417. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/SMOKE_SET.md +0 -0
  418. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/__init__.py +0 -0
  419. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/conftest.py +0 -0
  420. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/contract.md +0 -0
  421. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/manifest.yml +0 -0
  422. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  423. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  424. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/contract.md +0 -0
  425. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  426. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  427. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/manifest.yml +0 -0
  428. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  429. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-51/tsconfig.json +0 -0
  430. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  431. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/backends.py +0 -0
  432. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/conftest.py +0 -0
  433. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-basic.json +0 -0
  434. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  435. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  436. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  437. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  438. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/all_pass.json +0 -0
  439. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  440. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/mixed_fail.json +0 -0
  441. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  442. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  443. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/skip.json +0 -0
  444. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/playwright/truncated.json +0 -0
  445. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  446. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  447. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  448. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  449. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  450. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  451. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  452. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  453. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_acceptance.py +0 -0
  454. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_acceptance_drivers.py +0 -0
  455. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent.py +0 -0
  456. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_api_error.py +0 -0
  457. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_app.py +0 -0
  458. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_branch_base.py +0 -0
  459. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_branch_capture.py +0 -0
  460. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_config_free_1712.py +0 -0
  461. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_deploy_units_endpoint.py +0 -0
  462. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_dirty_worktree.py +0 -0
  463. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  464. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_graph_self_heal.py +0 -0
  465. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_health_h3.py +0 -0
  466. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_idle_restart.py +0 -0
  467. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_push_failure.py +0 -0
  468. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_reap.py +0 -0
  469. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_repos_and_pull.py +0 -0
  470. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_restart_services_endpoint.py +0 -0
  471. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_skills_self_heal.py +0 -0
  472. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_startup_diagnostics.py +0 -0
  473. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_update.py +0 -0
  474. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_update_bluegreen.py +0 -0
  475. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_usage_limit.py +0 -0
  476. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_agent_zero_commit.py +0 -0
  477. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ambient_home_isolation.py +0 -0
  478. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_capability_reroute_3241.py +0 -0
  479. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_dependency_busy_2804.py +0 -0
  480. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_reject_plan.py +0 -0
  481. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approve_usage_gate.py +0 -0
  482. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approved_work_2532.py +0 -0
  483. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_approved_work_2996.py +0 -0
  484. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_assignment_already_recorded_daemon.py +0 -0
  485. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_log.py +0 -0
  486. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_outcome.py +0 -0
  487. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_audit_query.py +0 -0
  488. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_auto_loop.py +0 -0
  489. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_auto_release_publish_2035.py +0 -0
  490. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_backend_selection.py +0 -0
  491. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_backup.py +0 -0
  492. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_base_checkout_restore.py +0 -0
  493. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_block_log.py +0 -0
  494. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_cap_762.py +0 -0
  495. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_fixture.py +0 -0
  496. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_read_path.py +0 -0
  497. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_schema.py +0 -0
  498. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_service.py +0 -0
  499. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_state.py +0 -0
  500. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_board_wire.py +0 -0
  501. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_brain.py +0 -0
  502. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_branch_model.py +0 -0
  503. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_bug_intake.py +0 -0
  504. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_build_worker_image_env_update.py +0 -0
  505. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cargo_cache.py +0 -0
  506. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_check_gh_argv_containment.py +0 -0
  507. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_acceptance_gate_1950.py +0 -0
  508. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_fix.py +0 -0
  509. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_github.py +0 -0
  510. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_gitlab.py +0 -0
  511. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_parity_2091.py +0 -0
  512. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_ci_store.py +0 -0
  513. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claim.py +0 -0
  514. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claude_md_budget.py +0 -0
  515. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_claude_setup_token.py +0 -0
  516. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_acceptance.py +0 -0
  517. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign.py +0 -0
  518. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  519. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_interactive_remote.py +0 -0
  520. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_provider.py +0 -0
  521. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  522. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_audit.py +0 -0
  523. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_chat_continue.py +0 -0
  524. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_codegen.py +0 -0
  525. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_decide.py +0 -0
  526. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_capability_rules.py +0 -0
  527. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_config_provenance.py +0 -0
  528. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_forge_availability.py +0 -0
  529. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_graph.py +0 -0
  530. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_self.py +0 -0
  531. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_diagnose_test_coverage.py +0 -0
  532. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor.py +0 -0
  533. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_free_1801.py +0 -0
  534. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  535. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  536. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_drive.py +0 -0
  537. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_escalate.py +0 -0
  538. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_fix_headless_review.py +0 -0
  539. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_gate_a.py +0 -0
  540. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_install_drift.py +0 -0
  541. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_install_skills.py +0 -0
  542. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_comment.py +0 -0
  543. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_create_label.py +0 -0
  544. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_reopen.py +0 -0
  545. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_issue_view_list.py +0 -0
  546. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_merge.py +0 -0
  547. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_assign.py +0 -0
  548. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_capture.py +0 -0
  549. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_chat_add_child.py +0 -0
  550. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_dispatch.py +0 -0
  551. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_b.py +0 -0
  552. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_gate_c.py +0 -0
  553. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_order.py +0 -0
  554. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  555. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_milestone_ship.py +0 -0
  556. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_network.py +0 -0
  557. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_new_issue_chat.py +0 -0
  558. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_plans.py +0 -0
  559. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_portal.py +0 -0
  560. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_pr.py +0 -0
  561. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_pull_artifact.py +0 -0
  562. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_queue.py +0 -0
  563. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_reattach_sessions.py +0 -0
  564. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_refine_board.py +0 -0
  565. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_preflight.py +0 -0
  566. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_release_window.py +0 -0
  567. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_repo_2220.py +0 -0
  568. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  569. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_scorecard.py +0 -0
  570. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_serve_store_backend_3084.py +0 -0
  571. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_set_review_findings.py +0 -0
  572. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_advisory_terminal.py +0 -0
  573. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_contested_tag.py +0 -0
  574. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_invariant_alarms.py +0 -0
  575. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_machine_fault.py +0 -0
  576. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_merge_queue.py +0 -0
  577. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_provider.py +0 -0
  578. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_retried_3340.py +0 -0
  579. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_review_finalizing.py +0 -0
  580. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_test_failed_tag.py +0 -0
  581. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_status_usage_limit.py +0 -0
  582. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_sync_comments_873.py +0 -0
  583. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_test_plan.py +0 -0
  584. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_track.py +0 -0
  585. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_tui_update.py +0 -0
  586. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cli_wait.py +0 -0
  587. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client.py +0 -0
  588. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_base_install.py +0 -0
  589. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_config_cache_atomic_3052.py +0 -0
  590. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_client_resource_migration_1946.py +0 -0
  591. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_commands_common.py +0 -0
  592. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_comments.py +0 -0
  593. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_completion_summary.py +0 -0
  594. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config.py +0 -0
  595. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_acceptance.py +0 -0
  596. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_audit.py +0 -0
  597. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_drift_check.py +0 -0
  598. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_pricing.py +0 -0
  599. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  600. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_config_usage_gate.py +0 -0
  601. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_confirm_test.py +0 -0
  602. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_conflict_fix.py +0 -0
  603. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_conflict_fix_semantic.py +0 -0
  604. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  605. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test.py +0 -0
  606. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  607. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_baseline.py +0 -0
  608. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_populated_home.py +0 -0
  609. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_routing.py +0 -0
  610. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_test_runner_toolchain.py +0 -0
  611. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_uat.py +0 -0
  612. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coord_web_sse_restart_live.py +0 -0
  613. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_coordinator_machine.py +0 -0
  614. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_cross_platform_imports.py +0 -0
  615. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dao.py +0 -0
  616. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard.py +0 -0
  617. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_api.py +0 -0
  618. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_fixture.py +0 -0
  619. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_server.py +0 -0
  620. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_terminal.py +0 -0
  621. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dashboard_terminal_live.py +0 -0
  622. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_db.py +0 -0
  623. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dead_end.py +0 -0
  624. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_decomposition_chat.py +0 -0
  625. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_db_backup.py +0 -0
  626. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_dist.py +0 -0
  627. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_coord_web_rollback.py +0 -0
  628. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_db_backup_unit.py +0 -0
  629. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_drive_queue_unit.py +0 -0
  630. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_failure_notify_unit.py +0 -0
  631. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_manifest.py +0 -0
  632. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_notify_unit.py +0 -0
  633. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_units_lane.py +0 -0
  634. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deploy_web_unit.py +0 -0
  635. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deprecation_telemetry.py +0 -0
  636. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_deps.py +0 -0
  637. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_diagnose.py +0 -0
  638. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch.py +0 -0
  639. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_liveness.py +0 -0
  640. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_target_validation.py +0 -0
  641. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dispatch_workers.py +0 -0
  642. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dist_name.py +0 -0
  643. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_done_housekeeping.py +0 -0
  644. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_azure_scripts.py +0 -0
  645. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_promote.py +0 -0
  646. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_dr_verify.py +0 -0
  647. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive.py +0 -0
  648. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_machine_fault.py +0 -0
  649. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue.py +0 -0
  650. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_blocked_rendering.py +0 -0
  651. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_launch_argv.py +0 -0
  652. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_config.py +0 -0
  653. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  654. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_roll_pending.py +0 -0
  655. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  656. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_state.py +0 -0
  657. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_drive_tmux.py +0 -0
  658. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_capability_detection.py +0 -0
  659. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  660. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_epic_up_image_provenance.py +0 -0
  661. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_errors.py +0 -0
  662. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_events.py +0 -0
  663. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_failure_class.py +0 -0
  664. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_failure_classifier.py +0 -0
  665. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_filelock.py +0 -0
  666. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  667. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fix_escalation_classifier.py +0 -0
  668. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fix_of_force_override.py +0 -0
  669. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_config_health.py +0 -0
  670. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_health_probes.py +0 -0
  671. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_health_snapshot.py +0 -0
  672. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_fleet_watchdog.py +0 -0
  673. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_forge_availability.py +0 -0
  674. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_freshness.py +0 -0
  675. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_a.py +0 -0
  676. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_b.py +0 -0
  677. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gate_snapshot_staleness.py +0 -0
  678. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gates.py +0 -0
  679. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  680. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_gen_mock_index.py +0 -0
  681. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_rust_fixture.py +0 -0
  682. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_rust_requests.py +0 -0
  683. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_generated_types_fixture.py +0 -0
  684. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_github_ops.py +0 -0
  685. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_github_throttle.py +0 -0
  686. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_goal.py +0 -0
  687. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_graph_health.py +0 -0
  688. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_graph_selfheal_absent_2237.py +0 -0
  689. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_handoff.py +0 -0
  690. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_checks.py +0 -0
  691. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_cli.py +0 -0
  692. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_cli_graph.py +0 -0
  693. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_config.py +0 -0
  694. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_context.py +0 -0
  695. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_coord_tui_ci_pin.py +0 -0
  696. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_coord_web_ci_pin.py +0 -0
  697. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_deploy_lane_facts.py +0 -0
  698. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_fix.py +0 -0
  699. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_incident_regression.py +0 -0
  700. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_issues_sync_staleness.py +0 -0
  701. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_pr_churn.py +0 -0
  702. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_pypi.py +0 -0
  703. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_registry.py +0 -0
  704. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_release_cordon_probe.py +0 -0
  705. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_timer_active.py +0 -0
  706. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_toolchain.py +0 -0
  707. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_unit_drift.py +0 -0
  708. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_unit_enablement.py +0 -0
  709. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_health_wedged_drive_queue.py +0 -0
  710. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_hooks.py +0 -0
  711. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_housekeeping.py +0 -0
  712. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_human_attended_437.py +0 -0
  713. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_init.py +0 -0
  714. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_install_agent_venv_2911.py +0 -0
  715. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_integration.py +0 -0
  716. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_briefing_echo.py +0 -0
  717. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_pane_log_2541.py +0 -0
  718. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_prefill_state.py +0 -0
  719. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_session_relaunch.py +0 -0
  720. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_test_verdict_backstop.py +0 -0
  721. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_token_attribution.py +0 -0
  722. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_interactive_worktree.py +0 -0
  723. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_invariant_alarms.py +0 -0
  724. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_issue_store_seam.py +0 -0
  725. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_issues_sync_status.py +0 -0
  726. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_liveness_auditor.py +0 -0
  727. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_liveness_notify.py +0 -0
  728. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_lock_contention_ratchet.py +0 -0
  729. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_fault.py +0 -0
  730. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_metrics.py +0 -0
  731. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_onboard.py +0 -0
  732. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_pause.py +0 -0
  733. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_machine_stats.py +0 -0
  734. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_merge_queue.py +0 -0
  735. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_merge_verify.py +0 -0
  736. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_chat.py +0 -0
  737. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_dispatch.py +0 -0
  738. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_gate.py +0 -0
  739. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_order.py +0 -0
  740. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_milestone_seam.py +0 -0
  741. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_mock_author.py +0 -0
  742. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_model_tiering.py +0 -0
  743. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_models.py +0 -0
  744. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_models_config_labels.py +0 -0
  745. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_needs_attention.py +0 -0
  746. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_network.py +0 -0
  747. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_new_issue_chat.py +0 -0
  748. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_next_release_tag.py +0 -0
  749. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_node_shim.py +0 -0
  750. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_baseline.py +0 -0
  751. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_cli.py +0 -0
  752. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_collect.py +0 -0
  753. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_config.py +0 -0
  754. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_drive_seam.py +0 -0
  755. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_isolation.py +0 -0
  756. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_predicate.py +0 -0
  757. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_quiet_hours.py +0 -0
  758. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notifier_service.py +0 -0
  759. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notify.py +0 -0
  760. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_notify_drain.py +0 -0
  761. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_openapi.py +0 -0
  762. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_operational_defaults.py +0 -0
  763. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_overlap_fence.py +0 -0
  764. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_packaged_deploy_units.py +0 -0
  765. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_parentage.py +0 -0
  766. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_paste_landed.py +0 -0
  767. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  768. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_pipeline.py +0 -0
  769. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_approve_plan_command.py +0 -0
  770. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_pr_command.py +0 -0
  771. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_followup_review_command.py +0 -0
  772. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_only.py +0 -0
  773. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_plan_parser.py +0 -0
  774. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_platform_paths.py +0 -0
  775. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_bridge.py +0 -0
  776. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_config.py +0 -0
  777. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_store.py +0 -0
  778. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_portal_sync.py +0 -0
  779. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_pr_body_lint.py +0 -0
  780. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_prereqs.py +0 -0
  781. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_production_db_guard.py +0 -0
  782. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_progress.py +0 -0
  783. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provider_seam.py +0 -0
  784. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers.py +0 -0
  785. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers_config_labels.py +0 -0
  786. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_providers_pty.py +0 -0
  787. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provision_core.py +0 -0
  788. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_provision_machine.py +0 -0
  789. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_py_rust_mirror_inventory.py +0 -0
  790. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_quiet_hours.py +0 -0
  791. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_quiet_hours_store_2146.py +0 -0
  792. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reap_merged_sessions.py +0 -0
  793. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reap_stale_interactive_tick.py +0 -0
  794. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile.py +0 -0
  795. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_branch.py +0 -0
  796. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_completions.py +0 -0
  797. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  798. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_merges.py +0 -0
  799. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_no_agent_record.py +0 -0
  800. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_tick.py +0 -0
  801. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reconcile_usage_limit_done.py +0 -0
  802. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_refine_chat.py +0 -0
  803. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_2101.py +0 -0
  804. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  805. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_deadlock_2240.py +0 -0
  806. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  807. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_cordon_stuck_2490.py +0 -0
  808. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_propagate_threshold.py +0 -0
  809. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_roll_between_legs_2854.py +0 -0
  810. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_roll_window_handoff.py +0 -0
  811. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_unified_1242.py +0 -0
  812. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_verify.py +0 -0
  813. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_release_window.py +0 -0
  814. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_remote_auto_prune.py +0 -0
  815. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_remote_interactive_reaper.py +0 -0
  816. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_add.py +0 -0
  817. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_dormancy.py +0 -0
  818. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_edit_2220.py +0 -0
  819. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_graph_fleet_2237.py +0 -0
  820. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_repo_onboard_2220.py +0 -0
  821. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_report_result_push.py +0 -0
  822. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_reports.py +0 -0
  823. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry.py +0 -0
  824. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_advisory_1606.py +0 -0
  825. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_escalation_classify_3360.py +0 -0
  826. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_retry_type_1636.py +0 -0
  827. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_revalidate.py +0 -0
  828. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review.py +0 -0
  829. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_end_review_without_verdict.py +0 -0
  830. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_parse_failure_diagnostic.py +0 -0
  831. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_reaffirm.py +0 -0
  832. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_state.py +0 -0
  833. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_backstop.py +0 -0
  834. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_override_audit.py +0 -0
  835. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_verdict_relay.py +0 -0
  836. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_review_zero_commits.py +0 -0
  837. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_scoped_review_wiring.py +0 -0
  838. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_scorecard.py +0 -0
  839. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_self_health.py +0 -0
  840. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve.py +0 -0
  841. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_app.py +0 -0
  842. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_app_board_trim.py +0 -0
  843. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_serve_rest_routes.py +0 -0
  844. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_session.py +0 -0
  845. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_slice_issue_attribution.py +0 -0
  846. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke.py +0 -0
  847. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  848. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_live_checkout_restore.py +0 -0
  849. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_smoke_workflow.py +0 -0
  850. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_spend_ceiling.py +0 -0
  851. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_spend_ceiling_coordinator.py +0 -0
  852. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_split.py +0 -0
  853. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_split_work.py +0 -0
  854. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_sql_dialect.py +0 -0
  855. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_sqlite_connect_ratchet.py +0 -0
  856. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stage_projection.py +0 -0
  857. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stale_busy_reviewer_697.py +0 -0
  858. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stalled_pipeline.py +0 -0
  859. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_state.py +0 -0
  860. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_state_review_findings_daemon.py +0 -0
  861. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_status_fleet_footer.py +0 -0
  862. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stop_1567.py +0 -0
  863. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_store_contract.py +0 -0
  864. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_store_migrate.py +0 -0
  865. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stuck.py +0 -0
  866. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  867. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_terminal_command.py +0 -0
  868. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_author.py +0 -0
  869. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_chat.py +0 -0
  870. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_orchestrator.py +0 -0
  871. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_report.py +0 -0
  872. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_verdict_parsing.py +0 -0
  873. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_test_verdict_transcript_floor.py +0 -0
  874. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_text_io_encoding_audit.py +0 -0
  875. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_board_audit.py +0 -0
  876. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_config_load_1080.py +0 -0
  877. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_thin_client_daemon_routing_906.py +0 -0
  878. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_throwaway_vm.py +0 -0
  879. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_tmux_host.py +0 -0
  880. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_tmux_session.py +0 -0
  881. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_transcript_floor.py +0 -0
  882. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_uat_checks.py +0 -0
  883. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage.py +0 -0
  884. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage_limits.py +0 -0
  885. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_usage_rollup.py +0 -0
  886. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_venv_live_install_2121.py +0 -0
  887. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_version_single_source.py +0 -0
  888. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_watch.py +0 -0
  889. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  890. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_env_venv_isolation.py +0 -0
  891. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_events.py +0 -0
  892. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_image_pin_sync.py +0 -0
  893. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_safety.py +0 -0
  894. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worker_test_scoping.py +0 -0
  895. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worktree.py +0 -0
  896. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  897. {code_coordinator-0.5.496 → code_coordinator-0.5.498}/tests/test_write_parity.py +0 -0
  898. {code_coordinator-0.5.496 → 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.496
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.496
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.496",
2
+ "tag": "0.5.498",
3
3
  "distance": 0,
4
- "node": "gdcf7e4331cfa3d1b0c95e0e3450402c3c49a6723",
4
+ "node": "g99081c11bad4947401aaeef6ccd4301a2b450952",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-19"
@@ -35,7 +35,7 @@ import socket
35
35
  import subprocess
36
36
  import time
37
37
  from pathlib import Path
38
- from typing import TYPE_CHECKING, Any, Mapping
38
+ from typing import TYPE_CHECKING, Any, Mapping, Sequence
39
39
 
40
40
  import click
41
41
 
@@ -111,6 +111,7 @@ from coord.overlap_predict import (
111
111
  EVENT_SCORED,
112
112
  OUTCOME_UNKNOWN,
113
113
  SOURCE_DECLARED,
114
+ Overlap,
114
115
  Prediction,
115
116
  classify_outcome,
116
117
  collect_candidate_files,
@@ -118,6 +119,7 @@ from coord.overlap_predict import (
118
119
  fanout_warnings,
119
120
  inflight_footprints,
120
121
  malformed_files_warning,
122
+ overlap_would_run_before,
121
123
  parse_declared_files,
122
124
  predict_overlap,
123
125
  predictions_from_audit,
@@ -465,12 +467,38 @@ def drive_queue_add(
465
467
  malformed_note = ""
466
468
  auto_after: list[str] = []
467
469
  rejected_after: list[str] = []
470
+ # #3395 rule 2: overlaps against an already-queued, not-yet-dispatched
471
+ # entry that THIS add is positioning ahead of — the edge for those goes
472
+ # on the INCUMBENT (`entry --after this add`), applied further down once
473
+ # this add's own row exists, never on `after` above (that would chain
474
+ # this add behind an entry it is about to run in front of).
475
+ reverse_candidates: list[tuple[QueueEntry, Overlap]] = []
476
+ reverse_rejected: list[str] = []
468
477
  if not no_predict_overlap:
469
478
  prediction, staleness_note, malformed_note = _predict_overlap(
470
479
  config_path, repo, issue, existing_entries
471
480
  )
481
+ effective_position = _resolve_effective_new_position(position, previous)
482
+ forward_keys, all_reverse = _partition_overlap_after(
483
+ existing_entries,
484
+ effective_position,
485
+ prediction,
486
+ previous_position=previous.position if previous is not None else None,
487
+ )
488
+ # #2603's --reject-after is the same narrower escape hatch for a
489
+ # REVERSED edge too — it names the OTHER entry's key either way, so
490
+ # an operator does not need to know which direction rule 2 picked to
491
+ # veto it.
492
+ reverse_candidates = [
493
+ (entry, overlap) for entry, overlap in all_reverse
494
+ if entry.key not in reject_after
495
+ ]
496
+ reverse_rejected = [
497
+ entry.key for entry, _overlap in all_reverse if entry.key in reject_after
498
+ ]
472
499
  candidate_after = _applicable_auto_after(
473
- existing_entries, repo, issue, after, prediction
500
+ existing_entries, repo, issue, after, prediction,
501
+ candidate_keys=forward_keys,
474
502
  )
475
503
  # #2603: --reject-after is the narrower escape hatch — it drops only
476
504
  # the named edge(s) from what actually gets applied, never the whole
@@ -493,6 +521,18 @@ def drive_queue_add(
493
521
  no_acceptance=no_acceptance,
494
522
  plan_destructive=plan_destructive,
495
523
  )
524
+ # #3395: apply the REVERSED edges rule 2 selected — writing to the
525
+ # INCUMBENT entry's own row, now that this add's row exists to name as
526
+ # its `--after`. Must run after the write above: it names `entry_key
527
+ # (repo, issue)` as a pre-req, and while nothing here checks the row for
528
+ # existence, doing this first keeps the audit trail (both events land in
529
+ # enqueue order, not out of order relative to `queued ...`) intuitive to
530
+ # read back.
531
+ reverse_applied: list[tuple[QueueEntry, Overlap]] = []
532
+ if reverse_candidates:
533
+ reverse_applied = _apply_reversed_overlap_after(
534
+ existing_entries, entry_key(repo, issue), after, reverse_candidates,
535
+ )
496
536
  # #2839: queueing a drive is a strictly STRONGER statement than "send to
497
537
  # Pipeline" (`coord track`), so it must never leave the issue in a
498
538
  # weaker label state — apply the same `coord` + `status:ready` labels
@@ -542,13 +582,22 @@ def drive_queue_add(
542
582
  # --reject-after confirmation above: an author who wrote a declaration
543
583
  # that never took must not see output byte-identical to "declared
544
584
  # nothing".
585
+ # #3395: plus, for every REVERSED edge rule 2 applied, a line naming the
586
+ # INCUMBENT entry and why the direction is flipped from #2247's usual
587
+ # "ordered --after" reading — an unexplained edge on a row OTHER than
588
+ # the one this `add` named is exactly the kind of surprise an operator
589
+ # needs the reason for immediately, not by going and reading that row's
590
+ # own `last_reason` separately.
545
591
  overlap_notes: list[str] = []
546
592
  if auto_after:
547
593
  overlap_notes.append(prediction.reason)
548
594
  overlap_notes.extend(_declared_overlap_age_notes(prediction, auto_after))
549
- if rejected_after:
595
+ for entry, overlap in reverse_applied:
596
+ overlap_notes.append(_reverse_overlap_reason(entry_key(repo, issue), overlap))
597
+ all_rejected = [*rejected_after, *reverse_rejected]
598
+ if all_rejected:
550
599
  overlap_notes.append(
551
- "rejected via --reject-after (not applied): " + ", ".join(rejected_after)
600
+ "rejected via --reject-after (not applied): " + ", ".join(all_rejected)
552
601
  )
553
602
  overlap_notes.extend(fanout_warnings(prediction))
554
603
  if malformed_note:
@@ -925,6 +974,8 @@ def _applicable_auto_after(
925
974
  issue: int,
926
975
  after: list[str],
927
976
  prediction: Prediction,
977
+ *,
978
+ candidate_keys: Sequence[str] | None = None,
928
979
  ) -> list[str]:
929
980
  """The predicted pre-reqs that are actually safe to add.
930
981
 
@@ -933,9 +984,20 @@ def _applicable_auto_after(
933
984
  dropped if it would self-edge or close a cycle — the opposite posture to
934
985
  `validate_enqueue`'s treatment of an operator-declared `--after`, which is
935
986
  a typo worth reporting.
987
+
988
+ #3395: *candidate_keys* narrows which of `prediction.after_keys` this
989
+ call even considers — `None` (the default, unused by `drive_queue_add`'s
990
+ own call today but kept for a caller that wants pre-#3395 behaviour, or
991
+ a future direct test) keeps the pre-#3395 behaviour of trying all of
992
+ them. `drive_queue_add` passes the FORWARD subset only:
993
+ `_partition_overlap_after` has already routed the REVERSED ones (a
994
+ newcomer positioned ahead of an overlapping, not-yet-dispatched entry) to
995
+ `_apply_reversed_overlap_after` instead, and chaining this entry after
996
+ them TOO would apply rule 2's edge twice, in both directions.
936
997
  """
998
+ keys = prediction.after_keys if candidate_keys is None else tuple(candidate_keys)
937
999
  applied: list[str] = []
938
- for candidate_key in prediction.after_keys:
1000
+ for candidate_key in keys:
939
1001
  if candidate_key in after or candidate_key in applied:
940
1002
  continue
941
1003
  try:
@@ -948,6 +1010,226 @@ def _applicable_auto_after(
948
1010
  return applied
949
1011
 
950
1012
 
1013
+ def _resolve_effective_new_position(
1014
+ position: int | None, previous: QueueEntry | None,
1015
+ ) -> int | None:
1016
+ """#3395: the position this `add` actually leaves the entry at, for
1017
+ :func:`coord.overlap_predict.overlap_would_run_before` to compare against.
1018
+
1019
+ An explicit ``--position`` wins outright. Otherwise, re-adding an
1020
+ already-queued entry keeps its CURRENT position — `enqueue_drive_queue`
1021
+ never moves a row unless `position` is given — so that position is what
1022
+ the entry will actually run at. A brand-new entry with no `--position`
1023
+ appends at the tail (``None``, `overlap_would_run_before`'s own "never
1024
+ ahead of anything" case) — there is no meaningful position yet.
1025
+ """
1026
+ if position is not None:
1027
+ return position
1028
+ if previous is not None:
1029
+ return previous.position
1030
+ return None
1031
+
1032
+
1033
+ def _partition_overlap_after(
1034
+ existing_entries: list[QueueEntry],
1035
+ effective_position: int | None,
1036
+ prediction: Prediction,
1037
+ *,
1038
+ previous_position: int | None = None,
1039
+ ) -> tuple[list[str], list[tuple[QueueEntry, Overlap]]]:
1040
+ """#3395 rule 2: split predicted overlaps by which direction the
1041
+ ``--after`` edge belongs in.
1042
+
1043
+ FORWARD (returned as plain keys, same shape `_applicable_auto_after`
1044
+ always took) is correct whenever the other side either is already
1045
+ running (`[branch]` — it started before this `add` regardless of queue
1046
+ position) or is queued but will still dispatch no earlier than this
1047
+ newcomer. REVERSE (returned paired with the other side's own
1048
+ `QueueEntry`, since applying it means writing to THAT row, not this one)
1049
+ is the case the issue is about: a `[declared]` overlap against an entry
1050
+ that is still queued but is about to be pushed BEHIND this newcomer in
1051
+ dispatch order. Chaining the newcomer after it there would force the
1052
+ newcomer to run last despite the operator's own `--position`, while the
1053
+ incumbent — now scheduled first — would carry no edge stopping it from
1054
+ colliding with the newcomer's fresher files.
1055
+
1056
+ An overlap naming a key with no matching `QueueEntry` (the declared
1057
+ footprint disappeared between prediction and this call — a `remove` race,
1058
+ vanishingly rare) falls back to FORWARD: the safe, pre-#3395 default.
1059
+
1060
+ ``previous_position`` is the target's OWN position before this call —
1061
+ `None` for a brand-new entry, the row's current position when this
1062
+ `add` is REPOSITIONING an already-queued entry. Passed straight through
1063
+ to `overlap_would_run_before`, which needs it to account for
1064
+ `_move_drive_queue_entry_local`'s remove-then-reinsert shift: without
1065
+ it, the direction decision compares `other`'s stale pre-removal
1066
+ position and can pick the REVERSE edge when FORWARD is actually correct
1067
+ (or vice versa) — see that function's docstring for the full case
1068
+ analysis.
1069
+ """
1070
+ entries_by_key = {e.key: e for e in existing_entries}
1071
+ forward: list[str] = []
1072
+ reverse: list[tuple[QueueEntry, Overlap]] = []
1073
+ for overlap in prediction.overlaps:
1074
+ other = entries_by_key.get(overlap.key)
1075
+ if (
1076
+ overlap.source == SOURCE_DECLARED
1077
+ and other is not None
1078
+ and overlap_would_run_before(
1079
+ effective_position,
1080
+ other.position,
1081
+ previous_position=previous_position,
1082
+ )
1083
+ ):
1084
+ reverse.append((other, overlap))
1085
+ else:
1086
+ forward.append(overlap.key)
1087
+ return forward, reverse
1088
+
1089
+
1090
+ def _apply_reversed_overlap_after(
1091
+ existing_entries: list[QueueEntry],
1092
+ new_key: str,
1093
+ new_key_after: Sequence[str],
1094
+ reverse_candidates: list[tuple[QueueEntry, Overlap]],
1095
+ ) -> list[tuple[QueueEntry, Overlap]]:
1096
+ """#3395: apply the REVERSED edges `_partition_overlap_after` identified
1097
+ — chain each incumbent entry ``--after`` the newcomer, since the
1098
+ newcomer is the one that will actually dispatch first.
1099
+
1100
+ Same fail-safe posture as `_applicable_auto_after`: a would-be cycle is
1101
+ silently dropped rather than failing this `add` (an INFERRED edge must
1102
+ never be able to refuse an operator's own `--position`), and an edge that
1103
+ already exists on the incumbent is left alone (no redundant write).
1104
+ Every OTHER operator-declared field on the incumbent's row (`machine`,
1105
+ the hold gate, `max_fix_rounds`, ...) is carried through unchanged —
1106
+ `enqueue_drive_queue` fully replaces those columns on every call, so
1107
+ omitting one here would silently clear it off a row this `add` was never
1108
+ asked to touch.
1109
+
1110
+ ``new_key_after`` is the newcomer's OWN final ``--after`` list from this
1111
+ same `add` (operator-declared plus rule 1's forward auto-chains). The
1112
+ cycle check below builds its own edge graph rather than reusing
1113
+ `validate_enqueue` directly, because `existing_entries` is the pre-write
1114
+ snapshot: it never contains the newcomer's row (a brand-new entry) and,
1115
+ on a reposition, contains only its STALE pre-`add` edges — so a
1116
+ `validate_enqueue` call scoped to just the incumbent's candidate edge
1117
+ cannot see the newcomer's own outgoing edges and would miss a two-node
1118
+ cycle this single `add` invocation introduces (rule 1 chains the
1119
+ newcomer after an overlapping incumbent, rule 2 separately wants that
1120
+ same incumbent chained after the newcomer). Including `new_key_after` as
1121
+ the newcomer's node in the graph here closes that gap; the tick's own
1122
+ full-graph `find_cycle` would otherwise be the only thing to catch it,
1123
+ after the fact.
1124
+ """
1125
+ from coord.state import enqueue_drive_queue # noqa: PLC0415
1126
+
1127
+ applied: list[tuple[QueueEntry, Overlap]] = []
1128
+ base_edges: dict[str, list[str]] = {
1129
+ e.key: list(e.after) for e in existing_entries if e.key != new_key
1130
+ }
1131
+ base_edges[new_key] = [str(a) for a in new_key_after]
1132
+ for entry, overlap in reverse_candidates:
1133
+ if new_key in entry.after:
1134
+ applied.append((entry, overlap))
1135
+ continue
1136
+ new_after = [*entry.after, new_key]
1137
+ trial_edges = dict(base_edges)
1138
+ trial_edges[entry.key] = new_after
1139
+ if find_cycle(trial_edges) is not None:
1140
+ continue
1141
+ enqueue_drive_queue(
1142
+ entry.repo,
1143
+ entry.issue,
1144
+ machine=entry.machine or None,
1145
+ after=new_after,
1146
+ position=None,
1147
+ hold_after=entry.hold_after,
1148
+ hold_reason=entry.hold_reason,
1149
+ resume_when=entry.resume_when,
1150
+ hold_scope=entry.hold_scope,
1151
+ max_fix_rounds=entry.max_fix_rounds,
1152
+ no_acceptance=entry.no_acceptance,
1153
+ plan_destructive=entry.plan_destructive,
1154
+ )
1155
+ applied.append((entry, overlap))
1156
+ _record_reverse_overlap_prediction(entry.repo, entry.issue, new_key, overlap)
1157
+ return applied
1158
+
1159
+
1160
+ def _reverse_overlap_reason(new_key: str, overlap: Overlap) -> str:
1161
+ """#3395: the one sentence shared by `add`'s stdout, the audit summary,
1162
+ and the INCUMBENT's own `last_reason` for a REVERSED edge — so all three
1163
+ surfaces agree on why a row this `add` never named got a new `after=`.
1164
+ """
1165
+ return (
1166
+ "predicted file overlap (#2247) — ordered "
1167
+ + overlap.describe_reversed(new_key)
1168
+ + " (#3395: this add was positioned ahead of an existing queued entry)"
1169
+ )
1170
+
1171
+
1172
+ def _record_reverse_overlap_prediction(
1173
+ repo: str, issue: int, new_key: str, overlap: Overlap,
1174
+ ) -> None:
1175
+ """#3395: the audit + `last_reason` twin of `_record_overlap_prediction`
1176
+ for a REVERSED edge — recorded against *repo*/*issue*, the INCUMBENT
1177
+ entry that actually got the new `after=` write, not the entry `add` was
1178
+ called for. Mirrors `_record_overlap_prediction`'s two sinks (a durable
1179
+ audit row, plus the `last_reason` column an operator reading `coord
1180
+ drive-queue list` sees immediately) for the same reason: a `last_reason`
1181
+ the next tick attempt will overwrite is not durable, so the claim also
1182
+ needs a permanent home to be scored later.
1183
+
1184
+ Kept as its own event rather than reusing `Prediction.audit_details()`
1185
+ verbatim: that payload's `after` list and `predicted_files` are framed
1186
+ from the CANDIDATE's point of view (`_predict_overlap` computed them
1187
+ that way), and reusing it here unedited would misrepresent whose files
1188
+ were actually being ordered against whose.
1189
+ """
1190
+ reason = _reverse_overlap_reason(new_key, overlap)
1191
+ details = {
1192
+ "predicted_files": list(overlap.files),
1193
+ "overlaps": [
1194
+ {
1195
+ "key": new_key,
1196
+ "source": overlap.source,
1197
+ "branch": overlap.branch,
1198
+ "head_sha": overlap.head_sha,
1199
+ "synced_at": overlap.synced_at,
1200
+ "liveness_checked": overlap.liveness_checked,
1201
+ "files": list(overlap.files),
1202
+ }
1203
+ ],
1204
+ "after": [new_key],
1205
+ # #3395: the one field with no forward-edge equivalent — lets a later
1206
+ # reader (a human, `overlap-report`) tell this row's `after=` was
1207
+ # rule 2's reversal, not an ordinary same-direction prediction.
1208
+ "reversed": True,
1209
+ }
1210
+ try:
1211
+ from coord.audit import record_audit # noqa: PLC0415
1212
+
1213
+ record_audit(
1214
+ tier="business",
1215
+ category=AUDIT_CATEGORY,
1216
+ event_type=EVENT_PREDICTED,
1217
+ actor="drive-queue",
1218
+ summary=reason,
1219
+ repo=repo,
1220
+ issue=issue,
1221
+ details=details,
1222
+ )
1223
+ except Exception: # noqa: BLE001 — recording must never fail the enqueue
1224
+ pass
1225
+ try:
1226
+ from coord.state import update_drive_queue_entry # noqa: PLC0415
1227
+
1228
+ update_drive_queue_entry(repo, issue, last_reason=reason)
1229
+ except Exception: # noqa: BLE001 — same
1230
+ pass
1231
+
1232
+
951
1233
  def _record_overlap_prediction(
952
1234
  repo: str, issue: int, prediction: Prediction, applied: list[str],
953
1235
  ) -> None:
@@ -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
  )
@@ -92,6 +92,23 @@ detail because it is pure data with no wall-clock dependency; the cached-body
92
92
  age is a relative-time string and is therefore the CLI layer's job (see
93
93
  ``coord.commands.drive_queue``), the same split that module already draws
94
94
  for the candidate's own staleness note.
95
+
96
+ #3395: this module already predicted against every non-terminal QUEUED entry,
97
+ not just in-flight branches (:func:`coord.commands.drive_queue._predict_overlap`
98
+ builds :class:`Footprint`\\ s from both) — the gap was DIRECTION, not
99
+ coverage. Chaining every overlap the newcomer's own ``--after`` is only
100
+ correct when the newcomer runs SECOND. When it is inserted ahead of an
101
+ already-queued, not-yet-dispatched entry it overlaps with (``--position``
102
+ placing it before that entry's slot), chaining it after that entry as well
103
+ would force it to run LAST despite the operator's own ordering — while the
104
+ incumbent, now scheduled to run FIRST, sails past the newcomer's fresher
105
+ files with no edge stopping it, exactly vimcode#1117/#1090's shape.
106
+ :func:`overlap_would_run_before` answers "who runs first" as a pure position
107
+ comparison; :meth:`Overlap.describe_reversed` renders the edge the other way
108
+ round when the answer says to reverse it. The decision of WHICH overlaps to
109
+ reverse still lives in ``coord.commands.drive_queue`` (it needs the queue's
110
+ positions and the write path to apply an edge onto an entry other than the
111
+ one being added), so this module only supplies the pure primitives.
95
112
  """
96
113
 
97
114
  from __future__ import annotations
@@ -444,6 +461,24 @@ class Overlap:
444
461
  stale = ", liveness check failed" if not self.liveness_checked else ""
445
462
  return f" ({self.branch}{sha}{stale})"
446
463
 
464
+ def describe_reversed(self, new_key: str) -> str:
465
+ """#3395: the same rendering as :meth:`describe`, but for the
466
+ REVERSED chaining direction rule 2 requires when a newcomer is
467
+ positioned AHEAD of the entry this overlap names.
468
+
469
+ :meth:`describe` reads as "the OTHER entry, which the candidate is
470
+ chained after" — correct when the candidate runs second. Here it is
471
+ the other way around: ``self.key`` (the entry already sitting in the
472
+ queue) is the one that must now wait, and *new_key* is the newcomer
473
+ it waits ON. Only ever called for a :data:`SOURCE_DECLARED` overlap
474
+ (see :func:`overlap_would_run_before`'s caller) — a `[branch]` edge
475
+ is already running and can never be the one reversed.
476
+ """
477
+ shown = ", ".join(f"`{f}`" for f in self.files[:3])
478
+ if len(self.files) > 3:
479
+ shown += f" (+{len(self.files) - 3} more)"
480
+ return f"{self.key} --after {new_key} [{self.source}]{self._provenance()}: {shown}"
481
+
447
482
 
448
483
  @dataclass(frozen=True)
449
484
  class Prediction:
@@ -528,6 +563,57 @@ def paths_overlap(left: str, right: str) -> bool:
528
563
  return bool(right.endswith("/") and left.startswith(right))
529
564
 
530
565
 
566
+ def overlap_would_run_before(
567
+ new_position: int | None,
568
+ other_position: int,
569
+ *,
570
+ previous_position: int | None = None,
571
+ ) -> bool:
572
+ """#3395: would the entry landing at *new_position* dispatch BEFORE the
573
+ already-queued entry sitting at *other_position*?
574
+
575
+ This is rule 2 of the issue's fix, in its testable pure form: an overlap
576
+ against a `[declared]` (still-queued, not-yet-dispatched) entry must be
577
+ chained the NORMAL way (newcomer ``--after`` the incumbent) UNLESS the
578
+ newcomer is being inserted ahead of it in queue order — in which case the
579
+ edge has to run the other way, or the incumbent's stale files would
580
+ collide with a newcomer that starts first. The caller
581
+ (`coord.commands.drive_queue._partition_overlap_after`) is what decides
582
+ WHICH direction to apply based on this answer; this function only answers
583
+ "who runs first".
584
+
585
+ ``new_position=None`` means "appends at the tail" — `coord.state.
586
+ enqueue_drive_queue`'s own contract for an omitted ``--position`` — which
587
+ can never be ahead of anything already queued, so this is unconditionally
588
+ ``False``. A tie (``new_position == other_position``) resolves to
589
+ ``True``: inserting AT an occupied slot pushes the incumbent back one
590
+ (`coord.state._move_drive_queue_entry_local`'s renumbering), so the
591
+ newcomer is the one that ends up running first.
592
+
593
+ ``previous_position`` is the entry's OWN position before this call, when
594
+ it is already queued and being repositioned (``None`` for a brand-new
595
+ entry). `_move_drive_queue_entry_local` implements a reposition as
596
+ remove-then-reinsert: removing the entry from its old slot shifts every
597
+ entry that was originally AFTER it down by one index, before the entry
598
+ is reinserted at the clamped destination. `other_position` (taken from
599
+ the pre-write snapshot) does not reflect that shift, so comparing it
600
+ directly against `new_position` is only correct when nothing was
601
+ removed first — i.e. a brand-new entry, where `previous_position` is
602
+ `None`. When repositioning, and `other_position` was originally after
603
+ `previous_position` (the entry's own old slot), the removal already
604
+ moved `other` one slot earlier — accounted for here by comparing against
605
+ ``other_position - 1`` instead. Getting this backwards does not just
606
+ miss an edge (the pre-#3395 failure mode) — it applies the REVERSE edge,
607
+ ordering the entry that will actually dispatch first to wait on the one
608
+ that dispatches second.
609
+ """
610
+ if new_position is None:
611
+ return False
612
+ if previous_position is not None and other_position > previous_position:
613
+ other_position -= 1
614
+ return int(new_position) <= int(other_position)
615
+
616
+
531
617
  def _intersect(candidate: Sequence[str], other: Sequence[str]) -> tuple[str, ...]:
532
618
  hits: list[str] = []
533
619
  for path in candidate:
@@ -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"):