code-coordinator 0.5.329__tar.gz → 0.5.331__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 (822) hide show
  1. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/drive_queue.py +38 -3
  5. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive_queue.py +69 -0
  6. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/serve_app.py +27 -2
  7. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/stage_projection.py +198 -3
  8. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_drive_queue.py +72 -0
  9. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue.py +82 -0
  10. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stage_projection.py +284 -0
  11. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/.gitignore +0 -0
  24. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/GOAL.md +0 -0
  26. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/LICENSE +0 -0
  27. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/README.md +0 -0
  29. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/client.py +0 -0
  63. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/machine.py +0 -0
  77. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/pr.py +0 -0
  83. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/store_migrate.py +0 -0
  92. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/config.py +0 -0
  97. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/confirm_test.py +0 -0
  99. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/conflict_fix.py +0 -0
  100. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dao.py +0 -0
  101. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/__init__.py +0 -0
  102. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/fixture.py +0 -0
  103. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/index.html +0 -0
  104. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/server.py +0 -0
  105. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dashboard/terminal.py +0 -0
  106. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/db.py +0 -0
  107. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dead_end.py +0 -0
  108. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/decomposition_chat.py +0 -0
  109. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/README.md +0 -0
  110. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-agent.service +0 -0
  111. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.service +0 -0
  112. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.sh +0 -0
  113. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.timer +0 -0
  114. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.service +0 -0
  115. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.timer +0 -0
  116. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-failure-notify.service +0 -0
  117. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.service +0 -0
  118. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  119. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-notify.service +0 -0
  120. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-notify.timer +0 -0
  121. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.service +0 -0
  122. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.timer +0 -0
  123. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.service +0 -0
  124. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.timer +0 -0
  125. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-serve.service +0 -0
  126. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.service +0 -0
  127. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.timer +0 -0
  128. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy/coord-web.service +0 -0
  129. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy_manifest.py +0 -0
  130. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deploy_units.py +0 -0
  131. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deprecation_telemetry.py +0 -0
  132. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/deps.py +0 -0
  133. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/diagnose.py +0 -0
  134. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dispatch.py +0 -0
  135. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/dist_name.py +0 -0
  136. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive.py +0 -0
  137. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/events.py +0 -0
  139. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/_ci_pin.py +0 -0
  156. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/agent_install.py +0 -0
  157. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/cargo_targets.py +0 -0
  158. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/claude_binary.py +0 -0
  159. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  160. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/issues_sync_staleness.py +0 -0
  171. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/plan_usage.py +0 -0
  172. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/release_cordon.py +0 -0
  173. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/repo_state.py +0 -0
  174. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/spawned_coord.py +0 -0
  175. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/stalled_pipeline.py +0 -0
  176. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/timer_active.py +0 -0
  177. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/toolchain.py +0 -0
  178. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/unit_drift.py +0 -0
  179. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/unit_enablement.py +0 -0
  180. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/wedged_drive_queue.py +0 -0
  181. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/checks/worktrees.py +0 -0
  182. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/cli.py +0 -0
  183. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/context.py +0 -0
  184. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/fleet_snapshot.py +0 -0
  185. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/models.py +0 -0
  186. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/pypi.py +0 -0
  187. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/registry.py +0 -0
  188. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/render.py +0 -0
  189. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/health/units.py +0 -0
  190. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/hooks.py +0 -0
  191. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/housekeeping.py +0 -0
  192. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/interactive.py +0 -0
  193. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/issue_store.py +0 -0
  194. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/issues_sync_status.py +0 -0
  195. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/liveness_auditor.py +0 -0
  196. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/machine_onboard.py +0 -0
  197. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/machine_pause.py +0 -0
  198. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/merge_queue.py +0 -0
  199. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_chat.py +0 -0
  200. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_dispatch.py +0 -0
  201. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_gate.py +0 -0
  202. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/milestone_order.py +0 -0
  203. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/mock_author.py +0 -0
  204. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/models.py +0 -0
  205. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/network.py +0 -0
  206. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/new_issue_chat.py +0 -0
  207. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/__init__.py +0 -0
  208. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/baseline.py +0 -0
  209. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/cli.py +0 -0
  210. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/collect.py +0 -0
  211. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/digest.py +0 -0
  212. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/models.py +0 -0
  213. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/predicate.py +0 -0
  214. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/service.py +0 -0
  215. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/store.py +0 -0
  216. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notifier/transport.py +0 -0
  217. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/notify.py +0 -0
  218. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/openapi.py +0 -0
  219. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/overlap_fence.py +0 -0
  220. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/overlap_predict.py +0 -0
  221. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/parentage.py +0 -0
  222. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/parentage_github.py +0 -0
  223. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/pipeline.py +0 -0
  224. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/plan_parser.py +0 -0
  225. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/plans.py +0 -0
  226. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/platform_paths.py +0 -0
  227. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_bridge.py +0 -0
  228. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_store.py +0 -0
  229. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/portal_sync.py +0 -0
  230. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/pr_body_lint.py +0 -0
  231. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/prereqs.py +0 -0
  232. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/progress.py +0 -0
  233. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/__init__.py +0 -0
  234. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/base.py +0 -0
  235. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/claude.py +0 -0
  236. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/claude_pty.py +0 -0
  237. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/providers/opencode.py +0 -0
  238. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/queue_diagnose.py +0 -0
  239. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reconcile.py +0 -0
  240. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reconcile_tick.py +0 -0
  241. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/refine_chat.py +0 -0
  242. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_cordon.py +0 -0
  243. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_propagate.py +0 -0
  244. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_verify.py +0 -0
  245. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/release_window.py +0 -0
  246. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_dormancy.py +0 -0
  247. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_edit.py +0 -0
  248. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/repo_onboard.py +0 -0
  249. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/reports.py +0 -0
  250. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/rest_schema.py +0 -0
  251. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/revalidate.py +0 -0
  252. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/review.py +0 -0
  253. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/scorecard.py +0 -0
  254. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/self_health.py +0 -0
  255. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/state.py +0 -0
  270. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/store_migrate.py +0 -0
  271. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_author.py +0 -0
  272. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_chat.py +0 -0
  273. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_orchestrator.py +0 -0
  274. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/test_report.py +0 -0
  275. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/tui_release.py +0 -0
  276. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage.py +0 -0
  277. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage_limits.py +0 -0
  278. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/usage_rollup.py +0 -0
  279. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coord/worker_events.py +0 -0
  280. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/coordinator.example.yml +0 -0
  281. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-agent.service +0 -0
  282. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.service +0 -0
  283. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.sh +0 -0
  284. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-db-backup.timer +0 -0
  285. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-drive-queue.service +0 -0
  286. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-drive-queue.timer +0 -0
  287. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-failure-notify.service +0 -0
  288. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-failure-notify.sh +0 -0
  289. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.service +0 -0
  290. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.timer +0 -0
  291. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-notify.service +0 -0
  292. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-notify.timer +0 -0
  293. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-propagate.service +0 -0
  294. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-propagate.timer +0 -0
  295. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-window.service +0 -0
  296. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-release-window.timer +0 -0
  297. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-serve.service +0 -0
  298. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.service +0 -0
  299. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.sh +0 -0
  300. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.timer +0 -0
  301. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web-rollback.sh +0 -0
  302. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/coord-web.service +0 -0
  303. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/deploy/node-shim.sh +0 -0
  304. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_TUI_CI.md +0 -0
  305. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  306. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_CI.md +0 -0
  307. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_DIST.md +0 -0
  308. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  309. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/AGENT_OPERATIONS.md +0 -0
  310. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ARCHITECTURE.md +0 -0
  311. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ARCH_SECURITY_GATES.md +0 -0
  312. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/COCKPIT.md +0 -0
  313. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CONTROL_CENTER.md +0 -0
  314. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/COST_DISCIPLINE.md +0 -0
  315. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CROSS_PLATFORM.md +0 -0
  316. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CUSTOMER_FACING_APPS.md +0 -0
  317. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/CUSTOMER_PORTAL.md +0 -0
  318. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/DRIVE_QUEUE.md +0 -0
  319. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/EPHEMERAL_WORKERS.md +0 -0
  320. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/FORGE_MIGRATION.md +0 -0
  321. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/GRAPHIFY_SETUP.md +0 -0
  322. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ISSUE_GUIDANCE.md +0 -0
  323. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/MAC_MINI.md +0 -0
  324. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  325. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/NOTIFIER.md +0 -0
  326. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPENCODE_VERIFICATION.md +0 -0
  327. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPERATING_GOTCHAS.md +0 -0
  328. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/OPERATOR_GUIDES.md +0 -0
  329. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/ORACLE_LOOP.md +0 -0
  330. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PHONE_WEBAPP.md +0 -0
  331. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PIPELINE_V2.md +0 -0
  332. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/PLATFORM_EVOLUTION.md +0 -0
  333. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/SECOND_BACKEND.md +0 -0
  334. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/STORE_SERVICE.md +0 -0
  335. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  336. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/WEB_CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/WSL_WINDOWS_WORKER.md +0 -0
  338. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/README.md +0 -0
  339. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/_tokens.css +0 -0
  340. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/issue-detail.html +0 -0
  341. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-narrow.html +0 -0
  342. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-wide.html +0 -0
  343. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/graphify-out/.gitignore +0 -0
  344. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/install-agent.sh +0 -0
  345. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/pyproject.toml +0 -0
  346. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/audit_review_verdict_overrides.py +0 -0
  347. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  348. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/build-worker-image.sh +0 -0
  349. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/coordinator-machine.py +0 -0
  350. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/epic-down.sh +0 -0
  351. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/epic-up.sh +0 -0
  352. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/preflight.sh +0 -0
  353. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/provision-worker.sh +0 -0
  354. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  355. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  356. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/azure-workers/verify-github-token.sh +0 -0
  357. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/check_gh_argv_containment.py +0 -0
  358. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/codegen.py +0 -0
  359. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-test-runner.sh +0 -0
  360. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  361. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  362. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  363. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  364. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/coord-venv-rollback.sh +0 -0
  365. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/drive-batch.sh +0 -0
  366. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/extract-coord-tui.sh +0 -0
  367. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/fleet_watchdog.py +0 -0
  368. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/gen_board_fixture.py +0 -0
  369. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/gen_mock_index.py +0 -0
  370. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/next_release_tag.py +0 -0
  371. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/run_tests_in_populated_home.sh +0 -0
  372. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/run_tests_without_gh.sh +0 -0
  373. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/smoke_437_interactive.py +0 -0
  374. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_878_review_capture.py +0 -0
  375. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_release_published.py +0 -0
  376. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/scripts/verify_release_wheel.py +0 -0
  377. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/setup.cfg +0 -0
  378. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/SMOKE_SET.md +0 -0
  379. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/__init__.py +0 -0
  380. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/conftest.py +0 -0
  381. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/contract.md +0 -0
  382. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/manifest.yml +0 -0
  383. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  384. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  385. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/contract.md +0 -0
  386. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  387. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  388. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/manifest.yml +0 -0
  389. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  390. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-51/tsconfig.json +0 -0
  391. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/backends.py +0 -0
  393. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/conftest.py +0 -0
  394. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_approved_work_2996.py +0 -0
  444. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_assignment_already_recorded_daemon.py +0 -0
  445. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_log.py +0 -0
  446. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_outcome.py +0 -0
  447. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_audit_query.py +0 -0
  448. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_auto_loop.py +0 -0
  449. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_auto_release_publish_2035.py +0 -0
  450. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_backend_selection.py +0 -0
  451. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_base_checkout_restore.py +0 -0
  452. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_block_log.py +0 -0
  453. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_cap_762.py +0 -0
  454. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_fixture.py +0 -0
  455. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_read_path.py +0 -0
  456. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_schema.py +0 -0
  457. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_service.py +0 -0
  458. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_state.py +0 -0
  459. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_board_wire.py +0 -0
  460. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_brain.py +0 -0
  461. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_branch_model.py +0 -0
  462. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_bug_intake.py +0 -0
  463. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_build_worker_image_env_update.py +0 -0
  464. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cargo_cache.py +0 -0
  465. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_check_gh_argv_containment.py +0 -0
  466. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_acceptance_gate_1950.py +0 -0
  467. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_fix.py +0 -0
  468. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_gitlab.py +0 -0
  469. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_parity_2091.py +0 -0
  470. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_ci_store.py +0 -0
  471. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_claim.py +0 -0
  472. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_claude_md_budget.py +0 -0
  473. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_acceptance.py +0 -0
  474. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign.py +0 -0
  475. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  476. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_remote.py +0 -0
  477. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_provider.py +0 -0
  478. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  479. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_audit.py +0 -0
  480. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_chat_continue.py +0 -0
  481. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_decide.py +0 -0
  482. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_capability_rules.py +0 -0
  483. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_config_provenance.py +0 -0
  484. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_forge_availability.py +0 -0
  485. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_graph.py +0 -0
  486. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_self.py +0 -0
  487. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_diagnose_test_coverage.py +0 -0
  488. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor.py +0 -0
  489. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_free_1801.py +0 -0
  490. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  491. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_drive.py +0 -0
  492. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_escalate.py +0 -0
  493. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_fix_headless_review.py +0 -0
  494. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_gate_a.py +0 -0
  495. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_install_drift.py +0 -0
  496. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_install_skills.py +0 -0
  497. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_comment.py +0 -0
  498. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_create_label.py +0 -0
  499. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_reopen.py +0 -0
  500. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_issue_view_list.py +0 -0
  501. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_merge.py +0 -0
  502. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_assign.py +0 -0
  503. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_capture.py +0 -0
  504. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_chat_add_child.py +0 -0
  505. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_dispatch.py +0 -0
  506. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_b.py +0 -0
  507. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_c.py +0 -0
  508. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_order.py +0 -0
  509. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  510. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_milestone_ship.py +0 -0
  511. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_network.py +0 -0
  512. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_new_issue_chat.py +0 -0
  513. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_plans.py +0 -0
  514. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_portal.py +0 -0
  515. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_pr.py +0 -0
  516. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_pull_artifact.py +0 -0
  517. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_queue.py +0 -0
  518. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_reattach_sessions.py +0 -0
  519. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_refine_board.py +0 -0
  520. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_preflight.py +0 -0
  521. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_propagate.py +0 -0
  522. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_release_window.py +0 -0
  523. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_repo_2220.py +0 -0
  524. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  525. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_scorecard.py +0 -0
  526. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_set_review_findings.py +0 -0
  527. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_advisory_terminal.py +0 -0
  528. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_contested_tag.py +0 -0
  529. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_merge_queue.py +0 -0
  530. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_provider.py +0 -0
  531. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_review_finalizing.py +0 -0
  532. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_test_failed_tag.py +0 -0
  533. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_status_usage_limit.py +0 -0
  534. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_sync_comments_873.py +0 -0
  535. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_test_plan.py +0 -0
  536. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_track.py +0 -0
  537. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_tui_update.py +0 -0
  538. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cli_wait.py +0 -0
  539. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_client_base_install.py +0 -0
  540. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_client_resource_migration_1946.py +0 -0
  541. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_commands_common.py +0 -0
  542. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_comments.py +0 -0
  543. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_completion_summary.py +0 -0
  544. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config.py +0 -0
  545. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_acceptance.py +0 -0
  546. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_audit.py +0 -0
  547. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_pricing.py +0 -0
  548. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  549. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_config_usage_gate.py +0 -0
  550. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_confirm_test.py +0 -0
  551. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_conflict_fix.py +0 -0
  552. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_conflict_fix_semantic.py +0 -0
  553. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  554. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test.py +0 -0
  555. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  556. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_baseline.py +0 -0
  557. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_populated_home.py +0 -0
  558. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_routing.py +0 -0
  559. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_test_runner_toolchain.py +0 -0
  560. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_uat.py +0 -0
  561. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coord_web_sse_restart_live.py +0 -0
  562. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_coordinator_machine.py +0 -0
  563. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_cross_platform_imports.py +0 -0
  564. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dao.py +0 -0
  565. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard.py +0 -0
  566. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_api.py +0 -0
  567. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_fixture.py +0 -0
  568. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_terminal.py +0 -0
  569. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dashboard_terminal_live.py +0 -0
  570. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_db.py +0 -0
  571. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dead_end.py +0 -0
  572. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_decomposition_chat.py +0 -0
  573. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_db_backup.py +0 -0
  574. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_dist.py +0 -0
  575. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_rollback.py +0 -0
  576. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_drive_queue_unit.py +0 -0
  577. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_failure_notify_unit.py +0 -0
  578. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_manifest.py +0 -0
  579. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_notify_unit.py +0 -0
  580. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_units_lane.py +0 -0
  581. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deploy_web_unit.py +0 -0
  582. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deprecation_telemetry.py +0 -0
  583. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_deps.py +0 -0
  584. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_diagnose.py +0 -0
  585. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dispatch.py +0 -0
  586. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dispatch_target_validation.py +0 -0
  587. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_dist_name.py +0 -0
  588. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_done_housekeeping.py +0 -0
  589. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive.py +0 -0
  590. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_blocked_rendering.py +0 -0
  591. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_launch_argv.py +0 -0
  592. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  593. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_roll_pending.py +0 -0
  594. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  595. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_state.py +0 -0
  596. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_drive_tmux.py +0 -0
  597. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_capability_detection.py +0 -0
  598. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  599. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_epic_up_image_provenance.py +0 -0
  600. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_errors.py +0 -0
  601. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_events.py +0 -0
  602. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_failure_class.py +0 -0
  603. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_filelock.py +0 -0
  604. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  605. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fix_of_force_override.py +0 -0
  606. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_config_health.py +0 -0
  607. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_health_probes.py +0 -0
  608. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_health_snapshot.py +0 -0
  609. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_fleet_watchdog.py +0 -0
  610. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_forge_availability.py +0 -0
  611. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_freshness.py +0 -0
  612. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_a.py +0 -0
  613. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_b.py +0 -0
  614. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gate_snapshot_staleness.py +0 -0
  615. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gates.py +0 -0
  616. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  617. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_gen_mock_index.py +0 -0
  618. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_rust_fixture.py +0 -0
  619. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_rust_requests.py +0 -0
  620. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_github_throttle.py +0 -0
  623. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_graph_selfheal_absent_2237.py +0 -0
  626. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_coord_tui_ci_pin.py +0 -0
  633. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_coord_web_ci_pin.py +0 -0
  634. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_deploy_lane_facts.py +0 -0
  635. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_fix.py +0 -0
  636. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_incident_regression.py +0 -0
  637. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_issues_sync_staleness.py +0 -0
  638. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_pypi.py +0 -0
  639. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_registry.py +0 -0
  640. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_release_cordon_probe.py +0 -0
  641. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_timer_active.py +0 -0
  642. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_toolchain.py +0 -0
  643. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_unit_drift.py +0 -0
  644. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_unit_enablement.py +0 -0
  645. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_health_wedged_drive_queue.py +0 -0
  646. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_install_agent_venv_2911.py +0 -0
  650. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_pane_log_2541.py +0 -0
  653. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_issues_sync_status.py +0 -0
  660. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_lock_contention_ratchet.py +0 -0
  663. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_machine_onboard.py +0 -0
  664. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_no_agent_record.py +0 -0
  730. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_tick.py +0 -0
  731. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_cordon_stuck_2490.py +0 -0
  737. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_propagate.py +0 -0
  738. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_propagate_threshold.py +0 -0
  739. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_roll_between_legs_2854.py +0 -0
  740. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_roll_window_handoff.py +0 -0
  741. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_dormancy.py +0 -0
  748. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_self_health.py +0 -0
  769. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve.py +0 -0
  770. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve_app_board_trim.py +0 -0
  771. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_serve_rest_routes.py +0 -0
  772. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_sql_dialect.py +0 -0
  782. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_sqlite_connect_ratchet.py +0 -0
  783. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stale_busy_reviewer_697.py +0 -0
  784. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stalled_pipeline.py +0 -0
  785. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_state.py +0 -0
  786. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_state_review_findings_daemon.py +0 -0
  787. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_status_fleet_footer.py +0 -0
  788. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stop_1567.py +0 -0
  789. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_store_contract.py +0 -0
  790. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_store_migrate.py +0 -0
  791. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stuck.py +0 -0
  792. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  793. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_text_io_encoding_audit.py +0 -0
  801. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_board_audit.py +0 -0
  802. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_config_load_1080.py +0 -0
  803. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_thin_client_daemon_routing_906.py +0 -0
  804. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_tmux_host.py +0 -0
  805. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_tmux_session.py +0 -0
  806. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage.py +0 -0
  808. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage_limits.py +0 -0
  809. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_usage_rollup.py +0 -0
  810. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_venv_live_install_2121.py +0 -0
  811. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_version_single_source.py +0 -0
  812. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_watch.py +0 -0
  813. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  814. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_env_venv_isolation.py +0 -0
  815. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/tests/test_write_parity.py +0 -0
  822. {code_coordinator-0.5.329 → code_coordinator-0.5.331}/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.329
3
+ Version: 0.5.331
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.329
3
+ Version: 0.5.331
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.329",
2
+ "tag": "0.5.331",
3
3
  "distance": 0,
4
- "node": "g620161040c983239a8258b25aa0e4e1fc5cf3c8a",
4
+ "node": "g73f327b8112ca3cfc50ce512371659afb1a4c411",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -80,9 +80,12 @@ from coord.drive_queue import (
80
80
  find_cycle,
81
81
  fired_holds,
82
82
  is_dispatch_failure_reason,
83
+ is_merge_gate_block_reason,
83
84
  is_permanent_block_reason,
84
85
  is_pre_dispatch_block_reason,
85
86
  is_unsatisfiable_prereq_reason,
87
+ merge_gate_remedy_command,
88
+ merge_plan_inspect_command,
86
89
  parse_after_spec,
87
90
  parse_key,
88
91
  pending_probe_targets,
@@ -4526,6 +4529,30 @@ def _requeue_command(entry: QueueEntry | None, key: str) -> str:
4526
4529
  )
4527
4530
 
4528
4531
 
4532
+ def _blocked_escalation_command(entry: QueueEntry | None, key: str, reason: str) -> str:
4533
+ """The command a `blocked`/`oscillating` escalation should propose
4534
+ (#3016) — `_requeue_command` ONLY for a genuinely never-dispatched entry;
4535
+ a gate-specific remedy (or the safe read-only inspect fallback) whenever
4536
+ *reason* already names a merge-gate block.
4537
+
4538
+ `_requeue_command` is right exactly once: nothing was ever dispatched
4539
+ for this row (or every dispatch attempt died before an assignment
4540
+ existed), so there is nothing left to lose by dropping and re-adding it.
4541
+ But `is_merge_gate_block_reason` names the other shape — Work/Test/
4542
+ Review already completed and it is the MERGE stage that is stuck — where
4543
+ the same requeue would discard that completed cycle instead of fixing
4544
+ the one gate actually blocking it. `merge_gate_remedy_command` is the
4545
+ one place that maps a merge-gate reason to its safe one-line fix (or, if
4546
+ none is known blind, the inspect command); this only decides WHICH of
4547
+ the two families applies.
4548
+ """
4549
+ if is_merge_gate_block_reason(reason):
4550
+ parsed = parse_key(key)
4551
+ if parsed is not None:
4552
+ return merge_gate_remedy_command(reason, parsed[0], parsed[1])
4553
+ return _requeue_command(entry, key)
4554
+
4555
+
4529
4556
  @drive_queue_group.command("tick")
4530
4557
  @click.option(
4531
4558
  "--max-parallel",
@@ -5071,7 +5098,7 @@ def drive_queue_tick(
5071
5098
  f"{entry.position if entry else '?'} | after="
5072
5099
  f"{','.join(entry.after) if entry and entry.after else '(none)'}"
5073
5100
  ),
5074
- command=_requeue_command(entry, item.key),
5101
+ command=_blocked_escalation_command(entry, item.key, item.reason),
5075
5102
  )
5076
5103
 
5077
5104
  # #2230: an entry #2230's sweep would have resumed, but has already
@@ -5098,7 +5125,7 @@ def drive_queue_tick(
5098
5125
  f"/{MAX_BLOCKED_RESUMES} | position="
5099
5126
  f"{entry.position if entry else '?'}"
5100
5127
  ),
5101
- command=_requeue_command(entry, item.key),
5128
+ command=_blocked_escalation_command(entry, item.key, item.reason),
5102
5129
  )
5103
5130
 
5104
5131
  # #2806: a `blocked` entry #2230's sweep targeted this tick, but whose
@@ -5117,6 +5144,14 @@ def drive_queue_tick(
5117
5144
  if parsed is None:
5118
5145
  continue
5119
5146
  entry = by_key.get(item.key)
5147
+ # #3016: NEVER the `remove && add` requeue here — `item.reason`
5148
+ # already says "the next tick re-probes rather than guessing"
5149
+ # (#2806); a destructive requeue directly contradicts that, and
5150
+ # would additionally discard a completed Work/Test/Review cycle
5151
+ # for no reason connected to what actually failed (a probe, not
5152
+ # a gate). The read-only inspect command is the only thing safe
5153
+ # to propose when the tick itself does not yet know what shape
5154
+ # this block is.
5120
5155
  _escalate(
5121
5156
  parsed[0],
5122
5157
  parsed[1],
@@ -5125,7 +5160,7 @@ def drive_queue_tick(
5125
5160
  f"queue_state=blocked | gate_reading=unreadable | "
5126
5161
  f"position={entry.position if entry else '?'}"
5127
5162
  ),
5128
- command=_requeue_command(entry, item.key),
5163
+ command=merge_plan_inspect_command(parsed[0]),
5129
5164
  )
5130
5165
 
5131
5166
  if plan.alert is not None:
@@ -94,6 +94,7 @@ from coord.gate_a import is_gate_a_refusal_reason
94
94
  from coord.github_ops import is_throttle_skip_reason, parse_throttle_skip_until
95
95
  from coord.issues_sync_status import STALENESS_WARN_SECONDS as ISSUE_CACHE_STALE_CEILING_S
96
96
  from coord.merge_queue import (
97
+ CI_STALE_PREFIX,
97
98
  PLAN_READY,
98
99
  ci_rollup_all_clear,
99
100
  is_ci_flaky_reason,
@@ -2746,6 +2747,74 @@ def _is_merge_gate_block_reason(reason: str | None) -> bool:
2746
2747
  return "merge_status=" in lowered
2747
2748
 
2748
2749
 
2750
+ def merge_plan_inspect_command(repo: str) -> str:
2751
+ """The read-only ``coord merge --plan`` fallback (#3016) — safe to
2752
+ propose whenever no specific, blind-runnable remedy is known, because it
2753
+ never mutates anything. Used both as :func:`merge_gate_remedy_command`'s
2754
+ own fallback and directly by callers escalating a #2806 ``gate_unreadable``
2755
+ outcome, whose reason text already says "the next tick re-probes" — the
2756
+ destructive `remove && add` requeue would directly contradict that.
2757
+ """
2758
+ return f"coord merge --plan --repo {repo}"
2759
+
2760
+
2761
+ def merge_gate_remedy_command(reason: str | None, repo: str, issue: int) -> str:
2762
+ """The gate-specific one-line fix for a `_is_merge_gate_block_reason`
2763
+ block (#3016) — never the blanket ``drive-queue remove && add`` requeue
2764
+ a synthetic escalation writer would otherwise reach for by default.
2765
+
2766
+ A requeue is not merely useless for a merge-gate block, it is actively
2767
+ destructive: it discards a completed Work/Test/Review cycle to re-run it
2768
+ from scratch, when the real fix is a single, targeted merge-lane command
2769
+ — exactly the misdirection `_is_merge_gate_block_reason`'s own docstring
2770
+ already names two live escalations (claude-coordinator#2405, coord-web#2)
2771
+ as having produced, and #2424 only fixed on the prose (``reason``) side,
2772
+ leaving this — the field a one-click "Run proposed fix" menu actually
2773
+ executes — untouched.
2774
+
2775
+ Only the CI-stale / stale-but-passed-smoke shape has a remedy that is
2776
+ both KNOWN and SAFE to run blind: ``coord merge --revalidate --only
2777
+ <repo>#<issue>``, the exact command :func:`coord.merge_queue.
2778
+ ci_stale_reason`'s own prose already tells the operator to run (matched
2779
+ textually here — via :data:`coord.merge_queue.CI_STALE_PREFIX` and
2780
+ :func:`is_stale_smoke_reason` — rather than re-derived, so the two can
2781
+ never diverge on what "CI stale" means).
2782
+
2783
+ Every other shape this matches — red CI (``checks failed``), a
2784
+ review/smoke gate divergence (``review_required —``/``smoke_required
2785
+ —``), an opaque terminal ``merge_status=`` — has no single command that
2786
+ is always both correct and safe to run without a human first reading
2787
+ the actual gate state (fixing a named CI check, recovering or re-running
2788
+ a review, deciding a UAT verdict). Guessing wrong there is worse than
2789
+ not guessing: the menu this feeds runs the command on one click. So
2790
+ every one of those falls back to the read-only inspect command instead
2791
+ — see #3016's design note ("a wrong 'Recommended' is worse than no
2792
+ recommendation").
2793
+
2794
+ Callers are expected to gate on :func:`_is_merge_gate_block_reason`
2795
+ first; called on a reason that ISN'T a merge-gate block at all, this
2796
+ still returns the safe inspect fallback rather than raising — there is
2797
+ no reason this text-matching helper needs to enforce that precondition
2798
+ itself when a wrong answer here is never destructive.
2799
+ """
2800
+ if reason and (
2801
+ CI_STALE_PREFIX.lower() in reason.lower() or is_stale_smoke_reason(reason)
2802
+ ):
2803
+ return f"coord merge --revalidate --only {entry_key(repo, issue)}"
2804
+ return merge_plan_inspect_command(repo)
2805
+
2806
+
2807
+ def is_merge_gate_block_reason(reason: str | None) -> bool:
2808
+ """Public alias for :func:`_is_merge_gate_block_reason` (#3016).
2809
+
2810
+ Same convention as ``is_empty_branch_death_reason``/
2811
+ ``is_unsatisfiable_prereq_reason``: the classifier is shared with the
2812
+ synthetic escalation writers in ``coord.commands.drive_queue``, so it
2813
+ gets a non-underscored name rather than a second copy of the text match.
2814
+ """
2815
+ return _is_merge_gate_block_reason(reason)
2816
+
2817
+
2749
2818
  def _is_empty_branch_death_reason(reason: str | None) -> bool:
2750
2819
  """#2363: does *reason* name the "claimed success, wrote nothing"
2751
2820
  signature — an acceptance-author or plain work session that exited
@@ -2547,7 +2547,8 @@ def _board_response_schema(components: dict) -> dict:
2547
2547
  "#550: server-computed per-issue stage/gate badges "
2548
2548
  "(work/review/smoke/test/merge status, has_approved_review) — "
2549
2549
  "generalizes the #776/#778 pattern so coord-tui's "
2550
- "pipeline.rs stops re-deriving this from raw rows"
2550
+ "pipeline.rs stops re-deriving this from raw rows. #3013 adds "
2551
+ "a per-stage leg count (`stage_counts`) alongside the status."
2551
2552
  ),
2552
2553
  "items": {
2553
2554
  "type": "object",
@@ -2560,6 +2561,24 @@ def _board_response_schema(components: dict) -> dict:
2560
2561
  "description": "stage name -> pending|active|done|failed|stale|skipped",
2561
2562
  "additionalProperties": {"type": "string"},
2562
2563
  },
2564
+ "stage_counts": {
2565
+ "type": "object",
2566
+ "description": (
2567
+ "#3013: stage name -> count of separate dispatched "
2568
+ "legs at that stage (e.g. a stage re-dispatched 4 "
2569
+ "times reads 4, not 1) — lets a client render "
2570
+ "'Work (2)' / 'Review (5)' and suppress the suffix "
2571
+ "at 1. Same key set as `stages` (including "
2572
+ "`acceptance`). Caveat: `merge` uses a different "
2573
+ "convention from every other key — it counts "
2574
+ "conflict-fix RETRIES (0 for a clean single merge, "
2575
+ "not 1 for 'one attempt happened'), so a uniform "
2576
+ "'suppress at <= 1' rule will also suppress a "
2577
+ "single conflict-fix retry, which is usually the "
2578
+ "most useful count to surface."
2579
+ ),
2580
+ "additionalProperties": {"type": "integer"},
2581
+ },
2563
2582
  "has_approved_review": {"type": "boolean"},
2564
2583
  "uat_preview_url": {
2565
2584
  "type": ["string", "null"],
@@ -2571,7 +2590,13 @@ def _board_response_schema(components: dict) -> dict:
2571
2590
  ),
2572
2591
  },
2573
2592
  },
2574
- "required": ["repo_name", "issue_number", "stages", "has_approved_review"],
2593
+ "required": [
2594
+ "repo_name",
2595
+ "issue_number",
2596
+ "stages",
2597
+ "stage_counts",
2598
+ "has_approved_review",
2599
+ ],
2575
2600
  },
2576
2601
  },
2577
2602
  "plan_roster": {
@@ -31,9 +31,10 @@ plain values — no I/O, no side effects.
31
31
 
32
32
  from __future__ import annotations
33
33
 
34
+ import dataclasses
34
35
  from typing import Any, Protocol, runtime_checkable
35
36
 
36
- from coord.models import CLOSES_ISSUE_TYPES
37
+ from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
37
38
 
38
39
  # ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
39
40
  PENDING = "pending"
@@ -172,6 +173,102 @@ def assignments_for_stage(
172
173
  return out
173
174
 
174
175
 
176
+ def _leg_count_for_stage(
177
+ assignments_for_issue: list,
178
+ stage: str,
179
+ *,
180
+ require_plan: bool,
181
+ ) -> int:
182
+ """How many separate dispatched attempts ("legs") this issue has had at
183
+ *stage* (#3013) — "attempts a human would recognise as separate", not a
184
+ raw row count. Each retry/redispatch is already its own board row (a
185
+ retry dispatches a fresh assignment id rather than mutating the failed
186
+ one, see ``coord.reconcile._reassign``), so counting rows already gives
187
+ the right number for stages backed by their own dedicated assignment
188
+ ``type`` — this only needs to special-case the stages that aren't:
189
+
190
+ * ``"work"`` is widened from a literal ``type == "work"`` (plus the
191
+ existing plan-fold) to the full :data:`WORK_LIKE_TYPES` — an
192
+ oracle-loop acceptance slice's repeated ``test-author``/``mock-author``
193
+ legs (#3013's coord-portal#164 example: 4 ``test-author`` legs, 5
194
+ ``review`` legs on one branch) are exactly the kind of repetition this
195
+ field exists to surface, and a strict ``type == "work"`` match would
196
+ never see them.
197
+ * ``"test"`` has no ``type="test"`` assignment — the Test-stage's
198
+ dispatched worker is ``type="smoke"`` (``coord.smoke``).
199
+ * ``"merge"`` has no ``type="merge"`` assignment either — repeated
200
+ landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
201
+ the counting convention this implies differs from every other stage:
202
+ a clean single merge with no conflict reports ``0`` (no *retry* was
203
+ needed), whereas one ordinary ``"work"``/``"review"``/``"test"`` leg
204
+ reports ``1`` (one attempt happened). A client applying one uniform
205
+ "suppress the number at <= 1" rule across every stage — as the
206
+ ``/board`` schema description implies — will suppress a single
207
+ conflict-fix leg (``count == 1``, arguably the most useful case to
208
+ surface: "this needed a rebase") exactly like "no problem at all". No
209
+ code path here can distinguish the two without a wire-schema change,
210
+ so this is flagged for the client rather than fixed on this side.
211
+ * ``"acceptance"`` (review fix, #3013) has no dedicated assignment type
212
+ either — like ``test_state``/``uat_state``, ``acceptance_state`` is
213
+ stamped directly onto the ``type="work"`` row a
214
+ ``coord acceptance record`` verdict belongs to (see
215
+ :func:`acceptance_stage_status_for`, which reads the same rows), so a
216
+ generic ``assignments_for_stage(..., "acceptance", ...)`` scan would
217
+ always return zero.
218
+
219
+ Every other stage (``"plan"``, ``"review"``, ``"uat"``, ...) already has
220
+ a 1:1 assignment ``type``, so :func:`assignments_for_stage` alone gives
221
+ the right count.
222
+ """
223
+ if stage == "work":
224
+ matching = assignments_for_stage(assignments_for_issue, "work", require_plan=require_plan)
225
+ seen = {id(a) for a in matching}
226
+ extra = [
227
+ a
228
+ for a in assignments_for_issue
229
+ if id(a) not in seen and (a.type or "work") in WORK_LIKE_TYPES
230
+ ]
231
+ return len(matching) + len(extra)
232
+ if stage == "test":
233
+ return sum(1 for a in assignments_for_issue if (a.type or "work") == "smoke")
234
+ if stage == "merge":
235
+ return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
236
+ if stage == "acceptance":
237
+ return sum(
238
+ 1
239
+ for a in assignments_for_issue
240
+ if (a.type or "work") == "work" and (a.acceptance_state or "") != ""
241
+ )
242
+ return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
243
+
244
+
245
+ def _widen_work_like_types(assignments: list) -> list:
246
+ """Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
247
+ ``mock-author``/``test-author``, not just literal ``type="work"``)
248
+ presented as ``type="work"`` to the generic per-stage dispatcher
249
+ (:func:`stage_status_for`, :func:`assignments_for_stage`,
250
+ :func:`acceptance_stage_status_for`, ...), all of which key strictly off
251
+ ``a.type``.
252
+
253
+ Used ONLY by :func:`compute_board_stage_projection`'s phantom-entry
254
+ fallback (see that function's docstring) — without it, a slice whose
255
+ only rows are ``test-author``/``mock-author`` legs got
256
+ ``stage_counts["work"] == 4`` (via :func:`_leg_count_for_stage`, which
257
+ already widens the same way) sitting next to ``stages["work"] ==
258
+ "pending"`` forever, since the strict-``type`` dispatcher never
259
+ recognised those rows as "work" activity. Every other field (status,
260
+ dispatched_at, test_state, acceptance_state, ...) is preserved
261
+ unchanged — this only relabels the ``type`` a downstream ``==`` check
262
+ sees.
263
+ """
264
+ out = []
265
+ for a in assignments:
266
+ t = a.type or "work"
267
+ widen = t in WORK_LIKE_TYPES and t != "work"
268
+ out.append(dataclasses.replace(a, type="work") if widen else a)
269
+ return out
270
+
271
+
175
272
  def upstream_max_dispatched_at(
176
273
  assignments_for_issue: list,
177
274
  stage: str,
@@ -698,6 +795,7 @@ def compute_issue_projection(
698
795
  ci_store: Any | None = None,
699
796
  uat_enabled: bool = False,
700
797
  uat_preview_url: str | None = None,
798
+ stage_count_assignments: list | None = None,
701
799
  ) -> dict[str, Any]:
702
800
  """Compute the full per-issue stage badge dict.
703
801
 
@@ -717,6 +815,15 @@ def compute_issue_projection(
717
815
  carried through unconditionally so a caller can show it next to the
718
816
  badge instead of sending the operator to ``coord merge``'s refusal
719
817
  message to find it (#2951 item 3).
818
+
819
+ ``stage_count_assignments`` (#3013) is the assignment list
820
+ :func:`_leg_count_for_stage` scans to fill ``stage_counts`` — a client
821
+ can then render ``Work (2)`` / ``Review (5)`` next to the status badge
822
+ and suppress the suffix at 1. Defaults to *assignments_for_issue* (the
823
+ same list ``stages`` uses) when omitted, which is correct for an
824
+ ordinary issue; :func:`compute_board_stage_projection` passes a
825
+ separately-keyed list for the #1553 oracle-loop epic/slice case — see
826
+ that function's docstring.
720
827
  """
721
828
  names = issue_stage_names(assignments_for_issue, default_gates, uat_enabled=uat_enabled)
722
829
  stages: dict[str, str] = {}
@@ -741,8 +848,29 @@ def compute_issue_projection(
741
848
  # excluded from the per-issue stage-strip ordering that `default_gates`
742
849
  # drives, since it only applies to oracle-loop milestones.
743
850
  stages["acceptance"] = acceptance_stage_status_for(assignments_for_issue)
851
+
852
+ count_source = (
853
+ assignments_for_issue if stage_count_assignments is None else stage_count_assignments
854
+ )
855
+ stage_counts: dict[str, int] = {
856
+ name: _leg_count_for_stage(count_source, name, require_plan=require_plan) for name in names
857
+ }
858
+ stage_counts.setdefault(
859
+ "merge", _leg_count_for_stage(count_source, "merge", require_plan=require_plan)
860
+ )
861
+ # Review fix (#3013): `stages` always carries "acceptance" (added
862
+ # unconditionally above, outside `names`/`default_gates`), but
863
+ # `stage_counts` was built only from `names` plus an explicit "merge"
864
+ # fallback — so it silently dropped "acceptance", contradicting the
865
+ # `/board` schema's documented "same key set as `stages`" guarantee
866
+ # (coord/serve_app.py) and leaving a client that indexes `stage_counts`
867
+ # by every key in `stages` with a plain `KeyError`.
868
+ stage_counts.setdefault(
869
+ "acceptance", _leg_count_for_stage(count_source, "acceptance", require_plan=require_plan)
870
+ )
744
871
  return {
745
872
  "stages": stages,
873
+ "stage_counts": stage_counts,
746
874
  "acceptance_progress": acceptance_progress_for(assignments_for_issue),
747
875
  "uat_preview_url": uat_preview_url if uat_enabled else None,
748
876
  "has_approved_review": issue_has_any_approved_review(
@@ -779,6 +907,44 @@ def compute_board_stage_projection(
779
907
  ``None`` (the default — e.g. a caller with no config loaded) means no
780
908
  repo is treated as opted in, matching :func:`pipeline_stage_names`'s own
781
909
  fail-toward-hidden default.
910
+
911
+ ``stage_counts`` (#3013) is deliberately built from a SECOND index keyed
912
+ by ``coord.models.effective_issue_number`` rather than the raw
913
+ ``assignments_by_key`` below: an oracle-loop acceptance slice's
914
+ ``test-author``/``mock-author``/``review`` legs are booked
915
+ (``issue_number``) to the milestone's *tracking* issue, with the child
916
+ they're actually FOR named in ``for_issue_number`` (see
917
+ ``coord gates <repo> <slice>``, which resolves the same way). Reusing
918
+ ``assignments_by_key`` for the count would leave a slice's own
919
+ ``stage_counts`` reading 0 forever — the same keying trap noted in the
920
+ #3013 issue's "drive-queue sweep bug" reference. For an issue that ALSO
921
+ has its own raw-keyed rows, this does NOT touch ``stages``: that stays
922
+ keyed on the raw ``issue_number`` on purpose (#1652 — re-attributing
923
+ status by ``for_issue_number`` moved a false "merged" green from the
924
+ epic onto a child that already had its own, separately-tracked state; a
925
+ leg *count* carries no such false-green risk, so the two fields are
926
+ allowed to disagree on which issue owns which rows in that case).
927
+
928
+ Review fix (#3013): a *phantom* entry — ANY key whose raw-keyed
929
+ assignment list is empty, whether it exists in ``issues`` with no
930
+ assignments of its own (the coord-portal#164 test below: the slice IS
931
+ already synced, but every one of its legs is booked to the tracking
932
+ issue) or exists ONLY via the effective-key union (never synced at all:
933
+ not yet caught up by ``_sync_issues_tick``, or a closed slice pruned
934
+ from ``issues`` after 7 days while assignment retention runs 14, see
935
+ ``coord/state.py``) — has nothing raw-keyed to protect from the #1652
936
+ clobber, because there IS no separately-tracked state for it to
937
+ conflict with. Rendering ``stages`` from the empty raw list anyway
938
+ produced a self-contradictory row: every stage PENDING (acceptance
939
+ SKIPPED) right next to a ``stage_counts`` proving real legs ran. So for
940
+ that case only, ``stages``/``acceptance``/``has_approved_review`` fall
941
+ back to the same effective-keyed list ``stage_counts`` already uses,
942
+ widened through :func:`_widen_work_like_types` so a `test-author`/
943
+ `mock-author` leg registers as "work" activity to the generic
944
+ per-stage dispatcher — see the ``projection_assignments`` fallback
945
+ below. ``issue_title`` still reads ``""`` for a phantom entry that
946
+ isn't itself in ``issues`` (genuinely unknown — not fabricated from the
947
+ tracking issue's own title, which would be actively wrong).
782
948
  """
783
949
  is_closed_by_key: dict[tuple[str, int], bool] = {
784
950
  (i["repo_name"], i["number"]): str(i.get("state", "")).lower() == "closed"
@@ -794,6 +960,17 @@ def compute_board_stage_projection(
794
960
  continue
795
961
  assignments_by_key.setdefault((a.repo_name, a.issue_number), []).append(a)
796
962
 
963
+ # #3013: effective-issue-keyed index — see docstring above. Used only to
964
+ # fill `stage_counts`, never `stages`.
965
+ assignments_by_effective_key: dict[tuple[str, int], list] = {}
966
+ for a in assignments:
967
+ if not a.repo_name:
968
+ continue
969
+ eff = effective_issue_number(a)
970
+ if not eff:
971
+ continue
972
+ assignments_by_effective_key.setdefault((a.repo_name, eff), []).append(a)
973
+
797
974
  merge_by_key: dict[tuple[str, int], Any] = {}
798
975
  for m in merge_queue_items:
799
976
  assignment_type = getattr(m, "assignment_type", "work") or "work"
@@ -815,7 +992,11 @@ def compute_board_stage_projection(
815
992
  # `load_queue()`/`board_projection()` both order by `id` ascending.
816
993
  merge_by_key.setdefault(key, m)
817
994
 
818
- keys = set(is_closed_by_key) | set(assignments_by_key)
995
+ # #3013: also union in the effective-key index so an acceptance slice
996
+ # whose only board rows are booked to the tracking issue (nothing keyed
997
+ # to the slice's own issue_number, e.g. never separately synced) still
998
+ # gets a projection row for stage_counts to land in.
999
+ keys = set(is_closed_by_key) | set(assignments_by_key) | set(assignments_by_effective_key)
819
1000
 
820
1001
  uat_enabled_by_repo: dict[str, bool] = {}
821
1002
 
@@ -823,12 +1004,25 @@ def compute_board_stage_projection(
823
1004
  for repo_name, issue_number in keys:
824
1005
  key = (repo_name, issue_number)
825
1006
  issue_assignments = assignments_by_key.get(key, [])
1007
+ effective_assignments = assignments_by_effective_key.get(key, [])
1008
+ # Review fix (#3013): a phantom entry (see docstring) has no
1009
+ # raw-keyed rows at all, so falling back to the effective-keyed list
1010
+ # here — instead of leaving `stages` computed from `[]` — keeps
1011
+ # `stages`/`acceptance`/`has_approved_review` consistent with the
1012
+ # non-zero `stage_counts` this same entry reports below. Widened
1013
+ # through `_widen_work_like_types` so a `test-author`/`mock-author`
1014
+ # leg (WORK_LIKE_TYPES, not literal `type="work"`) registers with
1015
+ # the generic per-stage dispatcher's strict `type` check the same
1016
+ # way `_leg_count_for_stage` already widens it for `stage_counts`.
1017
+ # A no-op for every ordinary issue: `issue_assignments or ...` only
1018
+ # reaches the fallback when the raw list is empty.
1019
+ projection_assignments = issue_assignments or _widen_work_like_types(effective_assignments)
826
1020
  merge_entry = merge_by_key.get(key)
827
1021
  if repo_name not in uat_enabled_by_repo:
828
1022
  uat_enabled_by_repo[repo_name] = repo_has_uat_preview(repo_name, config)
829
1023
  uat_enabled = uat_enabled_by_repo[repo_name]
830
1024
  entry = compute_issue_projection(
831
- issue_assignments,
1025
+ projection_assignments,
832
1026
  merge_entry,
833
1027
  is_closed=is_closed_by_key.get(key, False),
834
1028
  require_plan=require_plan,
@@ -840,6 +1034,7 @@ def compute_board_stage_projection(
840
1034
  if uat_enabled
841
1035
  else None
842
1036
  ),
1037
+ stage_count_assignments=effective_assignments,
843
1038
  )
844
1039
  entry["repo_name"] = repo_name
845
1040
  entry["issue_number"] = issue_number
@@ -1987,6 +1987,78 @@ def test_a_dead_drives_own_exit_reason_reaches_the_queue_row(
1987
1987
  assert state._get_drive_escalation_local(REPO, 1762) is not None
1988
1988
 
1989
1989
 
1990
+ def test_exhausted_ci_stale_escalation_proposes_revalidate_not_a_requeue(
1991
+ cli, seed, launches, coord_db, config_file
1992
+ ):
1993
+ """#3016 regression fixture — the exact claude-coordinator#2983 shape
1994
+ (2026-08-31), rendered end-to-end through the real `coord drive-queue
1995
+ tick` -> escalation write -> `coord escalate list` path: a merge-gate
1996
+ death whose OWN reason already names `coord merge --revalidate` as the
1997
+ fix must not have the escalation's `proposed_command` — the ONE field a
1998
+ one-click "Run proposed fix" menu actually runs — propose the blanket
1999
+ `drive-queue remove && add` requeue instead. #2424 already fixed the
2000
+ parallel misdirection in the `reason` prose; this pins the field that
2001
+ executes.
2002
+ """
2003
+ from coord.audit import record_audit
2004
+
2005
+ seed(issues={2983: "open"})
2006
+ cli("add", REPO, "2983")
2007
+ cli("tick")
2008
+
2009
+ def _own_reason(n: int) -> str:
2010
+ return (
2011
+ f"drive exited for {REPO}#2983 (exit_code=1): merge attempted "
2012
+ f"3 times without landing.\n"
2013
+ " Last board state: status='PENDING' reason='CI stale: checks "
2014
+ "predate the current base (...); auto-rerun budget exhausted "
2015
+ "(2/2) — re-run CI (`coord merge --revalidate`) before merging'"
2016
+ f" (attempt {n})"
2017
+ )
2018
+
2019
+ launched_at = queued(2983)["launched_at"]
2020
+ _backdate(2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
2021
+ record_audit(
2022
+ tier="business", category="drive", event_type="drive_exited",
2023
+ actor="drive", summary=_own_reason(1), repo=REPO, issue=2983,
2024
+ ts=launched_at + 5,
2025
+ )
2026
+ cli("tick")
2027
+
2028
+ _backdate_reason(coord_db, 2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
2029
+ relaunch = cli("tick")
2030
+ assert relaunch.exit_code == 0, relaunch.output
2031
+ assert queued(2983)["state"] == "running"
2032
+
2033
+ launched_at = queued(2983)["launched_at"]
2034
+ _backdate(2983, DRIVE_STARTUP_GRACE_SECONDS + 60)
2035
+ record_audit(
2036
+ tier="business", category="drive", event_type="drive_exited",
2037
+ actor="drive", summary=_own_reason(2), repo=REPO, issue=2983,
2038
+ ts=launched_at + 5,
2039
+ )
2040
+ second_retry = cli("tick")
2041
+ assert second_retry.exit_code == 0, second_retry.output
2042
+
2043
+ entry = queued(2983)
2044
+ assert entry["state"] == "blocked"
2045
+
2046
+ listing = CliRunner().invoke(
2047
+ main, ["escalate", "list", "--config", str(config_file)]
2048
+ )
2049
+ assert listing.exit_code == 0, listing.output
2050
+ assert f"{REPO} #2983" in listing.output
2051
+ assert "coord merge --revalidate" in listing.output
2052
+ assert f"--only {REPO}#2983" in listing.output
2053
+ assert "drive-queue remove" not in listing.output
2054
+ assert "drive-queue add" not in listing.output
2055
+
2056
+ escalation = state._get_drive_escalation_local(REPO, 2983)
2057
+ assert escalation is not None
2058
+ proposed = escalation["proposed_command"]
2059
+ assert proposed == f"coord merge --revalidate --only {REPO}#2983"
2060
+
2061
+
1990
2062
  def test_a_permanent_dispatch_refusal_blocks_on_the_first_tick_no_attempt_spent(
1991
2063
  cli, seed, launches,
1992
2064
  ):