code-coordinator 0.5.315__tar.gz → 0.5.317__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 (820) hide show
  1. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/github_ops.py +24 -2
  7. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reconcile.py +208 -17
  8. code_coordinator-0.5.317/coord/repo_dormancy.py +225 -0
  9. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/serve_app.py +45 -4
  10. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/state.py +135 -0
  11. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/conftest.py +23 -0
  12. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_merges.py +490 -4
  13. code_coordinator-0.5.317/tests/test_repo_dormancy.py +187 -0
  14. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve.py +139 -0
  15. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/.gitignore +0 -0
  28. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/GOAL.md +0 -0
  30. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/LICENSE +0 -0
  31. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/README.md +0 -0
  33. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_schema.py +0 -0
  52. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/client.py +0 -0
  65. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/drive.py +0 -0
  74. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/drive_queue.py +0 -0
  75. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/machine.py +0 -0
  80. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/merge.py +0 -0
  81. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/milestone.py +0 -0
  82. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/plan_followup.py +0 -0
  83. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/plans.py +0 -0
  84. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/portal.py +0 -0
  85. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/pr.py +0 -0
  86. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/release.py +0 -0
  87. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/repo.py +0 -0
  88. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/status.py +0 -0
  94. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/store_migrate.py +0 -0
  95. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/config.py +0 -0
  100. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/db.py +0 -0
  110. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.service +0 -0
  115. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.sh +0 -0
  116. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.timer +0 -0
  117. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.service +0 -0
  118. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.timer +0 -0
  119. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-failure-notify.service +0 -0
  120. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.service +0 -0
  121. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  122. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-notify.service +0 -0
  123. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-notify.timer +0 -0
  124. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.service +0 -0
  125. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.timer +0 -0
  126. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.service +0 -0
  127. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.timer +0 -0
  128. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-serve.service +0 -0
  129. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.service +0 -0
  130. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.timer +0 -0
  131. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy/coord-web.service +0 -0
  132. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy_manifest.py +0 -0
  133. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deploy_units.py +0 -0
  134. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deprecation_telemetry.py +0 -0
  135. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/deps.py +0 -0
  136. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/diagnose.py +0 -0
  137. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dispatch.py +0 -0
  138. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/dist_name.py +0 -0
  139. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive.py +0 -0
  140. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive_queue.py +0 -0
  141. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/drive_state.py +0 -0
  142. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/events.py +0 -0
  143. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/failure_class.py +0 -0
  144. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/filelock.py +0 -0
  145. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/fleet_config_health.py +0 -0
  146. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/forge_availability.py +0 -0
  147. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/freshness.py +0 -0
  148. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_a.py +0 -0
  149. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_b.py +0 -0
  150. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gate_snapshot.py +0 -0
  151. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/gates.py +0 -0
  152. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/github_throttle.py +0 -0
  153. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/goal.py +0 -0
  154. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/graph_health.py +0 -0
  155. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/__init__.py +0 -0
  156. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/aggregate.py +0 -0
  157. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/__init__.py +0 -0
  158. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/_ci_pin.py +0 -0
  159. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/agent_install.py +0 -0
  160. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/cargo_targets.py +0 -0
  161. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/claude_binary.py +0 -0
  162. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  163. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/coord_web_ci_pin.py +0 -0
  164. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/deploy_lane_facts.py +0 -0
  165. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/disk.py +0 -0
  166. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_board.py +0 -0
  167. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  168. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_phantom.py +0 -0
  169. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/fleet_unit_drift.py +0 -0
  170. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/graph.py +0 -0
  171. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/graphify_cli.py +0 -0
  172. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/index_lock.py +0 -0
  173. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/issues_sync_staleness.py +0 -0
  174. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/plan_usage.py +0 -0
  175. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/release_cordon.py +0 -0
  176. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/repo_state.py +0 -0
  177. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/spawned_coord.py +0 -0
  178. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/stalled_pipeline.py +0 -0
  179. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/timer_active.py +0 -0
  180. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/toolchain.py +0 -0
  181. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/unit_drift.py +0 -0
  182. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/unit_enablement.py +0 -0
  183. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/wedged_drive_queue.py +0 -0
  184. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/checks/worktrees.py +0 -0
  185. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/cli.py +0 -0
  186. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/context.py +0 -0
  187. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/fleet_snapshot.py +0 -0
  188. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/models.py +0 -0
  189. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/pypi.py +0 -0
  190. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/registry.py +0 -0
  191. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/render.py +0 -0
  192. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/health/units.py +0 -0
  193. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/hooks.py +0 -0
  194. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/housekeeping.py +0 -0
  195. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/interactive.py +0 -0
  196. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/issue_store.py +0 -0
  197. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/issues_sync_status.py +0 -0
  198. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/liveness_auditor.py +0 -0
  199. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/machine_onboard.py +0 -0
  200. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/machine_pause.py +0 -0
  201. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/merge_queue.py +0 -0
  202. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_chat.py +0 -0
  203. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_dispatch.py +0 -0
  204. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_gate.py +0 -0
  205. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/milestone_order.py +0 -0
  206. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/mock_author.py +0 -0
  207. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/models.py +0 -0
  208. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/network.py +0 -0
  209. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/new_issue_chat.py +0 -0
  210. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/__init__.py +0 -0
  211. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/baseline.py +0 -0
  212. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/cli.py +0 -0
  213. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/collect.py +0 -0
  214. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/digest.py +0 -0
  215. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/models.py +0 -0
  216. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/predicate.py +0 -0
  217. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/service.py +0 -0
  218. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/store.py +0 -0
  219. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notifier/transport.py +0 -0
  220. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/notify.py +0 -0
  221. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/openapi.py +0 -0
  222. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/overlap_fence.py +0 -0
  223. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/overlap_predict.py +0 -0
  224. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/parentage.py +0 -0
  225. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/parentage_github.py +0 -0
  226. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/pipeline.py +0 -0
  227. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/plan_parser.py +0 -0
  228. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/plans.py +0 -0
  229. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/platform_paths.py +0 -0
  230. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_bridge.py +0 -0
  231. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_store.py +0 -0
  232. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/portal_sync.py +0 -0
  233. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/pr_body_lint.py +0 -0
  234. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/prereqs.py +0 -0
  235. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/progress.py +0 -0
  236. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/__init__.py +0 -0
  237. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/base.py +0 -0
  238. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/claude.py +0 -0
  239. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/claude_pty.py +0 -0
  240. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/providers/opencode.py +0 -0
  241. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/queue_diagnose.py +0 -0
  242. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reconcile_tick.py +0 -0
  243. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/refine_chat.py +0 -0
  244. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_cordon.py +0 -0
  245. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_propagate.py +0 -0
  246. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_verify.py +0 -0
  247. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/release_window.py +0 -0
  248. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/repo_edit.py +0 -0
  249. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/repo_onboard.py +0 -0
  250. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/reports.py +0 -0
  251. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/rest_schema.py +0 -0
  252. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/revalidate.py +0 -0
  253. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/review.py +0 -0
  254. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/scorecard.py +0 -0
  255. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/self_health.py +0 -0
  256. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  257. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  258. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  259. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/portal-followup/SKILL.md +0 -0
  262. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/release-now/SKILL.md +0 -0
  263. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  264. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  265. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/skills/update-issue/SKILL.md +0 -0
  266. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/smoke.py +0 -0
  267. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/spend_ceiling.py +0 -0
  268. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/split_work.py +0 -0
  269. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/sql.py +0 -0
  270. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/stage_projection.py +0 -0
  271. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  310. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/setup.cfg +0 -0
  379. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_assignment_already_recorded_daemon.py +0 -0
  444. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_log.py +0 -0
  445. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_outcome.py +0 -0
  446. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_audit_query.py +0 -0
  447. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_auto_loop.py +0 -0
  448. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_auto_release_publish_2035.py +0 -0
  449. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_backend_selection.py +0 -0
  450. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_base_checkout_restore.py +0 -0
  451. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_block_log.py +0 -0
  452. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_cap_762.py +0 -0
  453. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_fixture.py +0 -0
  454. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_read_path.py +0 -0
  455. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_schema.py +0 -0
  456. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_service.py +0 -0
  457. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_state.py +0 -0
  458. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_board_wire.py +0 -0
  459. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_brain.py +0 -0
  460. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_branch_model.py +0 -0
  461. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_bug_intake.py +0 -0
  462. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_build_worker_image_env_update.py +0 -0
  463. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cargo_cache.py +0 -0
  464. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_check_gh_argv_containment.py +0 -0
  465. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_acceptance_gate_1950.py +0 -0
  466. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_fix.py +0 -0
  467. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_gitlab.py +0 -0
  468. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_parity_2091.py +0 -0
  469. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_ci_store.py +0 -0
  470. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_claim.py +0 -0
  471. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_claude_md_budget.py +0 -0
  472. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_acceptance.py +0 -0
  473. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign.py +0 -0
  474. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  475. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_remote.py +0 -0
  476. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_provider.py +0 -0
  477. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  478. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_audit.py +0 -0
  479. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_chat_continue.py +0 -0
  480. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_decide.py +0 -0
  481. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_capability_rules.py +0 -0
  482. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_config_provenance.py +0 -0
  483. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_forge_availability.py +0 -0
  484. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_graph.py +0 -0
  485. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_self.py +0 -0
  486. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_diagnose_test_coverage.py +0 -0
  487. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor.py +0 -0
  488. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_free_1801.py +0 -0
  489. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  490. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_drive.py +0 -0
  491. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_drive_queue.py +0 -0
  492. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_escalate.py +0 -0
  493. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_fix_headless_review.py +0 -0
  494. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_gate_a.py +0 -0
  495. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_install_drift.py +0 -0
  496. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_install_skills.py +0 -0
  497. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_comment.py +0 -0
  498. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_create_label.py +0 -0
  499. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_reopen.py +0 -0
  500. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_issue_view_list.py +0 -0
  501. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_merge.py +0 -0
  502. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_assign.py +0 -0
  503. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_capture.py +0 -0
  504. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_chat_add_child.py +0 -0
  505. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_dispatch.py +0 -0
  506. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_b.py +0 -0
  507. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_c.py +0 -0
  508. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_order.py +0 -0
  509. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  510. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_milestone_ship.py +0 -0
  511. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_network.py +0 -0
  512. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_new_issue_chat.py +0 -0
  513. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_plans.py +0 -0
  514. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_portal.py +0 -0
  515. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_pr.py +0 -0
  516. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_pull_artifact.py +0 -0
  517. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_queue.py +0 -0
  518. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_reattach_sessions.py +0 -0
  519. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_refine_board.py +0 -0
  520. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_preflight.py +0 -0
  521. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_propagate.py +0 -0
  522. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_release_window.py +0 -0
  523. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_repo_2220.py +0 -0
  524. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  525. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_scorecard.py +0 -0
  526. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_set_review_findings.py +0 -0
  527. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_advisory_terminal.py +0 -0
  528. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_contested_tag.py +0 -0
  529. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_merge_queue.py +0 -0
  530. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_provider.py +0 -0
  531. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_review_finalizing.py +0 -0
  532. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_test_failed_tag.py +0 -0
  533. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_status_usage_limit.py +0 -0
  534. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_sync_comments_873.py +0 -0
  535. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_test_plan.py +0 -0
  536. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_track.py +0 -0
  537. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_tui_update.py +0 -0
  538. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cli_wait.py +0 -0
  539. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_client_base_install.py +0 -0
  540. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_client_resource_migration_1946.py +0 -0
  541. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_commands_common.py +0 -0
  542. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_comments.py +0 -0
  543. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_completion_summary.py +0 -0
  544. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config.py +0 -0
  545. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_acceptance.py +0 -0
  546. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_audit.py +0 -0
  547. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_pricing.py +0 -0
  548. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  549. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_config_usage_gate.py +0 -0
  550. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_confirm_test.py +0 -0
  551. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_conflict_fix.py +0 -0
  552. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_conflict_fix_semantic.py +0 -0
  553. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  554. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test.py +0 -0
  555. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  556. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_baseline.py +0 -0
  557. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_populated_home.py +0 -0
  558. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_routing.py +0 -0
  559. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_test_runner_toolchain.py +0 -0
  560. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_uat.py +0 -0
  561. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coord_web_sse_restart_live.py +0 -0
  562. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_coordinator_machine.py +0 -0
  563. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_cross_platform_imports.py +0 -0
  564. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dao.py +0 -0
  565. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard.py +0 -0
  566. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_fixture.py +0 -0
  567. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_terminal.py +0 -0
  568. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dashboard_terminal_live.py +0 -0
  569. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_db.py +0 -0
  570. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dead_end.py +0 -0
  571. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_decomposition_chat.py +0 -0
  572. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_db_backup.py +0 -0
  573. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_dist.py +0 -0
  574. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_rollback.py +0 -0
  575. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_drive_queue_unit.py +0 -0
  576. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_failure_notify_unit.py +0 -0
  577. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_manifest.py +0 -0
  578. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_notify_unit.py +0 -0
  579. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_units_lane.py +0 -0
  580. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deploy_web_unit.py +0 -0
  581. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deprecation_telemetry.py +0 -0
  582. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_deps.py +0 -0
  583. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_diagnose.py +0 -0
  584. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dispatch.py +0 -0
  585. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dispatch_target_validation.py +0 -0
  586. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_dist_name.py +0 -0
  587. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_done_housekeeping.py +0 -0
  588. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive.py +0 -0
  589. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue.py +0 -0
  590. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_blocked_rendering.py +0 -0
  591. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_launch_argv.py +0 -0
  592. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  593. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_roll_pending.py +0 -0
  594. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  595. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_state.py +0 -0
  596. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_drive_tmux.py +0 -0
  597. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_capability_detection.py +0 -0
  598. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  599. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_epic_up_image_provenance.py +0 -0
  600. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_errors.py +0 -0
  601. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_events.py +0 -0
  602. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_failure_class.py +0 -0
  603. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_filelock.py +0 -0
  604. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  605. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fix_of_force_override.py +0 -0
  606. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_config_health.py +0 -0
  607. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_health_probes.py +0 -0
  608. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_health_snapshot.py +0 -0
  609. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_fleet_watchdog.py +0 -0
  610. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_forge_availability.py +0 -0
  611. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_freshness.py +0 -0
  612. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_a.py +0 -0
  613. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_b.py +0 -0
  614. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gate_snapshot_staleness.py +0 -0
  615. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gates.py +0 -0
  616. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  617. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_gen_mock_index.py +0 -0
  618. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_rust_fixture.py +0 -0
  619. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_rust_requests.py +0 -0
  620. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_github_throttle.py +0 -0
  623. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_graph_selfheal_absent_2237.py +0 -0
  626. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_coord_tui_ci_pin.py +0 -0
  633. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_coord_web_ci_pin.py +0 -0
  634. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_deploy_lane_facts.py +0 -0
  635. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_fix.py +0 -0
  636. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_incident_regression.py +0 -0
  637. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_issues_sync_staleness.py +0 -0
  638. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_pypi.py +0 -0
  639. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_registry.py +0 -0
  640. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_release_cordon_probe.py +0 -0
  641. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_timer_active.py +0 -0
  642. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_toolchain.py +0 -0
  643. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_unit_drift.py +0 -0
  644. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_unit_enablement.py +0 -0
  645. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_health_wedged_drive_queue.py +0 -0
  646. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_install_agent_venv_2911.py +0 -0
  650. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_pane_log_2541.py +0 -0
  653. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_issues_sync_status.py +0 -0
  660. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_lock_contention_ratchet.py +0 -0
  663. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_machine_onboard.py +0 -0
  664. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_no_agent_record.py +0 -0
  729. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_tick.py +0 -0
  730. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reconcile_usage_limit_done.py +0 -0
  731. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_refine_chat.py +0 -0
  732. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_2101.py +0 -0
  733. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  734. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_deadlock_2240.py +0 -0
  735. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_cordon_stuck_2490.py +0 -0
  736. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_propagate.py +0 -0
  737. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_propagate_threshold.py +0 -0
  738. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_roll_between_legs_2854.py +0 -0
  739. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_roll_window_handoff.py +0 -0
  740. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_unified_1242.py +0 -0
  741. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_verify.py +0 -0
  742. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_release_window.py +0 -0
  743. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_remote_auto_prune.py +0 -0
  744. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_remote_interactive_reaper.py +0 -0
  745. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_add.py +0 -0
  746. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_edit_2220.py +0 -0
  747. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_graph_fleet_2237.py +0 -0
  748. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_repo_onboard_2220.py +0 -0
  749. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_report_result_push.py +0 -0
  750. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_reports.py +0 -0
  751. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry.py +0 -0
  752. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry_advisory_1606.py +0 -0
  753. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_retry_type_1636.py +0 -0
  754. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_revalidate.py +0 -0
  755. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review.py +0 -0
  756. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_end_review_without_verdict.py +0 -0
  757. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_parse_failure_diagnostic.py +0 -0
  758. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_reaffirm.py +0 -0
  759. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_state.py +0 -0
  760. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_backstop.py +0 -0
  761. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_override_audit.py +0 -0
  762. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_verdict_relay.py +0 -0
  763. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_review_zero_commits.py +0 -0
  764. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_scoped_review_wiring.py +0 -0
  765. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_scorecard.py +0 -0
  766. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_self_health.py +0 -0
  767. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve_app_board_trim.py +0 -0
  768. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_serve_rest_routes.py +0 -0
  769. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_session.py +0 -0
  770. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_slice_issue_attribution.py +0 -0
  771. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke.py +0 -0
  772. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke_live_checkout_restore.py +0 -0
  773. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_smoke_workflow.py +0 -0
  774. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_spend_ceiling.py +0 -0
  775. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_spend_ceiling_coordinator.py +0 -0
  776. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_split.py +0 -0
  777. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_split_work.py +0 -0
  778. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_sql_dialect.py +0 -0
  779. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_sqlite_connect_ratchet.py +0 -0
  780. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stage_projection.py +0 -0
  781. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stale_busy_reviewer_697.py +0 -0
  782. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stalled_pipeline.py +0 -0
  783. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_state.py +0 -0
  784. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_state_review_findings_daemon.py +0 -0
  785. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_status_fleet_footer.py +0 -0
  786. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stop_1567.py +0 -0
  787. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_store_contract.py +0 -0
  788. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_store_migrate.py +0 -0
  789. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stuck.py +0 -0
  790. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  791. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_terminal_command.py +0 -0
  792. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_author.py +0 -0
  793. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_chat.py +0 -0
  794. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_orchestrator.py +0 -0
  795. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_report.py +0 -0
  796. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_verdict_parsing.py +0 -0
  797. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_test_verdict_transcript_floor.py +0 -0
  798. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_text_io_encoding_audit.py +0 -0
  799. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_board_audit.py +0 -0
  800. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_config_load_1080.py +0 -0
  801. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_thin_client_daemon_routing_906.py +0 -0
  802. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_tmux_host.py +0 -0
  803. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_tmux_session.py +0 -0
  804. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_transcript_floor.py +0 -0
  805. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage.py +0 -0
  806. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage_limits.py +0 -0
  807. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_usage_rollup.py +0 -0
  808. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_venv_live_install_2121.py +0 -0
  809. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_version_single_source.py +0 -0
  810. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_watch.py +0 -0
  811. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  812. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_env_venv_isolation.py +0 -0
  813. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_events.py +0 -0
  814. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_image_pin_sync.py +0 -0
  815. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_safety.py +0 -0
  816. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worker_test_scoping.py +0 -0
  817. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worktree.py +0 -0
  818. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  819. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/tests/test_write_parity.py +0 -0
  820. {code_coordinator-0.5.315 → code_coordinator-0.5.317}/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.315
3
+ Version: 0.5.317
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.315
3
+ Version: 0.5.317
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
@@ -126,6 +126,7 @@ coord/release_cordon.py
126
126
  coord/release_propagate.py
127
127
  coord/release_verify.py
128
128
  coord/release_window.py
129
+ coord/repo_dormancy.py
129
130
  coord/repo_edit.py
130
131
  coord/repo_onboard.py
131
132
  coord/reports.py
@@ -706,6 +707,7 @@ tests/test_release_window.py
706
707
  tests/test_remote_auto_prune.py
707
708
  tests/test_remote_interactive_reaper.py
708
709
  tests/test_repo_add.py
710
+ tests/test_repo_dormancy.py
709
711
  tests/test_repo_edit_2220.py
710
712
  tests/test_repo_graph_fleet_2237.py
711
713
  tests/test_repo_onboard_2220.py
@@ -231,6 +231,7 @@
231
231
  "coord/release_propagate.py",
232
232
  "coord/release_verify.py",
233
233
  "coord/release_window.py",
234
+ "coord/repo_dormancy.py",
234
235
  "coord/repo_edit.py",
235
236
  "coord/repo_onboard.py",
236
237
  "coord/reports.py",
@@ -732,6 +733,7 @@
732
733
  "tests/test_remote_auto_prune.py",
733
734
  "tests/test_remote_interactive_reaper.py",
734
735
  "tests/test_repo_add.py",
736
+ "tests/test_repo_dormancy.py",
735
737
  "tests/test_repo_edit_2220.py",
736
738
  "tests/test_repo_graph_fleet_2237.py",
737
739
  "tests/test_repo_onboard_2220.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.315",
2
+ "tag": "0.5.317",
3
3
  "distance": 0,
4
- "node": "g12da3c4a4320f19ffd6f46fd6eb6b882a5ba5026",
4
+ "node": "gf4f544e9955eaa18600b99dd2e5c9c0cc421e7e4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -1892,7 +1892,9 @@ def list_remote_branch_names(repo: str) -> set[str]:
1892
1892
  }
1893
1893
 
1894
1894
 
1895
- def branch_exists_on_remote(repo: str, branch: str) -> bool:
1895
+ def branch_exists_on_remote(
1896
+ repo: str, branch: str, *, cache: dict | None = None
1897
+ ) -> bool:
1896
1898
  """Return True if `branch` currently exists on `repo` (owner/name) at GitHub.
1897
1899
 
1898
1900
  Uses a targeted ``gh api`` call rather than listing all branches. Fails
@@ -1903,7 +1905,27 @@ def branch_exists_on_remote(repo: str, branch: str) -> bool:
1903
1905
 
1904
1906
  Called by ``dispatch_review`` and ``_dispatch_fix`` (#586) to avoid
1905
1907
  routing a follow-on assignment to a machine that can't fetch the branch.
1906
- """
1908
+
1909
+ *cache* (#2989) is an optional caller-owned ``dict`` used to memoise the
1910
+ lookup for the duration of ONE sweep, mirroring
1911
+ :func:`work_is_terminal`'s ``cache=``. A single ``reconcile_board_merges``
1912
+ pass measured 1,304 ref lookups for only 851 distinct refs (1.53x
1913
+ redundancy) because sibling assignment rows — a work row and its
1914
+ conflict-fix, or a re-dispatch — legitimately share one branch. The
1915
+ cache is deliberately **per-pass and caller-scoped**, never module-level:
1916
+ branch existence is exactly the kind of fact that must be re-read on the
1917
+ next pass.
1918
+ """
1919
+ key = (repo, branch)
1920
+ if cache is not None and key in cache:
1921
+ return cache[key]
1922
+ result = _branch_exists_on_remote_uncached(repo, branch)
1923
+ if cache is not None:
1924
+ cache[key] = result
1925
+ return result
1926
+
1927
+
1928
+ def _branch_exists_on_remote_uncached(repo: str, branch: str) -> bool:
1907
1929
  try:
1908
1930
  _gh("api", f"repos/{repo}/git/refs/heads/{branch}",
1909
1931
  caller="github_ops.branch_exists_on_remote")
@@ -31,6 +31,23 @@ if TYPE_CHECKING:
31
31
  # and treating a huge, all-matching-so-far diff as inconclusive (fail open).
32
32
  _FALSE_MERGE_AUDIT_MAX_FILES = 20
33
33
 
34
+ # #2989: bounds the OUTER candidate set of that same sweep — the loop #2639
35
+ # left unbounded. Without it the set is proportional to project history
36
+ # (1,302 rows on the drive host, +1 per merge, never shrinking), re-probed
37
+ # every 30s. This is a per-pass ceiling applied newest-first as a backstop
38
+ # behind the persistent terminal marker (`state.mark_false_merge_audit_
39
+ # clean`); the older tail drains over subsequent passes as newer rows are
40
+ # confirmed and drop out permanently. Not applied to a targeted
41
+ # `--issue N` audit.
42
+ _FALSE_MERGE_AUDIT_MAX_ROWS = 50
43
+
44
+ # #2989: how often the sweep may run when the caller opts into throttling
45
+ # (the daemon's reconcile tick does; a manual `coord reconcile-merges` does
46
+ # not). It detects a rare, non-urgent condition — a merged-marked row whose
47
+ # branch still differs from base — which is an hourly sweep, not a
48
+ # twice-a-minute one.
49
+ _FALSE_MERGE_AUDIT_MIN_INTERVAL_SECONDS = 3600.0
50
+
34
51
 
35
52
  def _query_agent(host: str, port: int = AGENT_PORT, timeout: float = 5.0) -> dict | None:
36
53
  try:
@@ -2774,9 +2791,11 @@ def _extract_issue_number(branch: str) -> int | None:
2774
2791
  def close_stale_prs(
2775
2792
  config: Config,
2776
2793
  *,
2794
+ board: Board | None = None,
2777
2795
  repo: str | None = None,
2778
2796
  issue: int | None = None,
2779
2797
  dry_run: bool = False,
2798
+ skip_dormant_repos: bool = False,
2780
2799
  ) -> list[str]:
2781
2800
  """Close open PRs whose work is already on main or whose issue is closed.
2782
2801
 
@@ -2791,15 +2810,46 @@ def close_stale_prs(
2791
2810
 
2792
2811
  Stale PRs are closed with an explanatory comment. Non-stale PRs are left
2793
2812
  untouched. *dry_run* lists what would change without writing. Idempotent.
2813
+
2814
+ #2994: when *skip_dormant_repos* is set (the daemon tick's opt-in — see
2815
+ ``coord.serve_app._reconcile_merges_tick``; a manual ``coord
2816
+ reconcile-merges`` leaves this False), a repo with no open assignment, no
2817
+ drive-queue entry, and no coord-authored open PR (``coord.repo_dormancy.
2818
+ should_skip_sweep``) is skipped this call rather than costing a
2819
+ ``list_open_prs`` call — bounded by ``coord.repo_dormancy.
2820
+ DORMANT_SWEEP_FLOOR_S`` so it's still swept eventually. Requires *board*
2821
+ to evaluate; with *board* left ``None`` this is a no-op regardless of
2822
+ *skip_dormant_repos* (no activity signal to check against, so never
2823
+ skip).
2824
+
2825
+ Note: the floor is recorded as soon as a repo is deemed due, before
2826
+ ``list_open_prs`` is even attempted, and it stays recorded if that call
2827
+ then raises (deliberate — see ``coord.repo_dormancy.record_swept``'s
2828
+ docstring: it tracks "a real gh call was spent", not "and it worked").
2829
+ One operator-facing consequence: a repo that is persistently failing
2830
+ (renamed, deleted, secondary-rate-limited) goes quiet for up to
2831
+ ``DORMANT_SWEEP_FLOOR_S`` between retries rather than being retried
2832
+ sooner, same as a genuinely idle repo would be.
2794
2833
  """
2795
2834
  from coord import github_ops # noqa: PLC0415
2796
2835
 
2797
2836
  actions: list[str] = []
2837
+ dormant_skipped = 0
2798
2838
 
2799
2839
  for repo_cfg in config.repos:
2800
2840
  if repo is not None and repo_cfg.name != repo:
2801
2841
  continue
2802
2842
 
2843
+ if skip_dormant_repos and board is not None:
2844
+ from coord import repo_dormancy # noqa: PLC0415
2845
+
2846
+ if repo_dormancy.should_skip_sweep(
2847
+ repo_cfg.name, board, repo_dormancy.KIND_PRS
2848
+ ):
2849
+ dormant_skipped += 1
2850
+ continue
2851
+ repo_dormancy.record_swept(repo_cfg.name, repo_dormancy.KIND_PRS)
2852
+
2803
2853
  try:
2804
2854
  open_prs = github_ops.list_open_prs(repo_cfg.github)
2805
2855
  except Exception as exc: # noqa: BLE001
@@ -2874,6 +2924,14 @@ def close_stale_prs(
2874
2924
  except Exception as exc: # noqa: BLE001
2875
2925
  actions.append(f" ↳ error closing PR #{pr_number}: {exc}")
2876
2926
 
2927
+ if dormant_skipped:
2928
+ # #2994: one aggregate line rather than one per repo — visible
2929
+ # without being noisy on a fleet with many idle repos.
2930
+ actions.append(
2931
+ f"stale-PR sweep: skipped {dormant_skipped} dormant repo(s) "
2932
+ "(no open assignment, drive-queue entry, or open PR)"
2933
+ )
2934
+
2877
2935
  return actions
2878
2936
 
2879
2937
 
@@ -2908,6 +2966,8 @@ def reconcile_board_merges(
2908
2966
  repo: str | None = None,
2909
2967
  issue: int | None = None,
2910
2968
  dry_run: bool = False,
2969
+ throttle_false_merge_audit: bool = False,
2970
+ skip_dormant_repos: bool = False,
2911
2971
  ) -> list[str]:
2912
2972
  """Reconcile done work assignments against git/GitHub reality.
2913
2973
 
@@ -2970,7 +3030,20 @@ def reconcile_board_merges(
2970
3030
  catching a historical false ``status='merged'`` flip that predates this
2971
3031
  fix (or any future bug shaped like it) rather than leaving it invisible
2972
3032
  to every other diagnostic forever. See its own inline comment for the
2973
- full methodology and false-positive guards.)
3033
+ full methodology and false-positive guards.
3034
+
3035
+ #2989 bounds sweep (h)'s candidate set — it used to select every
3036
+ ``merged`` work-like row in project history and re-probe all of them on
3037
+ the daemon's 30s tick (97% of a pass's ``gh`` calls). Set
3038
+ *throttle_false_merge_audit* to run that sweep at most hourly; the
3039
+ daemon tick does, a manual ``coord reconcile-merges`` deliberately does
3040
+ not. See the inline block above ``_false_merge_candidates``.
3041
+
3042
+ #2994: *skip_dormant_repos* (also daemon-tick-only, also off for a
3043
+ manual ``coord reconcile-merges``) is threaded through to sweep (c),
3044
+ :func:`close_stale_prs` — see its own docstring — so a repo with no open
3045
+ assignment, no drive-queue entry, and no coord-authored open PR doesn't
3046
+ cost a ``list_open_prs`` call on every tick either.)
2974
3047
  """
2975
3048
  from coord import github_ops, state # noqa: PLC0415
2976
3049
 
@@ -3114,7 +3187,16 @@ def reconcile_board_merges(
3114
3187
  state.mark_work_review_settled(a.assignment_id or "")
3115
3188
 
3116
3189
  # (c) #721 — close open PRs whose work has already landed.
3117
- actions.extend(close_stale_prs(config, repo=repo, issue=issue, dry_run=dry_run))
3190
+ actions.extend(
3191
+ close_stale_prs(
3192
+ config,
3193
+ board=board,
3194
+ repo=repo,
3195
+ issue=issue,
3196
+ dry_run=dry_run,
3197
+ skip_dormant_repos=skip_dormant_repos,
3198
+ )
3199
+ )
3118
3200
 
3119
3201
  # (d) #732 — prune stale merge_queue entries for closed issues / merged PRs.
3120
3202
  # Runs after the board sweeps so a just-marked-merged assignment doesn't
@@ -3456,28 +3538,121 @@ def reconcile_board_merges(
3456
3538
  # this is a FLAG for a human to check, exactly like the manual sweep this
3457
3539
  # automates, not a verdict. Fail-open at every layer: any fetch failure
3458
3540
  # skips that row/file rather than either flagging or clearing it.
3459
- _false_merge_candidates = [
3460
- a
3461
- for a in board.active + board.completed
3462
- if a.status == "merged"
3463
- and a.branch
3464
- and (a.type in WORK_LIKE_TYPES or is_interactive_merge_session(a))
3465
- and (repo is None or a.repo_name == repo)
3466
- and (issue is None or a.issue_number == issue)
3467
- ]
3541
+ #
3542
+ # BOUNDING (#2989) — three mechanisms, applied in this order. Before
3543
+ # them this sweep selected EVERY `merged` work-like row in the board:
3544
+ # 1,302 rows on the drive host, proportional to project history rather
3545
+ # than to work in flight, re-probed on the daemon's 30s tick. Measured,
3546
+ # that was 1,304 of one pass's 1,346 `gh` invocations (97%), and the
3547
+ # generator behind the fleet-wide secondary rate limiting #2809/#2858/
3548
+ # #2934/#2977 all treated symptomatically. (#2639 had already capped
3549
+ # the inner per-file loop — the wrong loop; the outer candidate set was
3550
+ # left unbounded.)
3551
+ #
3552
+ # (1) CADENCE. This detects a rare, non-urgent condition — a
3553
+ # merged-marked row whose branch still differs from base, which is
3554
+ # recovered by a human days later regardless. Twice a minute is
3555
+ # absurd for that. The daemon tick passes
3556
+ # `throttle_false_merge_audit=True` and the sweep then runs at most
3557
+ # once an hour (~120x fewer passes on its own). A manual `coord
3558
+ # reconcile-merges` / `coord diagnose` never throttles: an operator
3559
+ # who asked for a sweep gets one, deterministically.
3560
+ # (2) TERMINAL MARKER. A clean verdict is clean forever (branch
3561
+ # deleted, merged PR at the tip, already an ancestor of base, or
3562
+ # content byte-identical on base — none of those un-happen for a
3563
+ # terminal row). Persisting it (`state.mark_false_merge_audit_
3564
+ # clean`) drops the row from the candidate list permanently, which
3565
+ # makes the set proportional to *unaudited* merges — bounded by
3566
+ # recent throughput, not project age. This is the real fix, and
3567
+ # the same discipline `coord.gate_snapshot`'s refresh already
3568
+ # states ("merged history is never refreshed").
3569
+ # (3) RECENCY CAP. A backstop for the first pass after this ships (and
3570
+ # for any board whose marker was lost): audit at most
3571
+ # `_FALSE_MERGE_AUDIT_MAX_ROWS` rows per pass, newest first. A
3572
+ # false merge that has gone unnoticed for two months is not being
3573
+ # caught by a 30-second sweep anyway; the older tail is simply
3574
+ # drained over the following passes as newer rows get marked.
3575
+ #
3576
+ # An explicit `--issue N` bypasses (2) and (3) entirely: a targeted
3577
+ # re-audit must always re-probe, so a previously-cleared row stays
3578
+ # re-checkable by hand. Nothing here changes what the sweep CONCLUDES,
3579
+ # only how many probes it takes to conclude it.
3580
+ _false_merge_targeted = issue is not None
3581
+ _run_false_merge_audit = True
3582
+ if throttle_false_merge_audit and not _false_merge_targeted:
3583
+ _last_run = state.get_false_merge_audit_last_run()
3584
+ if (time.time() - _last_run) < _FALSE_MERGE_AUDIT_MIN_INTERVAL_SECONDS:
3585
+ _run_false_merge_audit = False
3586
+
3587
+ _false_merge_candidates: list[Assignment] = []
3588
+ if _run_false_merge_audit:
3589
+ _false_merge_candidates = [
3590
+ a
3591
+ for a in board.active + board.completed
3592
+ if a.status == "merged"
3593
+ and a.branch
3594
+ and (a.type in WORK_LIKE_TYPES or is_interactive_merge_session(a))
3595
+ and (repo is None or a.repo_name == repo)
3596
+ and (issue is None or a.issue_number == issue)
3597
+ # #2989: a row whose repo has no GitHub mapping is unprobeable —
3598
+ # drop it HERE rather than after the recency cap, so a pile of
3599
+ # orphaned rows (a repo since removed from coordinator.yml) can't
3600
+ # eat the cap's slots and starve the rows we can actually audit.
3601
+ and getattr(config.repo(a.repo_name), "github", None)
3602
+ ]
3603
+ if not _false_merge_targeted:
3604
+ _already_clean = state.load_false_merge_audit_clean()
3605
+ if _already_clean:
3606
+ _false_merge_candidates = [
3607
+ a
3608
+ for a in _false_merge_candidates
3609
+ if a.assignment_id not in _already_clean
3610
+ ]
3611
+ if len(_false_merge_candidates) > _FALSE_MERGE_AUDIT_MAX_ROWS:
3612
+ _false_merge_candidates.sort(
3613
+ key=lambda a: (a.finished_at or a.dispatched_at or 0.0),
3614
+ reverse=True,
3615
+ )
3616
+ _false_merge_candidates = _false_merge_candidates[
3617
+ :_FALSE_MERGE_AUDIT_MAX_ROWS
3618
+ ]
3619
+
3620
+ if (
3621
+ _run_false_merge_audit
3622
+ and throttle_false_merge_audit
3623
+ and not _false_merge_targeted
3624
+ and not dry_run # a dry-run must not consume the real run's turn
3625
+ ):
3626
+ # Stamp even when there was nothing to do — the point of the stamp is
3627
+ # "this sweep had its turn this hour", not "this sweep found work".
3628
+ state.set_false_merge_audit_last_run(time.time())
3629
+
3468
3630
  if _false_merge_candidates:
3469
3631
  from coord.branch_model import resolve_base_branch_for_issue_number # noqa: PLC0415
3470
3632
 
3471
3633
  _false_merge_milestone_cache: dict = {}
3634
+ # #2989 mechanism (3'): one ref lookup per DISTINCT (repo, branch)
3635
+ # per pass, not one per row. Sibling rows legitimately share a
3636
+ # branch (a work row and its conflict-fix, a re-dispatch), which
3637
+ # measured 1.53x redundancy — ~453 wasted calls in a single pass.
3638
+ _false_merge_branch_cache: dict = {}
3639
+ _false_merge_confirmed_clean: list[str] = []
3472
3640
  for a in _false_merge_candidates:
3473
3641
  repo_cfg = config.repo(a.repo_name)
3474
3642
  if repo_cfg is None or not repo_cfg.github:
3475
3643
  continue
3476
3644
  try:
3477
- if not github_ops.branch_exists_on_remote(repo_cfg.github, a.branch):
3478
- continue # branch gone — presumed genuinely merged + cleaned up
3645
+ if not github_ops.branch_exists_on_remote(
3646
+ repo_cfg.github, a.branch, cache=_false_merge_branch_cache
3647
+ ):
3648
+ # branch gone — presumed genuinely merged + cleaned up,
3649
+ # and permanently so (#2989).
3650
+ _false_merge_confirmed_clean.append(a.assignment_id)
3651
+ continue
3479
3652
  if github_ops.pr_is_merged(repo_cfg.github, a.branch):
3480
- continue # correctly tracked: a merged PR sits at this exact tip
3653
+ # correctly tracked: a merged PR sits at this exact tip
3654
+ _false_merge_confirmed_clean.append(a.assignment_id)
3655
+ continue
3481
3656
  base_branch = resolve_base_branch_for_issue_number(
3482
3657
  repo_cfg,
3483
3658
  repo_cfg.github,
@@ -3487,13 +3662,20 @@ def reconcile_board_merges(
3487
3662
  ahead = github_ops.branch_commits_ahead(
3488
3663
  repo_cfg.github, base_branch, a.branch
3489
3664
  )
3490
- if not ahead: # None (fail-open) or 0 (already an ancestor)
3665
+ if ahead is None:
3666
+ # fail-open: the probe itself failed, so this row is NOT
3667
+ # confirmed clean — re-probe it next pass (#2989).
3668
+ continue
3669
+ if ahead == 0:
3670
+ # already an ancestor of base: its content landed, and
3671
+ # that is permanent (#2989).
3672
+ _false_merge_confirmed_clean.append(a.assignment_id)
3491
3673
  continue
3492
3674
  changed_files = github_ops.get_compare_files(
3493
3675
  repo_cfg.github, base_branch, a.branch
3494
3676
  )
3495
3677
  if not changed_files:
3496
- continue # can't confirm anything — fail open
3678
+ continue # can't confirm anything — fail open, re-probe
3497
3679
  content_differs = False
3498
3680
  differing_path = None
3499
3681
  for _path in changed_files[:_FALSE_MERGE_AUDIT_MAX_FILES]:
@@ -3514,7 +3696,10 @@ def reconcile_board_merges(
3514
3696
  differing_path = _path
3515
3697
  break
3516
3698
  if not content_differs:
3517
- continue # verbatim on base already — rebase/squash, not lost
3699
+ # verbatim on base already — rebase/squash, not lost, and
3700
+ # a terminal row's content cannot un-land (#2989).
3701
+ _false_merge_confirmed_clean.append(a.assignment_id)
3702
+ continue
3518
3703
  actions.append(
3519
3704
  f"POSSIBLY LOST (#2639): {a.assignment_id} "
3520
3705
  f"({a.repo_name} #{a.issue_number}, branch={a.branch}) is "
@@ -3535,4 +3720,10 @@ def reconcile_board_merges(
3535
3720
  f"({a.repo_name} #{a.issue_number}): {exc}"
3536
3721
  )
3537
3722
 
3723
+ # #2989: persist the terminal marker once, at the end of the sweep —
3724
+ # one board_meta write per pass, not one per row. Never on a
3725
+ # dry-run: `--dry-run` must not change what the next real pass does.
3726
+ if _false_merge_confirmed_clean and not dry_run:
3727
+ state.mark_false_merge_audit_clean(_false_merge_confirmed_clean)
3728
+
3538
3729
  return actions
@@ -0,0 +1,225 @@
1
+ """Per-repo dormancy skip for the daemon's periodic GitHub sweeps (#2994).
2
+
3
+ **The problem this closes.** Two of the daemon's slow-cadence ticks —
4
+ ``coord.serve_app._sync_issues_tick`` and the stale-PR sweep inside
5
+ ``coord.reconcile.close_stale_prs`` (driven by ``_reconcile_merges_tick``) —
6
+ loop over *every registered repo, unconditionally, every tick* and spend a
7
+ ``gh`` call (or two) on each. GitHub call volume this way scales with how
8
+ many repos have ever been registered, not with how much work is actually in
9
+ flight: a repo nobody has touched in months costs exactly as much per tick
10
+ as a repo mid-pipeline.
11
+
12
+ **This module's job.** A repo counts as dormant when it has no open
13
+ assignment, no drive-queue entry, and no coord-authored open PR — see
14
+ :func:`repo_has_activity`, computed live from in-memory board state plus a
15
+ local (non-GitHub) drive-queue read, never cached. Because it is live, the
16
+ instant work is queued for a dormant repo the very next tick sees it as
17
+ active again — there is no separate "wake" call to remember to make.
18
+
19
+ A dormant repo is not *permanently* skipped, only skipped until
20
+ :data:`DORMANT_SWEEP_FLOOR_S` has passed since its last real sweep — a
21
+ floor, not a wall — so out-of-band activity (a human-opened PR, an issue
22
+ filed by someone who isn't coord) is still noticed eventually even though
23
+ nothing coord-side would otherwise prompt a look. Same best-effort,
24
+ JSON-backed, never-raises shape as the sibling starvation-floor tracker
25
+ :mod:`coord.issues_sync_status` established for exactly this kind of
26
+ bookkeeping — one file, one dict, no new persistence layer.
27
+
28
+ **Two independent sweep kinds, two independent floors (#2994 review).**
29
+ ``_sync_issues_tick`` (issues-sync, ``gh issue list``) and
30
+ ``close_stale_prs`` (stale-PR sweep, ``gh pr list``) both call this module
31
+ for the *same repo* in the same daemon tick, one right after the other
32
+ (``_tick_loop``). They are unrelated ``gh`` calls that happen to run
33
+ back-to-back — if they shared one ``{repo_name: last_swept_at}`` clock,
34
+ whichever tick ran first would refresh it before the second ever saw a
35
+ stale-enough value, permanently starving the loser. So every entry point
36
+ takes a mandatory ``kind`` (a short tag like ``"issues"`` or ``"prs"``) and
37
+ the on-disk state is keyed by ``f"{repo_name}:{kind}"`` — same file, two
38
+ disjoint sets of keys, each consumer only ever reads/writes its own.
39
+
40
+ Both consumers follow the same two-call contract:
41
+
42
+ * :func:`should_skip_sweep` before spending the real ``gh`` call — True
43
+ means skip this repo this tick.
44
+ * :func:`record_swept` right after deciding *not* to skip (regardless of
45
+ whether the sweep itself succeeded) — resets the floor timer.
46
+ """
47
+
48
+ from __future__ import annotations
49
+
50
+ import json
51
+ import logging
52
+ import os
53
+ import tempfile
54
+ import time
55
+ from pathlib import Path
56
+ from typing import TYPE_CHECKING
57
+
58
+ from coord.platform_paths import default_coord_dir
59
+
60
+ if TYPE_CHECKING:
61
+ from coord.models import Board
62
+
63
+ _log = logging.getLogger(__name__)
64
+
65
+ _STATE_FILENAME = "repo_dormancy_status.json"
66
+
67
+ # How long a genuinely-idle repo may go without a real sweep before the next
68
+ # tick forces one anyway, so out-of-band activity is still noticed within a
69
+ # bounded window rather than never. Comfortably above the default 300s tick
70
+ # cadence (COORD_RECONCILE_MERGES_INTERVAL) so an idle repo actually saves
71
+ # calls on most ticks, short enough that "eventually" reads as "within the
72
+ # hour" to an operator rather than "whenever someone notices."
73
+ DORMANT_SWEEP_FLOOR_S = 3600.0
74
+
75
+ # Sweep-kind tags (#2994 review): each gets its own floor timer, keyed by
76
+ # f"{repo_name}:{kind}" on disk, so the issues-sync tick and the stale-PR
77
+ # sweep never clobber each other's clock even when they run back-to-back
78
+ # for the same repo in the same tick (`_tick_loop`).
79
+ KIND_ISSUES = "issues"
80
+ KIND_PRS = "prs"
81
+
82
+
83
+ def _state_path() -> Path:
84
+ """Resolve the dormancy state file path.
85
+
86
+ ``$COORD_REPO_DORMANCY_STATE`` overrides first — same seam
87
+ ``coord.issues_sync_status._state_path`` documents: lets a test redirect
88
+ this with a one-line ``monkeypatch.setenv`` instead of risking a stray
89
+ write into the operator's real ``~/.coord``.
90
+ """
91
+ override = os.environ.get("COORD_REPO_DORMANCY_STATE")
92
+ if override:
93
+ return Path(override).expanduser()
94
+ return default_coord_dir() / _STATE_FILENAME
95
+
96
+
97
+ def _read_all() -> dict[str, float]:
98
+ path = _state_path()
99
+ try:
100
+ raw = path.read_text(encoding="utf-8")
101
+ except OSError:
102
+ return {}
103
+ try:
104
+ data = json.loads(raw)
105
+ except (json.JSONDecodeError, ValueError):
106
+ return {}
107
+ if not isinstance(data, dict):
108
+ return {}
109
+ return {k: float(v) for k, v in data.items() if isinstance(v, (int, float))}
110
+
111
+
112
+ def _write_all(data: dict[str, float]) -> None:
113
+ try:
114
+ path = _state_path()
115
+ path.parent.mkdir(parents=True, exist_ok=True)
116
+ fd, tmp = tempfile.mkstemp(
117
+ prefix=".repo_dormancy.", suffix=".tmp", dir=path.parent
118
+ )
119
+ try:
120
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
121
+ json.dump(data, fh, sort_keys=True)
122
+ fh.write("\n")
123
+ os.replace(tmp, path)
124
+ except Exception:
125
+ try:
126
+ os.unlink(tmp)
127
+ except OSError:
128
+ pass
129
+ raise
130
+ except Exception as exc: # noqa: BLE001 -- best-effort, never raises
131
+ _log.debug("repo_dormancy: write failed: %s", exc)
132
+
133
+
134
+ def _key(repo_name: str, kind: str) -> str:
135
+ return f"{repo_name}:{kind}"
136
+
137
+
138
+ def record_swept(repo_name: str, kind: str, *, now: float | None = None) -> None:
139
+ """Best-effort: stamp *repo_name*'s *kind* sweep as having run just now.
140
+
141
+ *kind* is a short tag identifying which independent sweep this is (e.g.
142
+ ``"issues"`` for the issues-sync tick, ``"prs"`` for the stale-PR sweep)
143
+ — each gets its own floor timer, keyed by ``f"{repo_name}:{kind}"``, so
144
+ the two sweeps never clobber each other's clock.
145
+
146
+ Called right after a tick decides NOT to skip a repo — regardless of
147
+ whether the sweep itself goes on to succeed or fail — so the floor timer
148
+ reflects "a real gh call was spent on this repo", not "and it worked".
149
+ """
150
+ now = now if now is not None else time.time()
151
+ data = _read_all()
152
+ data[_key(repo_name, kind)] = now
153
+ _write_all(data)
154
+
155
+
156
+ def _last_swept_at(repo_name: str, kind: str) -> float | None:
157
+ return _read_all().get(_key(repo_name, kind))
158
+
159
+
160
+ def repo_has_activity(repo_name: str, board: Board) -> bool:
161
+ """True when *repo_name* is NOT idle: an open assignment, a
162
+ coord-authored open PR, or a drive-queue entry.
163
+
164
+ * "Open assignment" — anything in ``board.active`` for this repo
165
+ (pending or running work/review/smoke/conflict-fix sessions).
166
+ * "Coord-authored open PR" — a ``board.completed`` row for this repo
167
+ still sitting at ``status == 'done'`` (landed, PR presumably open,
168
+ not yet flipped to ``'merged'``) — this is tracked locally already
169
+ (it's exactly what the merge-reconcile sweeps exist to resolve), so
170
+ no extra GitHub call is needed to answer this half of the question.
171
+ * "Drive-queue entry" — a local (non-GitHub) DB read via
172
+ :func:`coord.state.list_drive_queue`.
173
+
174
+ Deliberately fails OPEN on a drive-queue read error: a repo we can't
175
+ positively confirm is idle is treated as active, never skipped.
176
+ """
177
+ for a in board.active:
178
+ if a.repo_name == repo_name:
179
+ return True
180
+ for a in board.completed:
181
+ if a.repo_name == repo_name and a.status == "done":
182
+ return True
183
+
184
+ from coord import state # noqa: PLC0415 -- avoid a state<->reconcile import cycle
185
+
186
+ try:
187
+ if state.list_drive_queue(repo_name):
188
+ return True
189
+ except Exception: # noqa: BLE001 -- best-effort; treat as active on doubt
190
+ return True
191
+
192
+ return False
193
+
194
+
195
+ def should_skip_sweep(
196
+ repo_name: str, board: Board, kind: str, *, now: float | None = None
197
+ ) -> bool:
198
+ """True when this tick should skip *repo_name*'s *kind* GitHub sweep.
199
+
200
+ *kind* must match the tag the corresponding :func:`record_swept` call
201
+ uses (``"issues"`` vs. ``"prs"``) — the two sweeps are independent
202
+ ``gh`` call types with independent floors; see the module docstring for
203
+ why they must not share one clock.
204
+
205
+ Only ever True for a repo with zero activity (see
206
+ :func:`repo_has_activity`) that was also swept for real inside
207
+ :data:`DORMANT_SWEEP_FLOOR_S`. A repo with no recorded sweep at all
208
+ counts as due, not skippable — there is no prior sweep to protect, and a
209
+ freshly-registered repo should get its first real sweep immediately.
210
+ """
211
+ if repo_has_activity(repo_name, board):
212
+ return False
213
+ last = _last_swept_at(repo_name, kind)
214
+ if last is None:
215
+ return False
216
+ now = now if now is not None else time.time()
217
+ return (now - last) < DORMANT_SWEEP_FLOOR_S
218
+
219
+
220
+ def clear() -> None:
221
+ """Drop all recorded sweep timestamps. Best-effort; never raises. Tests only."""
222
+ try:
223
+ _state_path().unlink()
224
+ except OSError:
225
+ pass