code-coordinator 0.5.496__tar.gz → 0.5.497__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.497}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/drive_queue.py +287 -5
  5. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/overlap_predict.py +86 -0
  6. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_drive_queue.py +149 -0
  7. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_overlap_predict.py +56 -0
  8. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/board.md +0 -0
  9. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/complete-session.md +0 -0
  10. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.claude/commands/coordinator.md +0 -0
  11. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/_lib.sh +0 -0
  12. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-checkout +0 -0
  13. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-commit +0 -0
  14. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.githooks/post-merge +0 -0
  15. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/coord-ci-acceptance.yml +0 -0
  17. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/auto-release.yml +0 -0
  18. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/publish.yml +0 -0
  19. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.github/workflows/test.yml +0 -0
  20. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/.gitignore +0 -0
  21. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/CLAUDE.md +0 -0
  22. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/GOAL.md +0 -0
  23. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/LICENSE +0 -0
  24. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/MANIFEST.in +0 -0
  25. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/README.md +0 -0
  26. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/SOURCES.txt +0 -0
  27. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/dependency_links.txt +0 -0
  28. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/entry_points.txt +0 -0
  29. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/requires.txt +0 -0
  30. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/scm_file_list.json +0 -0
  31. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/code_coordinator.egg-info/top_level.txt +0 -0
  32. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/__init__.py +0 -0
  33. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/_board_mapping.py +0 -0
  34. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/acceptance.py +0 -0
  35. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/acceptance_drivers.py +0 -0
  36. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent.py +0 -0
  37. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent_app.py +0 -0
  38. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agent_update.py +0 -0
  39. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/.gitignore +0 -0
  40. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/agents/work.md +0 -0
  41. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/agents/opencode/routing.jsonc +0 -0
  42. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/approved_work.py +0 -0
  43. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/audit.py +0 -0
  44. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/auto_loop.py +0 -0
  45. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/backup.py +0 -0
  46. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/block_log.py +0 -0
  47. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_schema.py +0 -0
  48. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_service.py +0 -0
  49. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/board_wire.py +0 -0
  50. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/brain.py +0 -0
  51. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/branch_model.py +0 -0
  52. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/bug_intake.py +0 -0
  53. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/cargo_cache.py +0 -0
  54. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_fix.py +0 -0
  55. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_github.py +0 -0
  56. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_gitlab.py +0 -0
  57. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/claude_setup_token.py +0 -0
  60. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/client.py +0 -0
  62. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/codegen.py +0 -0
  63. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/backup.py +0 -0
  69. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/codegen.py +0 -0
  71. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/dr.py +0 -0
  74. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/machine.py +0 -0
  80. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/merge.py +0 -0
  81. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/milestone.py +0 -0
  82. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/plan_followup.py +0 -0
  83. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/plans.py +0 -0
  84. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/portal.py +0 -0
  85. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/pr.py +0 -0
  86. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/store_migrate.py +0 -0
  95. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/config.py +0 -0
  100. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/db.py +0 -0
  110. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-backup.service +0 -0
  115. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-backup.timer +0 -0
  116. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.service +0 -0
  117. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.sh +0 -0
  118. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-db-backup.timer +0 -0
  119. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-dr-verify.service +0 -0
  120. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-dr-verify.timer +0 -0
  121. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-drive-queue.service +0 -0
  122. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-drive-queue.timer +0 -0
  123. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-failure-notify.service +0 -0
  124. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-fleet-watchdog.service +0 -0
  125. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  126. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-notify.service +0 -0
  127. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-notify.timer +0 -0
  128. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-propagate.service +0 -0
  129. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-propagate.timer +0 -0
  130. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-window.service +0 -0
  131. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-release-window.timer +0 -0
  132. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-serve.service +0 -0
  133. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web-dist-build.service +0 -0
  134. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web-dist-build.timer +0 -0
  135. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy/coord-web.service +0 -0
  136. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy_manifest.py +0 -0
  137. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deploy_units.py +0 -0
  138. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deprecation_telemetry.py +0 -0
  139. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/deps.py +0 -0
  140. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/diagnose.py +0 -0
  141. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dispatch_liveness.py +0 -0
  143. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dist_name.py +0 -0
  144. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dr_promote.py +0 -0
  145. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/dr_verify.py +0 -0
  146. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive.py +0 -0
  147. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive_queue.py +0 -0
  148. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/drive_state.py +0 -0
  149. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/events.py +0 -0
  150. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/failure_class.py +0 -0
  151. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/failure_classifier.py +0 -0
  152. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/filelock.py +0 -0
  153. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/fleet_config_health.py +0 -0
  154. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/forge_availability.py +0 -0
  155. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/freshness.py +0 -0
  156. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_a.py +0 -0
  157. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_b.py +0 -0
  158. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gate_snapshot.py +0 -0
  159. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gates.py +0 -0
  160. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/gen_board_fixture.py +0 -0
  161. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/github_ops.py +0 -0
  162. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/github_throttle.py +0 -0
  163. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/goal.py +0 -0
  164. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/graph_health.py +0 -0
  165. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/__init__.py +0 -0
  166. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/aggregate.py +0 -0
  167. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/__init__.py +0 -0
  168. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/_ci_pin.py +0 -0
  169. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/agent_install.py +0 -0
  170. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/cargo_targets.py +0 -0
  171. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/claude_binary.py +0 -0
  172. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/config_drift.py +0 -0
  173. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  174. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/coord_web_ci_pin.py +0 -0
  175. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/deploy_lane_facts.py +0 -0
  176. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/disk.py +0 -0
  177. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_board.py +0 -0
  178. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  179. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_phantom.py +0 -0
  180. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/fleet_unit_drift.py +0 -0
  181. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/graph.py +0 -0
  182. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/graphify_cli.py +0 -0
  183. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/index_lock.py +0 -0
  184. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/issues_sync_staleness.py +0 -0
  185. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/plan_usage.py +0 -0
  186. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/pr_churn.py +0 -0
  187. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/release_cordon.py +0 -0
  188. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/repo_state.py +0 -0
  189. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/spawned_coord.py +0 -0
  190. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/stalled_pipeline.py +0 -0
  191. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/timer_active.py +0 -0
  192. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/toolchain.py +0 -0
  193. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/unit_drift.py +0 -0
  194. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/unit_enablement.py +0 -0
  195. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/wedged_drive_queue.py +0 -0
  196. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/checks/worktrees.py +0 -0
  197. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/cli.py +0 -0
  198. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/context.py +0 -0
  199. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/fleet_snapshot.py +0 -0
  200. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/models.py +0 -0
  201. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/pypi.py +0 -0
  202. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/registry.py +0 -0
  203. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/render.py +0 -0
  204. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/health/units.py +0 -0
  205. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/hooks.py +0 -0
  206. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/housekeeping.py +0 -0
  207. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/interactive.py +0 -0
  208. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/invariant_alarms.py +0 -0
  209. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/issue_store.py +0 -0
  210. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/issues_sync_status.py +0 -0
  211. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/liveness_auditor.py +0 -0
  212. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_fault.py +0 -0
  213. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_metrics.py +0 -0
  214. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_onboard.py +0 -0
  215. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_pause.py +0 -0
  216. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/machine_stats.py +0 -0
  217. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/merge_queue.py +0 -0
  218. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_chat.py +0 -0
  219. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_dispatch.py +0 -0
  220. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_gate.py +0 -0
  221. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/milestone_order.py +0 -0
  222. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/mock_author.py +0 -0
  223. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/models.py +0 -0
  224. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/network.py +0 -0
  225. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/new_issue_chat.py +0 -0
  226. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/__init__.py +0 -0
  227. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/baseline.py +0 -0
  228. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/cli.py +0 -0
  229. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/collect.py +0 -0
  230. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/digest.py +0 -0
  231. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/models.py +0 -0
  232. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/predicate.py +0 -0
  233. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/service.py +0 -0
  234. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/store.py +0 -0
  235. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notifier/transport.py +0 -0
  236. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/notify.py +0 -0
  237. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/openapi.py +0 -0
  238. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/overlap_fence.py +0 -0
  239. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/parentage.py +0 -0
  240. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/parentage_github.py +0 -0
  241. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/pipeline.py +0 -0
  242. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/plan_parser.py +0 -0
  243. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/plans.py +0 -0
  244. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/platform_paths.py +0 -0
  245. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_bridge.py +0 -0
  246. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_store.py +0 -0
  247. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/portal_sync.py +0 -0
  248. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/pr_body_lint.py +0 -0
  249. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/prereqs.py +0 -0
  250. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/progress.py +0 -0
  251. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/__init__.py +0 -0
  252. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/base.py +0 -0
  253. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/claude.py +0 -0
  254. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/claude_pty.py +0 -0
  255. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/providers/opencode.py +0 -0
  256. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/queue_diagnose.py +0 -0
  257. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reconcile.py +0 -0
  258. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reconcile_tick.py +0 -0
  259. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/refine_chat.py +0 -0
  260. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_cordon.py +0 -0
  261. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_propagate.py +0 -0
  262. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_verify.py +0 -0
  263. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/release_window.py +0 -0
  264. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_dormancy.py +0 -0
  265. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_edit.py +0 -0
  266. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/repo_onboard.py +0 -0
  267. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/reports.py +0 -0
  268. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/rest_schema.py +0 -0
  269. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/revalidate.py +0 -0
  270. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/review.py +0 -0
  271. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/scorecard.py +0 -0
  272. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/self_health.py +0 -0
  273. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/serve_app.py +0 -0
  274. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  275. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  276. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  277. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  278. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  279. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/portal-followup/SKILL.md +0 -0
  280. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/release-now/SKILL.md +0 -0
  281. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  282. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  283. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/skills/update-issue/SKILL.md +0 -0
  284. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/smoke.py +0 -0
  285. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/spend_ceiling.py +0 -0
  286. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/split_work.py +0 -0
  287. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/sql.py +0 -0
  288. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/stage_projection.py +0 -0
  289. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/state.py +0 -0
  290. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/store_migrate.py +0 -0
  291. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/store_parity.py +0 -0
  292. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/templates/deploy-cloudflare.node.yml +0 -0
  293. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_author.py +0 -0
  294. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_chat.py +0 -0
  295. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_orchestrator.py +0 -0
  296. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/test_report.py +0 -0
  297. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/tui_release.py +0 -0
  298. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/uat_checks.py +0 -0
  299. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage.py +0 -0
  300. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage_limits.py +0 -0
  301. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/usage_rollup.py +0 -0
  302. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coord/worker_events.py +0 -0
  303. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/coordinator.example.yml +0 -0
  304. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-agent.service +0 -0
  305. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-backup.service +0 -0
  306. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-backup.timer +0 -0
  307. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.service +0 -0
  308. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.sh +0 -0
  309. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-db-backup.timer +0 -0
  310. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-dr-verify.service +0 -0
  311. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-dr-verify.timer +0 -0
  312. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-drive-queue.service +0 -0
  313. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-drive-queue.timer +0 -0
  314. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-failure-notify.service +0 -0
  315. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-failure-notify.sh +0 -0
  316. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-fleet-watchdog.service +0 -0
  317. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-fleet-watchdog.timer +0 -0
  318. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-notify.service +0 -0
  319. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-notify.timer +0 -0
  320. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-propagate.service +0 -0
  321. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-propagate.timer +0 -0
  322. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-window.service +0 -0
  323. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-release-window.timer +0 -0
  324. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-serve.service +0 -0
  325. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.service +0 -0
  326. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.sh +0 -0
  327. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-dist-build.timer +0 -0
  328. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web-rollback.sh +0 -0
  329. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/coord-web.service +0 -0
  330. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/deploy/node-shim.sh +0 -0
  331. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_TUI_CI.md +0 -0
  332. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  333. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_CI.md +0 -0
  334. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_COORD_WEB_DIST.md +0 -0
  335. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  336. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/AGENT_OPERATIONS.md +0 -0
  337. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ARCHITECTURE.md +0 -0
  338. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ARCH_SECURITY_GATES.md +0 -0
  339. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/COCKPIT.md +0 -0
  340. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CONTROL_CENTER.md +0 -0
  341. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/COST_DISCIPLINE.md +0 -0
  342. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CROSS_PLATFORM.md +0 -0
  343. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CUSTOMER_FACING_APPS.md +0 -0
  344. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/CUSTOMER_PORTAL.md +0 -0
  345. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DATA_STORE_SELECTION.md +0 -0
  346. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DISASTER_RECOVERY.md +0 -0
  347. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/DRIVE_QUEUE.md +0 -0
  348. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/EPHEMERAL_WORKERS.md +0 -0
  349. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/FORGE_MIGRATION.md +0 -0
  350. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/GRAPHIFY_SETUP.md +0 -0
  351. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ISSUE_GUIDANCE.md +0 -0
  352. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/MAC_MINI.md +0 -0
  353. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  354. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/NOTIFIER.md +0 -0
  355. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPENCODE_VERIFICATION.md +0 -0
  356. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPERATING_GOTCHAS.md +0 -0
  357. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/OPERATOR_GUIDES.md +0 -0
  358. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/ORACLE_LOOP.md +0 -0
  359. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PHONE_WEBAPP.md +0 -0
  360. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PIPELINE_V2.md +0 -0
  361. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/PLATFORM_EVOLUTION.md +0 -0
  362. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/SECOND_BACKEND.md +0 -0
  363. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/STORE_SERVICE.md +0 -0
  364. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  365. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/WEB_CONTROL_CENTER.md +0 -0
  366. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/WSL_WINDOWS_WORKER.md +0 -0
  367. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/README.md +0 -0
  368. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/_tokens.css +0 -0
  369. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/issue-detail.html +0 -0
  370. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/pipeline-narrow.html +0 -0
  371. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/docs/mocks/web/pipeline-wide.html +0 -0
  372. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/graphify-out/.gitignore +0 -0
  373. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/install-agent.sh +0 -0
  374. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/pyproject.toml +0 -0
  375. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/audit_review_verdict_overrides.py +0 -0
  376. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  377. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/build-worker-image.sh +0 -0
  378. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/coordinator-machine.py +0 -0
  379. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/dr-down.sh +0 -0
  380. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/dr-up.sh +0 -0
  381. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/epic-down.sh +0 -0
  382. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/epic-up.sh +0 -0
  383. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/preflight.sh +0 -0
  384. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/provision-server.sh +0 -0
  385. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/provision-worker.sh +0 -0
  386. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  387. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  388. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/throwaway-vm.sh +0 -0
  389. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/azure-workers/verify-github-token.sh +0 -0
  390. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/check_gh_argv_containment.py +0 -0
  391. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/codegen.py +0 -0
  392. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-test-runner.sh +0 -0
  393. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  394. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  395. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  396. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  397. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/coord-venv-rollback.sh +0 -0
  398. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/drive-batch.sh +0 -0
  399. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/extract-coord-tui.sh +0 -0
  400. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/fleet_watchdog.py +0 -0
  401. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/gen_board_fixture.py +0 -0
  402. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/gen_mock_index.py +0 -0
  403. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/lib/provision-core.sh +0 -0
  404. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/next_release_tag.py +0 -0
  405. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/provision-machine.sh +0 -0
  406. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/run_tests_in_populated_home.sh +0 -0
  407. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/run_tests_without_gh.sh +0 -0
  408. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/setup-macmini.sh +0 -0
  409. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify-provision-noble.sh +0 -0
  411. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_878_review_capture.py +0 -0
  412. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_release_published.py +0 -0
  413. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/scripts/verify_release_wheel.py +0 -0
  414. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/setup.cfg +0 -0
  415. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/SMOKE_SET.md +0 -0
  416. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/__init__.py +0 -0
  417. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/conftest.py +0 -0
  418. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/contract.md +0 -0
  419. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/manifest.yml +0 -0
  420. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  421. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  422. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/contract.md +0 -0
  423. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  424. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  425. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/manifest.yml +0 -0
  426. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  427. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-51/tsconfig.json +0 -0
  428. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  429. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/backends.py +0 -0
  430. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/conftest.py +0 -0
  431. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/board-pipeline-basic.json +0 -0
  432. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  433. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  434. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  435. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  436. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/all_pass.json +0 -0
  437. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  438. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/mixed_fail.json +0 -0
  439. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  440. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  441. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/skip.json +0 -0
  442. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/playwright/truncated.json +0 -0
  443. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  444. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  445. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  446. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  447. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  448. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  449. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  450. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  451. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_acceptance.py +0 -0
  452. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_acceptance_drivers.py +0 -0
  453. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent.py +0 -0
  454. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_api_error.py +0 -0
  455. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_app.py +0 -0
  456. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_branch_base.py +0 -0
  457. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_branch_capture.py +0 -0
  458. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_config_free_1712.py +0 -0
  459. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_deploy_units_endpoint.py +0 -0
  460. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_dirty_worktree.py +0 -0
  461. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  462. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_graph_self_heal.py +0 -0
  463. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_health_h3.py +0 -0
  464. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_idle_restart.py +0 -0
  465. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_push_failure.py +0 -0
  466. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_reap.py +0 -0
  467. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_repos_and_pull.py +0 -0
  468. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_restart_services_endpoint.py +0 -0
  469. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_skills_self_heal.py +0 -0
  470. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_startup_diagnostics.py +0 -0
  471. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_update.py +0 -0
  472. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_update_bluegreen.py +0 -0
  473. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_usage_limit.py +0 -0
  474. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_agent_zero_commit.py +0 -0
  475. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ambient_home_isolation.py +0 -0
  476. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_capability_reroute_3241.py +0 -0
  477. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_dependency_busy_2804.py +0 -0
  478. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_reject_plan.py +0 -0
  479. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approve_usage_gate.py +0 -0
  480. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approved_work_2532.py +0 -0
  481. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_approved_work_2996.py +0 -0
  482. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_assignment_already_recorded_daemon.py +0 -0
  483. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_log.py +0 -0
  484. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_outcome.py +0 -0
  485. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_audit_query.py +0 -0
  486. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_auto_loop.py +0 -0
  487. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_auto_release_publish_2035.py +0 -0
  488. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_backend_selection.py +0 -0
  489. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_backup.py +0 -0
  490. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_base_checkout_restore.py +0 -0
  491. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_block_log.py +0 -0
  492. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_cap_762.py +0 -0
  493. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_fixture.py +0 -0
  494. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_read_path.py +0 -0
  495. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_schema.py +0 -0
  496. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_service.py +0 -0
  497. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_state.py +0 -0
  498. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_board_wire.py +0 -0
  499. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_brain.py +0 -0
  500. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_branch_model.py +0 -0
  501. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_bug_intake.py +0 -0
  502. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_build_worker_image_env_update.py +0 -0
  503. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cargo_cache.py +0 -0
  504. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_check_gh_argv_containment.py +0 -0
  505. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_acceptance_gate_1950.py +0 -0
  506. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_fix.py +0 -0
  507. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_github.py +0 -0
  508. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_gitlab.py +0 -0
  509. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_parity_2091.py +0 -0
  510. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_ci_store.py +0 -0
  511. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claim.py +0 -0
  512. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claude_md_budget.py +0 -0
  513. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_claude_setup_token.py +0 -0
  514. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  520. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_audit.py +0 -0
  521. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_chat_continue.py +0 -0
  522. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_codegen.py +0 -0
  523. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_decide.py +0 -0
  524. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_capability_rules.py +0 -0
  525. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_config_provenance.py +0 -0
  526. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_forge_availability.py +0 -0
  527. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_graph.py +0 -0
  528. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_self.py +0 -0
  529. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_diagnose_test_coverage.py +0 -0
  530. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor.py +0 -0
  531. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_config_free_1801.py +0 -0
  532. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  533. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  534. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_drive.py +0 -0
  535. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_escalate.py +0 -0
  536. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_fix_headless_review.py +0 -0
  537. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_gate_a.py +0 -0
  538. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_install_drift.py +0 -0
  539. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_install_skills.py +0 -0
  540. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_comment.py +0 -0
  541. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_create_label.py +0 -0
  542. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_reopen.py +0 -0
  543. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_issue_view_list.py +0 -0
  544. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_merge.py +0 -0
  545. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_assign.py +0 -0
  546. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_capture.py +0 -0
  547. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_chat_add_child.py +0 -0
  548. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_dispatch.py +0 -0
  549. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_gate_b.py +0 -0
  550. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_gate_c.py +0 -0
  551. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_order.py +0 -0
  552. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  553. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_milestone_ship.py +0 -0
  554. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_network.py +0 -0
  555. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_new_issue_chat.py +0 -0
  556. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_plans.py +0 -0
  557. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_portal.py +0 -0
  558. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_pr.py +0 -0
  559. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_pull_artifact.py +0 -0
  560. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_queue.py +0 -0
  561. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_reattach_sessions.py +0 -0
  562. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_refine_board.py +0 -0
  563. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_preflight.py +0 -0
  564. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_propagate.py +0 -0
  565. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_release_window.py +0 -0
  566. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_repo_2220.py +0 -0
  567. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  568. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_serve_store_backend_3084.py +0 -0
  570. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_set_review_findings.py +0 -0
  571. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_advisory_terminal.py +0 -0
  572. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_contested_tag.py +0 -0
  573. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_invariant_alarms.py +0 -0
  574. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_machine_fault.py +0 -0
  575. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_merge_queue.py +0 -0
  576. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_provider.py +0 -0
  577. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_retried_3340.py +0 -0
  578. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_review_finalizing.py +0 -0
  579. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_test_failed_tag.py +0 -0
  580. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_status_usage_limit.py +0 -0
  581. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_sync_comments_873.py +0 -0
  582. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_test_plan.py +0 -0
  583. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_track.py +0 -0
  584. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_tui_update.py +0 -0
  585. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cli_wait.py +0 -0
  586. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client.py +0 -0
  587. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_base_install.py +0 -0
  588. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_config_cache_atomic_3052.py +0 -0
  589. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_client_resource_migration_1946.py +0 -0
  590. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_commands_common.py +0 -0
  591. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_comments.py +0 -0
  592. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_completion_summary.py +0 -0
  593. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config.py +0 -0
  594. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_acceptance.py +0 -0
  595. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_audit.py +0 -0
  596. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_drift_check.py +0 -0
  597. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_pricing.py +0 -0
  598. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  599. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_config_usage_gate.py +0 -0
  600. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_confirm_test.py +0 -0
  601. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_conflict_fix.py +0 -0
  602. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_conflict_fix_semantic.py +0 -0
  603. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  604. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test.py +0 -0
  605. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  606. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_baseline.py +0 -0
  607. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_populated_home.py +0 -0
  608. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_routing.py +0 -0
  609. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_test_runner_toolchain.py +0 -0
  610. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_uat.py +0 -0
  611. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coord_web_sse_restart_live.py +0 -0
  612. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_coordinator_machine.py +0 -0
  613. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_cross_platform_imports.py +0 -0
  614. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dao.py +0 -0
  615. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard.py +0 -0
  616. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_api.py +0 -0
  617. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_fixture.py +0 -0
  618. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_server.py +0 -0
  619. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_terminal.py +0 -0
  620. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dashboard_terminal_live.py +0 -0
  621. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_db.py +0 -0
  622. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dead_end.py +0 -0
  623. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_decomposition_chat.py +0 -0
  624. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_db_backup.py +0 -0
  625. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_web_dist.py +0 -0
  626. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_coord_web_rollback.py +0 -0
  627. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_db_backup_unit.py +0 -0
  628. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_drive_queue_unit.py +0 -0
  629. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_failure_notify_unit.py +0 -0
  630. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_manifest.py +0 -0
  631. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_notify_unit.py +0 -0
  632. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_units_lane.py +0 -0
  633. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deploy_web_unit.py +0 -0
  634. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deprecation_telemetry.py +0 -0
  635. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_deps.py +0 -0
  636. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_diagnose.py +0 -0
  637. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch.py +0 -0
  638. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_liveness.py +0 -0
  639. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_target_validation.py +0 -0
  640. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dispatch_workers.py +0 -0
  641. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dist_name.py +0 -0
  642. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_done_housekeeping.py +0 -0
  643. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_azure_scripts.py +0 -0
  644. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_promote.py +0 -0
  645. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_dr_verify.py +0 -0
  646. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive.py +0 -0
  647. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_machine_fault.py +0 -0
  648. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue.py +0 -0
  649. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_blocked_rendering.py +0 -0
  650. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_launch_argv.py +0 -0
  651. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_max_parallel_config.py +0 -0
  652. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  653. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_roll_pending.py +0 -0
  654. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  655. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_state.py +0 -0
  656. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_drive_tmux.py +0 -0
  657. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_capability_detection.py +0 -0
  658. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  659. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_epic_up_image_provenance.py +0 -0
  660. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_errors.py +0 -0
  661. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_events.py +0 -0
  662. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_failure_class.py +0 -0
  663. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_failure_classifier.py +0 -0
  664. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_filelock.py +0 -0
  665. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  666. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fix_escalation_classifier.py +0 -0
  667. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fix_of_force_override.py +0 -0
  668. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_config_health.py +0 -0
  669. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_health_probes.py +0 -0
  670. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_health_snapshot.py +0 -0
  671. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_fleet_watchdog.py +0 -0
  672. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_forge_availability.py +0 -0
  673. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_freshness.py +0 -0
  674. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_a.py +0 -0
  675. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_b.py +0 -0
  676. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gate_snapshot_staleness.py +0 -0
  677. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gates.py +0 -0
  678. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  679. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_gen_mock_index.py +0 -0
  680. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_rust_fixture.py +0 -0
  681. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_rust_requests.py +0 -0
  682. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_generated_types_fixture.py +0 -0
  683. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_github_ops.py +0 -0
  684. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_github_throttle.py +0 -0
  685. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_goal.py +0 -0
  686. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_graph_health.py +0 -0
  687. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_graph_selfheal_absent_2237.py +0 -0
  688. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_handoff.py +0 -0
  689. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_checks.py +0 -0
  690. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_cli.py +0 -0
  691. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_cli_graph.py +0 -0
  692. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_config.py +0 -0
  693. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_context.py +0 -0
  694. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_coord_tui_ci_pin.py +0 -0
  695. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_coord_web_ci_pin.py +0 -0
  696. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_deploy_lane_facts.py +0 -0
  697. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_fix.py +0 -0
  698. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_incident_regression.py +0 -0
  699. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_issues_sync_staleness.py +0 -0
  700. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_pr_churn.py +0 -0
  701. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_pypi.py +0 -0
  702. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_registry.py +0 -0
  703. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_release_cordon_probe.py +0 -0
  704. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_timer_active.py +0 -0
  705. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_toolchain.py +0 -0
  706. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_unit_drift.py +0 -0
  707. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_unit_enablement.py +0 -0
  708. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_health_wedged_drive_queue.py +0 -0
  709. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_hooks.py +0 -0
  710. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_housekeeping.py +0 -0
  711. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_human_attended_437.py +0 -0
  712. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_init.py +0 -0
  713. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_install_agent_venv_2911.py +0 -0
  714. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_integration.py +0 -0
  715. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_briefing_echo.py +0 -0
  716. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_pane_log_2541.py +0 -0
  717. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_prefill_state.py +0 -0
  718. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_session_relaunch.py +0 -0
  719. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_test_verdict_backstop.py +0 -0
  720. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_token_attribution.py +0 -0
  721. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_interactive_worktree.py +0 -0
  722. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_invariant_alarms.py +0 -0
  723. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_issue_store_seam.py +0 -0
  724. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_issues_sync_status.py +0 -0
  725. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_liveness_auditor.py +0 -0
  726. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_liveness_notify.py +0 -0
  727. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_lock_contention_ratchet.py +0 -0
  728. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_fault.py +0 -0
  729. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_metrics.py +0 -0
  730. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_onboard.py +0 -0
  731. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_pause.py +0 -0
  732. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_machine_stats.py +0 -0
  733. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_merge_queue.py +0 -0
  734. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_merge_verify.py +0 -0
  735. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_chat.py +0 -0
  736. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_dispatch.py +0 -0
  737. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_gate.py +0 -0
  738. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_order.py +0 -0
  739. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_milestone_seam.py +0 -0
  740. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_mock_author.py +0 -0
  741. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_model_tiering.py +0 -0
  742. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_models.py +0 -0
  743. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_models_config_labels.py +0 -0
  744. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_needs_attention.py +0 -0
  745. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_network.py +0 -0
  746. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_new_issue_chat.py +0 -0
  747. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_next_release_tag.py +0 -0
  748. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_node_shim.py +0 -0
  749. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_baseline.py +0 -0
  750. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_cli.py +0 -0
  751. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_collect.py +0 -0
  752. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_config.py +0 -0
  753. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_drive_seam.py +0 -0
  754. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_isolation.py +0 -0
  755. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_predicate.py +0 -0
  756. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_quiet_hours.py +0 -0
  757. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notifier_service.py +0 -0
  758. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notify.py +0 -0
  759. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_notify_drain.py +0 -0
  760. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_openapi.py +0 -0
  761. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_operational_defaults.py +0 -0
  762. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_overlap_fence.py +0 -0
  763. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_packaged_deploy_units.py +0 -0
  764. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_parentage.py +0 -0
  765. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_paste_landed.py +0 -0
  766. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  767. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_pipeline.py +0 -0
  768. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_approve_plan_command.py +0 -0
  769. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_pr_command.py +0 -0
  770. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_followup_review_command.py +0 -0
  771. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_only.py +0 -0
  772. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_plan_parser.py +0 -0
  773. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_platform_paths.py +0 -0
  774. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_bridge.py +0 -0
  775. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_config.py +0 -0
  776. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_store.py +0 -0
  777. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_portal_sync.py +0 -0
  778. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_pr_body_lint.py +0 -0
  779. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_prereqs.py +0 -0
  780. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_production_db_guard.py +0 -0
  781. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_progress.py +0 -0
  782. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provider_seam.py +0 -0
  783. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers.py +0 -0
  784. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers_config_labels.py +0 -0
  785. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_providers_pty.py +0 -0
  786. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provision_core.py +0 -0
  787. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_provision_machine.py +0 -0
  788. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_py_rust_mirror_inventory.py +0 -0
  789. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_quiet_hours.py +0 -0
  790. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_quiet_hours_store_2146.py +0 -0
  791. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reap_merged_sessions.py +0 -0
  792. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reap_stale_interactive_tick.py +0 -0
  793. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile.py +0 -0
  794. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_branch.py +0 -0
  795. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_completions.py +0 -0
  796. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  797. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_merges.py +0 -0
  798. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_no_agent_record.py +0 -0
  799. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_tick.py +0 -0
  800. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reconcile_usage_limit_done.py +0 -0
  801. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_refine_chat.py +0 -0
  802. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_2101.py +0 -0
  803. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  804. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_deadlock_2240.py +0 -0
  805. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  806. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_cordon_stuck_2490.py +0 -0
  807. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_propagate.py +0 -0
  808. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_propagate_threshold.py +0 -0
  809. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_roll_between_legs_2854.py +0 -0
  810. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_roll_window_handoff.py +0 -0
  811. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_unified_1242.py +0 -0
  812. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_verify.py +0 -0
  813. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_release_window.py +0 -0
  814. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_remote_auto_prune.py +0 -0
  815. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_remote_interactive_reaper.py +0 -0
  816. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_add.py +0 -0
  817. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_dormancy.py +0 -0
  818. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_edit_2220.py +0 -0
  819. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_graph_fleet_2237.py +0 -0
  820. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_repo_onboard_2220.py +0 -0
  821. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_report_result_push.py +0 -0
  822. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_reports.py +0 -0
  823. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry.py +0 -0
  824. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_advisory_1606.py +0 -0
  825. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_escalation_classify_3360.py +0 -0
  826. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_retry_type_1636.py +0 -0
  827. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_revalidate.py +0 -0
  828. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review.py +0 -0
  829. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_end_review_without_verdict.py +0 -0
  830. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_parse_failure_diagnostic.py +0 -0
  831. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_reaffirm.py +0 -0
  832. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_state.py +0 -0
  833. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_backstop.py +0 -0
  834. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_override_audit.py +0 -0
  835. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_verdict_relay.py +0 -0
  836. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_review_zero_commits.py +0 -0
  837. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_scoped_review_wiring.py +0 -0
  838. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_scorecard.py +0 -0
  839. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_self_health.py +0 -0
  840. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve.py +0 -0
  841. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_app.py +0 -0
  842. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_app_board_trim.py +0 -0
  843. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_serve_rest_routes.py +0 -0
  844. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_session.py +0 -0
  845. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_slice_issue_attribution.py +0 -0
  846. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke.py +0 -0
  847. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  848. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_live_checkout_restore.py +0 -0
  849. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_smoke_workflow.py +0 -0
  850. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_spend_ceiling.py +0 -0
  851. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_spend_ceiling_coordinator.py +0 -0
  852. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_split.py +0 -0
  853. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_split_work.py +0 -0
  854. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_sql_dialect.py +0 -0
  855. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_sqlite_connect_ratchet.py +0 -0
  856. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stage_projection.py +0 -0
  857. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stale_busy_reviewer_697.py +0 -0
  858. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stalled_pipeline.py +0 -0
  859. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_state.py +0 -0
  860. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_state_review_findings_daemon.py +0 -0
  861. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_status_fleet_footer.py +0 -0
  862. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stop_1567.py +0 -0
  863. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_store_contract.py +0 -0
  864. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_store_migrate.py +0 -0
  865. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stuck.py +0 -0
  866. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  867. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_terminal_command.py +0 -0
  868. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_author.py +0 -0
  869. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_chat.py +0 -0
  870. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_orchestrator.py +0 -0
  871. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_report.py +0 -0
  872. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_verdict_parsing.py +0 -0
  873. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_test_verdict_transcript_floor.py +0 -0
  874. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_text_io_encoding_audit.py +0 -0
  875. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_board_audit.py +0 -0
  876. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_config_load_1080.py +0 -0
  877. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_thin_client_daemon_routing_906.py +0 -0
  878. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_throwaway_vm.py +0 -0
  879. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_tmux_host.py +0 -0
  880. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_tmux_session.py +0 -0
  881. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_transcript_floor.py +0 -0
  882. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_uat_checks.py +0 -0
  883. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage.py +0 -0
  884. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage_limits.py +0 -0
  885. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_usage_rollup.py +0 -0
  886. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_venv_live_install_2121.py +0 -0
  887. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_version_single_source.py +0 -0
  888. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_watch.py +0 -0
  889. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  890. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_env_venv_isolation.py +0 -0
  891. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_events.py +0 -0
  892. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_image_pin_sync.py +0 -0
  893. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_safety.py +0 -0
  894. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worker_test_scoping.py +0 -0
  895. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worktree.py +0 -0
  896. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  897. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/tests/test_write_parity.py +0 -0
  898. {code_coordinator-0.5.496 → code_coordinator-0.5.497}/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.497
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.497
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.497",
3
3
  "distance": 0,
4
- "node": "gdcf7e4331cfa3d1b0c95e0e3450402c3c49a6723",
4
+ "node": "gd05a81b74292333679389936cf7cdb3edea6fd12",
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:
@@ -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:
@@ -6097,3 +6097,152 @@ def test_diagnose_does_not_call_a_never_polled_machine_unreachable(
6097
6097
  assert "agent-unreachable" not in result.output
6098
6098
  assert "dead-leg" not in result.output
6099
6099
  assert "/health dellserver: not read" in result.output
6100
+
6101
+
6102
+ # ── #3395: direction-aware overlap ordering against a QUEUED entry ──────────
6103
+ #
6104
+ # vimcode#1117 / vimcode#1090: both declared `src/harness.rs` and
6105
+ # `src/tui_main/shell_app.rs`. #1090 was queued first and sat `waiting`
6106
+ # behind a chain; #1117 was added later at `--position 0`, ahead of it. The
6107
+ # predictor found the overlap but chained #1117 `--after` #1090 — the normal
6108
+ # direction, correct only when the newcomer runs SECOND. Here it runs FIRST
6109
+ # (that is the whole point of `--position 0`), so #1090 carried no edge
6110
+ # naming #1117 and both ran concurrently: #1117 merged first and emptied a
6111
+ # list in `src/harness.rs`; #1090's stale copy conflicted on merge (PR #1121,
6112
+ # `HUMAN_REQUIRED`). These assert the edge lands on the INCUMBENT (#1090)
6113
+ # instead, fixing the direction rather than merely detecting the collision
6114
+ # (which unfixed `main` already does — see the module docstring's #3395
6115
+ # paragraph).
6116
+
6117
+
6118
+ def test_inserting_ahead_of_a_queued_overlap_orders_the_incumbent_after_it(
6119
+ cli, declare,
6120
+ ):
6121
+ # Queue A (files X, Y) — queued first, sits at position 0.
6122
+ declare(1090, "src/harness.rs", "src/tui_main/shell_app.rs")
6123
+ assert cli("add", REPO, "1090").exit_code == 0
6124
+
6125
+ # Queue B (files X, Z) at --position 0, ahead of A. Fails against
6126
+ # unfixed main: the edge previously landed on B (`1117 after 1090`), not
6127
+ # on A — the newcomer positioned to run FIRST was the one made to wait.
6128
+ declare(1117, "src/harness.rs", "src/tui_main/shell_app.rs")
6129
+ result = cli("add", REPO, "1117", "--position", "0")
6130
+
6131
+ assert result.exit_code == 0, result.output
6132
+ # The edge exists, and on the correct side: A (already queued, now
6133
+ # pushed behind B in dispatch order) waits on B, not the other way
6134
+ # around.
6135
+ assert queued(1090)["after_json"] == [f"{REPO}#1117"]
6136
+ assert queued(1117)["after_json"] == []
6137
+ # B is genuinely positioned first.
6138
+ positions = {r["issue_number"]: r["position"] for r in state._list_drive_queue_local()}
6139
+ assert positions[1117] < positions[1090]
6140
+ # The reason is recorded on the row that actually changed, and names why
6141
+ # the direction is reversed.
6142
+ assert "predicted file overlap (#2247)" in result.output
6143
+ assert f"ordered {REPO}#1090 --after {REPO}#1117" in result.output
6144
+ assert "positioned ahead of an existing queued entry" in result.output
6145
+ assert "predicted file overlap (#2247)" in queued(1090)["last_reason"]
6146
+
6147
+
6148
+ def test_appending_after_a_queued_overlap_keeps_the_normal_forward_direction(
6149
+ cli, declare,
6150
+ ):
6151
+ # Same two declarations, but B appended at the tail (no --position) —
6152
+ # the ordinary case #2247's original tests already cover. Direction must
6153
+ # stay forward: B waits on A, since B genuinely runs second.
6154
+ declare(1090, "src/harness.rs", "src/tui_main/shell_app.rs")
6155
+ assert cli("add", REPO, "1090").exit_code == 0
6156
+
6157
+ declare(1117, "src/harness.rs", "src/tui_main/shell_app.rs")
6158
+ result = cli("add", REPO, "1117")
6159
+
6160
+ assert result.exit_code == 0, result.output
6161
+ assert queued(1117)["after_json"] == [f"{REPO}#1090"]
6162
+ assert queued(1090)["after_json"] == []
6163
+
6164
+
6165
+ def test_reject_after_drops_a_reversed_edge_too(cli, declare):
6166
+ declare(1090, "src/harness.rs")
6167
+ assert cli("add", REPO, "1090").exit_code == 0
6168
+
6169
+ declare(1117, "src/harness.rs")
6170
+ result = cli(
6171
+ "add", REPO, "1117", "--position", "0", "--reject-after", "1090",
6172
+ )
6173
+
6174
+ assert result.exit_code == 0, result.output
6175
+ # Named by the OTHER entry's key either way — the operator doesn't need
6176
+ # to know which direction rule 2 picked to veto it.
6177
+ assert queued(1090)["after_json"] == []
6178
+ assert queued(1117)["after_json"] == []
6179
+ assert f"rejected via --reject-after (not applied): {REPO}#1090" in result.output
6180
+
6181
+
6182
+ def test_repositioning_an_already_queued_entry_reevaluates_the_direction(
6183
+ cli, declare,
6184
+ ):
6185
+ # #3395 review: none of the tests above reposition an entry that is
6186
+ # ALREADY queued — they only insert a brand-new one at `--position 0`,
6187
+ # where there is nothing to remove first. Repositioning is exactly rule
6188
+ # 3's case, and it needs its own comparison: `_move_drive_queue_entry_
6189
+ # local` removes the target from its OLD slot before reinserting it,
6190
+ # shifting every entry originally after it down by one — a comparison
6191
+ # against the other entry's STALE, pre-removal position picks the WRONG
6192
+ # direction here.
6193
+ #
6194
+ # T queued first (position 0), O queued second (position 1), same
6195
+ # declared file. O's own `add` would normally auto-chain `O --after T`
6196
+ # (the ordinary forward case, correct at the time — T ran first) —
6197
+ # `--reject-after` skips that here so the queue starts with NO edge
6198
+ # between them, isolating what this test is actually about: the
6199
+ # direction rule 2 picks when T is repositioned, not whatever edge O's
6200
+ # own earlier `add` happened to leave behind.
6201
+ #
6202
+ # Re-adding T with `--position 1` is a SWAP, not "T stays ahead of O": O
6203
+ # ends up dispatching FIRST, T SECOND. The correct edge is therefore the
6204
+ # ordinary forward one (T --after O). Unfixed code compares T's
6205
+ # requested --position (1) against O's raw pre-move position (also 1),
6206
+ # calls that a tie, and reverses it (O --after T) — ordering the entry
6207
+ # that actually dispatches first to wait on the one that actually
6208
+ # dispatches second.
6209
+ declare(2001, "src/shared.rs")
6210
+ assert cli("add", REPO, "2001").exit_code == 0 # T, lands at position 0
6211
+
6212
+ declare(2002, "src/shared.rs")
6213
+ assert (
6214
+ cli("add", REPO, "2002", "--reject-after", "2001").exit_code == 0
6215
+ ) # O, lands at position 1, no edge yet
6216
+
6217
+ result = cli("add", REPO, "2001", "--position", "1")
6218
+
6219
+ assert result.exit_code == 0, result.output
6220
+ positions = {r["issue_number"]: r["position"] for r in state._list_drive_queue_local()}
6221
+ assert positions[2002] < positions[2001] # O genuinely runs first now
6222
+ assert queued(2001)["after_json"] == [f"{REPO}#2002"] # forward: T after O
6223
+ assert queued(2002)["after_json"] == []
6224
+
6225
+
6226
+ def test_a_reversed_edge_is_never_applied_against_an_in_flight_branch(
6227
+ cli, declare, seed, branch_diff,
6228
+ ):
6229
+ # A `[branch]` overlap (already running) must never reverse — it started
6230
+ # before this add regardless of queue position, so the newcomer always
6231
+ # waits on it, exactly like before #3395.
6232
+ seed(
6233
+ issues={2230: "open"},
6234
+ assignments=[{"issue_number": 2230, "status": "running"}],
6235
+ )
6236
+ from coord.db import get_connection
6237
+
6238
+ get_connection().execute(
6239
+ "UPDATE assignments SET branch = 'issue-2230' WHERE issue_number = 2230"
6240
+ )
6241
+ get_connection().commit()
6242
+ branch_diff({"issue-2230": ["coord/drive_queue.py"]})
6243
+ declare(2234, "coord/drive_queue.py")
6244
+
6245
+ result = cli("add", REPO, "2234", "--position", "0")
6246
+
6247
+ assert result.exit_code == 0, result.output
6248
+ assert queued(2234)["after_json"] == [f"{REPO}#2230"]