code-coordinator 0.5.316__tar.gz → 0.5.318__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.318}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/confirm_test.py +171 -2
  7. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notify.py +132 -22
  8. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reconcile.py +59 -2
  9. code_coordinator-0.5.318/coord/repo_dormancy.py +225 -0
  10. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/serve_app.py +40 -4
  11. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/conftest.py +23 -0
  12. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_confirm_test.py +193 -0
  13. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notify_drain.py +78 -4
  14. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_merges.py +137 -0
  15. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_roll_window_handoff.py +11 -4
  16. code_coordinator-0.5.318/tests/test_repo_dormancy.py +187 -0
  17. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve.py +139 -0
  18. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stuck_test_state_watchdog_2803.py +18 -2
  19. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/board.md +0 -0
  20. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/complete-session.md +0 -0
  21. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.claude/commands/coordinator.md +0 -0
  22. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/_lib.sh +0 -0
  23. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-checkout +0 -0
  24. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-commit +0 -0
  25. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.githooks/post-merge +0 -0
  26. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/coord-ci-acceptance.yml +0 -0
  28. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/publish.yml +0 -0
  30. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.github/workflows/test.yml +0 -0
  31. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/.gitignore +0 -0
  32. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/GOAL.md +0 -0
  34. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/LICENSE +0 -0
  35. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/README.md +0 -0
  37. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/dependency_links.txt +0 -0
  38. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/entry_points.txt +0 -0
  39. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/requires.txt +0 -0
  40. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/acceptance.py +0 -0
  44. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/acceptance_drivers.py +0 -0
  45. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent.py +0 -0
  46. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent_app.py +0 -0
  47. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agent_update.py +0 -0
  48. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/.gitignore +0 -0
  49. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/agents/work.md +0 -0
  50. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/agents/opencode/routing.jsonc +0 -0
  51. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/approved_work.py +0 -0
  52. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/audit.py +0 -0
  53. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/auto_loop.py +0 -0
  54. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/block_log.py +0 -0
  55. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_schema.py +0 -0
  56. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_fix.py +0 -0
  63. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_gitlab.py +0 -0
  65. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/client.py +0 -0
  69. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/__init__.py +0 -0
  70. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/_common.py +0 -0
  71. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/acceptance.py +0 -0
  72. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/agent_ops.py +0 -0
  73. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/audit.py +0 -0
  74. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/machine.py +0 -0
  84. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/pr.py +0 -0
  90. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/release.py +0 -0
  91. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/repo.py +0 -0
  92. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/report.py +0 -0
  93. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/review.py +0 -0
  94. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/scorecard.py +0 -0
  95. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/sessions.py +0 -0
  96. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/setup.py +0 -0
  97. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/status.py +0 -0
  98. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/store_migrate.py +0 -0
  99. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/config.py +0 -0
  104. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/conflict_fix.py +0 -0
  106. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dao.py +0 -0
  107. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/__init__.py +0 -0
  108. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/fixture.py +0 -0
  109. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/index.html +0 -0
  110. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/server.py +0 -0
  111. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dashboard/terminal.py +0 -0
  112. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/db.py +0 -0
  113. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dead_end.py +0 -0
  114. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/decomposition_chat.py +0 -0
  115. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/README.md +0 -0
  116. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-agent.service +0 -0
  117. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.service +0 -0
  118. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.sh +0 -0
  119. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-db-backup.timer +0 -0
  120. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.service +0 -0
  121. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-drive-queue.timer +0 -0
  122. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-failure-notify.service +0 -0
  123. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.service +0 -0
  124. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  125. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-notify.service +0 -0
  126. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-notify.timer +0 -0
  127. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.service +0 -0
  128. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-propagate.timer +0 -0
  129. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.service +0 -0
  130. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-release-window.timer +0 -0
  131. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-serve.service +0 -0
  132. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.service +0 -0
  133. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web-dist-build.timer +0 -0
  134. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy/coord-web.service +0 -0
  135. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy_manifest.py +0 -0
  136. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deploy_units.py +0 -0
  137. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deprecation_telemetry.py +0 -0
  138. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/deps.py +0 -0
  139. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/diagnose.py +0 -0
  140. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dispatch.py +0 -0
  141. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/dist_name.py +0 -0
  142. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive.py +0 -0
  143. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive_queue.py +0 -0
  144. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/drive_state.py +0 -0
  145. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/events.py +0 -0
  146. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/failure_class.py +0 -0
  147. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/filelock.py +0 -0
  148. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/fleet_config_health.py +0 -0
  149. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/forge_availability.py +0 -0
  150. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/freshness.py +0 -0
  151. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_a.py +0 -0
  152. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_b.py +0 -0
  153. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gate_snapshot.py +0 -0
  154. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/gates.py +0 -0
  155. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/github_ops.py +0 -0
  156. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/github_throttle.py +0 -0
  157. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/goal.py +0 -0
  158. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/graph_health.py +0 -0
  159. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/__init__.py +0 -0
  160. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/aggregate.py +0 -0
  161. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/__init__.py +0 -0
  162. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/_ci_pin.py +0 -0
  163. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/agent_install.py +0 -0
  164. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/cargo_targets.py +0 -0
  165. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/claude_binary.py +0 -0
  166. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  167. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/coord_web_ci_pin.py +0 -0
  168. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/deploy_lane_facts.py +0 -0
  169. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/disk.py +0 -0
  170. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_board.py +0 -0
  171. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  172. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_phantom.py +0 -0
  173. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/fleet_unit_drift.py +0 -0
  174. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/graph.py +0 -0
  175. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/graphify_cli.py +0 -0
  176. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/index_lock.py +0 -0
  177. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/issues_sync_staleness.py +0 -0
  178. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/plan_usage.py +0 -0
  179. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/release_cordon.py +0 -0
  180. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/repo_state.py +0 -0
  181. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/spawned_coord.py +0 -0
  182. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/stalled_pipeline.py +0 -0
  183. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/timer_active.py +0 -0
  184. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/toolchain.py +0 -0
  185. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/unit_drift.py +0 -0
  186. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/unit_enablement.py +0 -0
  187. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/wedged_drive_queue.py +0 -0
  188. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/checks/worktrees.py +0 -0
  189. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/cli.py +0 -0
  190. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/context.py +0 -0
  191. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/fleet_snapshot.py +0 -0
  192. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/models.py +0 -0
  193. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/pypi.py +0 -0
  194. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/registry.py +0 -0
  195. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/render.py +0 -0
  196. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/health/units.py +0 -0
  197. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/hooks.py +0 -0
  198. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/housekeeping.py +0 -0
  199. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/interactive.py +0 -0
  200. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/issue_store.py +0 -0
  201. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/issues_sync_status.py +0 -0
  202. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/liveness_auditor.py +0 -0
  203. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/machine_onboard.py +0 -0
  204. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/machine_pause.py +0 -0
  205. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/merge_queue.py +0 -0
  206. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_chat.py +0 -0
  207. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_dispatch.py +0 -0
  208. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_gate.py +0 -0
  209. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/milestone_order.py +0 -0
  210. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/mock_author.py +0 -0
  211. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/models.py +0 -0
  212. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/network.py +0 -0
  213. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/new_issue_chat.py +0 -0
  214. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/__init__.py +0 -0
  215. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/baseline.py +0 -0
  216. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/cli.py +0 -0
  217. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/collect.py +0 -0
  218. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/digest.py +0 -0
  219. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/models.py +0 -0
  220. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/predicate.py +0 -0
  221. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/service.py +0 -0
  222. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/store.py +0 -0
  223. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/notifier/transport.py +0 -0
  224. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/openapi.py +0 -0
  225. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/overlap_fence.py +0 -0
  226. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/overlap_predict.py +0 -0
  227. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/parentage.py +0 -0
  228. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/parentage_github.py +0 -0
  229. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/pipeline.py +0 -0
  230. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/plan_parser.py +0 -0
  231. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/plans.py +0 -0
  232. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/platform_paths.py +0 -0
  233. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_bridge.py +0 -0
  234. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_store.py +0 -0
  235. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/portal_sync.py +0 -0
  236. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/pr_body_lint.py +0 -0
  237. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/prereqs.py +0 -0
  238. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/progress.py +0 -0
  239. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/__init__.py +0 -0
  240. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/base.py +0 -0
  241. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/claude.py +0 -0
  242. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/claude_pty.py +0 -0
  243. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/providers/opencode.py +0 -0
  244. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/queue_diagnose.py +0 -0
  245. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reconcile_tick.py +0 -0
  246. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/refine_chat.py +0 -0
  247. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_cordon.py +0 -0
  248. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_propagate.py +0 -0
  249. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_verify.py +0 -0
  250. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/release_window.py +0 -0
  251. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/repo_edit.py +0 -0
  252. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/repo_onboard.py +0 -0
  253. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/reports.py +0 -0
  254. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/rest_schema.py +0 -0
  255. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/revalidate.py +0 -0
  256. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/review.py +0 -0
  257. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/scorecard.py +0 -0
  258. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/self_health.py +0 -0
  259. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  260. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  261. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  262. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  263. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  264. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/portal-followup/SKILL.md +0 -0
  265. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/release-now/SKILL.md +0 -0
  266. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  267. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  268. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/skills/update-issue/SKILL.md +0 -0
  269. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/smoke.py +0 -0
  270. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/spend_ceiling.py +0 -0
  271. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/split_work.py +0 -0
  272. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/sql.py +0 -0
  273. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/stage_projection.py +0 -0
  274. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/state.py +0 -0
  275. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/store_migrate.py +0 -0
  276. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_author.py +0 -0
  277. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_chat.py +0 -0
  278. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_orchestrator.py +0 -0
  279. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/test_report.py +0 -0
  280. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/tui_release.py +0 -0
  281. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage.py +0 -0
  282. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage_limits.py +0 -0
  283. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/usage_rollup.py +0 -0
  284. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coord/worker_events.py +0 -0
  285. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/coordinator.example.yml +0 -0
  286. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-agent.service +0 -0
  287. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.service +0 -0
  288. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.sh +0 -0
  289. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-db-backup.timer +0 -0
  290. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-drive-queue.service +0 -0
  291. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-drive-queue.timer +0 -0
  292. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-failure-notify.service +0 -0
  293. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-failure-notify.sh +0 -0
  294. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.service +0 -0
  295. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-fleet-watchdog.timer +0 -0
  296. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-notify.service +0 -0
  297. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-notify.timer +0 -0
  298. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-propagate.service +0 -0
  299. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-propagate.timer +0 -0
  300. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-window.service +0 -0
  301. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-release-window.timer +0 -0
  302. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-serve.service +0 -0
  303. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.service +0 -0
  304. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.sh +0 -0
  305. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-dist-build.timer +0 -0
  306. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web-rollback.sh +0 -0
  307. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/coord-web.service +0 -0
  308. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/deploy/node-shim.sh +0 -0
  309. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_TUI_CI.md +0 -0
  310. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  311. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_CI.md +0 -0
  312. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_COORD_WEB_DIST.md +0 -0
  313. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  314. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/AGENT_OPERATIONS.md +0 -0
  315. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ARCHITECTURE.md +0 -0
  316. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ARCH_SECURITY_GATES.md +0 -0
  317. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/COCKPIT.md +0 -0
  318. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CONTROL_CENTER.md +0 -0
  319. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/COST_DISCIPLINE.md +0 -0
  320. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CROSS_PLATFORM.md +0 -0
  321. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CUSTOMER_FACING_APPS.md +0 -0
  322. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/CUSTOMER_PORTAL.md +0 -0
  323. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/DRIVE_QUEUE.md +0 -0
  324. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/EPHEMERAL_WORKERS.md +0 -0
  325. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/FORGE_MIGRATION.md +0 -0
  326. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/GRAPHIFY_SETUP.md +0 -0
  327. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ISSUE_GUIDANCE.md +0 -0
  328. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/MAC_MINI.md +0 -0
  329. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  330. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/NOTIFIER.md +0 -0
  331. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPENCODE_VERIFICATION.md +0 -0
  332. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPERATING_GOTCHAS.md +0 -0
  333. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/OPERATOR_GUIDES.md +0 -0
  334. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/ORACLE_LOOP.md +0 -0
  335. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PHONE_WEBAPP.md +0 -0
  336. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PIPELINE_V2.md +0 -0
  337. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/PLATFORM_EVOLUTION.md +0 -0
  338. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/SECOND_BACKEND.md +0 -0
  339. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/STORE_SERVICE.md +0 -0
  340. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  341. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/WEB_CONTROL_CENTER.md +0 -0
  342. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/WSL_WINDOWS_WORKER.md +0 -0
  343. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/README.md +0 -0
  344. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/_tokens.css +0 -0
  345. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/issue-detail.html +0 -0
  346. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-narrow.html +0 -0
  347. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/docs/mocks/web/pipeline-wide.html +0 -0
  348. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/graphify-out/.gitignore +0 -0
  349. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/install-agent.sh +0 -0
  350. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/pyproject.toml +0 -0
  351. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/audit_review_verdict_overrides.py +0 -0
  352. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  353. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/build-worker-image.sh +0 -0
  354. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/coordinator-machine.py +0 -0
  355. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/epic-down.sh +0 -0
  356. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/epic-up.sh +0 -0
  357. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/preflight.sh +0 -0
  358. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/provision-worker.sh +0 -0
  359. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  360. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  361. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/azure-workers/verify-github-token.sh +0 -0
  362. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/check_gh_argv_containment.py +0 -0
  363. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/codegen.py +0 -0
  364. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-test-runner.sh +0 -0
  365. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  366. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  367. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  368. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  369. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/coord-venv-rollback.sh +0 -0
  370. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/drive-batch.sh +0 -0
  371. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/extract-coord-tui.sh +0 -0
  372. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/fleet_watchdog.py +0 -0
  373. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/gen_board_fixture.py +0 -0
  374. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/gen_mock_index.py +0 -0
  375. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/next_release_tag.py +0 -0
  376. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/run_tests_in_populated_home.sh +0 -0
  377. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/run_tests_without_gh.sh +0 -0
  378. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/smoke_437_interactive.py +0 -0
  379. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_878_review_capture.py +0 -0
  380. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_release_published.py +0 -0
  381. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/scripts/verify_release_wheel.py +0 -0
  382. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/setup.cfg +0 -0
  383. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/SMOKE_SET.md +0 -0
  384. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/__init__.py +0 -0
  385. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/conftest.py +0 -0
  386. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/contract.md +0 -0
  387. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/manifest.yml +0 -0
  388. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  389. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  390. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/contract.md +0 -0
  391. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  392. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  393. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/manifest.yml +0 -0
  394. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  395. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-51/tsconfig.json +0 -0
  396. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  397. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/backends.py +0 -0
  398. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-basic.json +0 -0
  399. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  400. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  401. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  402. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  403. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/all_pass.json +0 -0
  404. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  405. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/mixed_fail.json +0 -0
  406. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  407. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  408. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/skip.json +0 -0
  409. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/playwright/truncated.json +0 -0
  410. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  411. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  412. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  413. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  414. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  415. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  416. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  417. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  418. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_acceptance.py +0 -0
  419. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_acceptance_drivers.py +0 -0
  420. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent.py +0 -0
  421. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_api_error.py +0 -0
  422. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_app.py +0 -0
  423. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_branch_base.py +0 -0
  424. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_branch_capture.py +0 -0
  425. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_config_free_1712.py +0 -0
  426. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_deploy_units_endpoint.py +0 -0
  427. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_dirty_worktree.py +0 -0
  428. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  429. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_graph_self_heal.py +0 -0
  430. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_health_h3.py +0 -0
  431. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_idle_restart.py +0 -0
  432. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_push_failure.py +0 -0
  433. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_reap.py +0 -0
  434. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_repos_and_pull.py +0 -0
  435. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_restart_services_endpoint.py +0 -0
  436. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_skills_self_heal.py +0 -0
  437. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_startup_diagnostics.py +0 -0
  438. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_update.py +0 -0
  439. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_update_bluegreen.py +0 -0
  440. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_usage_limit.py +0 -0
  441. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_agent_zero_commit.py +0 -0
  442. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ambient_home_isolation.py +0 -0
  443. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_dependency_busy_2804.py +0 -0
  444. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_reject_plan.py +0 -0
  445. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approve_usage_gate.py +0 -0
  446. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_approved_work_2532.py +0 -0
  447. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_assignment_already_recorded_daemon.py +0 -0
  448. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_log.py +0 -0
  449. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_outcome.py +0 -0
  450. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_audit_query.py +0 -0
  451. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_auto_loop.py +0 -0
  452. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_auto_release_publish_2035.py +0 -0
  453. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_backend_selection.py +0 -0
  454. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_base_checkout_restore.py +0 -0
  455. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_block_log.py +0 -0
  456. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_cap_762.py +0 -0
  457. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_fixture.py +0 -0
  458. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_read_path.py +0 -0
  459. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_schema.py +0 -0
  460. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_service.py +0 -0
  461. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_state.py +0 -0
  462. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_board_wire.py +0 -0
  463. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_brain.py +0 -0
  464. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_branch_model.py +0 -0
  465. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_bug_intake.py +0 -0
  466. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_build_worker_image_env_update.py +0 -0
  467. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cargo_cache.py +0 -0
  468. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_check_gh_argv_containment.py +0 -0
  469. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_acceptance_gate_1950.py +0 -0
  470. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_fix.py +0 -0
  471. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_gitlab.py +0 -0
  472. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_parity_2091.py +0 -0
  473. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_ci_store.py +0 -0
  474. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_claim.py +0 -0
  475. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_claude_md_budget.py +0 -0
  476. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_acceptance.py +0 -0
  477. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign.py +0 -0
  478. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  479. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_interactive_remote.py +0 -0
  480. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_provider.py +0 -0
  481. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  482. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_audit.py +0 -0
  483. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_chat_continue.py +0 -0
  484. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_decide.py +0 -0
  485. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_capability_rules.py +0 -0
  486. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_config_provenance.py +0 -0
  487. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_forge_availability.py +0 -0
  488. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_graph.py +0 -0
  489. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_self.py +0 -0
  490. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_diagnose_test_coverage.py +0 -0
  491. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor.py +0 -0
  492. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_free_1801.py +0 -0
  493. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  494. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_drive.py +0 -0
  495. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_drive_queue.py +0 -0
  496. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_escalate.py +0 -0
  497. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_fix_headless_review.py +0 -0
  498. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_gate_a.py +0 -0
  499. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_install_drift.py +0 -0
  500. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_install_skills.py +0 -0
  501. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_comment.py +0 -0
  502. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_create_label.py +0 -0
  503. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_reopen.py +0 -0
  504. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_issue_view_list.py +0 -0
  505. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_merge.py +0 -0
  506. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_assign.py +0 -0
  507. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_capture.py +0 -0
  508. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_chat_add_child.py +0 -0
  509. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_dispatch.py +0 -0
  510. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_b.py +0 -0
  511. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_gate_c.py +0 -0
  512. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_order.py +0 -0
  513. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  514. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_milestone_ship.py +0 -0
  515. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_network.py +0 -0
  516. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_new_issue_chat.py +0 -0
  517. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_plans.py +0 -0
  518. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_portal.py +0 -0
  519. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_pr.py +0 -0
  520. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_pull_artifact.py +0 -0
  521. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_queue.py +0 -0
  522. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_reattach_sessions.py +0 -0
  523. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_refine_board.py +0 -0
  524. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_preflight.py +0 -0
  525. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_propagate.py +0 -0
  526. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_release_window.py +0 -0
  527. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_repo_2220.py +0 -0
  528. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  529. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_scorecard.py +0 -0
  530. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_set_review_findings.py +0 -0
  531. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_advisory_terminal.py +0 -0
  532. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_contested_tag.py +0 -0
  533. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_merge_queue.py +0 -0
  534. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_provider.py +0 -0
  535. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_review_finalizing.py +0 -0
  536. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_test_failed_tag.py +0 -0
  537. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_status_usage_limit.py +0 -0
  538. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_sync_comments_873.py +0 -0
  539. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_test_plan.py +0 -0
  540. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_track.py +0 -0
  541. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_tui_update.py +0 -0
  542. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cli_wait.py +0 -0
  543. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_client_base_install.py +0 -0
  544. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_client_resource_migration_1946.py +0 -0
  545. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_commands_common.py +0 -0
  546. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_comments.py +0 -0
  547. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_completion_summary.py +0 -0
  548. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config.py +0 -0
  549. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_acceptance.py +0 -0
  550. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_audit.py +0 -0
  551. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_pricing.py +0 -0
  552. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  553. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_config_usage_gate.py +0 -0
  554. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_conflict_fix.py +0 -0
  555. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_conflict_fix_semantic.py +0 -0
  556. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  557. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test.py +0 -0
  558. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  559. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_baseline.py +0 -0
  560. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_populated_home.py +0 -0
  561. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_routing.py +0 -0
  562. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_test_runner_toolchain.py +0 -0
  563. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_uat.py +0 -0
  564. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coord_web_sse_restart_live.py +0 -0
  565. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_coordinator_machine.py +0 -0
  566. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_cross_platform_imports.py +0 -0
  567. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dao.py +0 -0
  568. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard.py +0 -0
  569. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_fixture.py +0 -0
  570. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_terminal.py +0 -0
  571. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dashboard_terminal_live.py +0 -0
  572. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_db.py +0 -0
  573. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dead_end.py +0 -0
  574. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_decomposition_chat.py +0 -0
  575. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_db_backup.py +0 -0
  576. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_dist.py +0 -0
  577. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_coord_web_rollback.py +0 -0
  578. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_drive_queue_unit.py +0 -0
  579. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_failure_notify_unit.py +0 -0
  580. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_manifest.py +0 -0
  581. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_notify_unit.py +0 -0
  582. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_units_lane.py +0 -0
  583. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deploy_web_unit.py +0 -0
  584. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deprecation_telemetry.py +0 -0
  585. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_deps.py +0 -0
  586. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_diagnose.py +0 -0
  587. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dispatch.py +0 -0
  588. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dispatch_target_validation.py +0 -0
  589. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_dist_name.py +0 -0
  590. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_done_housekeeping.py +0 -0
  591. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive.py +0 -0
  592. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue.py +0 -0
  593. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_blocked_rendering.py +0 -0
  594. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_launch_argv.py +0 -0
  595. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  596. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_roll_pending.py +0 -0
  597. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  598. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_state.py +0 -0
  599. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_drive_tmux.py +0 -0
  600. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_capability_detection.py +0 -0
  601. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  602. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_epic_up_image_provenance.py +0 -0
  603. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_errors.py +0 -0
  604. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_events.py +0 -0
  605. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_failure_class.py +0 -0
  606. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_filelock.py +0 -0
  607. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  608. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fix_of_force_override.py +0 -0
  609. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_config_health.py +0 -0
  610. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_health_probes.py +0 -0
  611. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_health_snapshot.py +0 -0
  612. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_fleet_watchdog.py +0 -0
  613. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_forge_availability.py +0 -0
  614. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_freshness.py +0 -0
  615. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_a.py +0 -0
  616. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_b.py +0 -0
  617. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gate_snapshot_staleness.py +0 -0
  618. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gates.py +0 -0
  619. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  620. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_gen_mock_index.py +0 -0
  621. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_rust_fixture.py +0 -0
  622. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_rust_requests.py +0 -0
  623. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_generated_types_fixture.py +0 -0
  624. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_github_ops.py +0 -0
  625. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_github_throttle.py +0 -0
  626. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_goal.py +0 -0
  627. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_graph_health.py +0 -0
  628. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_graph_selfheal_absent_2237.py +0 -0
  629. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_handoff.py +0 -0
  630. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_checks.py +0 -0
  631. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_cli.py +0 -0
  632. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_cli_graph.py +0 -0
  633. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_config.py +0 -0
  634. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_context.py +0 -0
  635. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_coord_tui_ci_pin.py +0 -0
  636. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_coord_web_ci_pin.py +0 -0
  637. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_deploy_lane_facts.py +0 -0
  638. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_fix.py +0 -0
  639. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_incident_regression.py +0 -0
  640. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_issues_sync_staleness.py +0 -0
  641. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_pypi.py +0 -0
  642. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_registry.py +0 -0
  643. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_release_cordon_probe.py +0 -0
  644. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_timer_active.py +0 -0
  645. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_toolchain.py +0 -0
  646. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_unit_drift.py +0 -0
  647. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_unit_enablement.py +0 -0
  648. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_health_wedged_drive_queue.py +0 -0
  649. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_hooks.py +0 -0
  650. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_human_attended_437.py +0 -0
  651. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_init.py +0 -0
  652. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_install_agent_venv_2911.py +0 -0
  653. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_integration.py +0 -0
  654. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_briefing_echo.py +0 -0
  655. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_pane_log_2541.py +0 -0
  656. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_prefill_state.py +0 -0
  657. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_session_relaunch.py +0 -0
  658. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_test_verdict_backstop.py +0 -0
  659. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_token_attribution.py +0 -0
  660. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_interactive_worktree.py +0 -0
  661. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_issue_store_seam.py +0 -0
  662. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_issues_sync_status.py +0 -0
  663. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_liveness_auditor.py +0 -0
  664. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_liveness_notify.py +0 -0
  665. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_lock_contention_ratchet.py +0 -0
  666. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_machine_onboard.py +0 -0
  667. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_machine_pause.py +0 -0
  668. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_merge_queue.py +0 -0
  669. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_merge_verify.py +0 -0
  670. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_chat.py +0 -0
  671. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_dispatch.py +0 -0
  672. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_gate.py +0 -0
  673. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_order.py +0 -0
  674. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_milestone_seam.py +0 -0
  675. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_mock_author.py +0 -0
  676. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_model_tiering.py +0 -0
  677. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_models.py +0 -0
  678. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_models_config_labels.py +0 -0
  679. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_needs_attention.py +0 -0
  680. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_network.py +0 -0
  681. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_new_issue_chat.py +0 -0
  682. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_next_release_tag.py +0 -0
  683. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_node_shim.py +0 -0
  684. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_baseline.py +0 -0
  685. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_cli.py +0 -0
  686. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_collect.py +0 -0
  687. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_config.py +0 -0
  688. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_drive_seam.py +0 -0
  689. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_isolation.py +0 -0
  690. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_predicate.py +0 -0
  691. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_quiet_hours.py +0 -0
  692. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notifier_service.py +0 -0
  693. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_notify.py +0 -0
  694. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_openapi.py +0 -0
  695. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_operational_defaults.py +0 -0
  696. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_overlap_fence.py +0 -0
  697. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_overlap_predict.py +0 -0
  698. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_packaged_deploy_units.py +0 -0
  699. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_parentage.py +0 -0
  700. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_paste_landed.py +0 -0
  701. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  702. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_pipeline.py +0 -0
  703. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_approve_plan_command.py +0 -0
  704. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_pr_command.py +0 -0
  705. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_followup_review_command.py +0 -0
  706. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_only.py +0 -0
  707. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_plan_parser.py +0 -0
  708. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_platform_paths.py +0 -0
  709. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_bridge.py +0 -0
  710. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_config.py +0 -0
  711. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_store.py +0 -0
  712. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_portal_sync.py +0 -0
  713. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_pr_body_lint.py +0 -0
  714. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_prereqs.py +0 -0
  715. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_production_db_guard.py +0 -0
  716. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_progress.py +0 -0
  717. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_provider_seam.py +0 -0
  718. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers.py +0 -0
  719. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers_config_labels.py +0 -0
  720. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_providers_pty.py +0 -0
  721. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_py_rust_mirror_inventory.py +0 -0
  722. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_quiet_hours.py +0 -0
  723. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_quiet_hours_store_2146.py +0 -0
  724. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reap_merged_sessions.py +0 -0
  725. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reap_stale_interactive_tick.py +0 -0
  726. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile.py +0 -0
  727. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_branch.py +0 -0
  728. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_completions.py +0 -0
  729. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  730. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_no_agent_record.py +0 -0
  731. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_tick.py +0 -0
  732. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reconcile_usage_limit_done.py +0 -0
  733. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_refine_chat.py +0 -0
  734. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_2101.py +0 -0
  735. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  736. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_deadlock_2240.py +0 -0
  737. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_cordon_stuck_2490.py +0 -0
  738. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_propagate.py +0 -0
  739. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_propagate_threshold.py +0 -0
  740. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_roll_between_legs_2854.py +0 -0
  741. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_edit_2220.py +0 -0
  748. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_graph_fleet_2237.py +0 -0
  749. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_repo_onboard_2220.py +0 -0
  750. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_report_result_push.py +0 -0
  751. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_reports.py +0 -0
  752. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry.py +0 -0
  753. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry_advisory_1606.py +0 -0
  754. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_retry_type_1636.py +0 -0
  755. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_revalidate.py +0 -0
  756. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review.py +0 -0
  757. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_end_review_without_verdict.py +0 -0
  758. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_parse_failure_diagnostic.py +0 -0
  759. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_reaffirm.py +0 -0
  760. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_state.py +0 -0
  761. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_backstop.py +0 -0
  762. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_override_audit.py +0 -0
  763. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_verdict_relay.py +0 -0
  764. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_review_zero_commits.py +0 -0
  765. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_scoped_review_wiring.py +0 -0
  766. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_scorecard.py +0 -0
  767. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_self_health.py +0 -0
  768. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve_app_board_trim.py +0 -0
  769. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_serve_rest_routes.py +0 -0
  770. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_session.py +0 -0
  771. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_slice_issue_attribution.py +0 -0
  772. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke.py +0 -0
  773. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke_live_checkout_restore.py +0 -0
  774. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_smoke_workflow.py +0 -0
  775. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_spend_ceiling.py +0 -0
  776. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_spend_ceiling_coordinator.py +0 -0
  777. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_split.py +0 -0
  778. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_split_work.py +0 -0
  779. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_sql_dialect.py +0 -0
  780. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_sqlite_connect_ratchet.py +0 -0
  781. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stage_projection.py +0 -0
  782. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stale_busy_reviewer_697.py +0 -0
  783. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stalled_pipeline.py +0 -0
  784. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_state.py +0 -0
  785. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_state_review_findings_daemon.py +0 -0
  786. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_status_fleet_footer.py +0 -0
  787. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stop_1567.py +0 -0
  788. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_store_contract.py +0 -0
  789. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_store_migrate.py +0 -0
  790. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_stuck.py +0 -0
  791. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_terminal_command.py +0 -0
  792. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_author.py +0 -0
  793. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_chat.py +0 -0
  794. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_orchestrator.py +0 -0
  795. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_report.py +0 -0
  796. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_verdict_parsing.py +0 -0
  797. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_test_verdict_transcript_floor.py +0 -0
  798. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_text_io_encoding_audit.py +0 -0
  799. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_board_audit.py +0 -0
  800. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_config_load_1080.py +0 -0
  801. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_thin_client_daemon_routing_906.py +0 -0
  802. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_tmux_host.py +0 -0
  803. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_tmux_session.py +0 -0
  804. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_transcript_floor.py +0 -0
  805. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage.py +0 -0
  806. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage_limits.py +0 -0
  807. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_usage_rollup.py +0 -0
  808. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_venv_live_install_2121.py +0 -0
  809. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_version_single_source.py +0 -0
  810. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_watch.py +0 -0
  811. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  812. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_env_venv_isolation.py +0 -0
  813. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_events.py +0 -0
  814. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_image_pin_sync.py +0 -0
  815. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_safety.py +0 -0
  816. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worker_test_scoping.py +0 -0
  817. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worktree.py +0 -0
  818. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  819. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/tests/test_write_parity.py +0 -0
  820. {code_coordinator-0.5.316 → code_coordinator-0.5.318}/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.318
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.318
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.318",
3
3
  "distance": 0,
4
- "node": "g84875a2c21cee2157331b4a2f1e92ca1c9b812fe",
4
+ "node": "g232148cbec6041ecf0afda964794347d61a21a64",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -171,6 +171,23 @@ CONFIRM_DEFAULT_TIMEOUT_SECONDS = 60 * 20
171
171
  #: so a pass can confirm ~4 branches back to back) while the daemon-side worst
172
172
  #: case stays a number the thin client can actually be given — see
173
173
  #: :func:`notify_client_timeout_seconds`.
174
+ #:
175
+ #: #2975: that "~6 min serial" sizing is calibrated on THIS repo and does not
176
+ #: hold everywhere — quadraui's ``cargo test --features tui`` builds every
177
+ #: example/test executable (#305 in coordinator.yml) and blows straight past
178
+ #: it, and every ceiling in this module (this one, ``CONFIRM_DEFAULT_
179
+ #: TIMEOUT_SECONDS``, ``deploy/coord-notify.service``'s ``TimeoutStartSec``)
180
+ #: is bigger than ``coord-notify.timer``'s 5-minute cadence, so one such
181
+ #: confirmation can span several fires. Two changes close that without
182
+ #: shrinking this constant (which would just make the COMMON case degrade to
183
+ #: UNCONFIRMED instead): ``coord.notify``'s drain now dispatches pending
184
+ #: Test/Review/PR-opens BEFORE running any confirmation each pass, so a slow
185
+ #: suite on one repo can no longer queue another repo's dispatch behind it;
186
+ #: and :func:`expected_confirmation_seconds` remembers how long a repo's
187
+ #: confirmation last took, so :func:`confirmation_timeout` can recognise a
188
+ #: repo whose suite structurally cannot fit this budget and skip straight to
189
+ #: UNCONFIRMED instead of re-discovering that identical fact — and re-paying
190
+ #: the full ceiling for it — on every single PASS claim.
174
191
  CONFIRM_PASS_BUDGET_SECONDS = 60 * 25
175
192
 
176
193
  #: Don't *start* a confirmation with less than this left in the pass budget.
@@ -232,6 +249,31 @@ KIND_NO_OUTPUT = "no_output"
232
249
  #: docstring's fail-direction section — this frozenset IS that safety property.
233
250
  REFUTING_KINDS = frozenset({KIND_BUILD, KIND_SUITE})
234
251
 
252
+ #: #2975: kinds whose elapsed wall-clock time is a trustworthy signal of how
253
+ #: long THIS repo's confirmation genuinely takes, worth remembering for next
254
+ #: time via :func:`record_confirmation_duration`.
255
+ #:
256
+ #: ``KIND_OK``/``KIND_BUILD``/``KIND_SUITE``/``KIND_BASELINE_RED``/
257
+ #: ``KIND_NO_OUTPUT`` all ran the command to actual completion — a real
258
+ #: measurement. ``KIND_TIMEOUT`` ran for at least the ceiling it was given —
259
+ #: not exact, but a valid LOWER BOUND, and a lower bound is exactly what lets
260
+ #: a chronically-too-slow repo (quadraui's ``cargo test --features tui``
261
+ #: builds every example/test executable, #305 in coordinator.yml) be
262
+ #: recognised as such after a single attempt instead of re-discovering it on
263
+ #: every PASS claim — see :func:`expected_confirmation_seconds`.
264
+ #:
265
+ #: ``KIND_SETUP``/``KIND_INFRA``/``KIND_SIGNAL`` are deliberately excluded:
266
+ #: none of them ran the real command for a representative duration (no
267
+ #: checkout, no toolchain, or killed externally mid-run), and recording their
268
+ #: near-zero elapsed time would silently erase a previously-learned
269
+ #: expectation — exactly the failure mode that would make a single lock
270
+ #: contention hiccup or a missing checkout reset a repo's hard-won "this one
271
+ #: is slow" memory back to "assume it's fast."
272
+ RECORDABLE_DURATION_KINDS = frozenset({
273
+ KIND_OK, KIND_BUILD, KIND_SUITE, KIND_BASELINE_RED, KIND_NO_OUTPUT,
274
+ KIND_TIMEOUT,
275
+ })
276
+
235
277
  #: Kinds meaning "the check could not reach a verdict". The caller falls back to
236
278
  #: the worker's own claim on any of these, which is pre-#2464 behaviour.
237
279
  INCONCLUSIVE_KINDS = frozenset({
@@ -270,7 +312,7 @@ def begin_confirmation_pass(total: float = CONFIRM_PASS_BUDGET_SECONDS) -> None:
270
312
  _pass_state.remaining = float(total)
271
313
 
272
314
 
273
- def confirmation_timeout() -> int | None:
315
+ def confirmation_timeout(expected_seconds: float | None = None) -> int | None:
274
316
  """Seconds the next confirmation in this pass may take, or ``None``.
275
317
 
276
318
  ``None`` means the pass budget is spent (or too nearly spent to be worth
@@ -279,13 +321,31 @@ def confirmation_timeout() -> int | None:
279
321
 
280
322
  Outside a pass — a direct :func:`confirm_branch` call, a unit test — there
281
323
  is no budget to draw down and the full per-run ceiling applies.
324
+
325
+ *expected_seconds* (#2975) is the caller's best estimate of how long THIS
326
+ repo's confirmation will actually take — see
327
+ :func:`expected_confirmation_seconds`, which reads it back from what
328
+ :func:`record_confirmation_duration` learned last time. When it is
329
+ already at or past what this pass has left to spend, starting the run
330
+ would only spend the remainder re-discovering a fact already on record —
331
+ this repo cannot be confirmed in what is left — so this returns ``None``
332
+ immediately instead of paying for that discovery again. This is what
333
+ turns a repo whose suite structurally cannot fit the ceiling (quadraui's
334
+ ``cargo test --features tui``, #2975) from a repeated worst-case cost —
335
+ every PASS claim spending the full budget to learn the identical lesson —
336
+ into a one-time one: the FIRST attempt still spends up to the full
337
+ ceiling discovering the suite is too slow, and every attempt after that
338
+ skips straight to UNCONFIRMED.
282
339
  """
283
340
  remaining = getattr(_pass_state, "remaining", None)
284
341
  if remaining is None:
285
342
  return int(CONFIRM_DEFAULT_TIMEOUT_SECONDS)
286
343
  if remaining < CONFIRM_MIN_RUN_SECONDS:
287
344
  return None
288
- return int(min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining))
345
+ ceiling = min(float(CONFIRM_DEFAULT_TIMEOUT_SECONDS), remaining)
346
+ if expected_seconds is not None and expected_seconds >= ceiling:
347
+ return None
348
+ return int(ceiling)
289
349
 
290
350
 
291
351
  def spend_confirmation_budget(seconds: float) -> None:
@@ -300,6 +360,112 @@ def spend_confirmation_budget(seconds: float) -> None:
300
360
  _pass_state.remaining = max(0.0, remaining - max(0.0, float(seconds)))
301
361
 
302
362
 
363
+ #: #2975: filename under ``COORD_DIR`` for the per-repo measured-duration map
364
+ #: :func:`record_confirmation_duration` / :func:`expected_confirmation_seconds`
365
+ #: read and write. A tiny flat file, not a lock-guarded store: the worst case
366
+ #: of a torn read/write is one stale or missing estimate, which degrades to
367
+ #: exactly pre-#2975 behaviour (attempt the run, learn the hard way) — never
368
+ #: a correctness problem, so it does not warrant the ceremony
369
+ #: ``confirm_lock_path`` needs for the worktree lifecycle it guards.
370
+ _CONFIRM_HISTORY_FILENAME = "confirm_test_history.json"
371
+
372
+
373
+ def _confirm_history_path() -> Path:
374
+ """Where per-repo measured confirmation durations are persisted (#2975).
375
+
376
+ Resolved against ``coord.state.COORD_DIR`` freshly on every call — the
377
+ same discipline :func:`confirm_worktree_path` /
378
+ :func:`write_confirmation_output` already use above — so a test's
379
+ ``monkeypatch.setattr("coord.state.COORD_DIR", ...)`` is honoured rather
380
+ than this module caching a stale path at import time.
381
+ """
382
+ from coord.state import COORD_DIR # noqa: PLC0415
383
+
384
+ return COORD_DIR / _CONFIRM_HISTORY_FILENAME
385
+
386
+
387
+ def _load_confirm_history() -> dict[str, float]:
388
+ """Best-effort read of the persisted per-repo duration map.
389
+
390
+ Fail-soft on everything — a missing file, corrupt JSON, an unexpected
391
+ shape, a hand-edited value — because this is purely an optimisation hint
392
+ for :func:`confirmation_timeout`, never a correctness dependency. A file
393
+ this cannot make sense of must read as "nothing learned yet", the same
394
+ posture as :func:`coord.commands.drive_queue.read_roll_pending`.
395
+ """
396
+ import json # noqa: PLC0415
397
+
398
+ try:
399
+ raw = _confirm_history_path().read_text(encoding="utf-8")
400
+ except OSError:
401
+ return {}
402
+ try:
403
+ data = json.loads(raw)
404
+ except ValueError:
405
+ return {}
406
+ if not isinstance(data, dict):
407
+ return {}
408
+ out: dict[str, float] = {}
409
+ for key, value in data.items():
410
+ if isinstance(key, str) and isinstance(value, (int, float)) and value > 0:
411
+ out[key] = float(value)
412
+ return out
413
+
414
+
415
+ def record_confirmation_duration(repo_name: str, seconds: float) -> None:
416
+ """Remember how long *repo_name*'s confirmation attempt just took (#2975).
417
+
418
+ Callers pass this only results whose ``kind`` is in
419
+ :data:`RECORDABLE_DURATION_KINDS` — see that frozenset's docstring for
420
+ which outcomes are a trustworthy signal of real suite duration.
421
+
422
+ Overwrites any previous value for this repo outright, with no averaging:
423
+ the LAST attempt is a better estimate of the CURRENT suite than a rolling
424
+ average across however long ago the repo's test suite was this size.
425
+
426
+ Best-effort and atomic (tempfile-then-rename, mirroring
427
+ :func:`coord.commands.drive_queue.write_roll_pending`) — a full disk, an
428
+ unwritable ``COORD_DIR``, or a concurrent writer must not break the
429
+ confirmation this is charging against; the caller already has its real
430
+ result, this is purely a hint for next time.
431
+ """
432
+ if seconds <= 0:
433
+ return
434
+ import json # noqa: PLC0415
435
+ import tempfile # noqa: PLC0415
436
+
437
+ path = _confirm_history_path()
438
+ history = _load_confirm_history()
439
+ history[repo_name] = float(seconds)
440
+ try:
441
+ path.parent.mkdir(parents=True, exist_ok=True)
442
+ fd, tmp_name = tempfile.mkstemp(
443
+ prefix=".confirm_test_history.", suffix=".tmp", dir=str(path.parent),
444
+ )
445
+ try:
446
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
447
+ json.dump(history, fh)
448
+ os.replace(tmp_name, path)
449
+ except OSError:
450
+ try:
451
+ os.unlink(tmp_name)
452
+ except OSError:
453
+ pass
454
+ except OSError:
455
+ pass
456
+
457
+
458
+ def expected_confirmation_seconds(repo_name: str) -> float | None:
459
+ """The most recently measured confirmation duration for *repo_name*.
460
+
461
+ ``None`` when this repo has never produced a
462
+ :data:`RECORDABLE_DURATION_KINDS` result — the common case for most
463
+ repos most of the time, and the caller's cue to fall back to the
464
+ un-informed ceiling exactly as before #2975.
465
+ """
466
+ return _load_confirm_history().get(repo_name)
467
+
468
+
303
469
  def notify_client_timeout_seconds(
304
470
  budget: float = CONFIRM_PASS_BUDGET_SECONDS,
305
471
  ) -> float:
@@ -1067,6 +1233,7 @@ __all__ = [
1067
1233
  "KIND_SIGNAL",
1068
1234
  "NOTIFY_BASE_CLIENT_TIMEOUT_SECONDS",
1069
1235
  "PERMISSION_DENIED_EXIT",
1236
+ "RECORDABLE_DURATION_KINDS",
1070
1237
  "REFUTING_KINDS",
1071
1238
  "STALE_WORKTREE_MAX_AGE_HOURS",
1072
1239
  "ConfirmationResult",
@@ -1077,7 +1244,9 @@ __all__ = [
1077
1244
  "confirm_worktree_path",
1078
1245
  "confirmation_enabled",
1079
1246
  "confirmation_timeout",
1247
+ "expected_confirmation_seconds",
1080
1248
  "notify_client_timeout_seconds",
1249
+ "record_confirmation_duration",
1081
1250
  "spend_confirmation_budget",
1082
1251
  "sweep_stale_confirm_worktrees",
1083
1252
  "unmet_confirmation_capabilities",
@@ -2033,9 +2033,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2033
2033
  that cannot run must degrade to pre-#2464 behaviour, never break the reap.
2034
2034
  """
2035
2035
  from coord.confirm_test import ( # noqa: PLC0415
2036
+ RECORDABLE_DURATION_KINDS,
2036
2037
  confirm_branch,
2037
2038
  confirmation_enabled,
2038
2039
  confirmation_timeout,
2040
+ expected_confirmation_seconds,
2041
+ record_confirmation_duration,
2039
2042
  spend_confirmation_budget,
2040
2043
  )
2041
2044
 
@@ -2066,15 +2069,34 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2066
2069
  # `/notify` request the thin client is blocked on — scale with board
2067
2070
  # activity. Exhausted budget means UNCONFIRMED, which is pre-#2464
2068
2071
  # behaviour, and it is said out loud rather than truncating silently.
2069
- timeout = confirmation_timeout()
2072
+ #
2073
+ # #2975: also hand in whatever this repo's OWN last confirmation measured
2074
+ # (`expected_confirmation_seconds`) — a repo whose suite structurally
2075
+ # cannot finish inside the budget (quadraui's `cargo test --features
2076
+ # tui`) would otherwise spend the full ceiling relearning that identical
2077
+ # fact on every single PASS claim, serialising every other repo's Test/
2078
+ # Review dispatch behind it each time. Knowing the answer already lets
2079
+ # `confirmation_timeout` skip straight to UNCONFIRMED instead.
2080
+ expected = expected_confirmation_seconds(transition.repo_name)
2081
+ timeout = confirmation_timeout(expected)
2070
2082
  if timeout is None:
2071
- log.warning(
2072
- "smoke %s: this notify pass has spent its confirmation budget "
2073
- "(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
2074
- "worker's own claim for %s UNCONFIRMED rather than holding "
2075
- "notify.lock any longer (#2464).",
2076
- transition.assignment_id, transition.repo_name,
2077
- )
2083
+ if expected is not None:
2084
+ log.warning(
2085
+ "smoke %s: %s's last measured confirmation took about %.0fs, "
2086
+ "at or beyond what this pass has left to spend — skipping "
2087
+ "the run and recording the worker's own claim UNCONFIRMED "
2088
+ "rather than repeating a run already known not to finish "
2089
+ "(#2975).",
2090
+ transition.assignment_id, transition.repo_name, expected,
2091
+ )
2092
+ else:
2093
+ log.warning(
2094
+ "smoke %s: this notify pass has spent its confirmation budget "
2095
+ "(coord.confirm_test.CONFIRM_PASS_BUDGET_SECONDS) — recording the "
2096
+ "worker's own claim for %s UNCONFIRMED rather than holding "
2097
+ "notify.lock any longer (#2464).",
2098
+ transition.assignment_id, transition.repo_name,
2099
+ )
2078
2100
  return None
2079
2101
 
2080
2102
  branch = entry.get("branch")
@@ -2084,10 +2106,12 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2084
2106
  transition.assignment_id, transition.repo_name, branch, timeout,
2085
2107
  )
2086
2108
  started = time.monotonic()
2109
+ result: ConfirmationResult | None = None
2087
2110
  try:
2088
- return confirm_branch(
2111
+ result = confirm_branch(
2089
2112
  transition.repo_name, branch, config, timeout=timeout,
2090
2113
  )
2114
+ return result
2091
2115
  except Exception as exc: # noqa: BLE001
2092
2116
  log.warning(
2093
2117
  "smoke %s: confirmation run raised (%s) — falling back to the "
@@ -2100,7 +2124,15 @@ def _run_pass_confirmation(transition: Transition, entry: dict):
2100
2124
  # It really did hold the drain (and `notify.lock`) for those seconds,
2101
2125
  # and a run that reliably blows up after ten minutes must not be able
2102
2126
  # to repeat that for every row on the board free of charge.
2103
- spend_confirmation_budget(time.monotonic() - started)
2127
+ elapsed = time.monotonic() - started
2128
+ spend_confirmation_budget(elapsed)
2129
+ # #2975: only remember the duration when the result is actually a
2130
+ # trustworthy measurement (see RECORDABLE_DURATION_KINDS) — an
2131
+ # exception, a disabled config load, or a KIND_SETUP/INFRA/SIGNAL
2132
+ # short-circuit tells us nothing about how long the real suite takes
2133
+ # and must never overwrite a previously-learned expectation.
2134
+ if result is not None and result.kind in RECORDABLE_DURATION_KINDS:
2135
+ record_confirmation_duration(transition.repo_name, elapsed)
2104
2136
 
2105
2137
 
2106
2138
  def _confirmed_pass_verdict(
@@ -4155,6 +4187,20 @@ def run_drain(
4155
4187
  *notifications*, not pipeline advancement, and giving the daemon a
4156
4188
  periodic detector is #1632's job (which is blocked on this).
4157
4189
 
4190
+ **Dispatch order (#2975).** Smoke/review/PR-open dispatch also runs as a
4191
+ HEAD START right at the top of the pass, before this pass's own
4192
+ transition detection (which is where a #2464 out-of-band confirmation
4193
+ runs — see :mod:`coord.confirm_test`). A confirmation re-runs a repo's
4194
+ real build+test synchronously and can hold this very lock for the whole
4195
+ confirmation-pass budget, several timer fires' worth for a repo whose
4196
+ suite is structurally too slow. Every row already eligible for dispatch
4197
+ as of the top of the pass must not queue behind that — a slow suite on
4198
+ one repo must delay only its own confirmation, never another repo's
4199
+ Test/Review dispatch. The three dispatch functions run a second time
4200
+ afterward too, in their historical place, to pick up anything the
4201
+ transition-detection step below made newly eligible; all three are
4202
+ idempotent, so the repeat costs only a second, mostly-empty scan.
4203
+
4158
4204
  **Concurrency.** The whole pass runs under ``~/.coord/notify.lock`` —
4159
4205
  literally :class:`coord.filelock.FileLock`, the same class on the same
4160
4206
  path ``coord drive``'s ``run_notify()`` takes — so a drive's nudge and the
@@ -4203,6 +4249,56 @@ def _run_drain_locked(config: Config) -> DrainResult:
4203
4249
 
4204
4250
  begin_confirmation_pass()
4205
4251
 
4252
+ # Step 0a (#2803, moved up by #2975): clear any work row wedged at
4253
+ # test_state='running' well past its Test-stage child's own terminal
4254
+ # resolution (or absence) — a lost verdict write, never a fabricated one
4255
+ # (see `sweep_stuck_test_state_rows`'s docstring). It still runs BEFORE
4256
+ # every smoke dispatch in this pass, which is #2803's invariant: a row
4257
+ # this clears is picked up and redispatched in THIS SAME pass, not the
4258
+ # next one. It now runs before step 0b's head start as well, so a row it
4259
+ # clears gets that head start too rather than waiting behind step 1's
4260
+ # confirmations. Nothing is lost by sweeping before transition detection:
4261
+ # every case the sweep acts on is gated on
4262
+ # `STUCK_TEST_STATE_GRACE_SECONDS` (10 minutes) having elapsed since the
4263
+ # child's own resolution, so a child that only just went terminal in
4264
+ # THIS pass is out of scope either way.
4265
+ try:
4266
+ _sweep_stuck_test_state(config)
4267
+ except Exception: # noqa: BLE001
4268
+ log.exception("notify drain: stuck test_state sweep failed")
4269
+
4270
+ # Step 0b (#2975): dispatch pending Test-stage smoke / PR-opens / reviews
4271
+ # from the board exactly as it reads RIGHT NOW — before step 1 below gets
4272
+ # anywhere near a `confirm_branch` call. A confirmation re-runs one
4273
+ # repo's real build+test synchronously inside THIS pass and can
4274
+ # legitimately hold `notify.lock` for the whole `CONFIRM_PASS_BUDGET_
4275
+ # SECONDS` ceiling — several `coord-notify.timer` fires' worth (#2975).
4276
+ # Every row already eligible for dispatch as of the top of this pass
4277
+ # must not queue behind that: a slow suite on one repo should delay only
4278
+ # its own confirmation, never another repo's Test/Review dispatch.
4279
+ #
4280
+ # Steps 2-3 below repeat these same three calls after the transition
4281
+ # detection has had a chance to add anything newly eligible (a work leg
4282
+ # that just finished, a PR that just opened) — this head start is
4283
+ # additive, not a replacement.
4284
+ # All three are idempotent (`_dispatch_board_pending_pr_opens`'s and
4285
+ # `_dispatch_board_pending_smoke`'s own docstrings: "safe to call even
4286
+ # when the board file doesn't exist", find-or-create PRs, dedupe via
4287
+ # `has_active_followup`), so calling each twice in one pass costs
4288
+ # nothing beyond a second, mostly-empty scan.
4289
+ try:
4290
+ _dispatch_board_pending_pr_opens(config)
4291
+ except Exception: # noqa: BLE001
4292
+ log.exception("notify drain: head-start PR-open dispatch failed")
4293
+ try:
4294
+ _dispatch_board_pending_smoke(config)
4295
+ except Exception: # noqa: BLE001
4296
+ log.exception("notify drain: head-start smoke dispatch failed")
4297
+ try:
4298
+ _dispatch_board_pending_reviews(config)
4299
+ except Exception: # noqa: BLE001
4300
+ log.exception("notify drain: head-start review dispatch failed")
4301
+
4206
4302
  # Step 1: post completion/failure/advisory/plan/review comments for rows
4207
4303
  # the agent reports terminal. This is what stamps `finished_at` (via
4208
4304
  # mark_notified) and captures cost / SMOKE_TESTS / summary / session id /
@@ -4234,18 +4330,7 @@ def _run_drain_locked(config: Config) -> DrainResult:
4234
4330
  except Exception: # noqa: BLE001
4235
4331
  log.exception("notify drain: detect_transitions failed")
4236
4332
 
4237
- # Step 2 (#2803): clear any work row wedged at test_state='running' well
4238
- # past its Test-stage child's own terminal resolution (or absence) — a
4239
- # lost verdict write, never a fabricated one (see `sweep_stuck_test_
4240
- # state_rows`'s docstring). Runs BEFORE step 3's smoke dispatch so a row
4241
- # this clears is picked up and redispatched in THIS SAME pass, not the
4242
- # next one.
4243
- try:
4244
- _sweep_stuck_test_state(config)
4245
- except Exception: # noqa: BLE001
4246
- log.exception("notify drain: stuck test_state sweep failed")
4247
-
4248
- # Step 2.5 (#2844): open PRs for work-leg completions still missing one —
4333
+ # Step 2 (#2844): open PRs for work-leg completions still missing one —
4249
4334
  # BEFORE the Test-stage dispatch below, so the pull_request CI run starts
4250
4335
  # overlapping smoke instead of waiting for review dispatch to open the
4251
4336
  # PR ~20 minutes later.
@@ -4447,6 +4532,31 @@ def run(
4447
4532
  # why this reads the marker but never writes it.
4448
4533
  _roll_pending = _roll_pending_blocks_new_dispatch()
4449
4534
 
4535
+ # Step 0 (#2975): same head start `_run_drain_locked` takes, and for the
4536
+ # identical reason — dispatch pending Test-stage smoke / PR-opens /
4537
+ # reviews from the board exactly as it reads RIGHT NOW, before the
4538
+ # transition-detection loop below gets anywhere near a `confirm_branch`
4539
+ # call that can hold `notify.lock` for up to `CONFIRM_PASS_BUDGET_
4540
+ # SECONDS`. Gated on `_roll_pending` like every other NEW-leg dispatch in
4541
+ # this function (#2587) — the later calls to the same three functions,
4542
+ # a few dozen lines down, repeat this after the loop below has had a
4543
+ # chance to add anything newly eligible; this is a head start, not a
4544
+ # replacement, and all three are idempotent so calling each twice costs
4545
+ # only a second, mostly-empty scan.
4546
+ if not _roll_pending:
4547
+ try:
4548
+ _dispatch_board_pending_pr_opens(config)
4549
+ except Exception: # noqa: BLE001
4550
+ pass
4551
+ try:
4552
+ _dispatch_board_pending_smoke(config)
4553
+ except Exception: # noqa: BLE001
4554
+ pass
4555
+ try:
4556
+ _dispatch_board_pending_reviews(config)
4557
+ except Exception: # noqa: BLE001
4558
+ pass
4559
+
4450
4560
  # #522: one terminal-state cache shared across every gh-hitting check in
4451
4561
  # this notify run (the auto-loop review/fix dispatches below, and the
4452
4562
  # #1441 stalled-pipeline sweep at the end), so a burst of activity for
@@ -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