code-coordinator 0.5.330__tar.gz → 0.5.332__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 (825) hide show
  1. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. code_coordinator-0.5.332/code_coordinator.egg-info/scm_version.json +8 -0
  6. code_coordinator-0.5.332/coord/machine_metrics.py +217 -0
  7. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/serve_app.py +63 -3
  8. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/stage_projection.py +198 -3
  9. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_PY_RUST_MIRRORS.md +1 -0
  10. code_coordinator-0.5.332/tests/test_machine_metrics.py +229 -0
  11. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stage_projection.py +284 -0
  12. code_coordinator-0.5.330/code_coordinator.egg-info/scm_version.json +0 -8
  13. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/.gitignore +0 -0
  26. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/GOAL.md +0 -0
  28. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/LICENSE +0 -0
  29. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/README.md +0 -0
  31. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/client.py +0 -0
  63. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/machine.py +0 -0
  78. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/pr.py +0 -0
  84. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/store_migrate.py +0 -0
  93. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/config.py +0 -0
  98. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/config_reload.py +0 -0
  99. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/confirm_test.py +0 -0
  100. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/conflict_fix.py +0 -0
  101. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dao.py +0 -0
  102. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/db.py +0 -0
  108. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dead_end.py +0 -0
  109. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/decomposition_chat.py +0 -0
  110. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-failure-notify.service +0 -0
  118. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.service +0 -0
  119. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  120. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-notify.service +0 -0
  121. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-notify.timer +0 -0
  122. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.service +0 -0
  123. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-propagate.timer +0 -0
  124. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.service +0 -0
  125. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-release-window.timer +0 -0
  126. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-serve.service +0 -0
  127. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.service +0 -0
  128. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web-dist-build.timer +0 -0
  129. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy/coord-web.service +0 -0
  130. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy_manifest.py +0 -0
  131. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deploy_units.py +0 -0
  132. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deprecation_telemetry.py +0 -0
  133. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/events.py +0 -0
  141. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/_ci_pin.py +0 -0
  158. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/agent_install.py +0 -0
  159. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/cargo_targets.py +0 -0
  160. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/claude_binary.py +0 -0
  161. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  162. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/issues_sync_staleness.py +0 -0
  173. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/plan_usage.py +0 -0
  174. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/release_cordon.py +0 -0
  175. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/stalled_pipeline.py +0 -0
  178. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/wedged_drive_queue.py +0 -0
  183. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/checks/worktrees.py +0 -0
  184. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/cli.py +0 -0
  185. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/context.py +0 -0
  186. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/fleet_snapshot.py +0 -0
  187. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/models.py +0 -0
  188. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/pypi.py +0 -0
  189. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/registry.py +0 -0
  190. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/render.py +0 -0
  191. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/health/units.py +0 -0
  192. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/hooks.py +0 -0
  193. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/housekeeping.py +0 -0
  194. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/interactive.py +0 -0
  195. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/issue_store.py +0 -0
  196. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/issues_sync_status.py +0 -0
  197. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/liveness_auditor.py +0 -0
  198. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/machine_onboard.py +0 -0
  199. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/machine_pause.py +0 -0
  200. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/merge_queue.py +0 -0
  201. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_chat.py +0 -0
  202. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_dispatch.py +0 -0
  203. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_gate.py +0 -0
  204. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/milestone_order.py +0 -0
  205. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/mock_author.py +0 -0
  206. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/models.py +0 -0
  207. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/network.py +0 -0
  208. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/new_issue_chat.py +0 -0
  209. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/__init__.py +0 -0
  210. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/baseline.py +0 -0
  211. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/cli.py +0 -0
  212. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/collect.py +0 -0
  213. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/digest.py +0 -0
  214. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/models.py +0 -0
  215. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/predicate.py +0 -0
  216. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/service.py +0 -0
  217. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/store.py +0 -0
  218. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notifier/transport.py +0 -0
  219. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/notify.py +0 -0
  220. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/openapi.py +0 -0
  221. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/overlap_fence.py +0 -0
  222. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/overlap_predict.py +0 -0
  223. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/parentage.py +0 -0
  224. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/parentage_github.py +0 -0
  225. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/pipeline.py +0 -0
  226. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/plan_parser.py +0 -0
  227. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/plans.py +0 -0
  228. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/platform_paths.py +0 -0
  229. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_bridge.py +0 -0
  230. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_store.py +0 -0
  231. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/portal_sync.py +0 -0
  232. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/pr_body_lint.py +0 -0
  233. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/prereqs.py +0 -0
  234. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/progress.py +0 -0
  235. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/__init__.py +0 -0
  236. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/base.py +0 -0
  237. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/claude.py +0 -0
  238. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/claude_pty.py +0 -0
  239. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/providers/opencode.py +0 -0
  240. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/queue_diagnose.py +0 -0
  241. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reconcile.py +0 -0
  242. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reconcile_tick.py +0 -0
  243. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/refine_chat.py +0 -0
  244. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_cordon.py +0 -0
  245. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_propagate.py +0 -0
  246. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_verify.py +0 -0
  247. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/release_window.py +0 -0
  248. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_dormancy.py +0 -0
  249. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_edit.py +0 -0
  250. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/repo_onboard.py +0 -0
  251. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/reports.py +0 -0
  252. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/rest_schema.py +0 -0
  253. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/revalidate.py +0 -0
  254. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/review.py +0 -0
  255. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/scorecard.py +0 -0
  256. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/self_health.py +0 -0
  257. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  258. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  259. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  260. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  262. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/portal-followup/SKILL.md +0 -0
  263. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/release-now/SKILL.md +0 -0
  264. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  265. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  266. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/skills/update-issue/SKILL.md +0 -0
  267. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/smoke.py +0 -0
  268. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/spend_ceiling.py +0 -0
  269. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/split_work.py +0 -0
  270. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/sql.py +0 -0
  271. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/state.py +0 -0
  272. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/store_migrate.py +0 -0
  273. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_author.py +0 -0
  274. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_chat.py +0 -0
  275. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_orchestrator.py +0 -0
  276. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/test_report.py +0 -0
  277. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/tui_release.py +0 -0
  278. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage.py +0 -0
  279. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage_limits.py +0 -0
  280. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/usage_rollup.py +0 -0
  281. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coord/worker_events.py +0 -0
  282. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/coordinator.example.yml +0 -0
  283. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-agent.service +0 -0
  284. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.service +0 -0
  285. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.sh +0 -0
  286. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-db-backup.timer +0 -0
  287. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-drive-queue.service +0 -0
  288. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-drive-queue.timer +0 -0
  289. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-failure-notify.service +0 -0
  290. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-failure-notify.sh +0 -0
  291. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.service +0 -0
  292. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-fleet-watchdog.timer +0 -0
  293. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-notify.service +0 -0
  294. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-notify.timer +0 -0
  295. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-propagate.service +0 -0
  296. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-propagate.timer +0 -0
  297. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-window.service +0 -0
  298. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-release-window.timer +0 -0
  299. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-serve.service +0 -0
  300. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.service +0 -0
  301. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.sh +0 -0
  302. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-dist-build.timer +0 -0
  303. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web-rollback.sh +0 -0
  304. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/coord-web.service +0 -0
  305. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/deploy/node-shim.sh +0 -0
  306. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_TUI_CI.md +0 -0
  307. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  308. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_CI.md +0 -0
  309. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ADR_COORD_WEB_DIST.md +0 -0
  310. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/setup.cfg +0 -0
  379. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/conftest.py +0 -0
  395. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-basic.json +0 -0
  396. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  397. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  398. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  399. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  400. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/all_pass.json +0 -0
  401. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  402. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/mixed_fail.json +0 -0
  403. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  404. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  405. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/skip.json +0 -0
  406. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/playwright/truncated.json +0 -0
  407. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  408. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  409. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  410. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  411. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  412. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  413. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  414. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  415. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_acceptance.py +0 -0
  416. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_acceptance_drivers.py +0 -0
  417. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent.py +0 -0
  418. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_api_error.py +0 -0
  419. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_app.py +0 -0
  420. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_branch_base.py +0 -0
  421. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_branch_capture.py +0 -0
  422. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_config_free_1712.py +0 -0
  423. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_deploy_units_endpoint.py +0 -0
  424. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_dirty_worktree.py +0 -0
  425. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  426. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_graph_self_heal.py +0 -0
  427. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_health_h3.py +0 -0
  428. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_idle_restart.py +0 -0
  429. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_push_failure.py +0 -0
  430. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_reap.py +0 -0
  431. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_repos_and_pull.py +0 -0
  432. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_restart_services_endpoint.py +0 -0
  433. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_skills_self_heal.py +0 -0
  434. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_startup_diagnostics.py +0 -0
  435. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_update.py +0 -0
  436. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_update_bluegreen.py +0 -0
  437. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_usage_limit.py +0 -0
  438. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_agent_zero_commit.py +0 -0
  439. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ambient_home_isolation.py +0 -0
  440. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_dependency_busy_2804.py +0 -0
  441. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_reject_plan.py +0 -0
  442. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approve_usage_gate.py +0 -0
  443. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approved_work_2532.py +0 -0
  444. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_approved_work_2996.py +0 -0
  445. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_assignment_already_recorded_daemon.py +0 -0
  446. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_log.py +0 -0
  447. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_outcome.py +0 -0
  448. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_audit_query.py +0 -0
  449. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_auto_loop.py +0 -0
  450. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_auto_release_publish_2035.py +0 -0
  451. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_backend_selection.py +0 -0
  452. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_base_checkout_restore.py +0 -0
  453. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_block_log.py +0 -0
  454. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_cap_762.py +0 -0
  455. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_fixture.py +0 -0
  456. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_read_path.py +0 -0
  457. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_schema.py +0 -0
  458. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_service.py +0 -0
  459. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_state.py +0 -0
  460. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_board_wire.py +0 -0
  461. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_brain.py +0 -0
  462. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_branch_model.py +0 -0
  463. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_bug_intake.py +0 -0
  464. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_build_worker_image_env_update.py +0 -0
  465. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cargo_cache.py +0 -0
  466. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_check_gh_argv_containment.py +0 -0
  467. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_acceptance_gate_1950.py +0 -0
  468. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_fix.py +0 -0
  469. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_gitlab.py +0 -0
  470. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_parity_2091.py +0 -0
  471. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_ci_store.py +0 -0
  472. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_claim.py +0 -0
  473. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_claude_md_budget.py +0 -0
  474. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_acceptance.py +0 -0
  475. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign.py +0 -0
  476. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  477. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_interactive_remote.py +0 -0
  478. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_provider.py +0 -0
  479. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  480. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_audit.py +0 -0
  481. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_chat_continue.py +0 -0
  482. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_decide.py +0 -0
  483. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_capability_rules.py +0 -0
  484. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_config_provenance.py +0 -0
  485. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_forge_availability.py +0 -0
  486. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_graph.py +0 -0
  487. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_self.py +0 -0
  488. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_diagnose_test_coverage.py +0 -0
  489. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor.py +0 -0
  490. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_free_1801.py +0 -0
  491. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  492. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_drive.py +0 -0
  493. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_drive_queue.py +0 -0
  494. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_escalate.py +0 -0
  495. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_fix_headless_review.py +0 -0
  496. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_gate_a.py +0 -0
  497. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_install_drift.py +0 -0
  498. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_install_skills.py +0 -0
  499. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_comment.py +0 -0
  500. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_create_label.py +0 -0
  501. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_reopen.py +0 -0
  502. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_issue_view_list.py +0 -0
  503. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_merge.py +0 -0
  504. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_assign.py +0 -0
  505. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_capture.py +0 -0
  506. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_chat_add_child.py +0 -0
  507. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_dispatch.py +0 -0
  508. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_b.py +0 -0
  509. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_gate_c.py +0 -0
  510. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_order.py +0 -0
  511. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  512. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_milestone_ship.py +0 -0
  513. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_network.py +0 -0
  514. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_new_issue_chat.py +0 -0
  515. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_plans.py +0 -0
  516. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_portal.py +0 -0
  517. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_pr.py +0 -0
  518. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_pull_artifact.py +0 -0
  519. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_queue.py +0 -0
  520. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_reattach_sessions.py +0 -0
  521. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_refine_board.py +0 -0
  522. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_preflight.py +0 -0
  523. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_propagate.py +0 -0
  524. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_release_window.py +0 -0
  525. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_repo_2220.py +0 -0
  526. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  527. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_scorecard.py +0 -0
  528. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_set_review_findings.py +0 -0
  529. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_advisory_terminal.py +0 -0
  530. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_contested_tag.py +0 -0
  531. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_merge_queue.py +0 -0
  532. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_provider.py +0 -0
  533. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_review_finalizing.py +0 -0
  534. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_test_failed_tag.py +0 -0
  535. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_status_usage_limit.py +0 -0
  536. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_sync_comments_873.py +0 -0
  537. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_test_plan.py +0 -0
  538. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_track.py +0 -0
  539. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_tui_update.py +0 -0
  540. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cli_wait.py +0 -0
  541. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_client_base_install.py +0 -0
  542. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_client_resource_migration_1946.py +0 -0
  543. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_commands_common.py +0 -0
  544. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_comments.py +0 -0
  545. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_completion_summary.py +0 -0
  546. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config.py +0 -0
  547. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_acceptance.py +0 -0
  548. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_audit.py +0 -0
  549. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_pricing.py +0 -0
  550. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  551. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_config_usage_gate.py +0 -0
  552. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_confirm_test.py +0 -0
  553. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_conflict_fix.py +0 -0
  554. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_conflict_fix_semantic.py +0 -0
  555. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  556. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test.py +0 -0
  557. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  558. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_baseline.py +0 -0
  559. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_populated_home.py +0 -0
  560. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_routing.py +0 -0
  561. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_test_runner_toolchain.py +0 -0
  562. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_uat.py +0 -0
  563. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coord_web_sse_restart_live.py +0 -0
  564. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_coordinator_machine.py +0 -0
  565. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_cross_platform_imports.py +0 -0
  566. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dao.py +0 -0
  567. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard.py +0 -0
  568. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_api.py +0 -0
  569. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_fixture.py +0 -0
  570. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_terminal.py +0 -0
  571. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dashboard_terminal_live.py +0 -0
  572. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_db.py +0 -0
  573. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dead_end.py +0 -0
  574. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_decomposition_chat.py +0 -0
  575. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_db_backup.py +0 -0
  576. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_dist.py +0 -0
  577. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_coord_web_rollback.py +0 -0
  578. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_drive_queue_unit.py +0 -0
  579. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_failure_notify_unit.py +0 -0
  580. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_manifest.py +0 -0
  581. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_notify_unit.py +0 -0
  582. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_units_lane.py +0 -0
  583. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deploy_web_unit.py +0 -0
  584. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deprecation_telemetry.py +0 -0
  585. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_deps.py +0 -0
  586. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_diagnose.py +0 -0
  587. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dispatch.py +0 -0
  588. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dispatch_target_validation.py +0 -0
  589. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_dist_name.py +0 -0
  590. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_done_housekeeping.py +0 -0
  591. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive.py +0 -0
  592. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue.py +0 -0
  593. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_blocked_rendering.py +0 -0
  594. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_launch_argv.py +0 -0
  595. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  596. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_roll_pending.py +0 -0
  597. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  598. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_state.py +0 -0
  599. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_drive_tmux.py +0 -0
  600. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_capability_detection.py +0 -0
  601. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  602. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_epic_up_image_provenance.py +0 -0
  603. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_errors.py +0 -0
  604. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_events.py +0 -0
  605. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_failure_class.py +0 -0
  606. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_filelock.py +0 -0
  607. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  608. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fix_of_force_override.py +0 -0
  609. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_config_health.py +0 -0
  610. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_health_probes.py +0 -0
  611. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_health_snapshot.py +0 -0
  612. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_fleet_watchdog.py +0 -0
  613. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_forge_availability.py +0 -0
  614. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_freshness.py +0 -0
  615. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_a.py +0 -0
  616. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_b.py +0 -0
  617. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gate_snapshot_staleness.py +0 -0
  618. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gates.py +0 -0
  619. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  620. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_gen_mock_index.py +0 -0
  621. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_rust_fixture.py +0 -0
  622. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_rust_requests.py +0 -0
  623. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_generated_types_fixture.py +0 -0
  624. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_github_ops.py +0 -0
  625. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_github_throttle.py +0 -0
  626. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_goal.py +0 -0
  627. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_graph_health.py +0 -0
  628. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_graph_selfheal_absent_2237.py +0 -0
  629. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_handoff.py +0 -0
  630. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_checks.py +0 -0
  631. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_cli.py +0 -0
  632. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_cli_graph.py +0 -0
  633. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_config.py +0 -0
  634. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_context.py +0 -0
  635. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_coord_tui_ci_pin.py +0 -0
  636. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_coord_web_ci_pin.py +0 -0
  637. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_deploy_lane_facts.py +0 -0
  638. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_fix.py +0 -0
  639. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_incident_regression.py +0 -0
  640. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_issues_sync_staleness.py +0 -0
  641. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_pypi.py +0 -0
  642. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_registry.py +0 -0
  643. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_release_cordon_probe.py +0 -0
  644. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_timer_active.py +0 -0
  645. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_toolchain.py +0 -0
  646. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_unit_drift.py +0 -0
  647. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_unit_enablement.py +0 -0
  648. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_health_wedged_drive_queue.py +0 -0
  649. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_hooks.py +0 -0
  650. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_human_attended_437.py +0 -0
  651. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_init.py +0 -0
  652. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_install_agent_venv_2911.py +0 -0
  653. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_integration.py +0 -0
  654. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_briefing_echo.py +0 -0
  655. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_pane_log_2541.py +0 -0
  656. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_prefill_state.py +0 -0
  657. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_session_relaunch.py +0 -0
  658. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_test_verdict_backstop.py +0 -0
  659. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_token_attribution.py +0 -0
  660. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_interactive_worktree.py +0 -0
  661. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_issue_store_seam.py +0 -0
  662. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_issues_sync_status.py +0 -0
  663. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_liveness_auditor.py +0 -0
  664. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_liveness_notify.py +0 -0
  665. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_lock_contention_ratchet.py +0 -0
  666. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_machine_onboard.py +0 -0
  667. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_machine_pause.py +0 -0
  668. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_merge_queue.py +0 -0
  669. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_merge_verify.py +0 -0
  670. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_chat.py +0 -0
  671. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_dispatch.py +0 -0
  672. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_gate.py +0 -0
  673. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_order.py +0 -0
  674. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_milestone_seam.py +0 -0
  675. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_mock_author.py +0 -0
  676. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_model_tiering.py +0 -0
  677. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_models.py +0 -0
  678. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_models_config_labels.py +0 -0
  679. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_needs_attention.py +0 -0
  680. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_network.py +0 -0
  681. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_new_issue_chat.py +0 -0
  682. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_next_release_tag.py +0 -0
  683. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_node_shim.py +0 -0
  684. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_baseline.py +0 -0
  685. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_cli.py +0 -0
  686. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_collect.py +0 -0
  687. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_config.py +0 -0
  688. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_drive_seam.py +0 -0
  689. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_isolation.py +0 -0
  690. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_predicate.py +0 -0
  691. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_quiet_hours.py +0 -0
  692. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notifier_service.py +0 -0
  693. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notify.py +0 -0
  694. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_notify_drain.py +0 -0
  695. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_openapi.py +0 -0
  696. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_operational_defaults.py +0 -0
  697. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_overlap_fence.py +0 -0
  698. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_overlap_predict.py +0 -0
  699. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_packaged_deploy_units.py +0 -0
  700. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_parentage.py +0 -0
  701. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_paste_landed.py +0 -0
  702. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  703. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_pipeline.py +0 -0
  704. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_approve_plan_command.py +0 -0
  705. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_pr_command.py +0 -0
  706. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_followup_review_command.py +0 -0
  707. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_only.py +0 -0
  708. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_plan_parser.py +0 -0
  709. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_platform_paths.py +0 -0
  710. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_bridge.py +0 -0
  711. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_config.py +0 -0
  712. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_store.py +0 -0
  713. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_portal_sync.py +0 -0
  714. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_pr_body_lint.py +0 -0
  715. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_prereqs.py +0 -0
  716. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_production_db_guard.py +0 -0
  717. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_progress.py +0 -0
  718. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_provider_seam.py +0 -0
  719. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers.py +0 -0
  720. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers_config_labels.py +0 -0
  721. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_providers_pty.py +0 -0
  722. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_py_rust_mirror_inventory.py +0 -0
  723. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_quiet_hours.py +0 -0
  724. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_quiet_hours_store_2146.py +0 -0
  725. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reap_merged_sessions.py +0 -0
  726. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reap_stale_interactive_tick.py +0 -0
  727. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile.py +0 -0
  728. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_branch.py +0 -0
  729. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_completions.py +0 -0
  730. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  731. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_merges.py +0 -0
  732. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_no_agent_record.py +0 -0
  733. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_tick.py +0 -0
  734. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reconcile_usage_limit_done.py +0 -0
  735. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_refine_chat.py +0 -0
  736. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_2101.py +0 -0
  737. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  738. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_deadlock_2240.py +0 -0
  739. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_cordon_stuck_2490.py +0 -0
  740. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_propagate.py +0 -0
  741. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_propagate_threshold.py +0 -0
  742. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_roll_between_legs_2854.py +0 -0
  743. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_roll_window_handoff.py +0 -0
  744. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_unified_1242.py +0 -0
  745. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_verify.py +0 -0
  746. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_release_window.py +0 -0
  747. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_remote_auto_prune.py +0 -0
  748. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_remote_interactive_reaper.py +0 -0
  749. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_add.py +0 -0
  750. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_dormancy.py +0 -0
  751. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_edit_2220.py +0 -0
  752. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_graph_fleet_2237.py +0 -0
  753. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_repo_onboard_2220.py +0 -0
  754. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_report_result_push.py +0 -0
  755. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_reports.py +0 -0
  756. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry.py +0 -0
  757. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry_advisory_1606.py +0 -0
  758. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_retry_type_1636.py +0 -0
  759. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_revalidate.py +0 -0
  760. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review.py +0 -0
  761. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_end_review_without_verdict.py +0 -0
  762. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_parse_failure_diagnostic.py +0 -0
  763. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_reaffirm.py +0 -0
  764. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_state.py +0 -0
  765. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_backstop.py +0 -0
  766. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_override_audit.py +0 -0
  767. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_verdict_relay.py +0 -0
  768. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_review_zero_commits.py +0 -0
  769. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_scoped_review_wiring.py +0 -0
  770. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_scorecard.py +0 -0
  771. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_self_health.py +0 -0
  772. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve.py +0 -0
  773. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve_app_board_trim.py +0 -0
  774. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_serve_rest_routes.py +0 -0
  775. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_session.py +0 -0
  776. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_slice_issue_attribution.py +0 -0
  777. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke.py +0 -0
  778. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke_live_checkout_restore.py +0 -0
  779. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_smoke_workflow.py +0 -0
  780. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_spend_ceiling.py +0 -0
  781. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_spend_ceiling_coordinator.py +0 -0
  782. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_split.py +0 -0
  783. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_split_work.py +0 -0
  784. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_sql_dialect.py +0 -0
  785. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_sqlite_connect_ratchet.py +0 -0
  786. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stale_busy_reviewer_697.py +0 -0
  787. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stalled_pipeline.py +0 -0
  788. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_state.py +0 -0
  789. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_state_review_findings_daemon.py +0 -0
  790. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_status_fleet_footer.py +0 -0
  791. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stop_1567.py +0 -0
  792. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_store_contract.py +0 -0
  793. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_store_migrate.py +0 -0
  794. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stuck.py +0 -0
  795. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  796. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_terminal_command.py +0 -0
  797. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_author.py +0 -0
  798. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_chat.py +0 -0
  799. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_orchestrator.py +0 -0
  800. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_report.py +0 -0
  801. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_verdict_parsing.py +0 -0
  802. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_test_verdict_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_text_io_encoding_audit.py +0 -0
  804. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_board_audit.py +0 -0
  805. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_config_load_1080.py +0 -0
  806. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_thin_client_daemon_routing_906.py +0 -0
  807. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_tmux_host.py +0 -0
  808. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_tmux_session.py +0 -0
  809. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_transcript_floor.py +0 -0
  810. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage.py +0 -0
  811. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage_limits.py +0 -0
  812. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_usage_rollup.py +0 -0
  813. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_venv_live_install_2121.py +0 -0
  814. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_version_single_source.py +0 -0
  815. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_watch.py +0 -0
  816. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  817. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_env_venv_isolation.py +0 -0
  818. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_events.py +0 -0
  819. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_image_pin_sync.py +0 -0
  820. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_safety.py +0 -0
  821. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worker_test_scoping.py +0 -0
  822. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worktree.py +0 -0
  823. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  824. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/tests/test_write_parity.py +0 -0
  825. {code_coordinator-0.5.330 → code_coordinator-0.5.332}/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.330
3
+ Version: 0.5.332
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.330
3
+ Version: 0.5.332
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
@@ -91,6 +91,7 @@ coord/interactive.py
91
91
  coord/issue_store.py
92
92
  coord/issues_sync_status.py
93
93
  coord/liveness_auditor.py
94
+ coord/machine_metrics.py
94
95
  coord/machine_onboard.py
95
96
  coord/machine_pause.py
96
97
  coord/merge_queue.py
@@ -625,6 +626,7 @@ tests/test_issues_sync_status.py
625
626
  tests/test_liveness_auditor.py
626
627
  tests/test_liveness_notify.py
627
628
  tests/test_lock_contention_ratchet.py
629
+ tests/test_machine_metrics.py
628
630
  tests/test_machine_onboard.py
629
631
  tests/test_machine_pause.py
630
632
  tests/test_merge_queue.py
@@ -181,6 +181,7 @@
181
181
  "coord/issue_store.py",
182
182
  "coord/issues_sync_status.py",
183
183
  "coord/liveness_auditor.py",
184
+ "coord/machine_metrics.py",
184
185
  "coord/machine_onboard.py",
185
186
  "coord/machine_pause.py",
186
187
  "coord/merge_queue.py",
@@ -651,6 +652,7 @@
651
652
  "tests/test_liveness_auditor.py",
652
653
  "tests/test_liveness_notify.py",
653
654
  "tests/test_lock_contention_ratchet.py",
655
+ "tests/test_machine_metrics.py",
654
656
  "tests/test_machine_onboard.py",
655
657
  "tests/test_machine_pause.py",
656
658
  "tests/test_merge_queue.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.332",
3
+ "distance": 0,
4
+ "node": "g9eb084d2d068fc5fdf96e3a5de7f75bb41902679",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-01"
8
+ }
@@ -0,0 +1,217 @@
1
+ """Coordinator-side machine metrics sampler + bounded ring buffer (#3020).
2
+
3
+ Part of milestone #71 (Fleet metrics + machines API) — the backend half of
4
+ the coord-web Machines panel.
5
+
6
+ ``coord-tui`` renders CPU/mem sparklines by polling **each agent's own**
7
+ ``/metrics`` endpoint directly on port 7433 (``coord.agent_app.metrics``, a
8
+ ``psutil`` cpu/mem snapshot) and buffering samples in-process for as long as
9
+ the panel stays open (see ``coord-tui/src/app/data.rs``
10
+ ``spawn_machine_metrics``). A browser can't do that — ``coord web`` is a
11
+ single-origin HTTP client of the dashboard API, not something that can fan
12
+ out to N agent hosts — and nothing anywhere persists a series; the TUI's
13
+ ``VecDeque`` dies with the panel.
14
+
15
+ This module is the one missing thing: a coordinator-side sampler, owned by
16
+ the board daemon (``coord serve``) and driven off its existing periodic-loop
17
+ machinery (mirrors ``coord.health.fleet_snapshot.FleetHealthRefresher`` and
18
+ ``coord.gate_snapshot.GateSnapshotRefresher`` — see ``coord.serve_app``'s
19
+ ``_machine_metrics_loop``, isolated from ``_tick_loop`` for the identical
20
+ reason those two are: a fan-out HTTP GET per agent must never block, or be
21
+ blocked by, the reconcile/enqueue/drain steps).
22
+
23
+ **Bounded, not incidental (#3020).** Each machine gets its own
24
+ ``collections.deque(maxlen=...)`` ring buffer sized for a ~6h window at the
25
+ default ~15s cadence (:data:`DEFAULT_MAX_SAMPLES` = 1440) — old samples are
26
+ evicted automatically as new ones arrive; the process can never accumulate
27
+ unbounded history no matter how long the daemon stays up.
28
+
29
+ **``unknown``, never a silent gap (#1485).** A failed, timed-out, or 503
30
+ (psutil not installed) poll still appends a sample — with
31
+ ``status="unknown"`` — never nothing. A renderer building a sparkline from
32
+ this series must be able to tell "no data point" (a gap it filled in itself)
33
+ from "the daemon tried and the agent didn't answer" (an explicit unknown
34
+ sample); silently skipping the append would collapse that distinction back
35
+ into "looks the same as healthy", the exact failure mode
36
+ ``coord.health.fleet_snapshot`` already guards against for machine health.
37
+
38
+ **No persistence.** This is purely in-memory; history is lost on daemon
39
+ restart by design (a sqlite time-series was considered and deliberately
40
+ rejected for this milestone — see the issue).
41
+
42
+ **Out of scope here.** The read endpoint for this series (#A2) and putting
43
+ it on ``/board`` (explicitly rejected — every TUI client polls ``/board`` on
44
+ a short interval and ``FleetHealthSnapshot`` already carries a 256 KiB cap
45
+ for exactly this reason) are not this module's job.
46
+ """
47
+
48
+ from __future__ import annotations
49
+
50
+ import logging
51
+ import time
52
+ from collections import deque
53
+ from concurrent.futures import ThreadPoolExecutor
54
+ from dataclasses import dataclass
55
+
56
+ import httpx
57
+
58
+ from coord.network import AGENT_PORT, DEFAULT_TIMEOUT, classify_error
59
+
60
+ log = logging.getLogger("coord.serve")
61
+
62
+ # ~6h of history at the default ~15s cadence. Explicit and enforced (each
63
+ # per-machine buffer is a `deque(maxlen=...)`, not a list someone forgot to
64
+ # trim) rather than incidental.
65
+ DEFAULT_MAX_SAMPLES = 1440
66
+ DEFAULT_CADENCE_SECONDS = 15.0
67
+
68
+ STATUS_OK = "ok"
69
+ STATUS_UNKNOWN = "unknown"
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class MetricsSample:
74
+ """One machine, one point in time. ``status="unknown"`` carries no
75
+ cpu/mem values — never fabricated zeros — only a human-readable
76
+ ``reason`` for why the poll didn't produce a real reading.
77
+ """
78
+
79
+ timestamp: float
80
+ status: str # STATUS_OK | STATUS_UNKNOWN
81
+ cpu_percent: float | None = None
82
+ mem_percent: float | None = None
83
+ mem_used_mb: float | None = None
84
+ mem_total_mb: float | None = None
85
+ reason: str = ""
86
+
87
+ def to_dict(self) -> dict:
88
+ return {
89
+ "timestamp": self.timestamp,
90
+ "status": self.status,
91
+ "cpu_percent": self.cpu_percent,
92
+ "mem_percent": self.mem_percent,
93
+ "mem_used_mb": self.mem_used_mb,
94
+ "mem_total_mb": self.mem_total_mb,
95
+ "reason": self.reason,
96
+ }
97
+
98
+
99
+ def _unknown(reason: str, *, now: float | None = None) -> MetricsSample:
100
+ return MetricsSample(
101
+ timestamp=now if now is not None else time.time(),
102
+ status=STATUS_UNKNOWN,
103
+ reason=reason,
104
+ )
105
+
106
+
107
+ def fetch_metrics(machine, timeout: float = DEFAULT_TIMEOUT) -> MetricsSample: # noqa: ANN001 — coord.models.Machine
108
+ """GET one machine's agent ``/metrics`` and classify the result.
109
+
110
+ Mirrors ``coord.network.check_machine``'s error classification but
111
+ targets ``/metrics`` instead of ``/health``. Never raises: every failure
112
+ mode — connect/read timeout, DNS failure, connection refused, a non-200
113
+ status (including the documented 503 an agent returns when ``psutil``
114
+ isn't installed), and malformed/missing-field JSON — becomes an explicit
115
+ :data:`STATUS_UNKNOWN` sample rather than an exception or a dropped
116
+ point. The bounded ``timeout`` (default :data:`coord.network.
117
+ DEFAULT_TIMEOUT`, 3s) is what keeps one hanging agent from stalling this
118
+ call past that ceiling; :class:`MachineMetricsSampler.refresh` is what
119
+ keeps that bounded stall from serializing behind every other machine.
120
+ """
121
+ url = f"http://{machine.host}:{AGENT_PORT}/metrics"
122
+ try:
123
+ resp = httpx.get(url, timeout=timeout)
124
+ except Exception as e: # noqa: BLE001 — classify every network error, never raise
125
+ _, reason = classify_error(e)
126
+ return _unknown(reason)
127
+
128
+ if resp.status_code == 503:
129
+ # #207's documented shape: psutil not installed on that agent.
130
+ return _unknown("psutil not installed on agent")
131
+ if resp.status_code != 200:
132
+ return _unknown(f"HTTP {resp.status_code}")
133
+
134
+ try:
135
+ data = resp.json()
136
+ except ValueError:
137
+ return _unknown("invalid JSON from /metrics")
138
+
139
+ try:
140
+ return MetricsSample(
141
+ timestamp=time.time(),
142
+ status=STATUS_OK,
143
+ cpu_percent=float(data["cpu_percent"]),
144
+ mem_percent=float(data["mem_percent"]),
145
+ mem_used_mb=float(data["mem_used_mb"]),
146
+ mem_total_mb=float(data["mem_total_mb"]),
147
+ )
148
+ except (KeyError, TypeError, ValueError):
149
+ return _unknown("malformed /metrics payload")
150
+
151
+
152
+ class MachineMetricsSampler:
153
+ """Owns the bounded per-machine ring buffers; refreshed by the daemon tick.
154
+
155
+ ``series()``/``all_series()`` are the read path — bare in-memory reads,
156
+ no I/O, safe to call from a request handler. ``refresh(config)`` is the
157
+ only method that talks to agents and must only ever run from the
158
+ daemon's tick machinery (or a test driving it explicitly), exactly the
159
+ same split as ``coord.health.fleet_snapshot.FleetHealthRefresher``.
160
+ """
161
+
162
+ def __init__(
163
+ self,
164
+ *,
165
+ max_samples: int = DEFAULT_MAX_SAMPLES,
166
+ timeout: float = DEFAULT_TIMEOUT,
167
+ ) -> None:
168
+ if max_samples <= 0:
169
+ raise ValueError("max_samples must be positive")
170
+ self._max_samples = max_samples
171
+ self._timeout = timeout
172
+ self._buffers: dict[str, deque] = {}
173
+
174
+ def series(self, machine_name: str) -> list[dict]:
175
+ """This machine's samples, oldest first. ``[]`` if never polled."""
176
+ buf = self._buffers.get(machine_name)
177
+ return [s.to_dict() for s in buf] if buf else []
178
+
179
+ def all_series(self) -> dict[str, list[dict]]:
180
+ """Every known machine's series, oldest-first, keyed by name."""
181
+ return {name: [s.to_dict() for s in buf] for name, buf in self._buffers.items()}
182
+
183
+ def refresh(self, config) -> None: # noqa: ANN001 — coord.config.Config
184
+ """Poll every machine in ``config.machines`` once and append a sample
185
+ each — :data:`STATUS_OK` or :data:`STATUS_UNKNOWN`, never neither.
186
+
187
+ Polls concurrently (mirrors ``coord.network.check_all``): each call
188
+ is individually bounded by ``timeout``, and running them in a thread
189
+ pool rather than sequentially means one slow/hanging agent's bounded
190
+ stall does not serialize in front of the rest of the fleet's polls —
191
+ the whole ``refresh()`` call takes roughly one ``timeout``, not
192
+ ``len(machines) * timeout``, no matter which machine is the slow
193
+ one. Called off the event loop (``run_in_threadpool`` from
194
+ ``coord.serve_app``'s own loop, isolated from ``_tick_loop``) so
195
+ even that bound never touches board-read latency.
196
+ """
197
+ machines = list(getattr(config, "machines", ()) or ())
198
+ if not machines:
199
+ return
200
+
201
+ workers = min(8, len(machines))
202
+ with ThreadPoolExecutor(max_workers=workers) as pool:
203
+ samples = list(pool.map(self._poll_one, machines))
204
+
205
+ for machine, sample in zip(machines, samples):
206
+ buf = self._buffers.get(machine.name)
207
+ if buf is None:
208
+ buf = deque(maxlen=self._max_samples)
209
+ self._buffers[machine.name] = buf
210
+ buf.append(sample)
211
+
212
+ def _poll_one(self, machine) -> MetricsSample: # noqa: ANN001
213
+ try:
214
+ return fetch_metrics(machine, timeout=self._timeout)
215
+ except Exception as exc: # noqa: BLE001 — one bad machine must never abort the refresh
216
+ log.warning("machine-metrics poll: %s raised %s", machine.name, exc)
217
+ return _unknown(f"poll raised: {exc}")
@@ -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": {
@@ -5315,6 +5340,15 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
5315
5340
 
5316
5341
  _fleet_health_refresher = FleetHealthRefresher()
5317
5342
 
5343
+ # #3020: same shape again — polling every agent's own /metrics is real
5344
+ # per-machine I/O, so it runs on the tick loop's cadence
5345
+ # (`_machine_metrics_loop` below), never inline off a request handler.
5346
+ # Series live only in this sampler's bounded in-memory ring buffers; no
5347
+ # read endpoint exists yet (that's #A2) and nothing here touches /board.
5348
+ from coord.machine_metrics import MachineMetricsSampler # noqa: PLC0415
5349
+
5350
+ _machine_metrics_sampler = MachineMetricsSampler()
5351
+
5318
5352
  # Short-TTL cache for the computed /board projection so burst polls from the
5319
5353
  # TUI don't each pay the full board_projection + merge-plan + stage-projection
5320
5354
  # recomputation (~465-issue load measured in the issue). Keyed to nothing
@@ -9427,6 +9461,26 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
9427
9461
  except Exception: # noqa: BLE001 — keep serving the old snapshot
9428
9462
  log.warning("fleet-health refresh failed", exc_info=True)
9429
9463
 
9464
+ # #3020: CPU/mem sampler for the coord-web Machines panel — default
9465
+ # 15s (env COORD_METRICS_POLL_INTERVAL; 0 disables). Own loop, not a
9466
+ # `_tick_loop` step, for the identical reason as `_health_refresh_loop`
9467
+ # just above: it fans out one HTTP GET per agent and must never be
9468
+ # held up behind, or hold up, the reconcile/enqueue/drain steps.
9469
+ try:
9470
+ metrics_poll_interval = float(
9471
+ os.environ.get("COORD_METRICS_POLL_INTERVAL", "15")
9472
+ )
9473
+ except ValueError:
9474
+ metrics_poll_interval = 15.0
9475
+
9476
+ async def _machine_metrics_loop() -> None:
9477
+ while True:
9478
+ await asyncio.sleep(metrics_poll_interval)
9479
+ try:
9480
+ await run_in_threadpool(_machine_metrics_sampler.refresh, config)
9481
+ except Exception: # noqa: BLE001 — a tick must never crash the daemon
9482
+ log.warning("machine-metrics refresh failed", exc_info=True)
9483
+
9430
9484
  # #2570: the #2536 phantom-row auto-heal, run a SECOND time from
9431
9485
  # inside this long-lived process rather than relying solely on
9432
9486
  # `coord-notify.timer`'s oneshot `~/.coord-venv/bin/coord notify`
@@ -10193,12 +10247,18 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
10193
10247
  else None,
10194
10248
  "auto-revalidate",
10195
10249
  )
10250
+ machine_metrics_task = _watch(
10251
+ asyncio.create_task(_machine_metrics_loop())
10252
+ if interval > 0 and metrics_poll_interval > 0
10253
+ else None,
10254
+ "machine-metrics",
10255
+ )
10196
10256
  try:
10197
10257
  yield
10198
10258
  finally:
10199
10259
  for t in (
10200
10260
  task, gate_task, health_task, phantom_heal_task,
10201
- auto_revalidate_task,
10261
+ auto_revalidate_task, machine_metrics_task,
10202
10262
  ):
10203
10263
  if t is not None:
10204
10264
  t.cancel()
@@ -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