code-coordinator 0.5.316__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.316 → code_coordinator-0.5.317}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reconcile.py +59 -2
  7. code_coordinator-0.5.317/coord/repo_dormancy.py +225 -0
  8. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/serve_app.py +40 -4
  9. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/conftest.py +23 -0
  10. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_merges.py +137 -0
  11. code_coordinator-0.5.317/tests/test_repo_dormancy.py +187 -0
  12. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve.py +139 -0
  13. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/.gitignore +0 -0
  26. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/GOAL.md +0 -0
  28. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/LICENSE +0 -0
  29. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/README.md +0 -0
  31. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/client.py +0 -0
  63. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/machine.py +0 -0
  78. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/pr.py +0 -0
  84. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/repo.py +0 -0
  86. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/report.py +0 -0
  87. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/review.py +0 -0
  88. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/scorecard.py +0 -0
  89. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/sessions.py +0 -0
  90. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/setup.py +0 -0
  91. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/status.py +0 -0
  92. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/store_migrate.py +0 -0
  93. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/config.py +0 -0
  98. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/config_reload.py +0 -0
  99. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/confirm_test.py +0 -0
  100. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/conflict_fix.py +0 -0
  101. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dao.py +0 -0
  102. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/__init__.py +0 -0
  103. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/fixture.py +0 -0
  104. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/index.html +0 -0
  105. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/server.py +0 -0
  106. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dashboard/terminal.py +0 -0
  107. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/db.py +0 -0
  108. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dead_end.py +0 -0
  109. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/decomposition_chat.py +0 -0
  110. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-failure-notify.service +0 -0
  118. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.service +0 -0
  119. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  120. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-notify.service +0 -0
  121. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-notify.timer +0 -0
  122. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.service +0 -0
  123. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-propagate.timer +0 -0
  124. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.service +0 -0
  125. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-release-window.timer +0 -0
  126. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-serve.service +0 -0
  127. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.service +0 -0
  128. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web-dist-build.timer +0 -0
  129. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy/coord-web.service +0 -0
  130. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy_manifest.py +0 -0
  131. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deploy_units.py +0 -0
  132. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deprecation_telemetry.py +0 -0
  133. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/events.py +0 -0
  141. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/_ci_pin.py +0 -0
  158. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/agent_install.py +0 -0
  159. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/cargo_targets.py +0 -0
  160. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/claude_binary.py +0 -0
  161. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  162. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/issues_sync_staleness.py +0 -0
  173. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/plan_usage.py +0 -0
  174. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/release_cordon.py +0 -0
  175. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/stalled_pipeline.py +0 -0
  178. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/wedged_drive_queue.py +0 -0
  183. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/checks/worktrees.py +0 -0
  184. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/cli.py +0 -0
  185. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/context.py +0 -0
  186. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/fleet_snapshot.py +0 -0
  187. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/models.py +0 -0
  188. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/pypi.py +0 -0
  189. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/registry.py +0 -0
  190. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/render.py +0 -0
  191. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/health/units.py +0 -0
  192. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/hooks.py +0 -0
  193. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/housekeeping.py +0 -0
  194. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/interactive.py +0 -0
  195. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/issue_store.py +0 -0
  196. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/issues_sync_status.py +0 -0
  197. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/liveness_auditor.py +0 -0
  198. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/machine_onboard.py +0 -0
  199. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/machine_pause.py +0 -0
  200. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/merge_queue.py +0 -0
  201. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_chat.py +0 -0
  202. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_dispatch.py +0 -0
  203. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_gate.py +0 -0
  204. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/milestone_order.py +0 -0
  205. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/mock_author.py +0 -0
  206. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/models.py +0 -0
  207. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/network.py +0 -0
  208. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/new_issue_chat.py +0 -0
  209. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/__init__.py +0 -0
  210. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/baseline.py +0 -0
  211. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/cli.py +0 -0
  212. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/collect.py +0 -0
  213. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/digest.py +0 -0
  214. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/models.py +0 -0
  215. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/predicate.py +0 -0
  216. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/service.py +0 -0
  217. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/store.py +0 -0
  218. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notifier/transport.py +0 -0
  219. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/notify.py +0 -0
  220. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/openapi.py +0 -0
  221. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/overlap_fence.py +0 -0
  222. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/overlap_predict.py +0 -0
  223. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/parentage.py +0 -0
  224. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/parentage_github.py +0 -0
  225. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/pipeline.py +0 -0
  226. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/plan_parser.py +0 -0
  227. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/plans.py +0 -0
  228. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/platform_paths.py +0 -0
  229. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_bridge.py +0 -0
  230. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_store.py +0 -0
  231. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/portal_sync.py +0 -0
  232. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/pr_body_lint.py +0 -0
  233. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/prereqs.py +0 -0
  234. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/progress.py +0 -0
  235. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/__init__.py +0 -0
  236. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/base.py +0 -0
  237. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/claude.py +0 -0
  238. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/claude_pty.py +0 -0
  239. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/providers/opencode.py +0 -0
  240. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/queue_diagnose.py +0 -0
  241. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reconcile_tick.py +0 -0
  242. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/refine_chat.py +0 -0
  243. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_cordon.py +0 -0
  244. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_propagate.py +0 -0
  245. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_verify.py +0 -0
  246. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/release_window.py +0 -0
  247. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/repo_edit.py +0 -0
  248. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/repo_onboard.py +0 -0
  249. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/reports.py +0 -0
  250. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/rest_schema.py +0 -0
  251. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/revalidate.py +0 -0
  252. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/review.py +0 -0
  253. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/scorecard.py +0 -0
  254. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/self_health.py +0 -0
  255. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  256. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  257. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  258. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  259. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  260. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/portal-followup/SKILL.md +0 -0
  261. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/release-now/SKILL.md +0 -0
  262. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  263. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  264. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/skills/update-issue/SKILL.md +0 -0
  265. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/smoke.py +0 -0
  266. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/spend_ceiling.py +0 -0
  267. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/split_work.py +0 -0
  268. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/sql.py +0 -0
  269. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/stage_projection.py +0 -0
  270. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/state.py +0 -0
  271. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/store_migrate.py +0 -0
  272. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_author.py +0 -0
  273. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_chat.py +0 -0
  274. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_orchestrator.py +0 -0
  275. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/test_report.py +0 -0
  276. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/tui_release.py +0 -0
  277. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage.py +0 -0
  278. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage_limits.py +0 -0
  279. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/usage_rollup.py +0 -0
  280. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coord/worker_events.py +0 -0
  281. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/coordinator.example.yml +0 -0
  282. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-agent.service +0 -0
  283. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.service +0 -0
  284. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.sh +0 -0
  285. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-db-backup.timer +0 -0
  286. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-drive-queue.service +0 -0
  287. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-drive-queue.timer +0 -0
  288. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-failure-notify.service +0 -0
  289. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-failure-notify.sh +0 -0
  290. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.service +0 -0
  291. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-fleet-watchdog.timer +0 -0
  292. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-notify.service +0 -0
  293. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-notify.timer +0 -0
  294. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-propagate.service +0 -0
  295. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-propagate.timer +0 -0
  296. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-window.service +0 -0
  297. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-release-window.timer +0 -0
  298. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-serve.service +0 -0
  299. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.service +0 -0
  300. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.sh +0 -0
  301. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-dist-build.timer +0 -0
  302. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web-rollback.sh +0 -0
  303. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/coord-web.service +0 -0
  304. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/deploy/node-shim.sh +0 -0
  305. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_TUI_CI.md +0 -0
  306. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  307. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_CI.md +0 -0
  308. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_COORD_WEB_DIST.md +0 -0
  309. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  310. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/OPERATOR_GUIDES.md +0 -0
  330. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/ORACLE_LOOP.md +0 -0
  331. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PHONE_WEBAPP.md +0 -0
  332. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PIPELINE_V2.md +0 -0
  333. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/PLATFORM_EVOLUTION.md +0 -0
  334. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/SECOND_BACKEND.md +0 -0
  335. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/STORE_SERVICE.md +0 -0
  336. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  337. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/WEB_CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/WSL_WINDOWS_WORKER.md +0 -0
  339. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/README.md +0 -0
  340. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/_tokens.css +0 -0
  341. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/issue-detail.html +0 -0
  342. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-narrow.html +0 -0
  343. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/docs/mocks/web/pipeline-wide.html +0 -0
  344. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/graphify-out/.gitignore +0 -0
  345. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/install-agent.sh +0 -0
  346. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/pyproject.toml +0 -0
  347. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/audit_review_verdict_overrides.py +0 -0
  348. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  349. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/build-worker-image.sh +0 -0
  350. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/coordinator-machine.py +0 -0
  351. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/epic-down.sh +0 -0
  352. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/epic-up.sh +0 -0
  353. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/preflight.sh +0 -0
  354. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/provision-worker.sh +0 -0
  355. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  356. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  357. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/azure-workers/verify-github-token.sh +0 -0
  358. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/check_gh_argv_containment.py +0 -0
  359. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/codegen.py +0 -0
  360. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-test-runner.sh +0 -0
  361. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  362. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  363. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  364. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  365. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/coord-venv-rollback.sh +0 -0
  366. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/drive-batch.sh +0 -0
  367. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/extract-coord-tui.sh +0 -0
  368. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/fleet_watchdog.py +0 -0
  369. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/gen_board_fixture.py +0 -0
  370. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/gen_mock_index.py +0 -0
  371. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/next_release_tag.py +0 -0
  372. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/run_tests_in_populated_home.sh +0 -0
  373. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/run_tests_without_gh.sh +0 -0
  374. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/smoke_437_interactive.py +0 -0
  375. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_878_review_capture.py +0 -0
  376. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_release_published.py +0 -0
  377. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/scripts/verify_release_wheel.py +0 -0
  378. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/setup.cfg +0 -0
  379. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/SMOKE_SET.md +0 -0
  380. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/__init__.py +0 -0
  381. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/contract.md +0 -0
  387. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  388. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  389. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/manifest.yml +0 -0
  390. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  391. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-51/tsconfig.json +0 -0
  392. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/backends.py +0 -0
  394. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-basic.json +0 -0
  395. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  396. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  397. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  398. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  399. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/all_pass.json +0 -0
  400. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  401. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/mixed_fail.json +0 -0
  402. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  403. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  404. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/skip.json +0 -0
  405. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/playwright/truncated.json +0 -0
  406. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  407. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  408. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  409. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  410. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  411. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  412. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  413. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  414. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_acceptance.py +0 -0
  415. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_acceptance_drivers.py +0 -0
  416. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent.py +0 -0
  417. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_api_error.py +0 -0
  418. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_app.py +0 -0
  419. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_branch_base.py +0 -0
  420. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_branch_capture.py +0 -0
  421. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_config_free_1712.py +0 -0
  422. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_deploy_units_endpoint.py +0 -0
  423. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_dirty_worktree.py +0 -0
  424. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  425. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_graph_self_heal.py +0 -0
  426. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_health_h3.py +0 -0
  427. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_idle_restart.py +0 -0
  428. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_push_failure.py +0 -0
  429. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_reap.py +0 -0
  430. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_repos_and_pull.py +0 -0
  431. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_restart_services_endpoint.py +0 -0
  432. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_skills_self_heal.py +0 -0
  433. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_startup_diagnostics.py +0 -0
  434. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_update.py +0 -0
  435. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_update_bluegreen.py +0 -0
  436. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_usage_limit.py +0 -0
  437. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_agent_zero_commit.py +0 -0
  438. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ambient_home_isolation.py +0 -0
  439. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_dependency_busy_2804.py +0 -0
  440. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_reject_plan.py +0 -0
  441. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approve_usage_gate.py +0 -0
  442. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_approved_work_2532.py +0 -0
  443. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_assignment_already_recorded_daemon.py +0 -0
  444. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_log.py +0 -0
  445. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_outcome.py +0 -0
  446. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_audit_query.py +0 -0
  447. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_auto_loop.py +0 -0
  448. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_auto_release_publish_2035.py +0 -0
  449. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_backend_selection.py +0 -0
  450. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_base_checkout_restore.py +0 -0
  451. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_block_log.py +0 -0
  452. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_cap_762.py +0 -0
  453. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_fixture.py +0 -0
  454. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_read_path.py +0 -0
  455. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_schema.py +0 -0
  456. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_service.py +0 -0
  457. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_state.py +0 -0
  458. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_board_wire.py +0 -0
  459. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_brain.py +0 -0
  460. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_branch_model.py +0 -0
  461. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_bug_intake.py +0 -0
  462. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_build_worker_image_env_update.py +0 -0
  463. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cargo_cache.py +0 -0
  464. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_check_gh_argv_containment.py +0 -0
  465. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_acceptance_gate_1950.py +0 -0
  466. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_fix.py +0 -0
  467. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_gitlab.py +0 -0
  468. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_parity_2091.py +0 -0
  469. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_ci_store.py +0 -0
  470. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_claim.py +0 -0
  471. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_claude_md_budget.py +0 -0
  472. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_acceptance.py +0 -0
  473. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign.py +0 -0
  474. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  475. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_interactive_remote.py +0 -0
  476. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_provider.py +0 -0
  477. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  478. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_audit.py +0 -0
  479. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_chat_continue.py +0 -0
  480. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_decide.py +0 -0
  481. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_capability_rules.py +0 -0
  482. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_config_provenance.py +0 -0
  483. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_forge_availability.py +0 -0
  484. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_graph.py +0 -0
  485. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_self.py +0 -0
  486. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_diagnose_test_coverage.py +0 -0
  487. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor.py +0 -0
  488. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_free_1801.py +0 -0
  489. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  490. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_drive.py +0 -0
  491. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_drive_queue.py +0 -0
  492. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_escalate.py +0 -0
  493. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_fix_headless_review.py +0 -0
  494. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_gate_a.py +0 -0
  495. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_install_drift.py +0 -0
  496. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_install_skills.py +0 -0
  497. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_comment.py +0 -0
  498. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_create_label.py +0 -0
  499. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_reopen.py +0 -0
  500. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_issue_view_list.py +0 -0
  501. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_merge.py +0 -0
  502. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_assign.py +0 -0
  503. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_capture.py +0 -0
  504. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_chat_add_child.py +0 -0
  505. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_dispatch.py +0 -0
  506. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_b.py +0 -0
  507. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_gate_c.py +0 -0
  508. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_order.py +0 -0
  509. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  510. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_milestone_ship.py +0 -0
  511. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_network.py +0 -0
  512. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_new_issue_chat.py +0 -0
  513. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_plans.py +0 -0
  514. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_portal.py +0 -0
  515. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_pr.py +0 -0
  516. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_pull_artifact.py +0 -0
  517. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_queue.py +0 -0
  518. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_reattach_sessions.py +0 -0
  519. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_refine_board.py +0 -0
  520. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_preflight.py +0 -0
  521. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_propagate.py +0 -0
  522. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_release_window.py +0 -0
  523. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_repo_2220.py +0 -0
  524. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  525. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_scorecard.py +0 -0
  526. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_set_review_findings.py +0 -0
  527. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_advisory_terminal.py +0 -0
  528. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_contested_tag.py +0 -0
  529. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_merge_queue.py +0 -0
  530. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_provider.py +0 -0
  531. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_review_finalizing.py +0 -0
  532. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_test_failed_tag.py +0 -0
  533. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_status_usage_limit.py +0 -0
  534. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_sync_comments_873.py +0 -0
  535. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_test_plan.py +0 -0
  536. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_track.py +0 -0
  537. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_tui_update.py +0 -0
  538. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cli_wait.py +0 -0
  539. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_client_base_install.py +0 -0
  540. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_client_resource_migration_1946.py +0 -0
  541. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_commands_common.py +0 -0
  542. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_comments.py +0 -0
  543. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_completion_summary.py +0 -0
  544. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config.py +0 -0
  545. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_acceptance.py +0 -0
  546. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_audit.py +0 -0
  547. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_pricing.py +0 -0
  548. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  549. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_config_usage_gate.py +0 -0
  550. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_confirm_test.py +0 -0
  551. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_conflict_fix.py +0 -0
  552. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_conflict_fix_semantic.py +0 -0
  553. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  554. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test.py +0 -0
  555. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  556. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_baseline.py +0 -0
  557. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_populated_home.py +0 -0
  558. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_routing.py +0 -0
  559. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_test_runner_toolchain.py +0 -0
  560. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_uat.py +0 -0
  561. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coord_web_sse_restart_live.py +0 -0
  562. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_coordinator_machine.py +0 -0
  563. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_cross_platform_imports.py +0 -0
  564. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dao.py +0 -0
  565. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard.py +0 -0
  566. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_fixture.py +0 -0
  567. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_terminal.py +0 -0
  568. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dashboard_terminal_live.py +0 -0
  569. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_db.py +0 -0
  570. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dead_end.py +0 -0
  571. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_decomposition_chat.py +0 -0
  572. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_db_backup.py +0 -0
  573. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_dist.py +0 -0
  574. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_coord_web_rollback.py +0 -0
  575. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_drive_queue_unit.py +0 -0
  576. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_failure_notify_unit.py +0 -0
  577. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_manifest.py +0 -0
  578. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_notify_unit.py +0 -0
  579. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_units_lane.py +0 -0
  580. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deploy_web_unit.py +0 -0
  581. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deprecation_telemetry.py +0 -0
  582. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_deps.py +0 -0
  583. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_diagnose.py +0 -0
  584. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dispatch.py +0 -0
  585. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dispatch_target_validation.py +0 -0
  586. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_dist_name.py +0 -0
  587. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_done_housekeeping.py +0 -0
  588. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive.py +0 -0
  589. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue.py +0 -0
  590. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_blocked_rendering.py +0 -0
  591. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_launch_argv.py +0 -0
  592. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  593. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_roll_pending.py +0 -0
  594. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  595. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_state.py +0 -0
  596. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_drive_tmux.py +0 -0
  597. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_capability_detection.py +0 -0
  598. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  599. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_epic_up_image_provenance.py +0 -0
  600. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_errors.py +0 -0
  601. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_events.py +0 -0
  602. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_failure_class.py +0 -0
  603. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_filelock.py +0 -0
  604. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  605. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fix_of_force_override.py +0 -0
  606. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_config_health.py +0 -0
  607. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_health_probes.py +0 -0
  608. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_health_snapshot.py +0 -0
  609. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_fleet_watchdog.py +0 -0
  610. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_forge_availability.py +0 -0
  611. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_freshness.py +0 -0
  612. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_a.py +0 -0
  613. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_b.py +0 -0
  614. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gate_snapshot_staleness.py +0 -0
  615. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gates.py +0 -0
  616. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  617. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_gen_mock_index.py +0 -0
  618. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_rust_fixture.py +0 -0
  619. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_rust_requests.py +0 -0
  620. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_github_throttle.py +0 -0
  623. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_graph_selfheal_absent_2237.py +0 -0
  626. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_coord_tui_ci_pin.py +0 -0
  633. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_coord_web_ci_pin.py +0 -0
  634. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_deploy_lane_facts.py +0 -0
  635. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_fix.py +0 -0
  636. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_incident_regression.py +0 -0
  637. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_issues_sync_staleness.py +0 -0
  638. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_pypi.py +0 -0
  639. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_registry.py +0 -0
  640. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_release_cordon_probe.py +0 -0
  641. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_timer_active.py +0 -0
  642. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_toolchain.py +0 -0
  643. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_unit_drift.py +0 -0
  644. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_unit_enablement.py +0 -0
  645. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_health_wedged_drive_queue.py +0 -0
  646. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_install_agent_venv_2911.py +0 -0
  650. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_pane_log_2541.py +0 -0
  653. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_issues_sync_status.py +0 -0
  660. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_liveness_auditor.py +0 -0
  661. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_liveness_notify.py +0 -0
  662. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_lock_contention_ratchet.py +0 -0
  663. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_machine_onboard.py +0 -0
  664. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_no_agent_record.py +0 -0
  729. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_tick.py +0 -0
  730. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reconcile_usage_limit_done.py +0 -0
  731. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_refine_chat.py +0 -0
  732. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_2101.py +0 -0
  733. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  734. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_deadlock_2240.py +0 -0
  735. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_cordon_stuck_2490.py +0 -0
  736. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_propagate.py +0 -0
  737. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_propagate_threshold.py +0 -0
  738. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_roll_between_legs_2854.py +0 -0
  739. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_roll_window_handoff.py +0 -0
  740. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_unified_1242.py +0 -0
  741. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_verify.py +0 -0
  742. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_release_window.py +0 -0
  743. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_remote_auto_prune.py +0 -0
  744. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_remote_interactive_reaper.py +0 -0
  745. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_add.py +0 -0
  746. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_edit_2220.py +0 -0
  747. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_graph_fleet_2237.py +0 -0
  748. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_repo_onboard_2220.py +0 -0
  749. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_report_result_push.py +0 -0
  750. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_reports.py +0 -0
  751. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry.py +0 -0
  752. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry_advisory_1606.py +0 -0
  753. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_retry_type_1636.py +0 -0
  754. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_revalidate.py +0 -0
  755. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review.py +0 -0
  756. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_end_review_without_verdict.py +0 -0
  757. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_parse_failure_diagnostic.py +0 -0
  758. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_reaffirm.py +0 -0
  759. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_state.py +0 -0
  760. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_backstop.py +0 -0
  761. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_override_audit.py +0 -0
  762. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_verdict_relay.py +0 -0
  763. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_review_zero_commits.py +0 -0
  764. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_scoped_review_wiring.py +0 -0
  765. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_scorecard.py +0 -0
  766. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_self_health.py +0 -0
  767. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve_app_board_trim.py +0 -0
  768. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_serve_rest_routes.py +0 -0
  769. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_session.py +0 -0
  770. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_slice_issue_attribution.py +0 -0
  771. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke.py +0 -0
  772. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke_live_checkout_restore.py +0 -0
  773. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_smoke_workflow.py +0 -0
  774. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_spend_ceiling.py +0 -0
  775. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_spend_ceiling_coordinator.py +0 -0
  776. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_split.py +0 -0
  777. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_split_work.py +0 -0
  778. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_sql_dialect.py +0 -0
  779. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_sqlite_connect_ratchet.py +0 -0
  780. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stage_projection.py +0 -0
  781. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stale_busy_reviewer_697.py +0 -0
  782. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stalled_pipeline.py +0 -0
  783. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_state.py +0 -0
  784. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_state_review_findings_daemon.py +0 -0
  785. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_status_fleet_footer.py +0 -0
  786. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stop_1567.py +0 -0
  787. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_store_contract.py +0 -0
  788. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_store_migrate.py +0 -0
  789. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stuck.py +0 -0
  790. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  791. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_terminal_command.py +0 -0
  792. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_author.py +0 -0
  793. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_chat.py +0 -0
  794. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_orchestrator.py +0 -0
  795. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_report.py +0 -0
  796. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_verdict_parsing.py +0 -0
  797. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_test_verdict_transcript_floor.py +0 -0
  798. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_text_io_encoding_audit.py +0 -0
  799. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_board_audit.py +0 -0
  800. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_config_load_1080.py +0 -0
  801. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_thin_client_daemon_routing_906.py +0 -0
  802. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_tmux_host.py +0 -0
  803. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_tmux_session.py +0 -0
  804. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_transcript_floor.py +0 -0
  805. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage.py +0 -0
  806. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage_limits.py +0 -0
  807. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_usage_rollup.py +0 -0
  808. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_venv_live_install_2121.py +0 -0
  809. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_version_single_source.py +0 -0
  810. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_watch.py +0 -0
  811. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  812. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_env_venv_isolation.py +0 -0
  813. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_events.py +0 -0
  814. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_image_pin_sync.py +0 -0
  815. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_safety.py +0 -0
  816. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worker_test_scoping.py +0 -0
  817. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worktree.py +0 -0
  818. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  819. {code_coordinator-0.5.316 → code_coordinator-0.5.317}/tests/test_write_parity.py +0 -0
  820. {code_coordinator-0.5.316 → 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.316
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.316
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.316",
2
+ "tag": "0.5.317",
3
3
  "distance": 0,
4
- "node": "g84875a2c21cee2157331b4a2f1e92ca1c9b812fe",
4
+ "node": "gf4f544e9955eaa18600b99dd2e5c9c0cc421e7e4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -2791,9 +2791,11 @@ def _extract_issue_number(branch: str) -> int | None:
2791
2791
  def close_stale_prs(
2792
2792
  config: Config,
2793
2793
  *,
2794
+ board: Board | None = None,
2794
2795
  repo: str | None = None,
2795
2796
  issue: int | None = None,
2796
2797
  dry_run: bool = False,
2798
+ skip_dormant_repos: bool = False,
2797
2799
  ) -> list[str]:
2798
2800
  """Close open PRs whose work is already on main or whose issue is closed.
2799
2801
 
@@ -2808,15 +2810,46 @@ def close_stale_prs(
2808
2810
 
2809
2811
  Stale PRs are closed with an explanatory comment. Non-stale PRs are left
2810
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.
2811
2833
  """
2812
2834
  from coord import github_ops # noqa: PLC0415
2813
2835
 
2814
2836
  actions: list[str] = []
2837
+ dormant_skipped = 0
2815
2838
 
2816
2839
  for repo_cfg in config.repos:
2817
2840
  if repo is not None and repo_cfg.name != repo:
2818
2841
  continue
2819
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
+
2820
2853
  try:
2821
2854
  open_prs = github_ops.list_open_prs(repo_cfg.github)
2822
2855
  except Exception as exc: # noqa: BLE001
@@ -2891,6 +2924,14 @@ def close_stale_prs(
2891
2924
  except Exception as exc: # noqa: BLE001
2892
2925
  actions.append(f" ↳ error closing PR #{pr_number}: {exc}")
2893
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
+
2894
2935
  return actions
2895
2936
 
2896
2937
 
@@ -2926,6 +2967,7 @@ def reconcile_board_merges(
2926
2967
  issue: int | None = None,
2927
2968
  dry_run: bool = False,
2928
2969
  throttle_false_merge_audit: bool = False,
2970
+ skip_dormant_repos: bool = False,
2929
2971
  ) -> list[str]:
2930
2972
  """Reconcile done work assignments against git/GitHub reality.
2931
2973
 
@@ -2995,7 +3037,13 @@ def reconcile_board_merges(
2995
3037
  the daemon's 30s tick (97% of a pass's ``gh`` calls). Set
2996
3038
  *throttle_false_merge_audit* to run that sweep at most hourly; the
2997
3039
  daemon tick does, a manual ``coord reconcile-merges`` deliberately does
2998
- not. See the inline block above ``_false_merge_candidates``.)
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.)
2999
3047
  """
3000
3048
  from coord import github_ops, state # noqa: PLC0415
3001
3049
 
@@ -3139,7 +3187,16 @@ def reconcile_board_merges(
3139
3187
  state.mark_work_review_settled(a.assignment_id or "")
3140
3188
 
3141
3189
  # (c) #721 — close open PRs whose work has already landed.
3142
- 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
+ )
3143
3200
 
3144
3201
  # (d) #732 — prune stale merge_queue entries for closed issues / merged PRs.
3145
3202
  # Runs after the board sweeps so a just-marked-merged assignment doesn't
@@ -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
@@ -991,7 +991,13 @@ def _reconcile_merges_tick(config: Config) -> list[str]:
991
991
  # candidate set proportional to project history — 97% of a reconcile
992
992
  # pass's `gh` calls, and the demand behind the fleet-wide secondary rate
993
993
  # limiting. A manual `coord reconcile-merges` still sweeps every time.
994
- actions = reconcile_board_merges(board, config, throttle_false_merge_audit=True)
994
+ # #2994: same daemon-only opt-in for `skip_dormant_repos` — the stale-PR
995
+ # sweep (close_stale_prs, sweep c) otherwise lists open PRs for every
996
+ # registered repo every tick regardless of activity. A manual
997
+ # `coord reconcile-merges` still sweeps every repo.
998
+ actions = reconcile_board_merges(
999
+ board, config, throttle_false_merge_audit=True, skip_dormant_repos=True
1000
+ )
995
1001
  save_board(board)
996
1002
  if actions:
997
1003
  # #1038: one coarse operational row per tick that did something —
@@ -1035,11 +1041,24 @@ def _sync_issues_tick(config: Config) -> int:
1035
1041
  sample for 39 minutes straight, even though a direct ``gh`` call
1036
1042
  succeeded in under a second the whole time. See
1037
1043
  ``coord.github_ops._gh``'s docstring for exactly what the flag changes.
1044
+
1045
+ #2994: before spending a call on a repo, consult
1046
+ ``coord.repo_dormancy.should_skip_sweep`` — a repo with no open
1047
+ assignment, no drive-queue entry, and no coord-authored open PR is
1048
+ dormant, and dormant repos are only swept once per
1049
+ ``coord.repo_dormancy.DORMANT_SWEEP_FLOOR_S`` rather than every tick.
1050
+ Queuing work for a dormant repo un-skips it on the very next tick (the
1051
+ check is live against board + drive-queue state, never cached). This
1052
+ adds a ``build_board()`` call to this tick that wasn't here before —
1053
+ a local SQLite read, not a network call; every other slow-cadence tick
1054
+ in this module (``_reconcile_merges_tick`` included, run moments earlier
1055
+ in the same ``_tick_loop`` pass) already pays it once per tick, so this
1056
+ is not new cost territory.
1038
1057
  """
1039
1058
  import logging # noqa: PLC0415
1040
1059
 
1041
- from coord import github_ops, issues_sync_status # noqa: PLC0415
1042
- from coord.state import _upsert_open_issues_local # noqa: PLC0415
1060
+ from coord import github_ops, issues_sync_status, repo_dormancy # noqa: PLC0415
1061
+ from coord.state import _upsert_open_issues_local, build_board # noqa: PLC0415
1043
1062
 
1044
1063
  # Use the private _upsert_open_issues_local (underscore-prefixed) rather
1045
1064
  # than the public upsert_open_issues, because the public variant routes
@@ -1047,8 +1066,16 @@ def _sync_issues_tick(config: Config) -> int:
1047
1066
  # configured. Since this function IS the daemon, we must write directly
1048
1067
  # to the local DB to avoid a self-referential HTTP call.
1049
1068
  log = logging.getLogger("coord.serve")
1069
+ board = build_board()
1050
1070
  total = 0
1071
+ skipped_dormant = 0
1051
1072
  for repo in config.repos:
1073
+ if repo_dormancy.should_skip_sweep(
1074
+ repo.name, board, repo_dormancy.KIND_ISSUES
1075
+ ):
1076
+ skipped_dormant += 1
1077
+ continue
1078
+ repo_dormancy.record_swept(repo.name, repo_dormancy.KIND_ISSUES)
1052
1079
  starved = issues_sync_status.is_starved(repo.name)
1053
1080
  issues_sync_status.record_attempt(repo.name)
1054
1081
  try:
@@ -1065,7 +1092,16 @@ def _sync_issues_tick(config: Config) -> int:
1065
1092
  " (starvation-floor bypass already attempted)" if starved else "",
1066
1093
  exc_info=True,
1067
1094
  )
1068
- log.debug("issues-sync tick: %d open issues across %d repos", total, len(config.repos))
1095
+ if skipped_dormant:
1096
+ log.info(
1097
+ "issues-sync tick: skipped %d dormant repo(s) (no open assignment, "
1098
+ "drive-queue entry, or open PR)",
1099
+ skipped_dormant,
1100
+ )
1101
+ log.debug(
1102
+ "issues-sync tick: %d open issues across %d repos (%d dormant-skipped)",
1103
+ total, len(config.repos), skipped_dormant,
1104
+ )
1069
1105
  return total
1070
1106
 
1071
1107
 
@@ -761,6 +761,29 @@ def _no_real_issues_sync_status_store(monkeypatch, tmp_path):
761
761
  )
762
762
 
763
763
 
764
+ @pytest.fixture(autouse=True)
765
+ def _no_real_repo_dormancy_store(monkeypatch, tmp_path):
766
+ """#2994: never let a test write the OPERATOR'S real
767
+ ``~/.coord/repo_dormancy_status.json``.
768
+
769
+ Same hazard as ``_no_real_issues_sync_status_store`` immediately above,
770
+ one file over: this one is the per-repo dormant-sweep floor timer
771
+ (``coord.repo_dormancy``) that both ``coord.serve_app._sync_issues_tick``
772
+ and ``coord.reconcile.close_stale_prs`` consult before spending a real
773
+ ``gh`` call on a repo. A leaked test write could plant a fake recent
774
+ sweep timestamp that spuriously skips a real fleet's dormant repo past
775
+ its floor, or clear one and force an extra sweep early.
776
+
777
+ ``coord.repo_dormancy._state_path`` reads
778
+ ``$COORD_REPO_DORMANCY_STATE`` first for exactly this redirect, the same
779
+ env-var seam ``_no_real_issues_sync_status_store`` uses, not a
780
+ monkeypatched private function.
781
+ """
782
+ monkeypatch.setenv(
783
+ "COORD_REPO_DORMANCY_STATE", str(tmp_path / "repo-dormancy-status.json")
784
+ )
785
+
786
+
764
787
  @pytest.fixture(autouse=True)
765
788
  def _no_real_roll_pending_store(monkeypatch, tmp_path):
766
789
  """#2587: never let a test write the OPERATOR'S real
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import time
6
+
5
7
  import pytest
6
8
 
7
9
  from coord import github_ops
@@ -907,6 +909,141 @@ def test_stale_pr_sweep_integrated_into_reconcile_board_merges(
907
909
  assert any("close PR #44" in s for s in actions)
908
910
 
909
911
 
912
+ # ── #2994: dormant-repo skip ──────────────────────────────────────────────────
913
+
914
+
915
+ @pytest.fixture
916
+ def two_repo_config() -> Config:
917
+ return Config(
918
+ repos=[
919
+ Repo(name="api", github="acme/api", default_branch="main"),
920
+ Repo(name="idle", github="acme/idle", default_branch="main"),
921
+ ],
922
+ machines=[],
923
+ )
924
+
925
+
926
+ def test_close_stale_prs_skips_dormant_repo_when_opted_in(
927
+ monkeypatch, two_repo_config
928
+ ) -> None:
929
+ """#2994: with skip_dormant_repos=True and a board showing activity on
930
+ 'api' but nothing at all on 'idle', the sweep must not call
931
+ list_open_prs for 'idle' -- and must say so in its actions."""
932
+ from coord import repo_dormancy
933
+
934
+ calls: list[str] = []
935
+ monkeypatch.setattr(
936
+ github_ops,
937
+ "list_open_prs",
938
+ lambda repo: calls.append(repo) or [],
939
+ )
940
+
941
+ # 'idle' already had a baseline sweep, well inside the floor -- only a
942
+ # repo that has been swept before is even eligible to be skipped (see
943
+ # test_never_swept_repo_is_not_skipped in test_repo_dormancy.py).
944
+ repo_dormancy.record_swept("idle", repo_dormancy.KIND_PRS, now=time.time())
945
+
946
+ board = Board(
947
+ active=[],
948
+ completed=[_done_work(assignment_id="w1", branch="issue-1-x")],
949
+ )
950
+ board.completed[0].repo_name = "api"
951
+
952
+ actions = close_stale_prs(two_repo_config, board=board, skip_dormant_repos=True)
953
+
954
+ assert calls == ["acme/api"]
955
+ assert any("skipped 1 dormant repo" in s for s in actions)
956
+
957
+
958
+ def test_close_stale_prs_default_does_not_skip_idle_repo(
959
+ monkeypatch, two_repo_config
960
+ ) -> None:
961
+ """Without opting in (the manual `coord reconcile-merges` path), every
962
+ repo is still swept even when a board is supplied and shows no
963
+ activity anywhere -- skip_dormant_repos defaults to False."""
964
+ calls: list[str] = []
965
+ monkeypatch.setattr(
966
+ github_ops,
967
+ "list_open_prs",
968
+ lambda repo: calls.append(repo) or [],
969
+ )
970
+
971
+ board = Board(active=[], completed=[])
972
+
973
+ actions = close_stale_prs(two_repo_config, board=board)
974
+
975
+ assert calls == ["acme/api", "acme/idle"]
976
+ assert not any("dormant" in s for s in actions)
977
+
978
+
979
+ def test_close_stale_prs_dormant_repo_swept_again_past_the_floor(
980
+ monkeypatch, config
981
+ ) -> None:
982
+ """A dormant repo is only skipped inside DORMANT_SWEEP_FLOOR_S of its
983
+ last real sweep -- past that, the next tick sweeps it for real again so
984
+ out-of-band activity is still noticed eventually."""
985
+ from coord import repo_dormancy
986
+
987
+ calls: list[str] = []
988
+ monkeypatch.setattr(
989
+ github_ops,
990
+ "list_open_prs",
991
+ lambda repo: calls.append(repo) or [],
992
+ )
993
+
994
+ now = time.time()
995
+ repo_dormancy.record_swept(
996
+ "api", repo_dormancy.KIND_PRS, now=now - repo_dormancy.DORMANT_SWEEP_FLOOR_S - 1.0
997
+ )
998
+
999
+ board = Board(active=[], completed=[]) # no activity -- 'api' is idle
1000
+
1001
+ actions = close_stale_prs(config, board=board, skip_dormant_repos=True)
1002
+
1003
+ assert calls == ["acme/api"]
1004
+ assert not any("dormant" in s for s in actions)
1005
+
1006
+
1007
+ def test_reconcile_board_merges_wakes_dormant_repo_when_work_is_queued(
1008
+ monkeypatch, two_repo_config
1009
+ ) -> None:
1010
+ """#2994 acceptance: queuing work for a dormant repo puts it back on the
1011
+ normal cadence on the very next tick, not after the floor expires."""
1012
+ from coord import repo_dormancy
1013
+
1014
+ _patch_probes(monkeypatch, remote_branches=set(), terminal=False)
1015
+ calls: list[str] = []
1016
+ monkeypatch.setattr(
1017
+ github_ops,
1018
+ "list_open_prs",
1019
+ lambda repo: calls.append(repo) or [],
1020
+ )
1021
+
1022
+ now = time.time()
1023
+ # Both repos need a baseline sweep before dormancy skip applies at all
1024
+ # ('never swept' always sweeps -- see test_never_swept_repo_is_not_skipped
1025
+ # in test_repo_dormancy.py). 'api' has real activity below so it's never
1026
+ # skipped regardless; 'idle' was just swept -- well inside the floor.
1027
+ repo_dormancy.record_swept("api", repo_dormancy.KIND_PRS, now=now)
1028
+ repo_dormancy.record_swept("idle", repo_dormancy.KIND_PRS, now=now)
1029
+
1030
+ api_assignment = _done_work(assignment_id="w-api", status="running")
1031
+ api_assignment.repo_name = "api"
1032
+ board = Board(active=[api_assignment], completed=[])
1033
+ reconcile_board_merges(board, two_repo_config, skip_dormant_repos=True)
1034
+ assert calls == ["acme/api"] # 'idle' skipped -- still inside the floor
1035
+
1036
+ # Work gets queued for 'idle' (an open assignment appears on the board).
1037
+ calls.clear()
1038
+ idle_assignment = _done_work(assignment_id="w-idle", status="pending")
1039
+ idle_assignment.repo_name = "idle"
1040
+ board.active.append(idle_assignment)
1041
+
1042
+ reconcile_board_merges(board, two_repo_config, skip_dormant_repos=True)
1043
+
1044
+ assert calls == ["acme/api", "acme/idle"]
1045
+
1046
+
910
1047
  # ── #732 prune stale merge_queue entries ─────────────────────────────────────
911
1048
 
912
1049