code-coordinator 0.5.573__tar.gz → 0.5.574__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 (932) hide show
  1. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/bugbash.py +196 -28
  5. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/bugbash.py +15 -3
  6. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_bugbash.py +151 -0
  7. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.claude/commands/board.md +0 -0
  8. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.claude/commands/complete-session.md +0 -0
  9. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.claude/commands/coordinator.md +0 -0
  10. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.githooks/_lib.sh +0 -0
  11. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.githooks/post-checkout +0 -0
  12. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.githooks/post-commit +0 -0
  13. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.githooks/post-merge +0 -0
  14. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.github/coord-ci-acceptance.yml +0 -0
  16. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.github/workflows/publish.yml +0 -0
  18. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.github/workflows/test.yml +0 -0
  19. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/.gitignore +0 -0
  20. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/CLAUDE.md +0 -0
  21. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/GOAL.md +0 -0
  22. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/LICENSE +0 -0
  23. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/MANIFEST.in +0 -0
  24. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/README.md +0 -0
  25. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/SOURCES.txt +0 -0
  26. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/dependency_links.txt +0 -0
  27. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/entry_points.txt +0 -0
  28. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/requires.txt +0 -0
  29. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/scm_file_list.json +0 -0
  30. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/code_coordinator.egg-info/top_level.txt +0 -0
  31. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/__init__.py +0 -0
  32. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/_board_mapping.py +0 -0
  33. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/acceptance.py +0 -0
  34. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/acceptance_drivers.py +0 -0
  35. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agent.py +0 -0
  36. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agent_app.py +0 -0
  37. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agent_update.py +0 -0
  38. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agents/opencode/.gitignore +0 -0
  39. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agents/opencode/agents/work.md +0 -0
  40. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/agents/opencode/routing.jsonc +0 -0
  41. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/approved_work.py +0 -0
  42. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/audit.py +0 -0
  43. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/auto_loop.py +0 -0
  44. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/backup.py +0 -0
  45. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/block_log.py +0 -0
  46. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/board_schema.py +0 -0
  47. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/board_service.py +0 -0
  48. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/board_wire.py +0 -0
  49. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/brain.py +0 -0
  50. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/branch_model.py +0 -0
  51. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/bug_intake.py +0 -0
  52. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/cargo_cache.py +0 -0
  53. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/ci_fix.py +0 -0
  54. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/ci_github.py +0 -0
  55. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/ci_gitlab.py +0 -0
  56. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/ci_store.py +0 -0
  57. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/claim.py +0 -0
  58. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/claude_setup_token.py +0 -0
  59. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/client.py +0 -0
  61. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/codegen.py +0 -0
  62. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/backup.py +0 -0
  68. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/ci.py +0 -0
  70. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/codegen.py +0 -0
  71. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/dr.py +0 -0
  74. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/store_migrate.py +0 -0
  96. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/config.py +0 -0
  101. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/reports.html +0 -0
  109. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/db.py +0 -0
  112. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dead_end.py +0 -0
  113. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/decomposition_chat.py +0 -0
  114. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/README.md +0 -0
  115. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-agent.service +0 -0
  116. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-backup.service +0 -0
  117. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-backup.timer +0 -0
  118. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-db-backup.service +0 -0
  119. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-db-backup.sh +0 -0
  120. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-db-backup.timer +0 -0
  121. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-dr-verify.service +0 -0
  122. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-dr-verify.timer +0 -0
  123. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-drive-queue.service +0 -0
  124. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-drive-queue.timer +0 -0
  125. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-failure-notify.service +0 -0
  126. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-fleet-watchdog.service +0 -0
  127. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  128. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-notify.service +0 -0
  129. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-notify.timer +0 -0
  130. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-release-propagate.service +0 -0
  131. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-release-propagate.timer +0 -0
  132. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-release-window.service +0 -0
  133. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-release-window.timer +0 -0
  134. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-serve.service +0 -0
  135. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-web-dist-build.service +0 -0
  136. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-web-dist-build.timer +0 -0
  137. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy/coord-web.service +0 -0
  138. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy_manifest.py +0 -0
  139. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deploy_units.py +0 -0
  140. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deprecation_telemetry.py +0 -0
  141. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/deps.py +0 -0
  142. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/diagnose.py +0 -0
  143. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dispatch.py +0 -0
  144. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dispatch_liveness.py +0 -0
  145. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/drive_queue.py +0 -0
  150. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/drive_sessions_snapshot.py +0 -0
  151. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/drive_state.py +0 -0
  152. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/events.py +0 -0
  153. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/failure_class.py +0 -0
  154. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/failure_classifier.py +0 -0
  155. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/filelock.py +0 -0
  156. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/fleet_config_health.py +0 -0
  157. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/forge_availability.py +0 -0
  158. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/freshness.py +0 -0
  159. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gate_a.py +0 -0
  160. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gate_b.py +0 -0
  161. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gate_snapshot.py +0 -0
  162. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gates.py +0 -0
  163. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gen_board_fixture.py +0 -0
  164. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/github_ops.py +0 -0
  165. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/github_throttle.py +0 -0
  166. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/goal.py +0 -0
  167. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/graph_health.py +0 -0
  168. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/gtk_native_driver.py +0 -0
  169. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/__init__.py +0 -0
  170. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/aggregate.py +0 -0
  171. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/__init__.py +0 -0
  172. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/_ci_pin.py +0 -0
  173. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/agent_install.py +0 -0
  174. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/cargo_targets.py +0 -0
  175. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/claude_binary.py +0 -0
  176. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/config_drift.py +0 -0
  177. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  178. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/coord_web_ci_pin.py +0 -0
  179. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/deploy_lane_facts.py +0 -0
  180. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/disk.py +0 -0
  181. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/fleet_board.py +0 -0
  182. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  183. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/fleet_phantom.py +0 -0
  184. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/fleet_unit_drift.py +0 -0
  185. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/graph.py +0 -0
  186. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/graphify_cli.py +0 -0
  187. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/index_lock.py +0 -0
  188. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/issues_sync_staleness.py +0 -0
  189. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/local_machine_identity.py +0 -0
  190. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/plan_usage.py +0 -0
  191. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/pr_churn.py +0 -0
  192. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/release_cordon.py +0 -0
  193. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/repo_state.py +0 -0
  194. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/spawned_coord.py +0 -0
  195. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/stalled_pipeline.py +0 -0
  196. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/timer_active.py +0 -0
  197. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/toolchain.py +0 -0
  198. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/unit_drift.py +0 -0
  199. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/unit_enablement.py +0 -0
  200. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/wedged_drive_queue.py +0 -0
  201. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/checks/worktrees.py +0 -0
  202. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/cli.py +0 -0
  203. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/context.py +0 -0
  204. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/fleet_snapshot.py +0 -0
  205. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/models.py +0 -0
  206. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/pypi.py +0 -0
  207. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/registry.py +0 -0
  208. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/render.py +0 -0
  209. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/health/units.py +0 -0
  210. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/hooks.py +0 -0
  211. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/housekeeping.py +0 -0
  212. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/interactive.py +0 -0
  213. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/invariant_alarms.py +0 -0
  214. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/issue_store.py +0 -0
  215. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/issues_sync_status.py +0 -0
  216. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/liveness_auditor.py +0 -0
  217. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/mac_native_driver.py +0 -0
  218. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/machine_fault.py +0 -0
  219. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/machine_metrics.py +0 -0
  220. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/machine_onboard.py +0 -0
  221. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/machine_pause.py +0 -0
  222. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/machine_stats.py +0 -0
  223. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/merge_queue.py +0 -0
  224. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/milestone_chat.py +0 -0
  225. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/milestone_dispatch.py +0 -0
  226. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/milestone_gate.py +0 -0
  227. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/milestone_order.py +0 -0
  228. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/mock_author.py +0 -0
  229. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/models.py +0 -0
  230. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/network.py +0 -0
  231. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/new_issue_chat.py +0 -0
  232. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/__init__.py +0 -0
  233. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/baseline.py +0 -0
  234. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/cli.py +0 -0
  235. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/collect.py +0 -0
  236. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/digest.py +0 -0
  237. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/models.py +0 -0
  238. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/predicate.py +0 -0
  239. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/service.py +0 -0
  240. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/store.py +0 -0
  241. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notifier/transport.py +0 -0
  242. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/notify.py +0 -0
  243. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/openapi.py +0 -0
  244. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/overlap_fence.py +0 -0
  245. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/overlap_predict.py +0 -0
  246. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/parentage.py +0 -0
  247. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/parentage_github.py +0 -0
  248. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/pipeline.py +0 -0
  249. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/plan_parser.py +0 -0
  250. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/plans.py +0 -0
  251. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/platform_paths.py +0 -0
  252. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/portal_bridge.py +0 -0
  253. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/portal_store.py +0 -0
  254. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/portal_sync.py +0 -0
  255. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/pr_body_lint.py +0 -0
  256. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/prereqs.py +0 -0
  257. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/progress.py +0 -0
  258. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/providers/__init__.py +0 -0
  259. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/providers/base.py +0 -0
  260. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/providers/claude.py +0 -0
  261. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/providers/claude_pty.py +0 -0
  262. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/providers/opencode.py +0 -0
  263. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/queue_diagnose.py +0 -0
  264. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/reconcile.py +0 -0
  265. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/reconcile_tick.py +0 -0
  266. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/refine_chat.py +0 -0
  267. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/release_cordon.py +0 -0
  268. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/release_gate.py +0 -0
  269. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/release_propagate.py +0 -0
  270. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/release_verify.py +0 -0
  271. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/release_window.py +0 -0
  272. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/repo_dormancy.py +0 -0
  273. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/repo_edit.py +0 -0
  274. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/repo_onboard.py +0 -0
  275. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/reports.py +0 -0
  276. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/rest_schema.py +0 -0
  277. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/restart_cmd.py +0 -0
  278. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/revalidate.py +0 -0
  279. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/review.py +0 -0
  280. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/scorecard.py +0 -0
  281. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/self_health.py +0 -0
  282. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/serve_app.py +0 -0
  283. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  284. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  285. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  286. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  287. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  288. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/portal-followup/SKILL.md +0 -0
  289. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/release-now/SKILL.md +0 -0
  290. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  291. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  292. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/skills/update-issue/SKILL.md +0 -0
  293. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/smoke.py +0 -0
  294. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/smoke_tags.py +0 -0
  295. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/spend_ceiling.py +0 -0
  296. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/split_work.py +0 -0
  297. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/sql.py +0 -0
  298. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/stage_projection.py +0 -0
  299. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/state.py +0 -0
  300. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/store_migrate.py +0 -0
  301. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/store_parity.py +0 -0
  302. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/templates/deploy-cloudflare.node.yml +0 -0
  303. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/test_author.py +0 -0
  304. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/test_chat.py +0 -0
  305. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/test_orchestrator.py +0 -0
  306. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/test_report.py +0 -0
  307. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/tui_pty_driver.py +0 -0
  308. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/tui_release.py +0 -0
  309. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/uat_checks.py +0 -0
  310. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/usage.py +0 -0
  311. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/usage_limits.py +0 -0
  312. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/usage_rollup.py +0 -0
  313. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/win_native_bridge.py +0 -0
  314. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/win_native_driver.py +0 -0
  315. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coord/worker_events.py +0 -0
  316. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/coordinator.example.yml +0 -0
  317. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-agent.service +0 -0
  318. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-backup.service +0 -0
  319. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-backup.timer +0 -0
  320. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-db-backup.service +0 -0
  321. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-db-backup.sh +0 -0
  322. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-db-backup.timer +0 -0
  323. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-dr-verify.service +0 -0
  324. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-dr-verify.timer +0 -0
  325. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-drive-queue.service +0 -0
  326. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-drive-queue.timer +0 -0
  327. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-failure-notify.service +0 -0
  328. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-failure-notify.sh +0 -0
  329. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-fleet-watchdog.service +0 -0
  330. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-fleet-watchdog.timer +0 -0
  331. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-notify.service +0 -0
  332. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-notify.timer +0 -0
  333. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-release-propagate.service +0 -0
  334. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-release-propagate.timer +0 -0
  335. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-release-window.service +0 -0
  336. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-release-window.timer +0 -0
  337. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-serve.service +0 -0
  338. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-web-dist-build.service +0 -0
  339. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-web-dist-build.sh +0 -0
  340. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-web-dist-build.timer +0 -0
  341. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-web-rollback.sh +0 -0
  342. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/coord-web.service +0 -0
  343. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/deploy/node-shim.sh +0 -0
  344. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ADR_COORD_TUI_CI.md +0 -0
  345. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  346. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ADR_COORD_WEB_CI.md +0 -0
  347. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ADR_COORD_WEB_DIST.md +0 -0
  348. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  349. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/AGENT_OPERATIONS.md +0 -0
  350. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ARCHITECTURE.md +0 -0
  351. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ARCH_SECURITY_GATES.md +0 -0
  352. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/COCKPIT.md +0 -0
  353. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/CONTROL_CENTER.md +0 -0
  354. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/COST_DISCIPLINE.md +0 -0
  355. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/CROSS_PLATFORM.md +0 -0
  356. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/CUSTOMER_FACING_APPS.md +0 -0
  357. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/CUSTOMER_PORTAL.md +0 -0
  358. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/DATA_STORE_SELECTION.md +0 -0
  359. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/DISASTER_RECOVERY.md +0 -0
  360. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/DRIVE_QUEUE.md +0 -0
  361. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/EPHEMERAL_WORKERS.md +0 -0
  362. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/FORGE_MIGRATION.md +0 -0
  363. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/GRAPHIFY_SETUP.md +0 -0
  364. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ISSUE_GUIDANCE.md +0 -0
  365. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/MAC_MINI.md +0 -0
  366. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  367. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/NOTIFIER.md +0 -0
  368. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/OPENCODE_VERIFICATION.md +0 -0
  369. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/OPERATING_GOTCHAS.md +0 -0
  370. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/OPERATOR_GUIDES.md +0 -0
  371. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/ORACLE_LOOP.md +0 -0
  372. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/PHONE_WEBAPP.md +0 -0
  373. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/PIPELINE_V2.md +0 -0
  374. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/PLATFORM_EVOLUTION.md +0 -0
  375. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/SECOND_BACKEND.md +0 -0
  376. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/STORE_SERVICE.md +0 -0
  377. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  378. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/WEB_CONTROL_CENTER.md +0 -0
  379. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/WSL_WINDOWS_WORKER.md +0 -0
  380. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/mocks/web/README.md +0 -0
  381. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/mocks/web/_tokens.css +0 -0
  382. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/mocks/web/issue-detail.html +0 -0
  383. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/mocks/web/pipeline-narrow.html +0 -0
  384. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/docs/mocks/web/pipeline-wide.html +0 -0
  385. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/graphify-out/.gitignore +0 -0
  386. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/install-agent.sh +0 -0
  387. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/pyproject.toml +0 -0
  388. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/audit_review_verdict_overrides.py +0 -0
  389. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  390. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/build-worker-image.sh +0 -0
  391. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/coordinator-machine.py +0 -0
  392. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/dr-down.sh +0 -0
  393. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/dr-up.sh +0 -0
  394. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/epic-down.sh +0 -0
  395. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/epic-up.sh +0 -0
  396. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/preflight.sh +0 -0
  397. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/provision-server.sh +0 -0
  398. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/provision-worker.sh +0 -0
  399. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  400. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  401. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/throwaway-vm.sh +0 -0
  402. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/azure-workers/verify-github-token.sh +0 -0
  403. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/check_gh_argv_containment.py +0 -0
  404. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/codegen.py +0 -0
  405. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-test-runner.sh +0 -0
  406. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  407. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  408. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  409. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  410. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/coord-venv-rollback.sh +0 -0
  411. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/drive-batch.sh +0 -0
  412. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/extract-coord-tui.sh +0 -0
  413. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/fleet_watchdog.py +0 -0
  414. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/gen_board_fixture.py +0 -0
  415. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/gen_mock_index.py +0 -0
  416. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/lib/provision-core.sh +0 -0
  417. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/next_release_tag.py +0 -0
  418. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/provision-machine.sh +0 -0
  419. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/run_tests_in_populated_home.sh +0 -0
  420. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/run_tests_without_gh.sh +0 -0
  421. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/setup-macmini.sh +0 -0
  422. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/smoke_437_interactive.py +0 -0
  423. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/verify-provision-noble.sh +0 -0
  424. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/verify_878_review_capture.py +0 -0
  425. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/verify_release_published.py +0 -0
  426. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/scripts/verify_release_wheel.py +0 -0
  427. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/setup.cfg +0 -0
  428. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/SMOKE_SET.md +0 -0
  429. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/__init__.py +0 -0
  430. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-37/conftest.py +0 -0
  431. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-37/contract.md +0 -0
  432. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-37/manifest.yml +0 -0
  433. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  434. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  435. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/contract.md +0 -0
  436. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  437. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  438. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/manifest.yml +0 -0
  439. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  440. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-51/tsconfig.json +0 -0
  441. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  442. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/backends.py +0 -0
  443. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/conftest.py +0 -0
  444. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/board-pipeline-basic.json +0 -0
  445. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  446. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  447. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  448. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  449. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/all_pass.json +0 -0
  450. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  451. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/mixed_fail.json +0 -0
  452. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  453. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  454. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/skip.json +0 -0
  455. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/playwright/truncated.json +0 -0
  456. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  457. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  458. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  459. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  460. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  461. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  462. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  463. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  464. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  465. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_acceptance.py +0 -0
  466. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_acceptance_drivers.py +0 -0
  467. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent.py +0 -0
  468. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_api_error.py +0 -0
  469. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_app.py +0 -0
  470. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_branch_base.py +0 -0
  471. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_branch_capture.py +0 -0
  472. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_config_free_1712.py +0 -0
  473. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_deploy_units_endpoint.py +0 -0
  474. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_dirty_worktree.py +0 -0
  475. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  476. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_graph_self_heal.py +0 -0
  477. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_health_h3.py +0 -0
  478. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_idle_restart.py +0 -0
  479. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_push_failure.py +0 -0
  480. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_reap.py +0 -0
  481. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_repos_and_pull.py +0 -0
  482. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_restart_services_endpoint.py +0 -0
  483. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_skills_self_heal.py +0 -0
  484. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_startup_diagnostics.py +0 -0
  485. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_update.py +0 -0
  486. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_update_bluegreen.py +0 -0
  487. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_usage_limit.py +0 -0
  488. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_agent_zero_commit.py +0 -0
  489. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ambient_home_isolation.py +0 -0
  490. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approve_capability_reroute_3241.py +0 -0
  491. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approve_dependency_busy_2804.py +0 -0
  492. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approve_reject_plan.py +0 -0
  493. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approve_usage_gate.py +0 -0
  494. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approved_work_2532.py +0 -0
  495. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_approved_work_2996.py +0 -0
  496. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_assignment_already_recorded_daemon.py +0 -0
  497. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_audit_log.py +0 -0
  498. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_audit_outcome.py +0 -0
  499. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_audit_query.py +0 -0
  500. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_auto_loop.py +0 -0
  501. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_auto_release_publish_2035.py +0 -0
  502. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_backend_selection.py +0 -0
  503. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_backup.py +0 -0
  504. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_base_checkout_restore.py +0 -0
  505. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_block_log.py +0 -0
  506. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_cap_762.py +0 -0
  507. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_fixture.py +0 -0
  508. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_read_path.py +0 -0
  509. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_schema.py +0 -0
  510. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_service.py +0 -0
  511. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_state.py +0 -0
  512. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_board_wire.py +0 -0
  513. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_brain.py +0 -0
  514. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_branch_model.py +0 -0
  515. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_bug_intake.py +0 -0
  516. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_build_worker_image_env_update.py +0 -0
  517. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cargo_cache.py +0 -0
  518. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_check_gh_argv_containment.py +0 -0
  519. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_acceptance_gate_1950.py +0 -0
  520. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_fix.py +0 -0
  521. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_github.py +0 -0
  522. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_gitlab.py +0 -0
  523. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_parity_2091.py +0 -0
  524. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_ci_store.py +0 -0
  525. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_claim.py +0 -0
  526. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_claude_md_budget.py +0 -0
  527. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_claude_setup_token.py +0 -0
  528. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_acceptance.py +0 -0
  529. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_assign.py +0 -0
  530. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  531. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_assign_interactive_remote.py +0 -0
  532. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_assign_provider.py +0 -0
  533. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  534. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_audit.py +0 -0
  535. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_chat_continue.py +0 -0
  536. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_ci.py +0 -0
  537. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_codegen.py +0 -0
  538. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_decide.py +0 -0
  539. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_capability_rules.py +0 -0
  540. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_config_provenance.py +0 -0
  541. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_forge_availability.py +0 -0
  542. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_graph.py +0 -0
  543. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_self.py +0 -0
  544. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_diagnose_test_coverage.py +0 -0
  545. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_doctor.py +0 -0
  546. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_doctor_config_free_1801.py +0 -0
  547. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  548. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  549. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_drive.py +0 -0
  550. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_drive_queue.py +0 -0
  551. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_escalate.py +0 -0
  552. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_fix_headless_review.py +0 -0
  553. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_gate_a.py +0 -0
  554. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_install_drift.py +0 -0
  555. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_install_skills.py +0 -0
  556. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_issue_comment.py +0 -0
  557. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_issue_create_label.py +0 -0
  558. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_issue_reopen.py +0 -0
  559. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_issue_view_list.py +0 -0
  560. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_issues.py +0 -0
  561. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_merge.py +0 -0
  562. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_assign.py +0 -0
  563. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_capture.py +0 -0
  564. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_chat_add_child.py +0 -0
  565. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_dispatch.py +0 -0
  566. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_gate_b.py +0 -0
  567. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_gate_c.py +0 -0
  568. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_order.py +0 -0
  569. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  570. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_milestone_ship.py +0 -0
  571. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_network.py +0 -0
  572. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_new_issue_chat.py +0 -0
  573. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_plans.py +0 -0
  574. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_portal.py +0 -0
  575. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_pr.py +0 -0
  576. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_pull_artifact.py +0 -0
  577. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_queue.py +0 -0
  578. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_reattach_sessions.py +0 -0
  579. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_refine_board.py +0 -0
  580. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_release_preflight.py +0 -0
  581. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_release_propagate.py +0 -0
  582. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_release_window.py +0 -0
  583. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_repo_2220.py +0 -0
  584. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  585. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_scorecard.py +0 -0
  586. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_serve_store_backend_3084.py +0 -0
  587. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_set_review_findings.py +0 -0
  588. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_advisory_terminal.py +0 -0
  589. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_contested_tag.py +0 -0
  590. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_invariant_alarms.py +0 -0
  591. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_machine_fault.py +0 -0
  592. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_merge_queue.py +0 -0
  593. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_provider.py +0 -0
  594. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_retried_3340.py +0 -0
  595. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_review_finalizing.py +0 -0
  596. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_supervisor_3366.py +0 -0
  597. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_test_failed_tag.py +0 -0
  598. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_status_usage_limit.py +0 -0
  599. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_sync_comments_873.py +0 -0
  600. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_test_plan.py +0 -0
  601. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_track.py +0 -0
  602. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_tui_update.py +0 -0
  603. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cli_wait.py +0 -0
  604. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_client.py +0 -0
  605. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_client_base_install.py +0 -0
  606. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_client_config_cache_atomic_3052.py +0 -0
  607. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_client_resource_migration_1946.py +0 -0
  608. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_commands_common.py +0 -0
  609. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_comments.py +0 -0
  610. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_completion_summary.py +0 -0
  611. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config.py +0 -0
  612. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_acceptance.py +0 -0
  613. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_audit.py +0 -0
  614. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_drift_check.py +0 -0
  615. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_effective.py +0 -0
  616. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_pricing.py +0 -0
  617. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  618. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_config_usage_gate.py +0 -0
  619. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_confirm_test.py +0 -0
  620. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_conflict_fix.py +0 -0
  621. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_conflict_fix_semantic.py +0 -0
  622. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  623. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test.py +0 -0
  624. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  625. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test_runner_baseline.py +0 -0
  626. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test_runner_populated_home.py +0 -0
  627. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test_runner_routing.py +0 -0
  628. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_test_runner_toolchain.py +0 -0
  629. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_uat.py +0 -0
  630. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coord_web_sse_restart_live.py +0 -0
  631. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_coordinator_machine.py +0 -0
  632. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_cross_platform_imports.py +0 -0
  633. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dao.py +0 -0
  634. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard.py +0 -0
  635. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_api.py +0 -0
  636. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_fixture.py +0 -0
  637. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_reports.py +0 -0
  638. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_server.py +0 -0
  639. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_terminal.py +0 -0
  640. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dashboard_terminal_live.py +0 -0
  641. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_db.py +0 -0
  642. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dead_end.py +0 -0
  643. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_decomposition_chat.py +0 -0
  644. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_coord_db_backup.py +0 -0
  645. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_coord_web_dist.py +0 -0
  646. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_coord_web_rollback.py +0 -0
  647. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_db_backup_unit.py +0 -0
  648. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_drive_queue_unit.py +0 -0
  649. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_failure_notify_unit.py +0 -0
  650. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_manifest.py +0 -0
  651. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_notify_unit.py +0 -0
  652. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_units_lane.py +0 -0
  653. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deploy_web_unit.py +0 -0
  654. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deprecation_telemetry.py +0 -0
  655. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_deps.py +0 -0
  656. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_diagnose.py +0 -0
  657. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dispatch.py +0 -0
  658. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dispatch_liveness.py +0 -0
  659. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dispatch_target_validation.py +0 -0
  660. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dispatch_workers.py +0 -0
  661. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dist_name.py +0 -0
  662. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_done_housekeeping.py +0 -0
  663. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dr_azure_scripts.py +0 -0
  664. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dr_promote.py +0 -0
  665. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_dr_verify.py +0 -0
  666. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive.py +0 -0
  667. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_machine_fault.py +0 -0
  668. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue.py +0 -0
  669. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_blocked_rendering.py +0 -0
  670. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_launch_argv.py +0 -0
  671. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_max_parallel_config.py +0 -0
  672. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  673. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_roll_pending.py +0 -0
  674. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  675. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_sessions_snapshot.py +0 -0
  676. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_state.py +0 -0
  677. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_drive_tmux.py +0 -0
  678. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_epic_up_capability_detection.py +0 -0
  679. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  680. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_epic_up_image_provenance.py +0 -0
  681. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_errors.py +0 -0
  682. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_events.py +0 -0
  683. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_failure_class.py +0 -0
  684. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_failure_classifier.py +0 -0
  685. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_filelock.py +0 -0
  686. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  687. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fix_escalation_classifier.py +0 -0
  688. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fix_of_force_override.py +0 -0
  689. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fleet_config_health.py +0 -0
  690. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fleet_health_probes.py +0 -0
  691. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fleet_health_snapshot.py +0 -0
  692. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_fleet_watchdog.py +0 -0
  693. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_forge_availability.py +0 -0
  694. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_freshness.py +0 -0
  695. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gate_a.py +0 -0
  696. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gate_b.py +0 -0
  697. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gate_snapshot_staleness.py +0 -0
  698. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gates.py +0 -0
  699. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  700. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gen_mock_index.py +0 -0
  701. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_generated_rust_fixture.py +0 -0
  702. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_generated_rust_requests.py +0 -0
  703. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_generated_types_fixture.py +0 -0
  704. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_github_ops.py +0 -0
  705. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_github_throttle.py +0 -0
  706. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_goal.py +0 -0
  707. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_graph_health.py +0 -0
  708. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_graph_selfheal_absent_2237.py +0 -0
  709. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_gtk_native_driver.py +0 -0
  710. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_handoff.py +0 -0
  711. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_checks.py +0 -0
  712. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_cli.py +0 -0
  713. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_cli_graph.py +0 -0
  714. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_config.py +0 -0
  715. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_context.py +0 -0
  716. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_coord_tui_ci_pin.py +0 -0
  717. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_coord_web_ci_pin.py +0 -0
  718. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_deploy_lane_facts.py +0 -0
  719. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_fix.py +0 -0
  720. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_incident_regression.py +0 -0
  721. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_issues_sync_staleness.py +0 -0
  722. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_pr_churn.py +0 -0
  723. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_pypi.py +0 -0
  724. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_registry.py +0 -0
  725. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_release_cordon_probe.py +0 -0
  726. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_timer_active.py +0 -0
  727. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_toolchain.py +0 -0
  728. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_unit_drift.py +0 -0
  729. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_unit_enablement.py +0 -0
  730. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_health_wedged_drive_queue.py +0 -0
  731. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_hooks.py +0 -0
  732. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_housekeeping.py +0 -0
  733. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_human_attended_437.py +0 -0
  734. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_init.py +0 -0
  735. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_install_agent_capabilities_3515.py +0 -0
  736. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_install_agent_venv_2911.py +0 -0
  737. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  738. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_integration.py +0 -0
  739. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive.py +0 -0
  740. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_briefing_echo.py +0 -0
  741. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_pane_log_2541.py +0 -0
  742. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_prefill_state.py +0 -0
  743. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_session_relaunch.py +0 -0
  744. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_test_verdict_backstop.py +0 -0
  745. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_token_attribution.py +0 -0
  746. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_interactive_worktree.py +0 -0
  747. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_invariant_alarms.py +0 -0
  748. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_issue_store_seam.py +0 -0
  749. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_issues_sync_status.py +0 -0
  750. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_liveness_auditor.py +0 -0
  751. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_liveness_notify.py +0 -0
  752. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_lock_contention_ratchet.py +0 -0
  753. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_mac_native_driver.py +0 -0
  754. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_machine_fault.py +0 -0
  755. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_machine_metrics.py +0 -0
  756. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_machine_onboard.py +0 -0
  757. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_machine_pause.py +0 -0
  758. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_machine_stats.py +0 -0
  759. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_merge_queue.py +0 -0
  760. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_merge_verify.py +0 -0
  761. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_milestone_chat.py +0 -0
  762. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_milestone_dispatch.py +0 -0
  763. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_milestone_gate.py +0 -0
  764. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_milestone_order.py +0 -0
  765. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_milestone_seam.py +0 -0
  766. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_mock_author.py +0 -0
  767. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_model_tiering.py +0 -0
  768. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_models.py +0 -0
  769. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_models_config_labels.py +0 -0
  770. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_needs_attention.py +0 -0
  771. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_network.py +0 -0
  772. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_new_issue_chat.py +0 -0
  773. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_next_release_tag.py +0 -0
  774. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_node_shim.py +0 -0
  775. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_baseline.py +0 -0
  776. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_cli.py +0 -0
  777. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_collect.py +0 -0
  778. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_config.py +0 -0
  779. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_drive_seam.py +0 -0
  780. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_isolation.py +0 -0
  781. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_predicate.py +0 -0
  782. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_quiet_hours.py +0 -0
  783. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notifier_service.py +0 -0
  784. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notify.py +0 -0
  785. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_notify_drain.py +0 -0
  786. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_openapi.py +0 -0
  787. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_operational_defaults.py +0 -0
  788. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_overlap_fence.py +0 -0
  789. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_overlap_predict.py +0 -0
  790. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_packaged_deploy_units.py +0 -0
  791. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_parentage.py +0 -0
  792. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_paste_landed.py +0 -0
  793. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  794. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_pipeline.py +0 -0
  795. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_plan_followup_approve_plan_command.py +0 -0
  796. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_plan_followup_pr_command.py +0 -0
  797. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_plan_followup_review_command.py +0 -0
  798. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_plan_only.py +0 -0
  799. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_plan_parser.py +0 -0
  800. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_platform_paths.py +0 -0
  801. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_portal_bridge.py +0 -0
  802. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_portal_config.py +0 -0
  803. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_portal_store.py +0 -0
  804. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_portal_sync.py +0 -0
  805. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_pr_body_lint.py +0 -0
  806. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_prereqs.py +0 -0
  807. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_production_db_guard.py +0 -0
  808. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_progress.py +0 -0
  809. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_provider_seam.py +0 -0
  810. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_providers.py +0 -0
  811. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_providers_config_labels.py +0 -0
  812. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_providers_pty.py +0 -0
  813. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_provision_core.py +0 -0
  814. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_provision_machine.py +0 -0
  815. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_py_rust_mirror_inventory.py +0 -0
  816. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_quiet_hours.py +0 -0
  817. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_quiet_hours_store_2146.py +0 -0
  818. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reap_merged_sessions.py +0 -0
  819. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reap_stale_interactive_tick.py +0 -0
  820. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile.py +0 -0
  821. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_branch.py +0 -0
  822. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_completions.py +0 -0
  823. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  824. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_merges.py +0 -0
  825. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_no_agent_record.py +0 -0
  826. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_tick.py +0 -0
  827. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reconcile_usage_limit_done.py +0 -0
  828. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_refine_chat.py +0 -0
  829. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_cordon_2101.py +0 -0
  830. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  831. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_cordon_deadlock_2240.py +0 -0
  832. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  833. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_cordon_stuck_2490.py +0 -0
  834. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_gate.py +0 -0
  835. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_propagate.py +0 -0
  836. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_propagate_threshold.py +0 -0
  837. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_roll_between_legs_2854.py +0 -0
  838. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_roll_window_handoff.py +0 -0
  839. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_unified_1242.py +0 -0
  840. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_verify.py +0 -0
  841. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_release_window.py +0 -0
  842. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_remote_auto_prune.py +0 -0
  843. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_remote_interactive_reaper.py +0 -0
  844. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_add.py +0 -0
  845. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_dormancy.py +0 -0
  846. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_edit_2220.py +0 -0
  847. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_graph_fleet_2237.py +0 -0
  848. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_max_parallel_3423.py +0 -0
  849. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_repo_onboard_2220.py +0 -0
  850. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_report_public_export.py +0 -0
  851. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_report_result_push.py +0 -0
  852. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_reports.py +0 -0
  853. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_restart_cmd.py +0 -0
  854. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_retry.py +0 -0
  855. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_retry_advisory_1606.py +0 -0
  856. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_retry_escalation_classify_3360.py +0 -0
  857. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_retry_type_1636.py +0 -0
  858. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_revalidate.py +0 -0
  859. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review.py +0 -0
  860. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_end_review_without_verdict.py +0 -0
  861. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_parse_failure_diagnostic.py +0 -0
  862. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_reaffirm.py +0 -0
  863. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_state.py +0 -0
  864. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_verdict_backstop.py +0 -0
  865. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_verdict_override_audit.py +0 -0
  866. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_verdict_relay.py +0 -0
  867. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_review_zero_commits.py +0 -0
  868. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_scoped_review_wiring.py +0 -0
  869. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_scorecard.py +0 -0
  870. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_self_health.py +0 -0
  871. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_serve.py +0 -0
  872. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_serve_app.py +0 -0
  873. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_serve_app_board_trim.py +0 -0
  874. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_serve_rest_routes.py +0 -0
  875. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_session.py +0 -0
  876. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_slice_issue_attribution.py +0 -0
  877. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_smoke.py +0 -0
  878. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  879. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_smoke_live_checkout_restore.py +0 -0
  880. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_smoke_workflow.py +0 -0
  881. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_spend_ceiling.py +0 -0
  882. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_spend_ceiling_coordinator.py +0 -0
  883. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_split.py +0 -0
  884. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_split_work.py +0 -0
  885. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_sql_dialect.py +0 -0
  886. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_sqlite_connect_ratchet.py +0 -0
  887. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stage_projection.py +0 -0
  888. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stale_busy_reviewer_697.py +0 -0
  889. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stalled_pipeline.py +0 -0
  890. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_state.py +0 -0
  891. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_state_review_findings_daemon.py +0 -0
  892. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_status_fleet_footer.py +0 -0
  893. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stop_1567.py +0 -0
  894. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_store_contract.py +0 -0
  895. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_store_migrate.py +0 -0
  896. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stuck.py +0 -0
  897. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  898. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_terminal_command.py +0 -0
  899. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_author.py +0 -0
  900. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_chat.py +0 -0
  901. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_orchestrator.py +0 -0
  902. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_report.py +0 -0
  903. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_verdict_parsing.py +0 -0
  904. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_test_verdict_transcript_floor.py +0 -0
  905. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_text_io_encoding_audit.py +0 -0
  906. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_thin_client_board_audit.py +0 -0
  907. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_thin_client_config_load_1080.py +0 -0
  908. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_thin_client_daemon_routing_906.py +0 -0
  909. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_throwaway_vm.py +0 -0
  910. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_tmux_host.py +0 -0
  911. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_tmux_session.py +0 -0
  912. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_transcript_floor.py +0 -0
  913. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_tui_pty_driver.py +0 -0
  914. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_uat_checks.py +0 -0
  915. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_usage.py +0 -0
  916. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_usage_limits.py +0 -0
  917. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_usage_rollup.py +0 -0
  918. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_venv_live_install_2121.py +0 -0
  919. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_version_single_source.py +0 -0
  920. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_watch.py +0 -0
  921. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_win_native_bridge.py +0 -0
  922. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_win_native_driver.py +0 -0
  923. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  924. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worker_env_venv_isolation.py +0 -0
  925. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worker_events.py +0 -0
  926. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worker_image_pin_sync.py +0 -0
  927. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worker_safety.py +0 -0
  928. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worker_test_scoping.py +0 -0
  929. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worktree.py +0 -0
  930. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  931. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/tests/test_write_parity.py +0 -0
  932. {code_coordinator-0.5.573 → code_coordinator-0.5.574}/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.573
3
+ Version: 0.5.574
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.573
3
+ Version: 0.5.574
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.573",
2
+ "tag": "0.5.574",
3
3
  "distance": 0,
4
- "node": "g05352d1d1a6caa0eaee8083e67ae6f4aa685847e",
4
+ "node": "g15888500b70e89c6ef17658b665ae3fb70f2b9e6",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -405,7 +405,17 @@ def _best_match(
405
405
  issue_platform = _platform_from_title(title)
406
406
  if issue_platform is not None and issue_platform != finding.platform:
407
407
  continue
408
- score = _title_similarity(finding.title, title)
408
+ # #3546: score against the TAG-STRIPPED title, not the raw one — the
409
+ # platform gate above already accounts for the ``[bugbash:<platform>]``
410
+ # prefix, so scoring the untouched title made its own extra tokens
411
+ # ("bugbash", the platform name) dilute the Jaccard score against a
412
+ # short real-world title. "Caption buttons unclickable" (3 words) vs.
413
+ # "[bugbash:win-native] Caption buttons unclickable" scored only 0.5
414
+ # — BELOW :data:`DEFAULT_DEDUPE_THRESHOLD` — purely because of the
415
+ # tag's own 3 extra words, which is exactly the "titles differing
416
+ # enough to defeat matching" root cause behind vimcode#1656/#1660
417
+ # being filed as two separate issues for one bug.
418
+ score = _title_similarity(finding.title, _strip_platform_tag(title))
409
419
  if score >= threshold and (best is None or score > best[1]):
410
420
  best = (issue, score)
411
421
  return best
@@ -416,6 +426,54 @@ def _platform_from_title(title: str) -> str | None:
416
426
  return m.group(1) if m else None
417
427
 
418
428
 
429
+ def _strip_platform_tag(title: str) -> str:
430
+ """Remove a leading ``[bugbash:<platform>]`` tag (if present) before
431
+ scoring title similarity — see :func:`_best_match`'s comment for why
432
+ leaving it in place made the score sensitive to the platform name
433
+ itself rather than just the bug description."""
434
+ return re.sub(r"^\[bugbash:[^\]]+\]\s*", "", title)
435
+
436
+
437
+ def _dedupe_round_findings(
438
+ findings: Sequence[Finding],
439
+ open_issues: list[dict],
440
+ closed_issues: list[dict],
441
+ *,
442
+ threshold: float = DEFAULT_DEDUPE_THRESHOLD,
443
+ ) -> list[DedupeResult]:
444
+ """Dedupe every finding from ONE round, in order, against *open_issues*/
445
+ *closed_issues* — AND against every finding already decided NEW or
446
+ REGRESSION earlier in this SAME call (#3546).
447
+
448
+ The bugbash run that filed vimcode#1656/#1660/#1669/#1675 as four
449
+ separate issues for one bug did so partly because two lanes reporting
450
+ the identical symptom in the SAME round were each deduped only against
451
+ issues that existed BEFORE the round started — neither lane's finding
452
+ could see the other's. This function fixes that: a finding is matched
453
+ not just against *open_issues* but against a running list seeded with
454
+ every PRIOR finding in *findings* that this same walk already decided
455
+ was new/a regression, so the second lane's identical report comes back
456
+ :attr:`DedupeVerdict.DUPLICATE` instead of also being judged new.
457
+
458
+ A within-round match's :attr:`DedupeResult.matched_number` is ``None``
459
+ here — the sibling finding it matches has not actually been filed
460
+ through ``coord issue create`` yet at dedupe time, so there is no real
461
+ issue number to report. :func:`run_bugbash`'s filing loop resolves this
462
+ to the sibling's real number once that sibling is actually filed,
463
+ rather than leaving every within-round duplicate permanently numberless.
464
+ """
465
+ results: list[DedupeResult] = []
466
+ running_open = list(open_issues)
467
+ for finding in findings:
468
+ result = dedupe_finding(finding, running_open, closed_issues, threshold=threshold)
469
+ results.append(result)
470
+ if result.verdict is not DedupeVerdict.DUPLICATE:
471
+ running_open.append(
472
+ {"number": None, "title": compose_finding_issue_title(finding)}
473
+ )
474
+ return results
475
+
476
+
419
477
  def dedupe_finding(
420
478
  finding: Finding,
421
479
  open_issues: list[dict],
@@ -548,7 +606,11 @@ def build_exploration_briefing(
548
606
  "When done, end your final message with a fenced "
549
607
  f"```{FINDINGS_FENCE}``` block containing a JSON array of finding "
550
608
  "objects, each with: title, expected, actual, repro, evidence, "
551
- "suspected_repo (the app or its UI framework), captures (list of "
609
+ "suspected_repo (the repo the FIX belongs in — the app, its UI "
610
+ "framework, e.g. quadraui, OR the coordinator tooling itself, e.g. "
611
+ "claude-coordinator, if the bug is actually in this bugbash driver "
612
+ "or its WSL/native bridge rather than in the app under test), "
613
+ "captures (list of "
552
614
  "capture paths/descriptions, may be empty). An empty array means "
553
615
  "zero findings this round.",
554
616
  ]
@@ -700,6 +762,24 @@ class FilingResult:
700
762
  preview_body: str | None = None
701
763
 
702
764
 
765
+ def finding_target_repo(finding: Finding) -> str:
766
+ """Which repo a finding's issue should be filed into (#3546 requirement
767
+ 2): :attr:`Finding.suspected_repo` when the worker reported one, else
768
+ *finding.repo* (the app the lane actually ran against) as the fallback.
769
+
770
+ Three coord/win-native-driver/WSL-bridge bugs from the first real
771
+ vimcode bugbash run were filed (and queued) in vimcode anyway, where no
772
+ worker could ever fix them, because filing unconditionally targeted
773
+ *finding.repo*. ``suspected_repo`` already carries the worker's best
774
+ guess at the actually-at-fault repo (the app itself, its UI framework,
775
+ or coord's own driver/bridge — see :func:`build_exploration_briefing`)
776
+ and defaults to *repo* in :func:`_finding_from_entry` when a lane
777
+ worker doesn't name one explicitly, so this is a one-line fallback, not
778
+ a guess of its own.
779
+ """
780
+ return finding.suspected_repo or finding.repo
781
+
782
+
703
783
  def file_finding(
704
784
  finding: Finding,
705
785
  dedupe: DedupeResult,
@@ -720,6 +800,11 @@ def file_finding(
720
800
  success, queued through ``coord drive-queue add --machine
721
801
  <lane.machine>``.
722
802
 
803
+ Both calls target :func:`finding_target_repo` (#3546) — NOT always
804
+ *finding.repo* — so a finding whose ``suspected_repo`` names coord's
805
+ own driver/bridge or the app's UI framework lands where a worker can
806
+ actually fix it, rather than in the app repo where nobody can.
807
+
723
808
  ``dry_run=True`` skips BOTH calls entirely and returns a preview —
724
809
  this is the sole mechanism backing "a dry run files nothing": there is
725
810
  no code path from ``dry_run=True`` to the runner being invoked.
@@ -732,6 +817,7 @@ def file_finding(
732
817
  filed=False, queued=False, issue_number=dedupe.matched_number,
733
818
  )
734
819
 
820
+ target_repo = finding_target_repo(finding)
735
821
  title = compose_finding_issue_title(finding)
736
822
  body = format_bug_report(
737
823
  expected=finding.expected,
@@ -755,7 +841,7 @@ def file_finding(
755
841
 
756
842
  create_out = runner(
757
843
  [
758
- "issue", "create", finding.repo,
844
+ "issue", "create", target_repo,
759
845
  "--title", title,
760
846
  "--expected", finding.expected,
761
847
  "--actual", finding.actual,
@@ -771,7 +857,7 @@ def file_finding(
771
857
  issue_number = int(match.group(1))
772
858
 
773
859
  runner(
774
- ["drive-queue", "add", finding.repo, str(issue_number), "--machine", lane.machine]
860
+ ["drive-queue", "add", target_repo, str(issue_number), "--machine", lane.machine]
775
861
  )
776
862
 
777
863
  return FilingResult(
@@ -811,6 +897,14 @@ class RoundReport:
811
897
  filings: list[FilingResult] = field(default_factory=list)
812
898
  lane_cost: dict[str, float] = field(default_factory=dict)
813
899
  skipped_lanes: list[str] = field(default_factory=list)
900
+ #: ``{platform: reason}`` for every entry in :attr:`skipped_lanes`
901
+ #: (#3546) — a skip must be as explainable as a failure or an
902
+ #: unavailability, never a bare platform name with no reason attached.
903
+ #: Currently populated with the per-lane cost-cap detail (the only
904
+ #: engine-level skip reason today); kept as its own dict (rather than
905
+ #: folded into ``skipped_lanes`` itself) so ``skipped_lanes``'s existing
906
+ #: ``list[str]`` shape — already read by callers — never has to change.
907
+ skip_reasons: dict[str, str] = field(default_factory=dict)
814
908
  #: Findings this round that were NOT duplicates of an already-tracked
815
909
  #: open issue — i.e. what actually moved the round-cap/zero-findings
816
910
  #: termination decision. Computed from the SAME dedupe verdicts stored
@@ -886,6 +980,25 @@ class RoundReport:
886
980
  set(self.lane_failures) | set(self.unavailable_lanes)
887
981
  )
888
982
 
983
+ @property
984
+ def all_lanes_skipped(self) -> bool:
985
+ """``True`` when at least one lane was skipped this round (its
986
+ per-lane cost cap was already blown) AND NOT A SINGLE lane was
987
+ actually explored (#3546) — i.e. the round asked nothing, got no
988
+ answer from anyone, yet :attr:`new_count` still reads ``0`` the same
989
+ way a genuine clean pass does.
990
+
991
+ The first real vimcode bugbash run's round 4 skipped every
992
+ configured lane this way and the CLI still printed
993
+ ``terminated='zero_findings'`` — a release gate reading that output
994
+ would conclude "last bugbash clean" about a round that tested
995
+ nothing at all. Distinct from :attr:`all_explored_lanes_failed` /
996
+ :attr:`all_explored_lanes_unavailable_or_failed`, both of which
997
+ require ``explored_lanes`` to be non-empty (a lane that was asked
998
+ and answered badly) — this property is specifically the "nobody was
999
+ even asked" case."""
1000
+ return bool(self.skipped_lanes) and not self.explored_lanes
1001
+
889
1002
 
890
1003
  @dataclass
891
1004
  class BugbashReport:
@@ -949,17 +1062,24 @@ def run_bugbash(
949
1062
 
950
1063
  Each round: every lane is explored (unless it has already exceeded
951
1064
  ``cost_cap_per_lane``, in which case it is skipped and recorded in
952
- ``skipped_lanes`` — never silently dropped), findings are deduped
953
- against a FRESH fetch of open/closed issues (so a finding filed earlier
954
- in the SAME run is already visible and won't be re-filed next round),
955
- and non-duplicates are filed via :func:`file_finding` — gated by
956
- *confirm* for the first ``config.confirm_rounds`` rounds when not a dry
957
- run. Termination is checked AFTER filing, from the round's own observed
958
- ``new_count``/cost, never inferred from "no exception was raised":
1065
+ ``skipped_lanes``/``skip_reasons`` — never silently dropped), findings
1066
+ are deduped via :func:`_dedupe_round_findings` against a FRESH fetch of
1067
+ open/closed issues MERGED with every issue THIS RUN has already filed
1068
+ (#3546: a finding filed earlier in the same run — this round or an
1069
+ earlier one — must be recognised by its real issue number, not just by
1070
+ whatever a fresh ``gh issue list`` happens to already reflect, and two
1071
+ lanes reporting the same bug in the SAME round must collapse to one
1072
+ filing too), and non-duplicates are filed via :func:`file_finding` —
1073
+ gated by *confirm* for the first ``config.confirm_rounds`` rounds when
1074
+ not a dry run. Termination is checked AFTER filing, from the round's own
1075
+ observed ``new_count``/cost, never inferred from "no exception was
1076
+ raised":
959
1077
 
960
1078
  - ``"zero_findings"`` — this round's non-duplicate finding count is 0,
961
- AND at least one explored lane actually completed its checklist
962
- (neither ``RoundReport.all_explored_lanes_failed`` nor
1079
+ AND at least one lane was actually explored this round (not every
1080
+ lane was skipped on its cost cap — ``RoundReport.all_lanes_skipped``
1081
+ is ``False``), AND that explored lane actually completed its
1082
+ checklist (neither ``RoundReport.all_explored_lanes_failed`` nor
963
1083
  ``RoundReport.all_explored_lanes_unavailable_or_failed`` is ``True``),
964
1084
  AND no lane reported a protocol error (``RoundReport
965
1085
  .protocol_error_lanes`` is empty) — a genuine observed clean pass.
@@ -979,13 +1099,16 @@ def run_bugbash(
979
1099
  .protocol_error_lanes`` for which lane and why.
980
1100
  - ``"lanes_unavailable"`` — this round's non-duplicate finding count is
981
1101
  ALSO 0, no lane came back a dispatch/poll/log failure or a protocol
982
- error, but every lane explored this round reported its GUI session/
983
- display unavailable (#3510: locked or absent, e.g. a locked dell64) —
984
- a different reason from ``"lane_failure"`` (the explorer DID run and
985
- DID get a verified answer, it's just "the host is locked", not "I
986
- don't know"), and still not a clean pass either, since nothing was
987
- actually exercised against the app. Check ``BugbashReport
988
- .rounds[-1].unavailable_lanes`` for which host needs unlocking.
1102
+ error, and either (a) every lane explored this round reported its GUI
1103
+ session/display unavailable (#3510: locked or absent, e.g. a locked
1104
+ dell64), or (b) EVERY configured lane was skipped on its cost cap and
1105
+ none was explored at all this round (#3546: a round that asked
1106
+ nothing must never read as a clean pass either) — a different reason
1107
+ from ``"lane_failure"`` (the explorer DID run and DID get a verified
1108
+ answer, or nothing was even asked), and still not a clean pass either,
1109
+ since nothing was actually exercised against the app. Check
1110
+ ``BugbashReport.rounds[-1].unavailable_lanes``/``skip_reasons`` for
1111
+ which host needs unlocking or budget needs raising.
989
1112
  - ``"cost_cap"`` — cumulative cost has reached ``cost_cap_total``.
990
1113
  - ``"round_cap"`` — ``config.max_rounds`` rounds ran without either of
991
1114
  the above firing.
@@ -995,6 +1118,17 @@ def run_bugbash(
995
1118
  total_cost = 0.0
996
1119
  rounds: list[RoundReport] = []
997
1120
  reason = "round_cap"
1121
+ # #3546: every issue THIS RUN has actually filed into config.repo,
1122
+ # across every round so far — consulted alongside each round's FRESH
1123
+ # open-issues fetch so a finding matching an issue this run itself
1124
+ # already created reads as a duplicate by NUMBER, never depending on a
1125
+ # `gh issue list` snapshot having caught up with this process's own
1126
+ # recent write. `run_filed_by_title` is the same data keyed for O(1)
1127
+ # resolution when a within-round duplicate (see
1128
+ # `_dedupe_round_findings`) needs its placeholder `matched_number=None`
1129
+ # upgraded to the sibling's real number once that sibling is filed.
1130
+ run_filed_issues: list[dict] = []
1131
+ run_filed_by_title: dict[str, int] = {}
998
1132
 
999
1133
  for round_num in range(1, config.max_rounds + 1):
1000
1134
  report = RoundReport(round_num=round_num)
@@ -1002,6 +1136,10 @@ def run_bugbash(
1002
1136
  for lane in config.lanes:
1003
1137
  if lane_cost[lane.platform] >= config.cost_cap_per_lane:
1004
1138
  report.skipped_lanes.append(lane.platform)
1139
+ report.skip_reasons[lane.platform] = (
1140
+ f"cumulative cost {lane_cost[lane.platform]:.2f} already "
1141
+ f">= per-lane cap {config.cost_cap_per_lane:.2f}"
1142
+ )
1005
1143
  continue
1006
1144
  outcome = explorer(lane, round_num)
1007
1145
  lane_cost[lane.platform] += outcome.cost
@@ -1032,15 +1170,21 @@ def run_bugbash(
1032
1170
  # finding disappear and pass the #3488 release gate).
1033
1171
  report.protocol_error_lanes[lane.platform] = outcome.protocol_error
1034
1172
 
1035
- open_issues = open_issues_fetcher(config.repo)
1173
+ # #3546: merge the fresh fetch with every issue THIS RUN has already
1174
+ # filed — a finding matching one of this run's own earlier filings
1175
+ # must be recognised by number even if the fresh fetch hasn't (yet)
1176
+ # caught up with this process's own recent write.
1177
+ open_issues = list(open_issues_fetcher(config.repo)) + run_filed_issues
1036
1178
  closed_issues = closed_issues_fetcher(config.repo)
1037
1179
 
1038
1180
  # Dedupe every finding exactly once (one question, one answer) —
1039
1181
  # everything below (the confirm gate's candidate list, new_count,
1040
1182
  # and the actual filing decision) reads off this SAME verdict per
1041
- # finding rather than re-asking dedupe_finding with a chance to
1042
- # disagree with itself.
1043
- dedupes = [dedupe_finding(f, open_issues, closed_issues) for f in report.findings]
1183
+ # finding rather than re-asking dedupe with a chance to disagree
1184
+ # with itself. `_dedupe_round_findings` also catches two lanes
1185
+ # reporting the same bug in THIS round against each other, not just
1186
+ # against issues that existed before the round started.
1187
+ dedupes = _dedupe_round_findings(report.findings, open_issues, closed_issues)
1044
1188
 
1045
1189
  require_confirm = (not config.dry_run) and round_num <= config.confirm_rounds
1046
1190
  candidates = [
@@ -1071,17 +1215,39 @@ def run_bugbash(
1071
1215
  )
1072
1216
  )
1073
1217
  continue
1218
+ if dedupe.verdict is DedupeVerdict.DUPLICATE and dedupe.matched_number is None:
1219
+ # #3546: a within-round duplicate from `_dedupe_round_findings`
1220
+ # — its sibling finding may have already been filed earlier
1221
+ # in THIS loop (in which case its real issue number is now in
1222
+ # `run_filed_by_title`). Resolve it so the report/CLI shows
1223
+ # the real number instead of a permanent "duplicate of
1224
+ # #None".
1225
+ resolved = run_filed_by_title.get(dedupe.matched_title or "")
1226
+ if resolved is not None:
1227
+ dedupe = DedupeResult(
1228
+ verdict=dedupe.verdict, matched_number=resolved,
1229
+ matched_title=dedupe.matched_title, score=dedupe.score,
1230
+ )
1074
1231
  # An unresolvable lane (finding.platform not in this run's
1075
1232
  # config.lanes) is only a problem when it would actually be
1076
1233
  # queued — file_finding raises in that case, never silently
1077
1234
  # drops the machine target (#2096: a gate must be able to fail).
1078
1235
  result = file_finding(finding, dedupe, lane, runner, dry_run=config.dry_run)
1079
1236
  report.filings.append(result)
1237
+ if result.filed and result.issue_number is not None:
1238
+ # Only track filings that landed in config.repo's own
1239
+ # namespace — a finding routed elsewhere via
1240
+ # `finding_target_repo` (#3546 requirement 2) dedupes
1241
+ # against THAT repo's issues, not this one's.
1242
+ if finding_target_repo(finding) == config.repo:
1243
+ filed_title = compose_finding_issue_title(finding)
1244
+ run_filed_issues.append({"number": result.issue_number, "title": filed_title})
1245
+ run_filed_by_title[filed_title] = result.issue_number
1080
1246
 
1081
1247
  rounds.append(report)
1082
1248
 
1083
1249
  if report.new_count == 0:
1084
- # #2096/#3517: "zero findings" is only a genuine clean-pass
1250
+ # #2096/#3517/#3546: "zero findings" is only a genuine clean-pass
1085
1251
  # verdict when at least one lane was actually verified to have
1086
1252
  # RUN THE CHECKLIST this round AND every lane that did complete
1087
1253
  # produced a trustworthy report. A round where every explored
@@ -1092,13 +1258,15 @@ def run_bugbash(
1092
1258
  # below since a bad answer is a stronger "don't trust this round"
1093
1259
  # signal than a lane simply being locked out; a round where every
1094
1260
  # explored lane instead reported its session/display unavailable
1095
- # (#3510 — locked or absent, never a dispatch failure) gets its
1096
- # own distinct "lanes_unavailable" reason last.
1261
+ # (#3510 — locked or absent, never a dispatch failure), OR every
1262
+ # configured lane was skipped on its cost cap with NONE explored
1263
+ # at all (#3546), gets the same "lanes_unavailable" reason —
1264
+ # neither is a verified clean pass.
1097
1265
  if report.all_explored_lanes_failed:
1098
1266
  reason = "lane_failure"
1099
1267
  elif report.protocol_error_lanes:
1100
1268
  reason = "protocol_error"
1101
- elif report.all_explored_lanes_unavailable_or_failed:
1269
+ elif report.all_explored_lanes_unavailable_or_failed or report.all_lanes_skipped:
1102
1270
  reason = "lanes_unavailable"
1103
1271
  else:
1104
1272
  reason = "zero_findings"
@@ -50,6 +50,7 @@ from coord.bugbash import (
50
50
  ExploreOutcome,
51
51
  build_exploration_briefing,
52
52
  discover_lanes,
53
+ finding_target_repo,
53
54
  parse_findings_block,
54
55
  run_bugbash,
55
56
  subprocess_coord_runner,
@@ -228,6 +229,11 @@ def _print_round(report: BugbashReport) -> None:
228
229
  f"{r.new_count} new/regression, {sum(1 for f in r.filings if f.filed)} filed"
229
230
  + (f" (lanes skipped: {', '.join(r.skipped_lanes)})" if r.skipped_lanes else "")
230
231
  )
232
+ # #3546: a skip must be as explainable as a lane failure/
233
+ # unavailability — never a bare platform name with no reason.
234
+ for platform in r.skipped_lanes:
235
+ reason = r.skip_reasons.get(platform, "no reason recorded")
236
+ click.secho(f" lane SKIPPED ({platform}): {reason}", fg="yellow")
231
237
  # #2096: a lane failure must be as visible as a filed finding — never
232
238
  # let a fleet-wide dispatch outage hide behind a quiet "0 finding(s)"
233
239
  # line that reads identically to a genuinely clean round.
@@ -241,12 +247,18 @@ def _print_round(report: BugbashReport) -> None:
241
247
  click.secho(f" lane PROTOCOL ERROR ({platform}): {note}", fg="red")
242
248
  for f in r.filings:
243
249
  incomplete = " [INCOMPLETE REPORT]" if f.finding.incomplete else ""
250
+ # #3546: a finding routed by `suspected_repo` away from the app
251
+ # repo this round explored must say so here — an operator
252
+ # scanning "filed+queued: #42" has no way to tell it landed in
253
+ # coord's own repo rather than the app's without this.
254
+ target_repo = finding_target_repo(f.finding)
255
+ routed = f" [{target_repo}]" if target_repo != f.finding.repo else ""
244
256
  if f.filed:
245
- click.echo(f" filed+queued: #{f.issue_number} — {f.finding.title}{incomplete}")
257
+ click.echo(f" filed+queued: #{f.issue_number}{routed} — {f.finding.title}{incomplete}")
246
258
  elif f.verdict.value == "duplicate":
247
- click.echo(f" duplicate of #{f.issue_number}: {f.finding.title}{incomplete}")
259
+ click.echo(f" duplicate of #{f.issue_number}{routed}: {f.finding.title}{incomplete}")
248
260
  elif f.preview_title is not None:
249
- click.echo(f" would file ({f.verdict.value}): {f.preview_title}{incomplete}")
261
+ click.echo(f" would file ({f.verdict.value}){routed}: {f.preview_title}{incomplete}")
250
262
 
251
263
 
252
264
  @click.command(
@@ -100,6 +100,20 @@ class TestDedupeFinding:
100
100
  result = dedupe_finding(finding, open_issues=open_issues, closed_issues=[])
101
101
  assert result.verdict is DedupeVerdict.NEW
102
102
 
103
+ def test_short_title_matches_tagged_issue_despite_tag_word_dilution(self):
104
+ # #3546: a short real-world title ("Caption buttons unclickable", 3
105
+ # words) scored only 0.5 Jaccard similarity against the tagged issue
106
+ # title BEFORE the tag's own 3 extra tokens ("bugbash", "win",
107
+ # "native") were stripped for comparison — below the 0.6 threshold,
108
+ # so the exact same bug reported twice was never recognised as a
109
+ # duplicate. This is the "titles differing enough to defeat
110
+ # matching" root cause behind vimcode#1656/#1660 being filed twice.
111
+ finding = _finding(title="Caption buttons unclickable", platform="win-native")
112
+ open_issues = [{"number": 1656, "title": "[bugbash:win-native] Caption buttons unclickable"}]
113
+ result = dedupe_finding(finding, open_issues=open_issues, closed_issues=[])
114
+ assert result.verdict is DedupeVerdict.DUPLICATE
115
+ assert result.matched_number == 1656
116
+
103
117
  def test_untagged_open_issue_matches_regardless_of_platform(self):
104
118
  # A hand-filed issue carries no [bugbash:<platform>] tag — still
105
119
  # eligible to match on title alone.
@@ -363,6 +377,36 @@ class TestFileFinding:
363
377
  assert result.preview_title is not None
364
378
  assert runner.calls == []
365
379
 
380
+ def test_suspected_repo_routes_filing_to_a_different_repo(self):
381
+ # #3546: three findings whose fault was in coord's own win-native
382
+ # driver / WSL bridge were filed into vimcode anyway, where no
383
+ # worker could fix them. `suspected_repo` must route BOTH
384
+ # `coord issue create` and `coord drive-queue add` to the repo at
385
+ # fault, not unconditionally to the app repo the lane ran against.
386
+ finding = _finding(
387
+ title="win-native launch() leaks the shell's PID",
388
+ repo="vimcode", suspected_repo="claude-coordinator",
389
+ )
390
+ dedupe = dedupe_finding(finding, [], [])
391
+ runner = FakeRunner(next_issue_number=3542)
392
+ result = file_finding(finding, dedupe, _lane(), runner, dry_run=False)
393
+
394
+ assert result.filed is True
395
+ assert result.issue_number == 3542
396
+ assert runner.calls[0][:3] == ["issue", "create", "claude-coordinator"]
397
+ assert runner.calls[1] == [
398
+ "drive-queue", "add", "claude-coordinator", "3542", "--machine", "pc1",
399
+ ]
400
+
401
+ def test_suspected_repo_defaults_to_the_app_repo(self):
402
+ # No suspected_repo override (the common case) still files into the
403
+ # app repo the lane actually ran against.
404
+ finding = _finding(repo="vimcode", suspected_repo="vimcode")
405
+ dedupe = dedupe_finding(finding, [], [])
406
+ runner = FakeRunner(next_issue_number=1)
407
+ file_finding(finding, dedupe, _lane(), runner, dry_run=False)
408
+ assert runner.calls[0][:3] == ["issue", "create", "vimcode"]
409
+
366
410
  def test_filed_issue_title_carries_platform_tag(self):
367
411
  finding = _finding(platform="mac-native")
368
412
  assert compose_finding_issue_title(finding) == "[bugbash:mac-native] " + finding.title
@@ -694,6 +738,113 @@ class TestRunBugbashTermination:
694
738
  assert report.total_filed == 0
695
739
  assert report.rounds[0].filings[0].verdict is DedupeVerdict.DUPLICATE
696
740
 
741
+ def test_cross_round_dedupe_recognizes_own_earlier_filing_even_with_stale_fetch(self):
742
+ # #3546: the real vimcode run filed "caption buttons unclickable" as
743
+ # vimcode#1656 in round 1, then AGAIN as #1660 in the SAME round and
744
+ # #1669/#1675 in later rounds — dedupe never saw its own earlier
745
+ # filings. Simulate the worst case: the open-issues fetch is
746
+ # permanently stale (never reflects anything this run itself just
747
+ # filed, as a lagging `gh issue list` would) — the SAME finding
748
+ # reported again in round 2 must still be recognised as a duplicate
749
+ # of round 1's real issue number, not filed a second time.
750
+ config = _config(max_rounds=3)
751
+ finding = _finding(title="Caption buttons unclickable")
752
+ explorer = _make_explorer([[finding], [finding]])
753
+ runner = FakeRunner(next_issue_number=1656)
754
+ report = run_bugbash(
755
+ config, explorer=explorer, runner=runner,
756
+ open_issues_fetcher=lambda r: [], # stale: never updates
757
+ closed_issues_fetcher=lambda r: [],
758
+ )
759
+ assert report.total_filed == 1
760
+ assert report.rounds[0].filings[0].filed is True
761
+ assert report.rounds[0].filings[0].issue_number == 1656
762
+ assert report.rounds[1].filings[0].verdict is DedupeVerdict.DUPLICATE
763
+ assert report.rounds[1].filings[0].filed is False
764
+ assert report.rounds[1].filings[0].issue_number == 1656
765
+ create_calls = [c for c in runner.calls if c[:2] == ["issue", "create"]]
766
+ assert len(create_calls) == 1
767
+
768
+ def test_two_lanes_reporting_same_bug_one_round_files_once(self):
769
+ # #3546: two lane instances sharing the SAME platform (the real run
770
+ # had two "win-native" lanes from a coordinator.yml route + top-level
771
+ # driver both naming that kind) each independently reported the
772
+ # identical bug in round 1 — dedupe must collapse them to one filing,
773
+ # not two, even though neither finding existed as an open issue
774
+ # before the round started.
775
+ lane_a = _lane(platform="win-native", machine="pc1")
776
+ lane_b = _lane(platform="win-native", machine="pc2")
777
+ config = _config(lanes=[lane_a, lane_b], max_rounds=1)
778
+
779
+ def explorer(lane, round_num):
780
+ return ExploreOutcome(
781
+ findings=(_finding(title="Caption buttons unclickable", platform="win-native"),)
782
+ )
783
+
784
+ runner = FakeRunner(next_issue_number=1656)
785
+ report = run_bugbash(
786
+ config, explorer=explorer, runner=runner,
787
+ open_issues_fetcher=lambda r: [], closed_issues_fetcher=lambda r: [],
788
+ )
789
+ create_calls = [c for c in runner.calls if c[:2] == ["issue", "create"]]
790
+ assert len(create_calls) == 1
791
+ filings = report.rounds[0].filings
792
+ assert sum(1 for f in filings if f.filed) == 1
793
+ duplicate_filing = next(f for f in filings if not f.filed)
794
+ assert duplicate_filing.verdict is DedupeVerdict.DUPLICATE
795
+ # The duplicate resolves to the sibling's REAL issue number — not a
796
+ # permanent "duplicate of #None" placeholder.
797
+ assert duplicate_filing.issue_number == 1656
798
+
799
+ def test_all_lanes_skipped_reports_lanes_unavailable_not_zero_findings(self):
800
+ # #3546: round 4 of the real run skipped every configured lane (both
801
+ # had already blown their per-lane cost cap) and the CLI still
802
+ # printed `terminated='zero_findings'` — a release gate reading that
803
+ # would conclude "last bugbash clean" about a round that tested
804
+ # nothing at all.
805
+ lane = _lane(platform="win-native", machine="pc1")
806
+ config = _config(lanes=[lane], max_rounds=3, cost_cap_per_lane=1.0)
807
+
808
+ def explorer(lane, round_num):
809
+ # Round 1 finds something (so the loop doesn't already stop
810
+ # there) and spends enough to blow the per-lane cap for round 2.
811
+ if round_num == 1:
812
+ return ExploreOutcome(findings=(_finding(title="Bug A"),), cost=5.0)
813
+ return ExploreOutcome(findings=(), cost=5.0)
814
+
815
+ runner = FakeRunner()
816
+ report = run_bugbash(
817
+ config, explorer=explorer, runner=runner,
818
+ open_issues_fetcher=lambda r: [], closed_issues_fetcher=lambda r: [],
819
+ )
820
+ assert report.rounds[0].skipped_lanes == []
821
+ assert report.rounds[1].skipped_lanes == ["win-native"]
822
+ assert report.rounds[1].all_lanes_skipped is True
823
+ assert "cumulative cost" in report.rounds[1].skip_reasons["win-native"]
824
+ assert report.termination_reason == "lanes_unavailable"
825
+ assert report.termination_reason != "zero_findings"
826
+
827
+ def test_some_lanes_skipped_some_explored_is_not_all_skipped(self):
828
+ # A partial skip (one lane over its cap, the other still running)
829
+ # must still report a genuine "zero_findings" clean pass if the
830
+ # surviving lane found nothing — distinct from the all-skipped case
831
+ # above.
832
+ expensive_lane = _lane(platform="win-native", machine="pc1")
833
+ cheap_lane = _lane(platform="mac-native", machine="mac1")
834
+ config = _config(lanes=[expensive_lane, cheap_lane], max_rounds=3, cost_cap_per_lane=2.0)
835
+
836
+ def explorer(lane, round_num):
837
+ cost = 5.0 if lane.platform == "win-native" else 0.5
838
+ return ExploreOutcome(findings=(), cost=cost, ok=True)
839
+
840
+ runner = FakeRunner()
841
+ report = run_bugbash(
842
+ config, explorer=explorer, runner=runner,
843
+ open_issues_fetcher=lambda r: [], closed_issues_fetcher=lambda r: [],
844
+ )
845
+ assert report.termination_reason == "zero_findings"
846
+ assert report.rounds[0].all_lanes_skipped is False
847
+
697
848
 
698
849
  class TestRunBugbashDryRun:
699
850
  def test_dry_run_files_nothing_across_multiple_rounds(self):