code-coordinator 0.5.330__tar.gz → 0.5.331__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/serve_app.py +27 -2
  5. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/stage_projection.py +198 -3
  6. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stage_projection.py +284 -0
  7. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/board.md +0 -0
  8. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/complete-session.md +0 -0
  9. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.claude/commands/coordinator.md +0 -0
  10. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/_lib.sh +0 -0
  11. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-checkout +0 -0
  12. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-commit +0 -0
  13. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.githooks/post-merge +0 -0
  14. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/coord-ci-acceptance.yml +0 -0
  16. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/publish.yml +0 -0
  18. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.github/workflows/test.yml +0 -0
  19. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/.gitignore +0 -0
  20. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/CLAUDE.md +0 -0
  21. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/GOAL.md +0 -0
  22. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/LICENSE +0 -0
  23. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/MANIFEST.in +0 -0
  24. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/README.md +0 -0
  25. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/SOURCES.txt +0 -0
  26. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/dependency_links.txt +0 -0
  27. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/entry_points.txt +0 -0
  28. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/requires.txt +0 -0
  29. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/scm_file_list.json +0 -0
  30. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/code_coordinator.egg-info/top_level.txt +0 -0
  31. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/__init__.py +0 -0
  32. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/_board_mapping.py +0 -0
  33. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/acceptance.py +0 -0
  34. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/acceptance_drivers.py +0 -0
  35. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent.py +0 -0
  36. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent_app.py +0 -0
  37. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agent_update.py +0 -0
  38. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/.gitignore +0 -0
  39. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/agents/work.md +0 -0
  40. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/agents/opencode/routing.jsonc +0 -0
  41. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/approved_work.py +0 -0
  42. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/audit.py +0 -0
  43. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/auto_loop.py +0 -0
  44. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/block_log.py +0 -0
  45. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_schema.py +0 -0
  46. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_service.py +0 -0
  47. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/board_wire.py +0 -0
  48. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/brain.py +0 -0
  49. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/branch_model.py +0 -0
  50. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/bug_intake.py +0 -0
  51. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/cargo_cache.py +0 -0
  52. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_fix.py +0 -0
  53. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_github.py +0 -0
  54. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_gitlab.py +0 -0
  55. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/ci_store.py +0 -0
  56. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/claim.py +0 -0
  57. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/cli.py +0 -0
  58. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/client.py +0 -0
  59. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/__init__.py +0 -0
  60. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/_common.py +0 -0
  61. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/acceptance.py +0 -0
  62. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/agent_ops.py +0 -0
  63. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/audit.py +0 -0
  64. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/chat.py +0 -0
  65. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/dispatch.py +0 -0
  66. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/dispatch_workers.py +0 -0
  67. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/drive.py +0 -0
  68. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/drive_queue.py +0 -0
  69. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/gate_a.py +0 -0
  70. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/gates.py +0 -0
  71. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/issues.py +0 -0
  72. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/lifecycle.py +0 -0
  73. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/machine.py +0 -0
  74. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/merge.py +0 -0
  75. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/milestone.py +0 -0
  76. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/plan_followup.py +0 -0
  77. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/plans.py +0 -0
  78. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/portal.py +0 -0
  79. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/pr.py +0 -0
  80. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/release.py +0 -0
  81. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/repo.py +0 -0
  82. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/report.py +0 -0
  83. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/review.py +0 -0
  84. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/scorecard.py +0 -0
  85. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/sessions.py +0 -0
  86. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/setup.py +0 -0
  87. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/status.py +0 -0
  88. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/store_migrate.py +0 -0
  89. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/config.py +0 -0
  94. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/config_reload.py +0 -0
  95. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/confirm_test.py +0 -0
  96. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/conflict_fix.py +0 -0
  97. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dao.py +0 -0
  98. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/__init__.py +0 -0
  99. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/fixture.py +0 -0
  100. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/index.html +0 -0
  101. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/server.py +0 -0
  102. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dashboard/terminal.py +0 -0
  103. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/db.py +0 -0
  104. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dead_end.py +0 -0
  105. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/decomposition_chat.py +0 -0
  106. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/README.md +0 -0
  107. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-agent.service +0 -0
  108. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.service +0 -0
  109. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.sh +0 -0
  110. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-db-backup.timer +0 -0
  111. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.service +0 -0
  112. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-drive-queue.timer +0 -0
  113. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-failure-notify.service +0 -0
  114. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.service +0 -0
  115. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  116. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-notify.service +0 -0
  117. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-notify.timer +0 -0
  118. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.service +0 -0
  119. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-propagate.timer +0 -0
  120. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.service +0 -0
  121. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-release-window.timer +0 -0
  122. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-serve.service +0 -0
  123. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.service +0 -0
  124. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web-dist-build.timer +0 -0
  125. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy/coord-web.service +0 -0
  126. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy_manifest.py +0 -0
  127. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deploy_units.py +0 -0
  128. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deprecation_telemetry.py +0 -0
  129. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/deps.py +0 -0
  130. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/diagnose.py +0 -0
  131. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dispatch.py +0 -0
  132. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/dist_name.py +0 -0
  133. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive.py +0 -0
  134. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive_queue.py +0 -0
  135. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/drive_state.py +0 -0
  136. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/events.py +0 -0
  137. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/failure_class.py +0 -0
  138. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/filelock.py +0 -0
  139. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/fleet_config_health.py +0 -0
  140. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/forge_availability.py +0 -0
  141. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/freshness.py +0 -0
  142. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_a.py +0 -0
  143. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_b.py +0 -0
  144. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gate_snapshot.py +0 -0
  145. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/gates.py +0 -0
  146. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/github_ops.py +0 -0
  147. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/github_throttle.py +0 -0
  148. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/goal.py +0 -0
  149. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/graph_health.py +0 -0
  150. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/__init__.py +0 -0
  151. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/aggregate.py +0 -0
  152. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/__init__.py +0 -0
  153. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/_ci_pin.py +0 -0
  154. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/agent_install.py +0 -0
  155. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/cargo_targets.py +0 -0
  156. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/claude_binary.py +0 -0
  157. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  158. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/coord_web_ci_pin.py +0 -0
  159. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/deploy_lane_facts.py +0 -0
  160. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/disk.py +0 -0
  161. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_board.py +0 -0
  162. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  163. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_phantom.py +0 -0
  164. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/fleet_unit_drift.py +0 -0
  165. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/graph.py +0 -0
  166. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/graphify_cli.py +0 -0
  167. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/index_lock.py +0 -0
  168. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/issues_sync_staleness.py +0 -0
  169. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/plan_usage.py +0 -0
  170. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/release_cordon.py +0 -0
  171. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/repo_state.py +0 -0
  172. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/spawned_coord.py +0 -0
  173. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/stalled_pipeline.py +0 -0
  174. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/timer_active.py +0 -0
  175. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/toolchain.py +0 -0
  176. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/unit_drift.py +0 -0
  177. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/unit_enablement.py +0 -0
  178. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/wedged_drive_queue.py +0 -0
  179. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/checks/worktrees.py +0 -0
  180. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/cli.py +0 -0
  181. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/context.py +0 -0
  182. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/fleet_snapshot.py +0 -0
  183. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/models.py +0 -0
  184. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/pypi.py +0 -0
  185. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/registry.py +0 -0
  186. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/render.py +0 -0
  187. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/health/units.py +0 -0
  188. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/hooks.py +0 -0
  189. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/housekeeping.py +0 -0
  190. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/interactive.py +0 -0
  191. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/issue_store.py +0 -0
  192. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/issues_sync_status.py +0 -0
  193. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/liveness_auditor.py +0 -0
  194. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/machine_onboard.py +0 -0
  195. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/machine_pause.py +0 -0
  196. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/merge_queue.py +0 -0
  197. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_chat.py +0 -0
  198. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_dispatch.py +0 -0
  199. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_gate.py +0 -0
  200. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/milestone_order.py +0 -0
  201. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/mock_author.py +0 -0
  202. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/models.py +0 -0
  203. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/network.py +0 -0
  204. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/new_issue_chat.py +0 -0
  205. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/__init__.py +0 -0
  206. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/baseline.py +0 -0
  207. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/cli.py +0 -0
  208. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/collect.py +0 -0
  209. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/digest.py +0 -0
  210. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/models.py +0 -0
  211. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/predicate.py +0 -0
  212. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/service.py +0 -0
  213. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/store.py +0 -0
  214. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notifier/transport.py +0 -0
  215. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/notify.py +0 -0
  216. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/openapi.py +0 -0
  217. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/overlap_fence.py +0 -0
  218. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/overlap_predict.py +0 -0
  219. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/parentage.py +0 -0
  220. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/parentage_github.py +0 -0
  221. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/pipeline.py +0 -0
  222. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/plan_parser.py +0 -0
  223. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/plans.py +0 -0
  224. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/platform_paths.py +0 -0
  225. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_bridge.py +0 -0
  226. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_store.py +0 -0
  227. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/portal_sync.py +0 -0
  228. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/pr_body_lint.py +0 -0
  229. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/prereqs.py +0 -0
  230. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/progress.py +0 -0
  231. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/__init__.py +0 -0
  232. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/base.py +0 -0
  233. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/claude.py +0 -0
  234. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/claude_pty.py +0 -0
  235. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/providers/opencode.py +0 -0
  236. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/queue_diagnose.py +0 -0
  237. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reconcile.py +0 -0
  238. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reconcile_tick.py +0 -0
  239. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/refine_chat.py +0 -0
  240. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_cordon.py +0 -0
  241. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_propagate.py +0 -0
  242. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_verify.py +0 -0
  243. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/release_window.py +0 -0
  244. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_dormancy.py +0 -0
  245. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_edit.py +0 -0
  246. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/repo_onboard.py +0 -0
  247. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/reports.py +0 -0
  248. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/rest_schema.py +0 -0
  249. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/revalidate.py +0 -0
  250. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/review.py +0 -0
  251. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/scorecard.py +0 -0
  252. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/self_health.py +0 -0
  253. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  254. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  255. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  256. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  257. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  258. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/portal-followup/SKILL.md +0 -0
  259. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/release-now/SKILL.md +0 -0
  260. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  261. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  262. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/skills/update-issue/SKILL.md +0 -0
  263. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/smoke.py +0 -0
  264. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/spend_ceiling.py +0 -0
  265. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/split_work.py +0 -0
  266. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/sql.py +0 -0
  267. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/state.py +0 -0
  268. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/store_migrate.py +0 -0
  269. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_author.py +0 -0
  270. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_chat.py +0 -0
  271. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_orchestrator.py +0 -0
  272. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/test_report.py +0 -0
  273. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/tui_release.py +0 -0
  274. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage.py +0 -0
  275. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage_limits.py +0 -0
  276. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/usage_rollup.py +0 -0
  277. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coord/worker_events.py +0 -0
  278. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/coordinator.example.yml +0 -0
  279. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-agent.service +0 -0
  280. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.service +0 -0
  281. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.sh +0 -0
  282. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-db-backup.timer +0 -0
  283. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-drive-queue.service +0 -0
  284. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-drive-queue.timer +0 -0
  285. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-failure-notify.service +0 -0
  286. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-failure-notify.sh +0 -0
  287. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.service +0 -0
  288. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-fleet-watchdog.timer +0 -0
  289. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-notify.service +0 -0
  290. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-notify.timer +0 -0
  291. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-propagate.service +0 -0
  292. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-propagate.timer +0 -0
  293. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-window.service +0 -0
  294. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-release-window.timer +0 -0
  295. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-serve.service +0 -0
  296. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.service +0 -0
  297. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.sh +0 -0
  298. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-dist-build.timer +0 -0
  299. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web-rollback.sh +0 -0
  300. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/coord-web.service +0 -0
  301. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/deploy/node-shim.sh +0 -0
  302. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_TUI_CI.md +0 -0
  303. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  304. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_CI.md +0 -0
  305. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_COORD_WEB_DIST.md +0 -0
  306. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  307. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/AGENT_OPERATIONS.md +0 -0
  308. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ARCHITECTURE.md +0 -0
  309. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ARCH_SECURITY_GATES.md +0 -0
  310. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/COCKPIT.md +0 -0
  311. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CONTROL_CENTER.md +0 -0
  312. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/COST_DISCIPLINE.md +0 -0
  313. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CROSS_PLATFORM.md +0 -0
  314. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CUSTOMER_FACING_APPS.md +0 -0
  315. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/CUSTOMER_PORTAL.md +0 -0
  316. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/DRIVE_QUEUE.md +0 -0
  317. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/EPHEMERAL_WORKERS.md +0 -0
  318. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/FORGE_MIGRATION.md +0 -0
  319. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/GRAPHIFY_SETUP.md +0 -0
  320. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ISSUE_GUIDANCE.md +0 -0
  321. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/MAC_MINI.md +0 -0
  322. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  323. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/NOTIFIER.md +0 -0
  324. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPENCODE_VERIFICATION.md +0 -0
  325. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPERATING_GOTCHAS.md +0 -0
  326. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/OPERATOR_GUIDES.md +0 -0
  327. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/ORACLE_LOOP.md +0 -0
  328. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PHONE_WEBAPP.md +0 -0
  329. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PIPELINE_V2.md +0 -0
  330. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/PLATFORM_EVOLUTION.md +0 -0
  331. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/SECOND_BACKEND.md +0 -0
  332. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/STORE_SERVICE.md +0 -0
  333. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  334. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/WEB_CONTROL_CENTER.md +0 -0
  335. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/WSL_WINDOWS_WORKER.md +0 -0
  336. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/README.md +0 -0
  337. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/_tokens.css +0 -0
  338. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/issue-detail.html +0 -0
  339. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-narrow.html +0 -0
  340. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/docs/mocks/web/pipeline-wide.html +0 -0
  341. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/graphify-out/.gitignore +0 -0
  342. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/install-agent.sh +0 -0
  343. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/pyproject.toml +0 -0
  344. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/audit_review_verdict_overrides.py +0 -0
  345. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  346. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/build-worker-image.sh +0 -0
  347. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/coordinator-machine.py +0 -0
  348. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/epic-down.sh +0 -0
  349. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/epic-up.sh +0 -0
  350. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/preflight.sh +0 -0
  351. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/provision-worker.sh +0 -0
  352. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  353. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  354. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/azure-workers/verify-github-token.sh +0 -0
  355. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/check_gh_argv_containment.py +0 -0
  356. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/codegen.py +0 -0
  357. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-test-runner.sh +0 -0
  358. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  359. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  360. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  361. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  362. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/coord-venv-rollback.sh +0 -0
  363. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/drive-batch.sh +0 -0
  364. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/extract-coord-tui.sh +0 -0
  365. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/fleet_watchdog.py +0 -0
  366. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/gen_board_fixture.py +0 -0
  367. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/gen_mock_index.py +0 -0
  368. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/next_release_tag.py +0 -0
  369. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/run_tests_in_populated_home.sh +0 -0
  370. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/run_tests_without_gh.sh +0 -0
  371. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/smoke_437_interactive.py +0 -0
  372. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_878_review_capture.py +0 -0
  373. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_release_published.py +0 -0
  374. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/scripts/verify_release_wheel.py +0 -0
  375. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/setup.cfg +0 -0
  376. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/SMOKE_SET.md +0 -0
  377. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/__init__.py +0 -0
  378. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/conftest.py +0 -0
  379. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/contract.md +0 -0
  380. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/manifest.yml +0 -0
  381. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  382. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  383. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/contract.md +0 -0
  384. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  385. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  386. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/manifest.yml +0 -0
  387. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  388. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-51/tsconfig.json +0 -0
  389. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  390. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/backends.py +0 -0
  391. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/conftest.py +0 -0
  392. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-basic.json +0 -0
  393. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  394. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  395. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  396. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  397. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/all_pass.json +0 -0
  398. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  399. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/mixed_fail.json +0 -0
  400. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  401. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  402. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/skip.json +0 -0
  403. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/playwright/truncated.json +0 -0
  404. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  405. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  406. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  407. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  408. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  409. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  410. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  411. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  412. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_acceptance.py +0 -0
  413. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_acceptance_drivers.py +0 -0
  414. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent.py +0 -0
  415. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_api_error.py +0 -0
  416. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_app.py +0 -0
  417. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_branch_base.py +0 -0
  418. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_branch_capture.py +0 -0
  419. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_config_free_1712.py +0 -0
  420. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_deploy_units_endpoint.py +0 -0
  421. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_dirty_worktree.py +0 -0
  422. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  423. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_graph_self_heal.py +0 -0
  424. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_health_h3.py +0 -0
  425. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_idle_restart.py +0 -0
  426. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_push_failure.py +0 -0
  427. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_reap.py +0 -0
  428. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_repos_and_pull.py +0 -0
  429. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_restart_services_endpoint.py +0 -0
  430. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_skills_self_heal.py +0 -0
  431. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_startup_diagnostics.py +0 -0
  432. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_update.py +0 -0
  433. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_update_bluegreen.py +0 -0
  434. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_usage_limit.py +0 -0
  435. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_agent_zero_commit.py +0 -0
  436. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ambient_home_isolation.py +0 -0
  437. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_dependency_busy_2804.py +0 -0
  438. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_reject_plan.py +0 -0
  439. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approve_usage_gate.py +0 -0
  440. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approved_work_2532.py +0 -0
  441. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_approved_work_2996.py +0 -0
  442. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_assignment_already_recorded_daemon.py +0 -0
  443. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_log.py +0 -0
  444. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_outcome.py +0 -0
  445. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_audit_query.py +0 -0
  446. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_auto_loop.py +0 -0
  447. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_auto_release_publish_2035.py +0 -0
  448. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_backend_selection.py +0 -0
  449. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_base_checkout_restore.py +0 -0
  450. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_block_log.py +0 -0
  451. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_cap_762.py +0 -0
  452. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_fixture.py +0 -0
  453. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_read_path.py +0 -0
  454. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_schema.py +0 -0
  455. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_service.py +0 -0
  456. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_state.py +0 -0
  457. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_board_wire.py +0 -0
  458. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_brain.py +0 -0
  459. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_branch_model.py +0 -0
  460. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_bug_intake.py +0 -0
  461. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_build_worker_image_env_update.py +0 -0
  462. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cargo_cache.py +0 -0
  463. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_check_gh_argv_containment.py +0 -0
  464. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_acceptance_gate_1950.py +0 -0
  465. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_fix.py +0 -0
  466. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_gitlab.py +0 -0
  467. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_parity_2091.py +0 -0
  468. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_ci_store.py +0 -0
  469. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_claim.py +0 -0
  470. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_claude_md_budget.py +0 -0
  471. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_acceptance.py +0 -0
  472. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign.py +0 -0
  473. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  474. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_interactive_remote.py +0 -0
  475. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_provider.py +0 -0
  476. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  477. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_audit.py +0 -0
  478. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_chat_continue.py +0 -0
  479. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_decide.py +0 -0
  480. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_capability_rules.py +0 -0
  481. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_config_provenance.py +0 -0
  482. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_forge_availability.py +0 -0
  483. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_graph.py +0 -0
  484. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_self.py +0 -0
  485. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_diagnose_test_coverage.py +0 -0
  486. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor.py +0 -0
  487. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_free_1801.py +0 -0
  488. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  489. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_drive.py +0 -0
  490. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_drive_queue.py +0 -0
  491. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_escalate.py +0 -0
  492. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_fix_headless_review.py +0 -0
  493. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_gate_a.py +0 -0
  494. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_install_drift.py +0 -0
  495. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_install_skills.py +0 -0
  496. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_comment.py +0 -0
  497. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_create_label.py +0 -0
  498. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_reopen.py +0 -0
  499. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_issue_view_list.py +0 -0
  500. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_merge.py +0 -0
  501. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_assign.py +0 -0
  502. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_capture.py +0 -0
  503. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_chat_add_child.py +0 -0
  504. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_dispatch.py +0 -0
  505. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_b.py +0 -0
  506. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_gate_c.py +0 -0
  507. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_order.py +0 -0
  508. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  509. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_milestone_ship.py +0 -0
  510. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_network.py +0 -0
  511. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_new_issue_chat.py +0 -0
  512. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_plans.py +0 -0
  513. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_portal.py +0 -0
  514. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_pr.py +0 -0
  515. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_pull_artifact.py +0 -0
  516. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_queue.py +0 -0
  517. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_reattach_sessions.py +0 -0
  518. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_refine_board.py +0 -0
  519. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_preflight.py +0 -0
  520. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_propagate.py +0 -0
  521. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_release_window.py +0 -0
  522. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_repo_2220.py +0 -0
  523. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  524. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_scorecard.py +0 -0
  525. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_set_review_findings.py +0 -0
  526. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_advisory_terminal.py +0 -0
  527. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_contested_tag.py +0 -0
  528. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_merge_queue.py +0 -0
  529. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_provider.py +0 -0
  530. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_review_finalizing.py +0 -0
  531. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_test_failed_tag.py +0 -0
  532. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_status_usage_limit.py +0 -0
  533. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_sync_comments_873.py +0 -0
  534. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_test_plan.py +0 -0
  535. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_track.py +0 -0
  536. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_tui_update.py +0 -0
  537. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cli_wait.py +0 -0
  538. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_client_base_install.py +0 -0
  539. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_client_resource_migration_1946.py +0 -0
  540. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_commands_common.py +0 -0
  541. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_comments.py +0 -0
  542. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_completion_summary.py +0 -0
  543. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config.py +0 -0
  544. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_acceptance.py +0 -0
  545. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_audit.py +0 -0
  546. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_pricing.py +0 -0
  547. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  548. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_config_usage_gate.py +0 -0
  549. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_confirm_test.py +0 -0
  550. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_conflict_fix.py +0 -0
  551. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_conflict_fix_semantic.py +0 -0
  552. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  553. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test.py +0 -0
  554. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  555. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_baseline.py +0 -0
  556. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_populated_home.py +0 -0
  557. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_routing.py +0 -0
  558. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_test_runner_toolchain.py +0 -0
  559. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_uat.py +0 -0
  560. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coord_web_sse_restart_live.py +0 -0
  561. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_coordinator_machine.py +0 -0
  562. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_cross_platform_imports.py +0 -0
  563. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dao.py +0 -0
  564. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard.py +0 -0
  565. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_api.py +0 -0
  566. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_fixture.py +0 -0
  567. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_terminal.py +0 -0
  568. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dashboard_terminal_live.py +0 -0
  569. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_db.py +0 -0
  570. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dead_end.py +0 -0
  571. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_decomposition_chat.py +0 -0
  572. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_db_backup.py +0 -0
  573. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_dist.py +0 -0
  574. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_coord_web_rollback.py +0 -0
  575. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_drive_queue_unit.py +0 -0
  576. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_failure_notify_unit.py +0 -0
  577. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_manifest.py +0 -0
  578. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_notify_unit.py +0 -0
  579. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_units_lane.py +0 -0
  580. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deploy_web_unit.py +0 -0
  581. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deprecation_telemetry.py +0 -0
  582. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_deps.py +0 -0
  583. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_diagnose.py +0 -0
  584. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dispatch.py +0 -0
  585. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dispatch_target_validation.py +0 -0
  586. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_dist_name.py +0 -0
  587. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_done_housekeeping.py +0 -0
  588. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive.py +0 -0
  589. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue.py +0 -0
  590. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_blocked_rendering.py +0 -0
  591. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_launch_argv.py +0 -0
  592. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  593. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_roll_pending.py +0 -0
  594. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  595. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_state.py +0 -0
  596. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_drive_tmux.py +0 -0
  597. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_capability_detection.py +0 -0
  598. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  599. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_epic_up_image_provenance.py +0 -0
  600. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_errors.py +0 -0
  601. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_events.py +0 -0
  602. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_failure_class.py +0 -0
  603. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_filelock.py +0 -0
  604. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  605. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fix_of_force_override.py +0 -0
  606. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_config_health.py +0 -0
  607. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_health_probes.py +0 -0
  608. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_health_snapshot.py +0 -0
  609. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_fleet_watchdog.py +0 -0
  610. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_forge_availability.py +0 -0
  611. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_freshness.py +0 -0
  612. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_a.py +0 -0
  613. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_b.py +0 -0
  614. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gate_snapshot_staleness.py +0 -0
  615. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gates.py +0 -0
  616. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  617. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_gen_mock_index.py +0 -0
  618. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_rust_fixture.py +0 -0
  619. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_rust_requests.py +0 -0
  620. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_github_throttle.py +0 -0
  623. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_graph_selfheal_absent_2237.py +0 -0
  626. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_coord_tui_ci_pin.py +0 -0
  633. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_coord_web_ci_pin.py +0 -0
  634. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_deploy_lane_facts.py +0 -0
  635. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_fix.py +0 -0
  636. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_incident_regression.py +0 -0
  637. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_issues_sync_staleness.py +0 -0
  638. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_pypi.py +0 -0
  639. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_registry.py +0 -0
  640. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_release_cordon_probe.py +0 -0
  641. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_timer_active.py +0 -0
  642. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_toolchain.py +0 -0
  643. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_unit_drift.py +0 -0
  644. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_unit_enablement.py +0 -0
  645. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_health_wedged_drive_queue.py +0 -0
  646. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_install_agent_venv_2911.py +0 -0
  650. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_pane_log_2541.py +0 -0
  653. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_issues_sync_status.py +0 -0
  660. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_lock_contention_ratchet.py +0 -0
  663. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_machine_onboard.py +0 -0
  664. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_no_agent_record.py +0 -0
  730. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_tick.py +0 -0
  731. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_cordon_stuck_2490.py +0 -0
  737. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_propagate.py +0 -0
  738. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_propagate_threshold.py +0 -0
  739. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_roll_between_legs_2854.py +0 -0
  740. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_roll_window_handoff.py +0 -0
  741. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_dormancy.py +0 -0
  748. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_self_health.py +0 -0
  769. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve.py +0 -0
  770. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve_app_board_trim.py +0 -0
  771. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_serve_rest_routes.py +0 -0
  772. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_sql_dialect.py +0 -0
  782. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_sqlite_connect_ratchet.py +0 -0
  783. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stale_busy_reviewer_697.py +0 -0
  784. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stalled_pipeline.py +0 -0
  785. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_state.py +0 -0
  786. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_state_review_findings_daemon.py +0 -0
  787. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_status_fleet_footer.py +0 -0
  788. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stop_1567.py +0 -0
  789. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_store_contract.py +0 -0
  790. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_store_migrate.py +0 -0
  791. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stuck.py +0 -0
  792. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  793. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_text_io_encoding_audit.py +0 -0
  801. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_board_audit.py +0 -0
  802. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_config_load_1080.py +0 -0
  803. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_thin_client_daemon_routing_906.py +0 -0
  804. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_tmux_host.py +0 -0
  805. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_tmux_session.py +0 -0
  806. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage.py +0 -0
  808. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage_limits.py +0 -0
  809. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_usage_rollup.py +0 -0
  810. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_venv_live_install_2121.py +0 -0
  811. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_version_single_source.py +0 -0
  812. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_watch.py +0 -0
  813. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  814. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_env_venv_isolation.py +0 -0
  815. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/test_write_parity.py +0 -0
  822. {code_coordinator-0.5.330 → code_coordinator-0.5.331}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.330
3
+ Version: 0.5.331
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.330
3
+ Version: 0.5.331
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.330",
2
+ "tag": "0.5.331",
3
3
  "distance": 0,
4
- "node": "g1b5009cd9bd233460972d0e1bfca11135eb4058b",
4
+ "node": "g73f327b8112ca3cfc50ce512371659afb1a4c411",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -2547,7 +2547,8 @@ def _board_response_schema(components: dict) -> dict:
2547
2547
  "#550: server-computed per-issue stage/gate badges "
2548
2548
  "(work/review/smoke/test/merge status, has_approved_review) — "
2549
2549
  "generalizes the #776/#778 pattern so coord-tui's "
2550
- "pipeline.rs stops re-deriving this from raw rows"
2550
+ "pipeline.rs stops re-deriving this from raw rows. #3013 adds "
2551
+ "a per-stage leg count (`stage_counts`) alongside the status."
2551
2552
  ),
2552
2553
  "items": {
2553
2554
  "type": "object",
@@ -2560,6 +2561,24 @@ def _board_response_schema(components: dict) -> dict:
2560
2561
  "description": "stage name -> pending|active|done|failed|stale|skipped",
2561
2562
  "additionalProperties": {"type": "string"},
2562
2563
  },
2564
+ "stage_counts": {
2565
+ "type": "object",
2566
+ "description": (
2567
+ "#3013: stage name -> count of separate dispatched "
2568
+ "legs at that stage (e.g. a stage re-dispatched 4 "
2569
+ "times reads 4, not 1) — lets a client render "
2570
+ "'Work (2)' / 'Review (5)' and suppress the suffix "
2571
+ "at 1. Same key set as `stages` (including "
2572
+ "`acceptance`). Caveat: `merge` uses a different "
2573
+ "convention from every other key — it counts "
2574
+ "conflict-fix RETRIES (0 for a clean single merge, "
2575
+ "not 1 for 'one attempt happened'), so a uniform "
2576
+ "'suppress at <= 1' rule will also suppress a "
2577
+ "single conflict-fix retry, which is usually the "
2578
+ "most useful count to surface."
2579
+ ),
2580
+ "additionalProperties": {"type": "integer"},
2581
+ },
2563
2582
  "has_approved_review": {"type": "boolean"},
2564
2583
  "uat_preview_url": {
2565
2584
  "type": ["string", "null"],
@@ -2571,7 +2590,13 @@ def _board_response_schema(components: dict) -> dict:
2571
2590
  ),
2572
2591
  },
2573
2592
  },
2574
- "required": ["repo_name", "issue_number", "stages", "has_approved_review"],
2593
+ "required": [
2594
+ "repo_name",
2595
+ "issue_number",
2596
+ "stages",
2597
+ "stage_counts",
2598
+ "has_approved_review",
2599
+ ],
2575
2600
  },
2576
2601
  },
2577
2602
  "plan_roster": {
@@ -31,9 +31,10 @@ plain values — no I/O, no side effects.
31
31
 
32
32
  from __future__ import annotations
33
33
 
34
+ import dataclasses
34
35
  from typing import Any, Protocol, runtime_checkable
35
36
 
36
- from coord.models import CLOSES_ISSUE_TYPES
37
+ from coord.models import CLOSES_ISSUE_TYPES, WORK_LIKE_TYPES, effective_issue_number
37
38
 
38
39
  # ── Stage-status vocabulary — mirrors tui/src/app/pipeline.rs::StageStatus ──
39
40
  PENDING = "pending"
@@ -172,6 +173,102 @@ def assignments_for_stage(
172
173
  return out
173
174
 
174
175
 
176
+ def _leg_count_for_stage(
177
+ assignments_for_issue: list,
178
+ stage: str,
179
+ *,
180
+ require_plan: bool,
181
+ ) -> int:
182
+ """How many separate dispatched attempts ("legs") this issue has had at
183
+ *stage* (#3013) — "attempts a human would recognise as separate", not a
184
+ raw row count. Each retry/redispatch is already its own board row (a
185
+ retry dispatches a fresh assignment id rather than mutating the failed
186
+ one, see ``coord.reconcile._reassign``), so counting rows already gives
187
+ the right number for stages backed by their own dedicated assignment
188
+ ``type`` — this only needs to special-case the stages that aren't:
189
+
190
+ * ``"work"`` is widened from a literal ``type == "work"`` (plus the
191
+ existing plan-fold) to the full :data:`WORK_LIKE_TYPES` — an
192
+ oracle-loop acceptance slice's repeated ``test-author``/``mock-author``
193
+ legs (#3013's coord-portal#164 example: 4 ``test-author`` legs, 5
194
+ ``review`` legs on one branch) are exactly the kind of repetition this
195
+ field exists to surface, and a strict ``type == "work"`` match would
196
+ never see them.
197
+ * ``"test"`` has no ``type="test"`` assignment — the Test-stage's
198
+ dispatched worker is ``type="smoke"`` (``coord.smoke``).
199
+ * ``"merge"`` has no ``type="merge"`` assignment either — repeated
200
+ landing attempts show up as ``type="conflict-fix"`` legs (#241). Note
201
+ the counting convention this implies differs from every other stage:
202
+ a clean single merge with no conflict reports ``0`` (no *retry* was
203
+ needed), whereas one ordinary ``"work"``/``"review"``/``"test"`` leg
204
+ reports ``1`` (one attempt happened). A client applying one uniform
205
+ "suppress the number at <= 1" rule across every stage — as the
206
+ ``/board`` schema description implies — will suppress a single
207
+ conflict-fix leg (``count == 1``, arguably the most useful case to
208
+ surface: "this needed a rebase") exactly like "no problem at all". No
209
+ code path here can distinguish the two without a wire-schema change,
210
+ so this is flagged for the client rather than fixed on this side.
211
+ * ``"acceptance"`` (review fix, #3013) has no dedicated assignment type
212
+ either — like ``test_state``/``uat_state``, ``acceptance_state`` is
213
+ stamped directly onto the ``type="work"`` row a
214
+ ``coord acceptance record`` verdict belongs to (see
215
+ :func:`acceptance_stage_status_for`, which reads the same rows), so a
216
+ generic ``assignments_for_stage(..., "acceptance", ...)`` scan would
217
+ always return zero.
218
+
219
+ Every other stage (``"plan"``, ``"review"``, ``"uat"``, ...) already has
220
+ a 1:1 assignment ``type``, so :func:`assignments_for_stage` alone gives
221
+ the right count.
222
+ """
223
+ if stage == "work":
224
+ matching = assignments_for_stage(assignments_for_issue, "work", require_plan=require_plan)
225
+ seen = {id(a) for a in matching}
226
+ extra = [
227
+ a
228
+ for a in assignments_for_issue
229
+ if id(a) not in seen and (a.type or "work") in WORK_LIKE_TYPES
230
+ ]
231
+ return len(matching) + len(extra)
232
+ if stage == "test":
233
+ return sum(1 for a in assignments_for_issue if (a.type or "work") == "smoke")
234
+ if stage == "merge":
235
+ return sum(1 for a in assignments_for_issue if (a.type or "work") == "conflict-fix")
236
+ if stage == "acceptance":
237
+ return sum(
238
+ 1
239
+ for a in assignments_for_issue
240
+ if (a.type or "work") == "work" and (a.acceptance_state or "") != ""
241
+ )
242
+ return len(assignments_for_stage(assignments_for_issue, stage, require_plan=require_plan))
243
+
244
+
245
+ def _widen_work_like_types(assignments: list) -> list:
246
+ """Return *assignments* with every :data:`WORK_LIKE_TYPES` row (#3013:
247
+ ``mock-author``/``test-author``, not just literal ``type="work"``)
248
+ presented as ``type="work"`` to the generic per-stage dispatcher
249
+ (:func:`stage_status_for`, :func:`assignments_for_stage`,
250
+ :func:`acceptance_stage_status_for`, ...), all of which key strictly off
251
+ ``a.type``.
252
+
253
+ Used ONLY by :func:`compute_board_stage_projection`'s phantom-entry
254
+ fallback (see that function's docstring) — without it, a slice whose
255
+ only rows are ``test-author``/``mock-author`` legs got
256
+ ``stage_counts["work"] == 4`` (via :func:`_leg_count_for_stage`, which
257
+ already widens the same way) sitting next to ``stages["work"] ==
258
+ "pending"`` forever, since the strict-``type`` dispatcher never
259
+ recognised those rows as "work" activity. Every other field (status,
260
+ dispatched_at, test_state, acceptance_state, ...) is preserved
261
+ unchanged — this only relabels the ``type`` a downstream ``==`` check
262
+ sees.
263
+ """
264
+ out = []
265
+ for a in assignments:
266
+ t = a.type or "work"
267
+ widen = t in WORK_LIKE_TYPES and t != "work"
268
+ out.append(dataclasses.replace(a, type="work") if widen else a)
269
+ return out
270
+
271
+
175
272
  def upstream_max_dispatched_at(
176
273
  assignments_for_issue: list,
177
274
  stage: str,
@@ -698,6 +795,7 @@ def compute_issue_projection(
698
795
  ci_store: Any | None = None,
699
796
  uat_enabled: bool = False,
700
797
  uat_preview_url: str | None = None,
798
+ stage_count_assignments: list | None = None,
701
799
  ) -> dict[str, Any]:
702
800
  """Compute the full per-issue stage badge dict.
703
801
 
@@ -717,6 +815,15 @@ def compute_issue_projection(
717
815
  carried through unconditionally so a caller can show it next to the
718
816
  badge instead of sending the operator to ``coord merge``'s refusal
719
817
  message to find it (#2951 item 3).
818
+
819
+ ``stage_count_assignments`` (#3013) is the assignment list
820
+ :func:`_leg_count_for_stage` scans to fill ``stage_counts`` — a client
821
+ can then render ``Work (2)`` / ``Review (5)`` next to the status badge
822
+ and suppress the suffix at 1. Defaults to *assignments_for_issue* (the
823
+ same list ``stages`` uses) when omitted, which is correct for an
824
+ ordinary issue; :func:`compute_board_stage_projection` passes a
825
+ separately-keyed list for the #1553 oracle-loop epic/slice case — see
826
+ that function's docstring.
720
827
  """
721
828
  names = issue_stage_names(assignments_for_issue, default_gates, uat_enabled=uat_enabled)
722
829
  stages: dict[str, str] = {}
@@ -741,8 +848,29 @@ def compute_issue_projection(
741
848
  # excluded from the per-issue stage-strip ordering that `default_gates`
742
849
  # drives, since it only applies to oracle-loop milestones.
743
850
  stages["acceptance"] = acceptance_stage_status_for(assignments_for_issue)
851
+
852
+ count_source = (
853
+ assignments_for_issue if stage_count_assignments is None else stage_count_assignments
854
+ )
855
+ stage_counts: dict[str, int] = {
856
+ name: _leg_count_for_stage(count_source, name, require_plan=require_plan) for name in names
857
+ }
858
+ stage_counts.setdefault(
859
+ "merge", _leg_count_for_stage(count_source, "merge", require_plan=require_plan)
860
+ )
861
+ # Review fix (#3013): `stages` always carries "acceptance" (added
862
+ # unconditionally above, outside `names`/`default_gates`), but
863
+ # `stage_counts` was built only from `names` plus an explicit "merge"
864
+ # fallback — so it silently dropped "acceptance", contradicting the
865
+ # `/board` schema's documented "same key set as `stages`" guarantee
866
+ # (coord/serve_app.py) and leaving a client that indexes `stage_counts`
867
+ # by every key in `stages` with a plain `KeyError`.
868
+ stage_counts.setdefault(
869
+ "acceptance", _leg_count_for_stage(count_source, "acceptance", require_plan=require_plan)
870
+ )
744
871
  return {
745
872
  "stages": stages,
873
+ "stage_counts": stage_counts,
746
874
  "acceptance_progress": acceptance_progress_for(assignments_for_issue),
747
875
  "uat_preview_url": uat_preview_url if uat_enabled else None,
748
876
  "has_approved_review": issue_has_any_approved_review(
@@ -779,6 +907,44 @@ def compute_board_stage_projection(
779
907
  ``None`` (the default — e.g. a caller with no config loaded) means no
780
908
  repo is treated as opted in, matching :func:`pipeline_stage_names`'s own
781
909
  fail-toward-hidden default.
910
+
911
+ ``stage_counts`` (#3013) is deliberately built from a SECOND index keyed
912
+ by ``coord.models.effective_issue_number`` rather than the raw
913
+ ``assignments_by_key`` below: an oracle-loop acceptance slice's
914
+ ``test-author``/``mock-author``/``review`` legs are booked
915
+ (``issue_number``) to the milestone's *tracking* issue, with the child
916
+ they're actually FOR named in ``for_issue_number`` (see
917
+ ``coord gates <repo> <slice>``, which resolves the same way). Reusing
918
+ ``assignments_by_key`` for the count would leave a slice's own
919
+ ``stage_counts`` reading 0 forever — the same keying trap noted in the
920
+ #3013 issue's "drive-queue sweep bug" reference. For an issue that ALSO
921
+ has its own raw-keyed rows, this does NOT touch ``stages``: that stays
922
+ keyed on the raw ``issue_number`` on purpose (#1652 — re-attributing
923
+ status by ``for_issue_number`` moved a false "merged" green from the
924
+ epic onto a child that already had its own, separately-tracked state; a
925
+ leg *count* carries no such false-green risk, so the two fields are
926
+ allowed to disagree on which issue owns which rows in that case).
927
+
928
+ Review fix (#3013): a *phantom* entry — ANY key whose raw-keyed
929
+ assignment list is empty, whether it exists in ``issues`` with no
930
+ assignments of its own (the coord-portal#164 test below: the slice IS
931
+ already synced, but every one of its legs is booked to the tracking
932
+ issue) or exists ONLY via the effective-key union (never synced at all:
933
+ not yet caught up by ``_sync_issues_tick``, or a closed slice pruned
934
+ from ``issues`` after 7 days while assignment retention runs 14, see
935
+ ``coord/state.py``) — has nothing raw-keyed to protect from the #1652
936
+ clobber, because there IS no separately-tracked state for it to
937
+ conflict with. Rendering ``stages`` from the empty raw list anyway
938
+ produced a self-contradictory row: every stage PENDING (acceptance
939
+ SKIPPED) right next to a ``stage_counts`` proving real legs ran. So for
940
+ that case only, ``stages``/``acceptance``/``has_approved_review`` fall
941
+ back to the same effective-keyed list ``stage_counts`` already uses,
942
+ widened through :func:`_widen_work_like_types` so a `test-author`/
943
+ `mock-author` leg registers as "work" activity to the generic
944
+ per-stage dispatcher — see the ``projection_assignments`` fallback
945
+ below. ``issue_title`` still reads ``""`` for a phantom entry that
946
+ isn't itself in ``issues`` (genuinely unknown — not fabricated from the
947
+ tracking issue's own title, which would be actively wrong).
782
948
  """
783
949
  is_closed_by_key: dict[tuple[str, int], bool] = {
784
950
  (i["repo_name"], i["number"]): str(i.get("state", "")).lower() == "closed"
@@ -794,6 +960,17 @@ def compute_board_stage_projection(
794
960
  continue
795
961
  assignments_by_key.setdefault((a.repo_name, a.issue_number), []).append(a)
796
962
 
963
+ # #3013: effective-issue-keyed index — see docstring above. Used only to
964
+ # fill `stage_counts`, never `stages`.
965
+ assignments_by_effective_key: dict[tuple[str, int], list] = {}
966
+ for a in assignments:
967
+ if not a.repo_name:
968
+ continue
969
+ eff = effective_issue_number(a)
970
+ if not eff:
971
+ continue
972
+ assignments_by_effective_key.setdefault((a.repo_name, eff), []).append(a)
973
+
797
974
  merge_by_key: dict[tuple[str, int], Any] = {}
798
975
  for m in merge_queue_items:
799
976
  assignment_type = getattr(m, "assignment_type", "work") or "work"
@@ -815,7 +992,11 @@ def compute_board_stage_projection(
815
992
  # `load_queue()`/`board_projection()` both order by `id` ascending.
816
993
  merge_by_key.setdefault(key, m)
817
994
 
818
- keys = set(is_closed_by_key) | set(assignments_by_key)
995
+ # #3013: also union in the effective-key index so an acceptance slice
996
+ # whose only board rows are booked to the tracking issue (nothing keyed
997
+ # to the slice's own issue_number, e.g. never separately synced) still
998
+ # gets a projection row for stage_counts to land in.
999
+ keys = set(is_closed_by_key) | set(assignments_by_key) | set(assignments_by_effective_key)
819
1000
 
820
1001
  uat_enabled_by_repo: dict[str, bool] = {}
821
1002
 
@@ -823,12 +1004,25 @@ def compute_board_stage_projection(
823
1004
  for repo_name, issue_number in keys:
824
1005
  key = (repo_name, issue_number)
825
1006
  issue_assignments = assignments_by_key.get(key, [])
1007
+ effective_assignments = assignments_by_effective_key.get(key, [])
1008
+ # Review fix (#3013): a phantom entry (see docstring) has no
1009
+ # raw-keyed rows at all, so falling back to the effective-keyed list
1010
+ # here — instead of leaving `stages` computed from `[]` — keeps
1011
+ # `stages`/`acceptance`/`has_approved_review` consistent with the
1012
+ # non-zero `stage_counts` this same entry reports below. Widened
1013
+ # through `_widen_work_like_types` so a `test-author`/`mock-author`
1014
+ # leg (WORK_LIKE_TYPES, not literal `type="work"`) registers with
1015
+ # the generic per-stage dispatcher's strict `type` check the same
1016
+ # way `_leg_count_for_stage` already widens it for `stage_counts`.
1017
+ # A no-op for every ordinary issue: `issue_assignments or ...` only
1018
+ # reaches the fallback when the raw list is empty.
1019
+ projection_assignments = issue_assignments or _widen_work_like_types(effective_assignments)
826
1020
  merge_entry = merge_by_key.get(key)
827
1021
  if repo_name not in uat_enabled_by_repo:
828
1022
  uat_enabled_by_repo[repo_name] = repo_has_uat_preview(repo_name, config)
829
1023
  uat_enabled = uat_enabled_by_repo[repo_name]
830
1024
  entry = compute_issue_projection(
831
- issue_assignments,
1025
+ projection_assignments,
832
1026
  merge_entry,
833
1027
  is_closed=is_closed_by_key.get(key, False),
834
1028
  require_plan=require_plan,
@@ -840,6 +1034,7 @@ def compute_board_stage_projection(
840
1034
  if uat_enabled
841
1035
  else None
842
1036
  ),
1037
+ stage_count_assignments=effective_assignments,
843
1038
  )
844
1039
  entry["repo_name"] = repo_name
845
1040
  entry["issue_number"] = issue_number
@@ -397,6 +397,116 @@ def test_compute_issue_projection_includes_acceptance_box():
397
397
  assert out["acceptance_progress"] == {"passed": 5, "total": 5}
398
398
 
399
399
 
400
+ def test_compute_issue_projection_stage_counts_has_same_keys_as_stages():
401
+ """Review fix (#3013): `stage_counts` must carry every key `stages`
402
+ does — including `acceptance`, which is added to `stages`
403
+ unconditionally outside `names`/`default_gates` and was previously
404
+ dropped from `stage_counts` entirely, contradicting the `/board` schema
405
+ description ('Same key set as `stages`') and risking a `KeyError` for
406
+ any client indexing `stage_counts` by every key in `stages`."""
407
+ a = [_work(status="done", acceptance_state="passed", acceptance_total=5, acceptance_passed=5)]
408
+ out = sp.compute_issue_projection(
409
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
410
+ )
411
+ assert set(out["stage_counts"]) == set(out["stages"])
412
+ assert out["stage_counts"]["acceptance"] == 1
413
+
414
+
415
+ def test_compute_issue_projection_stage_counts_acceptance_counts_verdict_legs():
416
+ """Each `type="work"` row carrying a recorded `acceptance_state` is a
417
+ separate acceptance-verdict leg — mirrors the `test`/`merge` special
418
+ cases: no dedicated assignment type exists to count directly."""
419
+ a = [
420
+ _work(assignment_id="w1", status="done", acceptance_state="failed", dispatched_at=1.0),
421
+ _work(assignment_id="w2", status="done", acceptance_state="passed", dispatched_at=2.0),
422
+ _work(assignment_id="w3", status="done", dispatched_at=3.0), # no verdict yet
423
+ ]
424
+ out = sp.compute_issue_projection(
425
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
426
+ )
427
+ assert out["stage_counts"]["acceptance"] == 2
428
+
429
+
430
+ # ── compute_issue_projection: stage_counts (#3013) ──────────────────────────
431
+
432
+
433
+ def test_compute_issue_projection_stage_counts_counts_separate_legs():
434
+ """A stage re-dispatched N times must report N in stage_counts, not
435
+ fold into the single status string the way `stages` does."""
436
+ a = [
437
+ _work(assignment_id="w1", status="failed", dispatched_at=1.0),
438
+ _work(assignment_id="w2", status="failed", dispatched_at=2.0),
439
+ _work(assignment_id="w3", status="done", test_state="passed", dispatched_at=3.0),
440
+ _review(
441
+ assignment_id="r1", review_of_assignment_id="w3",
442
+ review_verdict="request-changes", dispatched_at=4.0,
443
+ ),
444
+ _review(
445
+ assignment_id="r2", review_of_assignment_id="w3",
446
+ review_verdict="approve", dispatched_at=5.0,
447
+ ),
448
+ ]
449
+ out = sp.compute_issue_projection(
450
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
451
+ )
452
+ assert out["stage_counts"]["work"] == 3
453
+ assert out["stage_counts"]["review"] == 2
454
+
455
+
456
+ def test_compute_issue_projection_stage_counts_single_leg_is_one():
457
+ a = [_work(assignment_id="w1", status="done", dispatched_at=1.0)]
458
+ out = sp.compute_issue_projection(
459
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
460
+ )
461
+ assert out["stage_counts"]["work"] == 1
462
+ assert out["stage_counts"]["review"] == 0
463
+
464
+
465
+ def test_compute_issue_projection_stage_counts_test_counts_smoke_legs():
466
+ """The Test stage has no `type="test"` assignment — its dispatched
467
+ worker is `type="smoke"` (coord.smoke) — so the count must key off
468
+ that, not a literal type match."""
469
+ a = [
470
+ _work(assignment_id="w1", status="done", dispatched_at=1.0),
471
+ _work(assignment_id="s1", type="smoke", status="done", test_state="failed", dispatched_at=2.0),
472
+ _work(assignment_id="s2", type="smoke", status="done", test_state="passed", dispatched_at=3.0),
473
+ ]
474
+ out = sp.compute_issue_projection(
475
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
476
+ )
477
+ assert out["stage_counts"]["test"] == 2
478
+
479
+
480
+ def test_compute_issue_projection_stage_counts_merge_counts_conflict_fix_legs():
481
+ """Repeated landing attempts show up as `type="conflict-fix"` legs
482
+ (#241) — there is no `type="merge"` assignment to count directly."""
483
+ a = [
484
+ _work(assignment_id="w1", status="done", dispatched_at=1.0),
485
+ _work(assignment_id="cf1", type="conflict-fix", status="done", dispatched_at=2.0),
486
+ _work(assignment_id="cf2", type="conflict-fix", status="failed", dispatched_at=3.0),
487
+ ]
488
+ out = sp.compute_issue_projection(
489
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
490
+ )
491
+ assert out["stage_counts"]["merge"] == 2
492
+
493
+
494
+ def test_compute_issue_projection_stage_counts_work_includes_test_author_legs():
495
+ """#3013's coord-portal#164 example: an oracle-loop acceptance slice's
496
+ repeated `test-author` legs must count as Work legs — a strict
497
+ `type == "work"` match would never see them."""
498
+ a = [
499
+ _work(assignment_id="ta1", type="test-author", status="failed", dispatched_at=1.0),
500
+ _work(assignment_id="ta2", type="test-author", status="failed", dispatched_at=2.0),
501
+ _work(assignment_id="ta3", type="test-author", status="failed", dispatched_at=3.0),
502
+ _work(assignment_id="ta4", type="test-author", status="done", dispatched_at=4.0),
503
+ ]
504
+ out = sp.compute_issue_projection(
505
+ a, None, is_closed=False, require_plan=False, default_gates=["test", "review", "merge"],
506
+ )
507
+ assert out["stage_counts"]["work"] == 4
508
+
509
+
400
510
  # ── issue_has_any_approved_review ───────────────────────────────────────────
401
511
 
402
512
 
@@ -839,3 +949,177 @@ def test_merged_test_author_entry_does_not_green_child_with_own_unmerged_work():
839
949
  )
840
950
  by_issue = {e["issue_number"]: e for e in out}
841
951
  assert by_issue[1122]["stages"]["merge"] == sp.PENDING
952
+
953
+
954
+ # ── compute_board_stage_projection: stage_counts epic/slice keying (#3013) ──
955
+
956
+
957
+ def test_compute_board_stage_projection_stage_counts_attributes_slice_legs_to_child():
958
+ """#3013's coord-portal#164 example: an oracle-loop acceptance slice's
959
+ test-author/review legs are booked (`issue_number`) to the milestone's
960
+ tracking issue but FOR the child (`for_issue_number`) — `coord gates
961
+ coord-portal 164` resolves them the same way. stage_counts must land on
962
+ the CHILD's own projection entry, not the epic's — and must not
963
+ double-count the same legs on both."""
964
+ issues = [
965
+ {"repo_name": "api", "number": 160, "title": "epic", "state": "open"},
966
+ {"repo_name": "api", "number": 164, "title": "slice", "state": "open"},
967
+ ]
968
+ assignments = [
969
+ _work(
970
+ assignment_id="ta1", issue_number=160, type="test-author",
971
+ status="failed", for_issue_number=164, dispatched_at=1.0,
972
+ ),
973
+ _work(
974
+ assignment_id="ta2", issue_number=160, type="test-author",
975
+ status="failed", for_issue_number=164, dispatched_at=2.0,
976
+ ),
977
+ _work(
978
+ assignment_id="ta3", issue_number=160, type="test-author",
979
+ status="failed", for_issue_number=164, dispatched_at=3.0,
980
+ ),
981
+ _work(
982
+ assignment_id="ta4", issue_number=160, type="test-author",
983
+ status="done", for_issue_number=164, dispatched_at=4.0,
984
+ ),
985
+ _review(
986
+ assignment_id="r1", issue_number=160, review_of_assignment_id="ta4",
987
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=5.0,
988
+ ),
989
+ _review(
990
+ assignment_id="r2", issue_number=160, review_of_assignment_id="ta4",
991
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=6.0,
992
+ ),
993
+ _review(
994
+ assignment_id="r3", issue_number=160, review_of_assignment_id="ta4",
995
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=7.0,
996
+ ),
997
+ _review(
998
+ assignment_id="r4", issue_number=160, review_of_assignment_id="ta4",
999
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=8.0,
1000
+ ),
1001
+ _review(
1002
+ assignment_id="r5", issue_number=160, review_of_assignment_id="ta4",
1003
+ for_issue_number=164, review_verdict="approve", dispatched_at=9.0,
1004
+ ),
1005
+ ]
1006
+ out = sp.compute_board_stage_projection(
1007
+ issues=issues,
1008
+ assignments=assignments,
1009
+ merge_queue_items=[],
1010
+ default_gates=["test", "review", "merge"],
1011
+ )
1012
+ by_issue = {e["issue_number"]: e for e in out}
1013
+ assert by_issue[164]["stage_counts"]["work"] == 4
1014
+ assert by_issue[164]["stage_counts"]["review"] == 5
1015
+ # The epic's own count must not also carry the slice's legs — they
1016
+ # belong on exactly one entry, not both.
1017
+ assert by_issue[160]["stage_counts"]["work"] == 0
1018
+ assert by_issue[160]["stage_counts"]["review"] == 0
1019
+
1020
+
1021
+ def test_compute_board_stage_projection_phantom_slice_stages_match_stage_counts():
1022
+ """Review fix (#3013 blocking finding): a slice/child issue whose ONLY
1023
+ board rows are booked to the tracking issue — and which is NOT itself in
1024
+ the `issues` table yet (unlike the sibling test above, where both #160
1025
+ and #164 are already synced) — must not render a self-contradictory
1026
+ board row: every stage PENDING/SKIPPED right next to a `stage_counts`
1027
+ proving 4 work legs and 5 review legs ran. `stages` now falls back to
1028
+ the same effective-keyed rows `stage_counts` uses whenever an issue has
1029
+ zero rows keyed to its own raw `issue_number` (nothing separately
1030
+ tracked for #1652's false-green concern to clobber)."""
1031
+ issues = [
1032
+ {"repo_name": "api", "number": 160, "title": "epic", "state": "open"},
1033
+ # #164 deliberately absent — the phantom case: it only appears via
1034
+ # the effective-key union below.
1035
+ ]
1036
+ assignments = [
1037
+ _work(
1038
+ assignment_id="ta1", issue_number=160, type="test-author",
1039
+ status="failed", for_issue_number=164, dispatched_at=1.0,
1040
+ ),
1041
+ _work(
1042
+ assignment_id="ta2", issue_number=160, type="test-author",
1043
+ status="failed", for_issue_number=164, dispatched_at=2.0,
1044
+ ),
1045
+ _work(
1046
+ assignment_id="ta3", issue_number=160, type="test-author",
1047
+ status="failed", for_issue_number=164, dispatched_at=3.0,
1048
+ ),
1049
+ _work(
1050
+ assignment_id="ta4", issue_number=160, type="test-author",
1051
+ status="done", for_issue_number=164, dispatched_at=4.0,
1052
+ ),
1053
+ _review(
1054
+ assignment_id="r1", issue_number=160, review_of_assignment_id="ta4",
1055
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=5.0,
1056
+ ),
1057
+ _review(
1058
+ assignment_id="r2", issue_number=160, review_of_assignment_id="ta4",
1059
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=6.0,
1060
+ ),
1061
+ _review(
1062
+ assignment_id="r3", issue_number=160, review_of_assignment_id="ta4",
1063
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=7.0,
1064
+ ),
1065
+ _review(
1066
+ assignment_id="r4", issue_number=160, review_of_assignment_id="ta4",
1067
+ for_issue_number=164, review_verdict="request-changes", dispatched_at=8.0,
1068
+ ),
1069
+ _review(
1070
+ assignment_id="r5", issue_number=160, review_of_assignment_id="ta4",
1071
+ for_issue_number=164, review_verdict="approve", dispatched_at=9.0,
1072
+ ),
1073
+ ]
1074
+ out = sp.compute_board_stage_projection(
1075
+ issues=issues,
1076
+ assignments=assignments,
1077
+ merge_queue_items=[],
1078
+ default_gates=["test", "review", "merge"],
1079
+ )
1080
+ by_issue = {e["issue_number"]: e for e in out}
1081
+ slice_entry = by_issue[164]
1082
+
1083
+ # The counts are unaffected by this fix — same as the synced-sibling case.
1084
+ assert slice_entry["stage_counts"]["work"] == 4
1085
+ assert slice_entry["stage_counts"]["review"] == 5
1086
+
1087
+ # The core fix: `stages` must no longer be a blanket PENDING default —
1088
+ # it reflects the SAME rows the counts are drawn from.
1089
+ assert slice_entry["stages"]["work"] == sp.DONE
1090
+ assert slice_entry["stages"]["review"] == sp.DONE
1091
+ assert slice_entry["has_approved_review"] is True
1092
+ # No merge signal exists for a phantom entry (no merge-queue row keys to
1093
+ # it) — PENDING here is honest (matches stage_counts["merge"] == 0), not
1094
+ # a fabricated green.
1095
+ assert slice_entry["stages"]["merge"] == sp.PENDING
1096
+ assert slice_entry["stage_counts"]["merge"] == 0
1097
+
1098
+ # Genuinely unknown, not fabricated from the tracking issue's own title.
1099
+ assert slice_entry["issue_title"] == ""
1100
+
1101
+ # The epic's own entry is completely unaffected (it has real raw-keyed
1102
+ # rows, so the phantom fallback never applies to it).
1103
+ assert by_issue[160]["stage_counts"]["work"] == 0
1104
+ assert by_issue[160]["stage_counts"]["review"] == 0
1105
+
1106
+
1107
+ def test_compute_board_stage_projection_stage_counts_ordinary_issue_uses_own_key():
1108
+ """An ordinary (non-oracle-loop) issue has no `for_issue_number` — its
1109
+ stage_counts must come from its own rows, unaffected by the #3013
1110
+ effective-key indirection added for the slice case above."""
1111
+ issues = [{"repo_name": "api", "number": 1, "title": "t", "state": "open"}]
1112
+ assignments = [
1113
+ _work(assignment_id="w1", status="failed", dispatched_at=1.0),
1114
+ _work(assignment_id="w2", status="done", dispatched_at=2.0),
1115
+ _review(assignment_id="r1", review_of_assignment_id="w2", review_verdict="approve", dispatched_at=3.0),
1116
+ ]
1117
+ out = sp.compute_board_stage_projection(
1118
+ issues=issues,
1119
+ assignments=assignments,
1120
+ merge_queue_items=[],
1121
+ default_gates=["test", "review", "merge"],
1122
+ )
1123
+ entry = out[0]
1124
+ assert entry["stage_counts"]["work"] == 2
1125
+ assert entry["stage_counts"]["review"] == 1