code-coordinator 0.5.288__tar.gz → 0.5.289__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 (888) hide show
  1. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agent.py +19 -5
  5. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/cargo_cache.py +340 -51
  6. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/cargo_targets.py +95 -12
  7. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cargo_cache.py +282 -1
  8. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_checks.py +90 -0
  9. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_fix.py +56 -0
  10. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/workflows/cargo-test.yml +0 -0
  21. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/.gitignore +0 -0
  24. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/GOAL.md +0 -0
  26. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/LICENSE +0 -0
  27. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/README.md +0 -0
  29. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agent_app.py +0 -0
  40. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agent_update.py +0 -0
  41. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/board_bool_guard.py +0 -0
  49. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/ci_fix.py +0 -0
  56. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/client.py +0 -0
  62. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/chat.py +0 -0
  68. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/dispatch.py +0 -0
  69. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/dispatch_workers.py +0 -0
  70. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/drive.py +0 -0
  71. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/drive_queue.py +0 -0
  72. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/machine.py +0 -0
  77. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/pr.py +0 -0
  83. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/store_migrate.py +0 -0
  92. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/terminal.py +0 -0
  93. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/test_gate.py +0 -0
  94. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/commands/tui.py +0 -0
  95. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/comments.py +0 -0
  96. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/config.py +0 -0
  97. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/config_reload.py +0 -0
  98. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/confirm_test.py +0 -0
  99. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/conflict_fix.py +0 -0
  100. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dao.py +0 -0
  101. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dashboard/__init__.py +0 -0
  102. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dashboard/fixture.py +0 -0
  103. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dashboard/index.html +0 -0
  104. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dashboard/server.py +0 -0
  105. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dashboard/terminal.py +0 -0
  106. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/db.py +0 -0
  107. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dead_end.py +0 -0
  108. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/decomposition_chat.py +0 -0
  109. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/README.md +0 -0
  110. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-agent.service +0 -0
  111. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-db-backup.service +0 -0
  112. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-db-backup.sh +0 -0
  113. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-db-backup.timer +0 -0
  114. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-drive-queue.service +0 -0
  115. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-drive-queue.timer +0 -0
  116. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-failure-notify.service +0 -0
  117. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-fleet-watchdog.service +0 -0
  118. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  119. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-notify.service +0 -0
  120. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-notify.timer +0 -0
  121. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-release-propagate.service +0 -0
  122. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-release-propagate.timer +0 -0
  123. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-release-window.service +0 -0
  124. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-release-window.timer +0 -0
  125. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-serve.service +0 -0
  126. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-web-dist-build.service +0 -0
  127. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-web-dist-build.timer +0 -0
  128. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy/coord-web.service +0 -0
  129. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy_manifest.py +0 -0
  130. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deploy_units.py +0 -0
  131. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/events.py +0 -0
  139. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/github_throttle.py +0 -0
  150. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/goal.py +0 -0
  151. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/graph_health.py +0 -0
  152. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/__init__.py +0 -0
  153. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/aggregate.py +0 -0
  154. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/__init__.py +0 -0
  155. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/agent_install.py +0 -0
  156. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/claude_binary.py +0 -0
  157. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/coord_web_ci_pin.py +0 -0
  158. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/deploy_lane_facts.py +0 -0
  159. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/disk.py +0 -0
  160. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/fleet_board.py +0 -0
  161. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  162. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/fleet_phantom.py +0 -0
  163. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/fleet_unit_drift.py +0 -0
  164. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/graph.py +0 -0
  165. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/graphify_cli.py +0 -0
  166. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/index_lock.py +0 -0
  167. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/issues_sync_staleness.py +0 -0
  168. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/plan_usage.py +0 -0
  169. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/release_cordon.py +0 -0
  170. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/repo_state.py +0 -0
  171. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/spawned_coord.py +0 -0
  172. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/stalled_pipeline.py +0 -0
  173. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/timer_active.py +0 -0
  174. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/toolchain.py +0 -0
  175. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/unit_drift.py +0 -0
  176. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/unit_enablement.py +0 -0
  177. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/checks/worktrees.py +0 -0
  178. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/cli.py +0 -0
  179. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/context.py +0 -0
  180. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/fleet_snapshot.py +0 -0
  181. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/models.py +0 -0
  182. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/pypi.py +0 -0
  183. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/registry.py +0 -0
  184. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/render.py +0 -0
  185. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/health/units.py +0 -0
  186. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/hooks.py +0 -0
  187. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/housekeeping.py +0 -0
  188. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/interactive.py +0 -0
  189. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/issue_store.py +0 -0
  190. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/issues_sync_status.py +0 -0
  191. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/liveness_auditor.py +0 -0
  192. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/machine_onboard.py +0 -0
  193. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/models.py +0 -0
  201. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/network.py +0 -0
  202. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/new_issue_chat.py +0 -0
  203. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/__init__.py +0 -0
  204. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/baseline.py +0 -0
  205. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/cli.py +0 -0
  206. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/collect.py +0 -0
  207. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/digest.py +0 -0
  208. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/models.py +0 -0
  209. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/predicate.py +0 -0
  210. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/service.py +0 -0
  211. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/store.py +0 -0
  212. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notifier/transport.py +0 -0
  213. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/notify.py +0 -0
  214. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/openapi.py +0 -0
  215. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/overlap_fence.py +0 -0
  216. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/overlap_predict.py +0 -0
  217. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/parentage.py +0 -0
  218. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/parentage_github.py +0 -0
  219. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/pipeline.py +0 -0
  220. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/plan_parser.py +0 -0
  221. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/plans.py +0 -0
  222. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/platform_paths.py +0 -0
  223. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/portal_bridge.py +0 -0
  224. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/portal_store.py +0 -0
  225. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/portal_sync.py +0 -0
  226. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/pr_body_lint.py +0 -0
  227. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/prereqs.py +0 -0
  228. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/providers/claude_pty.py +0 -0
  233. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/providers/opencode.py +0 -0
  234. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/queue_diagnose.py +0 -0
  235. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/reconcile.py +0 -0
  236. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/reconcile_tick.py +0 -0
  237. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/refine_chat.py +0 -0
  238. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/release_cordon.py +0 -0
  239. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/release_propagate.py +0 -0
  240. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/repo_edit.py +0 -0
  243. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/repo_onboard.py +0 -0
  244. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/reports.py +0 -0
  245. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/rest_schema.py +0 -0
  246. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/revalidate.py +0 -0
  247. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/review.py +0 -0
  248. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/scorecard.py +0 -0
  249. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/self_health.py +0 -0
  250. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/serve_app.py +0 -0
  251. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  252. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  253. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  254. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  256. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/portal-followup/SKILL.md +0 -0
  257. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/release-now/SKILL.md +0 -0
  258. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  259. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  260. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/skills/update-issue/SKILL.md +0 -0
  261. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/smoke.py +0 -0
  262. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/spend_ceiling.py +0 -0
  263. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/split_work.py +0 -0
  264. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/sql.py +0 -0
  265. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/stage_projection.py +0 -0
  266. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/state.py +0 -0
  267. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/store_migrate.py +0 -0
  268. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/test_author.py +0 -0
  269. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/test_chat.py +0 -0
  270. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/test_orchestrator.py +0 -0
  271. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/test_report.py +0 -0
  272. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/tui_release.py +0 -0
  273. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/usage.py +0 -0
  274. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/usage_limits.py +0 -0
  275. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/usage_rollup.py +0 -0
  276. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coord/worker_events.py +0 -0
  277. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/coordinator.example.yml +0 -0
  278. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-agent.service +0 -0
  279. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-db-backup.service +0 -0
  280. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-db-backup.sh +0 -0
  281. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-db-backup.timer +0 -0
  282. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-drive-queue.service +0 -0
  283. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-drive-queue.timer +0 -0
  284. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-failure-notify.service +0 -0
  285. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-failure-notify.sh +0 -0
  286. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-fleet-watchdog.service +0 -0
  287. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-fleet-watchdog.timer +0 -0
  288. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-notify.service +0 -0
  289. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-notify.timer +0 -0
  290. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-release-propagate.service +0 -0
  291. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-release-propagate.timer +0 -0
  292. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-release-window.service +0 -0
  293. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-release-window.timer +0 -0
  294. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-serve.service +0 -0
  295. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-web-dist-build.service +0 -0
  296. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-web-dist-build.sh +0 -0
  297. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-web-dist-build.timer +0 -0
  298. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-web-rollback.sh +0 -0
  299. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/coord-web.service +0 -0
  300. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/deploy/node-shim.sh +0 -0
  301. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  302. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ADR_COORD_WEB_CI.md +0 -0
  303. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ADR_COORD_WEB_DIST.md +0 -0
  304. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/AGENT_OPERATIONS.md +0 -0
  305. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ARCHITECTURE.md +0 -0
  306. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ARCH_SECURITY_GATES.md +0 -0
  307. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/COCKPIT.md +0 -0
  308. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/CONTROL_CENTER.md +0 -0
  309. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/COST_DISCIPLINE.md +0 -0
  310. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/CROSS_PLATFORM.md +0 -0
  311. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/CUSTOMER_FACING_APPS.md +0 -0
  312. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/CUSTOMER_PORTAL.md +0 -0
  313. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/DRIVE_QUEUE.md +0 -0
  314. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/EPHEMERAL_WORKERS.md +0 -0
  315. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/FORGE_MIGRATION.md +0 -0
  316. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/GRAPHIFY_SETUP.md +0 -0
  317. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ISSUE_GUIDANCE.md +0 -0
  318. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/MAC_MINI.md +0 -0
  319. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  320. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/NOTIFIER.md +0 -0
  321. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/OPENCODE_VERIFICATION.md +0 -0
  322. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/OPERATING_GOTCHAS.md +0 -0
  323. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/OPERATOR_GUIDES.md +0 -0
  324. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/ORACLE_LOOP.md +0 -0
  325. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/PHONE_WEBAPP.md +0 -0
  326. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/PIPELINE_V2.md +0 -0
  327. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/PLATFORM_EVOLUTION.md +0 -0
  328. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/SECOND_BACKEND.md +0 -0
  329. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/STORE_SERVICE.md +0 -0
  330. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  331. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/WEB_CONTROL_CENTER.md +0 -0
  332. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/WSL_WINDOWS_WORKER.md +0 -0
  333. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/mocks/web/README.md +0 -0
  334. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/mocks/web/_tokens.css +0 -0
  335. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/mocks/web/issue-detail.html +0 -0
  336. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/mocks/web/pipeline-narrow.html +0 -0
  337. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/docs/mocks/web/pipeline-wide.html +0 -0
  338. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/graphify-out/.gitignore +0 -0
  339. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/install-agent.sh +0 -0
  340. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/pyproject.toml +0 -0
  341. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/audit_review_verdict_overrides.py +0 -0
  342. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  343. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/build-worker-image.sh +0 -0
  344. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/coordinator-machine.py +0 -0
  345. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/epic-down.sh +0 -0
  346. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/epic-up.sh +0 -0
  347. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/preflight.sh +0 -0
  348. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/provision-worker.sh +0 -0
  349. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  350. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  351. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/azure-workers/verify-github-token.sh +0 -0
  352. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/check_gh_argv_containment.py +0 -0
  353. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/codegen.py +0 -0
  354. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/coord-test-runner.sh +0 -0
  355. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/coord-venv-rollback.sh +0 -0
  356. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/drive-batch.sh +0 -0
  357. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/fleet_watchdog.py +0 -0
  358. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/gen_board_fixture.py +0 -0
  359. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/gen_mock_index.py +0 -0
  360. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/next_release_tag.py +0 -0
  361. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/run_tests_in_populated_home.sh +0 -0
  362. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/run_tests_without_gh.sh +0 -0
  363. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/smoke_437_interactive.py +0 -0
  364. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/verify_878_review_capture.py +0 -0
  365. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/verify_release_published.py +0 -0
  366. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/scripts/verify_release_wheel.py +0 -0
  367. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/setup.cfg +0 -0
  368. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/SMOKE_SET.md +0 -0
  369. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/__init__.py +0 -0
  370. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-37/conftest.py +0 -0
  371. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-37/contract.md +0 -0
  372. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-37/manifest.yml +0 -0
  373. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  374. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  375. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/contract.md +0 -0
  376. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  377. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  378. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/manifest.yml +0 -0
  379. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  380. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-51/tsconfig.json +0 -0
  381. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  382. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/backends.py +0 -0
  383. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/conftest.py +0 -0
  384. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/board-pipeline-basic.json +0 -0
  385. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  386. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  387. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  388. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  389. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/all_pass.json +0 -0
  390. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  391. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/mixed_fail.json +0 -0
  392. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  393. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  394. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/skip.json +0 -0
  395. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/playwright/truncated.json +0 -0
  396. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  397. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  398. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  399. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  400. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  401. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  402. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  403. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  404. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_acceptance.py +0 -0
  405. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_acceptance_drivers.py +0 -0
  406. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent.py +0 -0
  407. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_api_error.py +0 -0
  408. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_app.py +0 -0
  409. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_branch_base.py +0 -0
  410. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_branch_capture.py +0 -0
  411. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_config_free_1712.py +0 -0
  412. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_deploy_units_endpoint.py +0 -0
  413. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_dirty_worktree.py +0 -0
  414. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  415. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_graph_self_heal.py +0 -0
  416. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_health_h3.py +0 -0
  417. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_idle_restart.py +0 -0
  418. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_push_failure.py +0 -0
  419. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_reap.py +0 -0
  420. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_repos_and_pull.py +0 -0
  421. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_restart_services_endpoint.py +0 -0
  422. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_skills_self_heal.py +0 -0
  423. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_startup_diagnostics.py +0 -0
  424. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_update.py +0 -0
  425. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_update_bluegreen.py +0 -0
  426. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_usage_limit.py +0 -0
  427. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_agent_zero_commit.py +0 -0
  428. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ambient_home_isolation.py +0 -0
  429. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_approve_dependency_busy_2804.py +0 -0
  430. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_approve_reject_plan.py +0 -0
  431. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_approve_usage_gate.py +0 -0
  432. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_approved_work_2532.py +0 -0
  433. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_assignment_already_recorded_daemon.py +0 -0
  434. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_audit_log.py +0 -0
  435. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_audit_outcome.py +0 -0
  436. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_audit_query.py +0 -0
  437. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_auto_loop.py +0 -0
  438. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_auto_release_publish_2035.py +0 -0
  439. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_backend_selection.py +0 -0
  440. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_base_checkout_restore.py +0 -0
  441. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_block_log.py +0 -0
  442. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_cap_762.py +0 -0
  443. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_fixture.py +0 -0
  444. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_read_path.py +0 -0
  445. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_schema.py +0 -0
  446. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_service.py +0 -0
  447. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_state.py +0 -0
  448. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_board_wire.py +0 -0
  449. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_brain.py +0 -0
  450. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_branch_model.py +0 -0
  451. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_bug_intake.py +0 -0
  452. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_build_worker_image_env_update.py +0 -0
  453. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_check_gh_argv_containment.py +0 -0
  454. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ci_acceptance_gate_1950.py +0 -0
  455. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ci_fix.py +0 -0
  456. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ci_gitlab.py +0 -0
  457. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ci_parity_2091.py +0 -0
  458. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_ci_store.py +0 -0
  459. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_claim.py +0 -0
  460. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_claude_md_budget.py +0 -0
  461. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_acceptance.py +0 -0
  462. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_assign.py +0 -0
  463. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  464. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_assign_interactive_remote.py +0 -0
  465. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_assign_provider.py +0 -0
  466. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  467. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_audit.py +0 -0
  468. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_chat_continue.py +0 -0
  469. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_decide.py +0 -0
  470. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_diagnose_config_provenance.py +0 -0
  471. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_diagnose_forge_availability.py +0 -0
  472. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_diagnose_graph.py +0 -0
  473. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_diagnose_self.py +0 -0
  474. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_doctor.py +0 -0
  475. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_doctor_config_free_1801.py +0 -0
  476. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  477. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_drive.py +0 -0
  478. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_drive_queue.py +0 -0
  479. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_escalate.py +0 -0
  480. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_fix_headless_review.py +0 -0
  481. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_gate_a.py +0 -0
  482. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_install_drift.py +0 -0
  483. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_install_skills.py +0 -0
  484. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_issue_comment.py +0 -0
  485. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_issue_create_label.py +0 -0
  486. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_issue_reopen.py +0 -0
  487. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_issue_view_list.py +0 -0
  488. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_merge.py +0 -0
  489. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_assign.py +0 -0
  490. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_capture.py +0 -0
  491. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_chat_add_child.py +0 -0
  492. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_dispatch.py +0 -0
  493. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_gate_b.py +0 -0
  494. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_gate_c.py +0 -0
  495. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_order.py +0 -0
  496. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  497. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_milestone_ship.py +0 -0
  498. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_network.py +0 -0
  499. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_new_issue_chat.py +0 -0
  500. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_plans.py +0 -0
  501. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_portal.py +0 -0
  502. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_pr.py +0 -0
  503. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_pull_artifact.py +0 -0
  504. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_queue.py +0 -0
  505. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_reattach_sessions.py +0 -0
  506. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_refine_board.py +0 -0
  507. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_release_preflight.py +0 -0
  508. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_release_propagate.py +0 -0
  509. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_release_window.py +0 -0
  510. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_repo_2220.py +0 -0
  511. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  512. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_scorecard.py +0 -0
  513. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_set_review_findings.py +0 -0
  514. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_advisory_terminal.py +0 -0
  515. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_contested_tag.py +0 -0
  516. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_merge_queue.py +0 -0
  517. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_provider.py +0 -0
  518. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_review_finalizing.py +0 -0
  519. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_test_failed_tag.py +0 -0
  520. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_status_usage_limit.py +0 -0
  521. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_sync_comments_873.py +0 -0
  522. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_test_plan.py +0 -0
  523. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_track.py +0 -0
  524. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_tui_update.py +0 -0
  525. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cli_wait.py +0 -0
  526. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_client_base_install.py +0 -0
  527. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_commands_common.py +0 -0
  528. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_comments.py +0 -0
  529. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_completion_summary.py +0 -0
  530. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config.py +0 -0
  531. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config_acceptance.py +0 -0
  532. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config_audit.py +0 -0
  533. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config_pricing.py +0 -0
  534. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  535. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_config_usage_gate.py +0 -0
  536. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_confirm_test.py +0 -0
  537. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_conflict_fix.py +0 -0
  538. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_conflict_fix_semantic.py +0 -0
  539. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  540. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_test.py +0 -0
  541. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_test_runner_baseline.py +0 -0
  542. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_test_runner_populated_home.py +0 -0
  543. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_test_runner_routing.py +0 -0
  544. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_test_runner_toolchain.py +0 -0
  545. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_uat.py +0 -0
  546. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coord_web_sse_restart_live.py +0 -0
  547. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_coordinator_machine.py +0 -0
  548. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_cross_platform_imports.py +0 -0
  549. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dao.py +0 -0
  550. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dashboard.py +0 -0
  551. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dashboard_fixture.py +0 -0
  552. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dashboard_terminal.py +0 -0
  553. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dashboard_terminal_live.py +0 -0
  554. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_db.py +0 -0
  555. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dead_end.py +0 -0
  556. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_decomposition_chat.py +0 -0
  557. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_coord_db_backup.py +0 -0
  558. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_coord_web_dist.py +0 -0
  559. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_coord_web_rollback.py +0 -0
  560. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_drive_queue_unit.py +0 -0
  561. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_failure_notify_unit.py +0 -0
  562. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_manifest.py +0 -0
  563. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_notify_unit.py +0 -0
  564. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_units_lane.py +0 -0
  565. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deploy_web_unit.py +0 -0
  566. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_deps.py +0 -0
  567. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_diagnose.py +0 -0
  568. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dispatch.py +0 -0
  569. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dispatch_target_validation.py +0 -0
  570. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_dist_name.py +0 -0
  571. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_done_housekeeping.py +0 -0
  572. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive.py +0 -0
  573. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue.py +0 -0
  574. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue_blocked_rendering.py +0 -0
  575. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue_launch_argv.py +0 -0
  576. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  577. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue_roll_pending.py +0 -0
  578. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  579. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_state.py +0 -0
  580. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_drive_tmux.py +0 -0
  581. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_epic_up_capability_detection.py +0 -0
  582. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  583. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_epic_up_image_provenance.py +0 -0
  584. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_errors.py +0 -0
  585. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_events.py +0 -0
  586. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_failure_class.py +0 -0
  587. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_filelock.py +0 -0
  588. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  589. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_fix_of_force_override.py +0 -0
  590. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_fleet_config_health.py +0 -0
  591. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_fleet_health_probes.py +0 -0
  592. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_fleet_health_snapshot.py +0 -0
  593. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_fleet_watchdog.py +0 -0
  594. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_forge_availability.py +0 -0
  595. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_freshness.py +0 -0
  596. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gate_a.py +0 -0
  597. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gate_b.py +0 -0
  598. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gate_snapshot_staleness.py +0 -0
  599. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gates.py +0 -0
  600. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  601. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_gen_mock_index.py +0 -0
  602. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_generated_rust_fixture.py +0 -0
  603. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_generated_types_fixture.py +0 -0
  604. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_github_ops.py +0 -0
  605. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_github_throttle.py +0 -0
  606. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_graph_selfheal_absent_2237.py +0 -0
  609. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_handoff.py +0 -0
  610. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_cli.py +0 -0
  611. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_cli_graph.py +0 -0
  612. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_config.py +0 -0
  613. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_context.py +0 -0
  614. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_coord_web_ci_pin.py +0 -0
  615. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_deploy_lane_facts.py +0 -0
  616. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_incident_regression.py +0 -0
  617. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_issues_sync_staleness.py +0 -0
  618. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_pypi.py +0 -0
  619. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_registry.py +0 -0
  620. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_release_cordon_probe.py +0 -0
  621. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_timer_active.py +0 -0
  622. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_toolchain.py +0 -0
  623. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_unit_drift.py +0 -0
  624. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_health_unit_enablement.py +0 -0
  625. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_hooks.py +0 -0
  626. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_human_attended_437.py +0 -0
  627. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_init.py +0 -0
  628. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_install_agent_venv_2911.py +0 -0
  629. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_integration.py +0 -0
  630. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_briefing_echo.py +0 -0
  631. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_pane_log_2541.py +0 -0
  632. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_prefill_state.py +0 -0
  633. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_session_relaunch.py +0 -0
  634. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_test_verdict_backstop.py +0 -0
  635. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_token_attribution.py +0 -0
  636. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_interactive_worktree.py +0 -0
  637. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_issue_store_seam.py +0 -0
  638. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_issues_sync_status.py +0 -0
  639. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_liveness_auditor.py +0 -0
  640. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_liveness_notify.py +0 -0
  641. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_lock_contention_ratchet.py +0 -0
  642. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_machine_onboard.py +0 -0
  643. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_machine_pause.py +0 -0
  644. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_merge_queue.py +0 -0
  645. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_merge_verify.py +0 -0
  646. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_milestone_chat.py +0 -0
  647. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_milestone_dispatch.py +0 -0
  648. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_milestone_gate.py +0 -0
  649. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_milestone_order.py +0 -0
  650. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_milestone_seam.py +0 -0
  651. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_mock_author.py +0 -0
  652. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_model_tiering.py +0 -0
  653. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_models.py +0 -0
  654. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_models_config_labels.py +0 -0
  655. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_needs_attention.py +0 -0
  656. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_network.py +0 -0
  657. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_new_issue_chat.py +0 -0
  658. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_next_release_tag.py +0 -0
  659. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_node_shim.py +0 -0
  660. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_baseline.py +0 -0
  661. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_cli.py +0 -0
  662. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_collect.py +0 -0
  663. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_config.py +0 -0
  664. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_drive_seam.py +0 -0
  665. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_isolation.py +0 -0
  666. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_predicate.py +0 -0
  667. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_quiet_hours.py +0 -0
  668. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notifier_service.py +0 -0
  669. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notify.py +0 -0
  670. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_notify_drain.py +0 -0
  671. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_openapi.py +0 -0
  672. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_operational_defaults.py +0 -0
  673. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_overlap_fence.py +0 -0
  674. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_overlap_predict.py +0 -0
  675. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_packaged_deploy_units.py +0 -0
  676. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_parentage.py +0 -0
  677. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_paste_landed.py +0 -0
  678. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  679. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_pipeline.py +0 -0
  680. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_plan_followup_approve_plan_command.py +0 -0
  681. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_plan_followup_pr_command.py +0 -0
  682. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_plan_followup_review_command.py +0 -0
  683. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_plan_only.py +0 -0
  684. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_plan_parser.py +0 -0
  685. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_platform_paths.py +0 -0
  686. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_portal_bridge.py +0 -0
  687. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_portal_config.py +0 -0
  688. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_portal_store.py +0 -0
  689. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_portal_sync.py +0 -0
  690. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_pr_body_lint.py +0 -0
  691. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_prereqs.py +0 -0
  692. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_production_db_guard.py +0 -0
  693. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_progress.py +0 -0
  694. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_provider_seam.py +0 -0
  695. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_providers.py +0 -0
  696. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_providers_config_labels.py +0 -0
  697. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_providers_pty.py +0 -0
  698. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_quiet_hours.py +0 -0
  699. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_quiet_hours_store_2146.py +0 -0
  700. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reap_merged_sessions.py +0 -0
  701. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reap_stale_interactive_tick.py +0 -0
  702. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile.py +0 -0
  703. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_branch.py +0 -0
  704. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_completions.py +0 -0
  705. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  706. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_merges.py +0 -0
  707. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_no_agent_record.py +0 -0
  708. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_tick.py +0 -0
  709. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reconcile_usage_limit_done.py +0 -0
  710. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_refine_chat.py +0 -0
  711. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_cordon_2101.py +0 -0
  712. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  713. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_cordon_deadlock_2240.py +0 -0
  714. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_cordon_stuck_2490.py +0 -0
  715. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_propagate.py +0 -0
  716. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_propagate_threshold.py +0 -0
  717. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_roll_between_legs_2854.py +0 -0
  718. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_roll_window_handoff.py +0 -0
  719. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_unified_1242.py +0 -0
  720. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_verify.py +0 -0
  721. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_release_window.py +0 -0
  722. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_remote_auto_prune.py +0 -0
  723. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_remote_interactive_reaper.py +0 -0
  724. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_repo_add.py +0 -0
  725. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_repo_edit_2220.py +0 -0
  726. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_repo_graph_fleet_2237.py +0 -0
  727. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_repo_onboard_2220.py +0 -0
  728. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_report_result_push.py +0 -0
  729. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_reports.py +0 -0
  730. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_retry.py +0 -0
  731. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_retry_advisory_1606.py +0 -0
  732. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_retry_type_1636.py +0 -0
  733. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_revalidate.py +0 -0
  734. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review.py +0 -0
  735. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_end_review_without_verdict.py +0 -0
  736. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_parse_failure_diagnostic.py +0 -0
  737. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_reaffirm.py +0 -0
  738. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_state.py +0 -0
  739. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_verdict_backstop.py +0 -0
  740. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_verdict_override_audit.py +0 -0
  741. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_verdict_relay.py +0 -0
  742. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_review_zero_commits.py +0 -0
  743. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_scoped_review_wiring.py +0 -0
  744. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_scorecard.py +0 -0
  745. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_self_health.py +0 -0
  746. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_serve.py +0 -0
  747. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_serve_app_board_trim.py +0 -0
  748. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_serve_rest_routes.py +0 -0
  749. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_session.py +0 -0
  750. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_slice_issue_attribution.py +0 -0
  751. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_smoke.py +0 -0
  752. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_smoke_live_checkout_restore.py +0 -0
  753. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_smoke_workflow.py +0 -0
  754. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_spend_ceiling.py +0 -0
  755. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_spend_ceiling_coordinator.py +0 -0
  756. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_split.py +0 -0
  757. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_split_work.py +0 -0
  758. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_sql_dialect.py +0 -0
  759. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_sqlite_connect_ratchet.py +0 -0
  760. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stage_projection.py +0 -0
  761. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stale_busy_reviewer_697.py +0 -0
  762. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stalled_pipeline.py +0 -0
  763. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_state.py +0 -0
  764. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_state_review_findings_daemon.py +0 -0
  765. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_status_fleet_footer.py +0 -0
  766. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stop_1567.py +0 -0
  767. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_store_contract.py +0 -0
  768. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_store_migrate.py +0 -0
  769. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stuck.py +0 -0
  770. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  771. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_terminal_command.py +0 -0
  772. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_author.py +0 -0
  773. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_chat.py +0 -0
  774. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_orchestrator.py +0 -0
  775. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_report.py +0 -0
  776. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_verdict_parsing.py +0 -0
  777. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_test_verdict_transcript_floor.py +0 -0
  778. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_text_io_encoding_audit.py +0 -0
  779. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_thin_client_board_audit.py +0 -0
  780. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_thin_client_config_load_1080.py +0 -0
  781. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_thin_client_daemon_routing_906.py +0 -0
  782. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_tmux_host.py +0 -0
  783. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_tmux_session.py +0 -0
  784. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_usage.py +0 -0
  786. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_usage_limits.py +0 -0
  787. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_usage_rollup.py +0 -0
  788. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_venv_live_install_2121.py +0 -0
  789. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_version_single_source.py +0 -0
  790. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_watch.py +0 -0
  791. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  792. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worker_env_venv_isolation.py +0 -0
  793. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worker_events.py +0 -0
  794. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worker_image_pin_sync.py +0 -0
  795. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worker_safety.py +0 -0
  796. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worker_test_scoping.py +0 -0
  797. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worktree.py +0 -0
  798. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  799. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/test_write_parity.py +0 -0
  800. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tests/write_parity.py +0 -0
  801. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/.github/workflows/release-tui.yml +0 -0
  802. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/Cargo.lock +0 -0
  803. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/Cargo.toml +0 -0
  804. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/cargo-config-local-quadraui.toml.example +0 -0
  805. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/approved.rs +0 -0
  806. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/doc_tabs.rs +0 -0
  811. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/drive.rs +0 -0
  812. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/drive_queue.rs +0 -0
  813. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/escalation.rs +0 -0
  814. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/events.rs +0 -0
  815. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/fixtures.rs +0 -0
  816. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/fleet_health.rs +0 -0
  817. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/fleet_sessions.rs +0 -0
  818. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/fleet_terminals.rs +0 -0
  819. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/format.rs +0 -0
  820. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/milestone_dag.rs +0 -0
  821. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/mod.rs +0 -0
  822. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/msv.rs +0 -0
  823. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/pipeline.rs +0 -0
  824. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/plans.rs +0 -0
  825. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/render.rs +0 -0
  826. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/reports.rs +0 -0
  827. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/sessions.rs +0 -0
  828. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/settings_ui.rs +0 -0
  829. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/sidebar.rs +0 -0
  830. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/terminal.rs +0 -0
  831. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/tests.rs +0 -0
  832. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/types/generated.rs +0 -0
  833. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/types.rs +0 -0
  834. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/app/workspace.rs +0 -0
  835. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/bin/gtk.rs +0 -0
  836. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/commands.rs +0 -0
  837. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/lib.rs +0 -0
  838. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/main.rs +0 -0
  839. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/src/settings.rs +0 -0
  840. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  841. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/contract.md +0 -0
  842. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  843. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  844. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  845. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  846. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  847. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/contract.md +0 -0
  848. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  849. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  850. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  851. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  852. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  853. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  854. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  855. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  856. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  857. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  858. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  859. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  860. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  861. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  862. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/contract.md +0 -0
  863. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  864. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  865. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  866. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  867. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  868. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  869. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  870. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  871. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  872. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  873. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  874. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  875. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  876. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  877. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/contract.md +0 -0
  878. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  879. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  880. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  881. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  882. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  883. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  884. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  885. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  886. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/acceptance.rs +0 -0
  887. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/cli.rs +0 -0
  888. {code_coordinator-0.5.288 → code_coordinator-0.5.289}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.288
3
+ Version: 0.5.289
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.288
3
+ Version: 0.5.289
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.288",
2
+ "tag": "0.5.289",
3
3
  "distance": 0,
4
- "node": "gc15b59071ef9a73aaca54a53587f2604b0d0fbe0",
4
+ "node": "ga013df1e45f8ba2ece0ba26be923f8a107dbe654",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -6879,11 +6879,19 @@ class AgentServer:
6879
6879
  reclaimed, which is how ``cargo-target/quadraui`` reached 38G against
6880
6880
  a 20 GiB cap and filled ``/home``.
6881
6881
 
6882
- Also passes the absolute free-disk floor (#2137 item 4), and parks
6883
- the sweep's verdict where the ``cargo_targets`` health check can read
6884
- it so ``cargo_over_cap`` reaches an operator instead of dead-ending
6885
- in this dict. Best-effort: any failure degrades to an empty dict
6886
- rather than aborting the worktree sweep that calls it.
6882
+ Also passes the absolute free-disk floor (#2137 item 4) and, since
6883
+ #2919, every local checkout's own ``target/`` dir
6884
+ (``checkout_target_dirs``) — without this the floor can only ever
6885
+ reclaim from the shared cache, which is precisely the 2026-08-28
6886
+ incident: a stale ``~/src/quadraui/target`` sat untouched two
6887
+ directories away while the sweep evicted the whole cache to
6888
+ compensate for bytes it structurally could not reach. Mirrors
6889
+ ``fix_cargo_targets``'s own ``_checkout_target_dirs`` in
6890
+ ``coord/health/checks/cargo_targets.py``. Also parks the sweep's
6891
+ verdict where the ``cargo_targets`` health check can read it so
6892
+ ``cargo_over_cap`` reaches an operator instead of dead-ending in this
6893
+ dict. Best-effort: any failure degrades to an empty dict rather than
6894
+ aborting the worktree sweep that calls it.
6887
6895
  """
6888
6896
  with self._lock:
6889
6897
  live_repos = {
@@ -6892,10 +6900,16 @@ class AgentServer:
6892
6900
  if a.status in (PENDING, RUNNING)
6893
6901
  }
6894
6902
  try:
6903
+ from coord.health.context import local_checkouts # noqa: PLC0415
6904
+
6905
+ checkout_target_dirs = [
6906
+ c.path / "target" for c in local_checkouts(self._health_config)
6907
+ ]
6895
6908
  result = cargo_cache.sweep(
6896
6909
  self.state_dir,
6897
6910
  protect_repos=live_repos,
6898
6911
  free_floor=cargo_cache.free_floor_bytes(),
6912
+ checkout_target_dirs=checkout_target_dirs,
6899
6913
  )
6900
6914
  except OSError as e: # pragma: no cover - defensive
6901
6915
  _log.warning("cargo cache GC failed: %s", e)
@@ -54,6 +54,26 @@ agent log, and a status file (:func:`write_gc_status`) the ``cargo_targets``
54
54
  health check renders — rather than returning quietly the way it did while 38G
55
55
  accumulated.
56
56
 
57
+ #2919: the free-space floor above can only ever reclaim from *this* cache,
58
+ but on a machine where a per-checkout ``target/`` dominates the disk (a human
59
+ building directly in ``~/src/<repo>``, invisible to everything above), the
60
+ cache is not what filled the disk and evicting it whole does not fix that —
61
+ it just forces a fleet-wide cold rebuild that buys back, at best, an hour.
62
+ Two changes:
63
+
64
+ * :func:`sweep` accepts *checkout_target_dirs* — an optional list of
65
+ per-checkout ``target/`` paths outside the cache root entirely. When the
66
+ free-space floor is breached, these are reclaimed *first* (stale + idle
67
+ ones only, same :func:`build_active` gate), because a dir nothing has
68
+ touched in weeks and nothing is compiling against costs nothing to lose —
69
+ unlike any tier of the shared cache, which something reuses this hour.
70
+ * If even zeroing the *entire* cache could not close the remaining shortfall
71
+ (``cargo_floor_unreachable``), tier-3 whole-cache eviction is skipped: it
72
+ cannot satisfy the floor either way, so spending it anyway would only buy a
73
+ fleet-wide rebuild for nothing. The cheap tiers (1-2) still run. Either
74
+ way the verdict — reason, and the biggest non-cache dirs it saw — lands in
75
+ ``cargo_over_cap_reason`` the same as an ordinary cap breach.
76
+
57
77
  Set ``COORD_SHARED_CARGO_TARGET=0`` to disable the whole feature; an operator
58
78
  who exports their own ``CARGO_TARGET_DIR`` also wins (we never override it).
59
79
  """
@@ -88,7 +108,18 @@ DEFAULT_CACHE_CAP_GB = 20.0
88
108
  # cap can never see because the per-checkout ``target/`` dirs (17G + 13G + 11G
89
109
  # on the machine that filled) are outside it. When free space is under this
90
110
  # floor the sweep reclaims the shortfall from the cache even if the cache is
91
- # under its cap — the cache is the cheapest thing on the disk to give up.
111
+ # under its cap — the cache is the cheapest thing on the disk *this module
112
+ # has authority over* to give up.
113
+ #
114
+ # #2919: that framing turned out to be incomplete — a single repo's cache
115
+ # routinely returns to 14-18G within the hour, well above this floor, so
116
+ # evicting it whole buys almost nothing when a stale per-checkout ``target/``
117
+ # dominates the disk instead. Rather than raise this number (there is no
118
+ # value that is both "below one repo's steady state" and "big enough to
119
+ # matter"), the floor path below now reaches the *actually* cheap thing
120
+ # first (a stale, idle per-checkout ``target/``, see ``checkout_target_dirs``
121
+ # on :func:`sweep`) and refuses to spend the cache on a shortfall it cannot
122
+ # close either way. The default stays put until that's shown insufficient.
92
123
  DEFAULT_FREE_FLOOR_GB = 10.0
93
124
 
94
125
  # A profile dir untouched for this long is "stale": its artifacts predate the
@@ -96,9 +127,15 @@ DEFAULT_FREE_FLOOR_GB = 10.0
96
127
  # the bytes once we're over the cap.
97
128
  DEFAULT_STALE_DAYS = 7.0
98
129
 
130
+ # #2919: a *per-checkout* ``target/`` may be a human's working tree they
131
+ # intend to return to, not just a rebuild-speed cache — so the bar for
132
+ # reclaiming one defaults well above a shared-cache profile dir's.
133
+ DEFAULT_CHECKOUT_STALE_DAYS = 30.0
134
+
99
135
  CAP_ENV = "COORD_CARGO_CACHE_CAP_GB"
100
136
  FREE_FLOOR_ENV = "COORD_CARGO_FREE_FLOOR_GB"
101
137
  STALE_DAYS_ENV = "COORD_CARGO_STALE_DAYS"
138
+ CHECKOUT_STALE_DAYS_ENV = "COORD_CARGO_CHECKOUT_STALE_DAYS"
102
139
  ENABLE_ENV = "COORD_SHARED_CARGO_TARGET"
103
140
  CARGO_ENV = "CARGO_TARGET_DIR"
104
141
 
@@ -228,6 +265,22 @@ def stale_secs(env: dict[str, str] | None = None) -> float | None:
228
265
  return days * 86400.0
229
266
 
230
267
 
268
+ def checkout_stale_secs(env: dict[str, str] | None = None) -> float | None:
269
+ """Age at which a per-checkout ``target/`` dir counts as stale enough to
270
+ reclaim (#2919), or ``None`` when disabled.
271
+
272
+ Deliberately separate from :func:`stale_secs`: a *shared-cache* profile
273
+ dir (tier 2) is cheap to lose — cargo rebuilds just that one profile —
274
+ where a per-checkout ``target/`` may belong to a working tree a human
275
+ intends to return to, so the default bar is much higher (see
276
+ :data:`DEFAULT_CHECKOUT_STALE_DAYS`).
277
+ """
278
+ days = _float_env(env, CHECKOUT_STALE_DAYS_ENV, DEFAULT_CHECKOUT_STALE_DAYS)
279
+ if days <= 0:
280
+ return None
281
+ return days * 86400.0
282
+
283
+
231
284
  def dir_size(path: Path) -> int:
232
285
  """Total size of the regular files under *path* (symlinks not followed)."""
233
286
  total = 0
@@ -280,6 +333,19 @@ def _last_used(path: Path) -> float:
280
333
  return newest
281
334
 
282
335
 
336
+ def target_dir_age_secs(path: Path, now: float) -> float:
337
+ """Seconds since *path* — any cargo target dir, shared cache or
338
+ per-checkout — was last built into (#2919).
339
+
340
+ Exposes the same cheap "newest mtime, shallow-sampled" heuristic
341
+ :func:`sweep`'s own tiers use internally (:func:`_last_used`), so a
342
+ surface with no business reaching into this module's guts — the
343
+ ``cargo_targets`` health check reporting how stale a per-checkout
344
+ ``target/`` is — doesn't have to re-derive it.
345
+ """
346
+ return max(0.0, now - _last_used(path))
347
+
348
+
283
349
  # ── #2137: intra-repo pruning ───────────────────────────────────────────────
284
350
 
285
351
 
@@ -495,6 +561,110 @@ def build_active(repo_dir: Path) -> bool:
495
561
  return True
496
562
 
497
563
 
564
+ # ── #2919: per-checkout ``target/`` dirs, outside the cache root ───────────
565
+
566
+
567
+ def stale_checkout_targets(
568
+ dirs: "list[Path] | tuple[Path, ...]", older_than_secs: float | None, now: float
569
+ ) -> list[Path]:
570
+ """Per-checkout ``target/`` dirs idle longer than *older_than_secs*.
571
+
572
+ Unlike everything else in this module, these live outside
573
+ :func:`cache_root` entirely — a human's own checkout, not a per-machine
574
+ cache keyed on repo name — so the caller supplies the candidate paths
575
+ rather than this walking a known root. Purely a filter: it does not
576
+ check :func:`build_active`, so a caller that intends to delete anything
577
+ returned here still has to gate each one itself (:func:`sweep` does).
578
+ """
579
+ if not older_than_secs or older_than_secs <= 0:
580
+ return []
581
+ out: list[Path] = []
582
+ for d in dirs:
583
+ try:
584
+ if d.is_symlink() or not d.is_dir():
585
+ continue
586
+ except OSError:
587
+ continue
588
+ if (now - _last_used(d)) >= older_than_secs:
589
+ out.append(d)
590
+ return out
591
+
592
+
593
+ def _reclaim_checkout_targets(
594
+ dirs: "list[Path] | tuple[Path, ...]",
595
+ *,
596
+ stale_after_secs: float | None,
597
+ now: float,
598
+ needed_bytes: int,
599
+ dry_run: bool,
600
+ result: dict,
601
+ ) -> int:
602
+ """#2919: reclaim stale, idle per-checkout ``target/`` dirs for the
603
+ free-space floor, stopping as soon as *needed_bytes* is covered.
604
+
605
+ Real bytes on the same filesystem the floor cares about, entirely
606
+ outside the cache :func:`sweep` otherwise governs — and the cheapest
607
+ thing on the disk to give back, because nothing has touched it in a
608
+ long time and (:func:`build_active`) nothing is compiling against it
609
+ right now. Populates ``result["cargo_checkout_*"]`` and returns bytes
610
+ freed (or, for a dry run, bytes that *would* be freed).
611
+ """
612
+ # The staleness predicate is `stale_checkout_targets` — computed once,
613
+ # up front, rather than re-derived inline here, so there is exactly one
614
+ # answer to "is this checkout target stale enough to reclaim" instead of
615
+ # two implementations that only agree because they were written together.
616
+ stale_dirs = set(stale_checkout_targets(dirs, stale_after_secs, now))
617
+
618
+ scanned: list[dict] = []
619
+ candidates: list[tuple[float, Path, int]] = []
620
+ for d in dirs:
621
+ try:
622
+ if d.is_symlink() or not d.is_dir():
623
+ continue
624
+ except OSError:
625
+ continue
626
+ last_used = _last_used(d)
627
+ age = max(0.0, now - last_used)
628
+ size = dir_size(d)
629
+ stale = d in stale_dirs
630
+ scanned.append(
631
+ {
632
+ "path": str(d),
633
+ "bytes": size,
634
+ "last_used": last_used,
635
+ "age_secs": age,
636
+ "stale": stale,
637
+ }
638
+ )
639
+ if stale:
640
+ candidates.append((last_used, d, size))
641
+ result["cargo_checkout_scanned"] = scanned
642
+
643
+ candidates.sort(key=lambda c: (c[0], str(c[1])))
644
+ freed = 0
645
+ blocked: list[str] = []
646
+ pruned: list[dict] = []
647
+ for _last_used_at, d, size in candidates:
648
+ if freed >= needed_bytes:
649
+ break
650
+ if build_active(d):
651
+ blocked.append(str(d))
652
+ continue
653
+ if size <= 0:
654
+ continue
655
+ if not dry_run:
656
+ try:
657
+ shutil.rmtree(d)
658
+ except OSError:
659
+ continue
660
+ freed += size
661
+ pruned.append({"path": str(d), "bytes": size})
662
+ result["cargo_checkout_pruned"] = pruned
663
+ result["cargo_checkout_pruned_bytes"] = freed
664
+ result["cargo_checkout_prune_blocked"] = blocked
665
+ return freed
666
+
667
+
498
668
  # ── #2137: the GC's verdict, for operator surfaces ──────────────────────────
499
669
 
500
670
 
@@ -544,6 +714,8 @@ def sweep(
544
714
  dry_run: bool = False,
545
715
  free_floor: int | None = None,
546
716
  stale_after_secs: float | None = -1.0,
717
+ checkout_target_dirs: "list[Path] | tuple[Path, ...] | None" = None,
718
+ checkout_stale_after_secs: float | None = -1.0,
547
719
  now: float | None = None,
548
720
  ) -> dict:
549
721
  """Reclaim cache space until the total is under the cap.
@@ -577,6 +749,19 @@ def sweep(
577
749
  *stale_after_secs* defaults to the sentinel ``-1`` meaning "read it from
578
750
  the environment" (:func:`stale_secs`); ``None`` disables tier 2.
579
751
 
752
+ *checkout_target_dirs* (#2919, default ``None``) names per-checkout
753
+ ``target/`` paths on this machine, outside the cache root — the thing the
754
+ free-space floor could never previously reach. When the floor is
755
+ breached, stale + idle ones (:func:`stale_checkout_targets`,
756
+ :func:`build_active`) are reclaimed *before* the cache's own limit is
757
+ tightened, because losing one costs nothing: nothing has touched it in a
758
+ long time and nothing is building against it right now. If even the
759
+ entire cache could not have closed the remaining shortfall on its own,
760
+ ``cargo_floor_unreachable`` is set and tier-3 whole-cache eviction is
761
+ skipped — it would not satisfy the floor either way, so there is no
762
+ reason to spend it. *checkout_stale_after_secs* is the analogous sentinel
763
+ for :func:`checkout_stale_secs`.
764
+
580
765
  Returns ``{"cargo_cache_bytes": B, "cargo_caches_evicted": N,
581
766
  "cargo_evicted_repos": [...], "cargo_cap_bytes": C|None,
582
767
  "cargo_over_cap": bool, "cargo_dry_run": bool}`` plus, since #2137,
@@ -585,8 +770,16 @@ def sweep(
585
770
  (repos left untouched because a build is live), ``cargo_over_cap_reason``,
586
771
  ``cargo_limit_bytes`` (what the sweep actually aimed at — the cap, or
587
772
  tighter when the floor bites), ``cargo_disk_free_bytes``,
588
- ``cargo_disk_floor_bytes`` and ``cargo_disk_low``. ``cargo_cache_bytes`` is the total *after* the sweep
589
- (or, for ``dry_run``, what it would be).
773
+ ``cargo_disk_floor_bytes`` and ``cargo_disk_low``. ``cargo_disk_low`` can
774
+ flip back to ``False`` mid-function (#2919): it is set ``True`` as soon as
775
+ the floor is breached, then reset if reclaiming stale checkout
776
+ ``target/`` dirs alone closes the shortfall, so the cache tiers below
777
+ never had to give anything back. ``cargo_cache_bytes`` is the total
778
+ *after* the sweep (or, for ``dry_run``, what it would be). Since #2919, also
779
+ ``cargo_checkout_scanned`` (every candidate seen, with size/age/staleness),
780
+ ``cargo_checkout_pruned``, ``cargo_checkout_pruned_bytes``,
781
+ ``cargo_checkout_prune_blocked`` (a live build) and
782
+ ``cargo_floor_unreachable``.
590
783
  """
591
784
  limit = cap_bytes() if cap == -1 else cap
592
785
  stale_cutoff = stale_secs() if stale_after_secs == -1.0 else stale_after_secs
@@ -612,6 +805,12 @@ def sweep(
612
805
  "cargo_disk_free_bytes": None,
613
806
  "cargo_disk_floor_bytes": free_floor,
614
807
  "cargo_disk_low": False,
808
+ # #2919.
809
+ "cargo_checkout_scanned": [],
810
+ "cargo_checkout_pruned": [],
811
+ "cargo_checkout_pruned_bytes": 0,
812
+ "cargo_checkout_prune_blocked": [],
813
+ "cargo_floor_unreachable": False,
615
814
  }
616
815
 
617
816
  root = cache_root(state_dir)
@@ -637,7 +836,7 @@ def sweep(
637
836
  # #2137 item 4: the failure that actually bit was "0 bytes free", not
638
837
  # "cache over cap". A floor on absolute free space tightens the limit so
639
838
  # the cache gives back the shortfall — it is the cheapest thing on the
640
- # filesystem to lose, and the only thing here we have authority over.
839
+ # filesystem *this module has authority over* to lose.
641
840
  if free_floor:
642
841
  try:
643
842
  usage = shutil.disk_usage(str(root))
@@ -648,11 +847,48 @@ def sweep(
648
847
  shortfall = free_floor - usage.free
649
848
  if shortfall > 0:
650
849
  result["cargo_disk_low"] = True
651
- disk_limit = max(0, total - shortfall)
652
- limit = disk_limit if limit is None else min(limit, disk_limit)
653
- result["cargo_limit_bytes"] = limit
654
850
 
655
- if limit is None or total <= limit:
851
+ # #2919: reclaim stale, idle per-checkout target/ dirs
852
+ # first — real bytes on this same filesystem, entirely
853
+ # outside the cache, and cheaper to lose than anything in
854
+ # it: nothing has touched them in a long time and nothing
855
+ # is building against them right now.
856
+ if checkout_target_dirs:
857
+ checkout_cutoff = (
858
+ checkout_stale_secs()
859
+ if checkout_stale_after_secs == -1.0
860
+ else checkout_stale_after_secs
861
+ )
862
+ shortfall -= _reclaim_checkout_targets(
863
+ checkout_target_dirs,
864
+ stale_after_secs=checkout_cutoff,
865
+ now=clock,
866
+ needed_bytes=shortfall,
867
+ dry_run=dry_run,
868
+ result=result,
869
+ )
870
+
871
+ if shortfall <= 0:
872
+ # The non-cache tier closed the gap on its own — the
873
+ # cache is not touched at all.
874
+ result["cargo_disk_low"] = False
875
+ else:
876
+ if shortfall >= total:
877
+ # #2919: even zeroing the ENTIRE cache would not
878
+ # close this gap. Escalating to tier-3 eviction
879
+ # below would buy a fleet-wide cold rebuild for
880
+ # nothing, so it is skipped and the sweep says why.
881
+ result["cargo_floor_unreachable"] = True
882
+ disk_limit = max(0, total - shortfall)
883
+ limit = disk_limit if limit is None else min(limit, disk_limit)
884
+ result["cargo_limit_bytes"] = limit
885
+
886
+ if limit is None:
887
+ # GC disabled entirely. Note this cannot skip the floor-unreachable
888
+ # reason/log below: `limit` only stays `None` here when the free-disk
889
+ # floor never set `disk_limit` in the first place (see the
890
+ # `if free_floor:` block above), which means `cargo_floor_unreachable`
891
+ # is `False` too — there is nothing for this early return to lose.
656
892
  return result
657
893
 
658
894
  # Oldest-used first; ties broken by name so the sweep is deterministic.
@@ -660,6 +896,7 @@ def sweep(
660
896
  remaining = {name: size for _m, name, _p, size in entries}
661
897
  pruned: list[dict] = []
662
898
  blocked: list[str] = []
899
+ evicted: list[str] = []
663
900
  # A repo's build-activity verdict is probed at most once per sweep: the
664
901
  # /proc scan is not free and the answer cannot usefully change mid-sweep.
665
902
  idle: dict[str, bool] = {}
@@ -697,49 +934,64 @@ def sweep(
697
934
  )
698
935
  return size
699
936
 
700
- # Tier 1 then tier 2, each across every repo before the next escalates —
701
- # "cheapest to recreate first" is a property of the whole cache, not of one
702
- # repo, so an incremental dir on a hot repo goes before a stale profile dir
703
- # on a cold one.
704
- for tier in ("incremental", "stale"):
705
- for _mtime, name, path, _size in entries:
937
+ # Everything below is the reclaim work itself, skipped outright when the
938
+ # cache is already at/under the limit (including the common post-#2919
939
+ # case of a prior sweep having already drained it to 0) — but the
940
+ # aggregation and floor-unreachable/over-cap reporting after it always
941
+ # runs, even then: `cargo_floor_unreachable` can be `True` with nothing
942
+ # left here to reclaim, and that verdict must still reach
943
+ # `cargo_over_cap_reason` and the log rather than being lost to an early
944
+ # return, which was the bug (#2919 review).
945
+ if total > limit:
946
+ # Tier 1 then tier 2, each across every repo before the next
947
+ # escalates — "cheapest to recreate first" is a property of the whole
948
+ # cache, not of one repo, so an incremental dir on a hot repo goes
949
+ # before a stale profile dir on a cold one.
950
+ for tier in ("incremental", "stale"):
951
+ for _mtime, name, path, _size in entries:
952
+ if total <= limit:
953
+ break
954
+ if not _may_touch(name, path):
955
+ continue
956
+ if tier == "incremental":
957
+ subtrees = incremental_dirs(path)
958
+ elif stale_cutoff is None:
959
+ subtrees = []
960
+ else:
961
+ subtrees = stale_profile_dirs(path, stale_cutoff, clock)
962
+ for subtree in subtrees:
963
+ if total <= limit:
964
+ break
965
+ total -= _reclaim(name, subtree, tier)
706
966
  if total <= limit:
707
967
  break
708
- if not _may_touch(name, path):
709
- continue
710
- if tier == "incremental":
711
- subtrees = incremental_dirs(path)
712
- elif stale_cutoff is None:
713
- subtrees = []
714
- else:
715
- subtrees = stale_profile_dirs(path, stale_cutoff, clock)
716
- for subtree in subtrees:
968
+
969
+ # Tier 3: whole-directory eviction, as since #1402 — the last resort,
970
+ # and never against a repo with a live assignment. The
971
+ # build-activity gate applies here too: refusing to prune a busy tree
972
+ # and then rmtree-ing the whole thing two lines later would be the
973
+ # worse of both behaviours.
974
+ #
975
+ # #2919: skipped entirely when the free-space floor is unreachable
976
+ # from the cache alone — spending the whole cache would not close
977
+ # that gap either, so there is nothing to buy by evicting it, only a
978
+ # fleet-wide cold rebuild to pay for.
979
+ if not result["cargo_floor_unreachable"]:
980
+ for _mtime, name, path, _size in entries:
717
981
  if total <= limit:
718
982
  break
719
- total -= _reclaim(name, subtree, tier)
720
- if total <= limit:
721
- break
722
-
723
- # Tier 3: whole-directory eviction, as since #1402 — the last resort, and
724
- # never against a repo with a live assignment. The build-activity gate
725
- # applies here too: refusing to prune a busy tree and then rmtree-ing the
726
- # whole thing two lines later would be the worse of both behaviours.
727
- evicted: list[str] = []
728
- for _mtime, name, path, _size in entries:
729
- if total <= limit:
730
- break
731
- if name in protected:
732
- continue
733
- if not _may_touch(name, path):
734
- continue
735
- if not dry_run:
736
- try:
737
- shutil.rmtree(path)
738
- except OSError:
739
- continue
740
- total -= remaining[name]
741
- remaining[name] = 0
742
- evicted.append(name)
983
+ if name in protected:
984
+ continue
985
+ if not _may_touch(name, path):
986
+ continue
987
+ if not dry_run:
988
+ try:
989
+ shutil.rmtree(path)
990
+ except OSError:
991
+ continue
992
+ total -= remaining[name]
993
+ remaining[name] = 0
994
+ evicted.append(name)
743
995
 
744
996
  pruned_bytes = sum(int(p["bytes"]) for p in pruned)
745
997
  result["cargo_cache_bytes"] = total
@@ -751,7 +1003,21 @@ def sweep(
751
1003
  result["cargo_prune_blocked"] = blocked
752
1004
  result["cargo_over_cap"] = total > limit
753
1005
 
754
- if result["cargo_over_cap"]:
1006
+ if result["cargo_floor_unreachable"]:
1007
+ # Independent of `cargo_over_cap` below: this is true — and worth
1008
+ # saying — even if tiers 1-2 happened to drain the cache to 0 and
1009
+ # `cargo_over_cap` ends up False.
1010
+ reason = _over_cap_reason(
1011
+ total,
1012
+ limit,
1013
+ floor_unreachable=True,
1014
+ top_consumers=result.get("cargo_checkout_scanned"),
1015
+ )
1016
+ result["cargo_over_cap_reason"] = reason
1017
+ _log.warning(
1018
+ "cargo free-space floor unreachable from the cache alone: %s", reason
1019
+ )
1020
+ elif result["cargo_over_cap"]:
755
1021
  reason = _over_cap_reason(total, limit, protected, blocked, remaining)
756
1022
  result["cargo_over_cap_reason"] = reason
757
1023
  # Escalate rather than return quietly (#2137): this is the exact state
@@ -763,12 +1029,35 @@ def sweep(
763
1029
  def _over_cap_reason(
764
1030
  total: int,
765
1031
  limit: int,
766
- protected: "set[str]",
767
- blocked: "list[str]",
768
- remaining: dict[str, int],
1032
+ protected: "set[str] | None" = None,
1033
+ blocked: "list[str] | None" = None,
1034
+ remaining: "dict[str, int] | None" = None,
1035
+ *,
1036
+ floor_unreachable: bool = False,
1037
+ top_consumers: "list[dict] | None" = None,
769
1038
  ) -> str:
770
1039
  """One line an operator can act on: how far over, and what stopped us."""
1040
+ if floor_unreachable:
1041
+ ranked = sorted(
1042
+ (c for c in (top_consumers or []) if c.get("bytes")),
1043
+ key=lambda c: -int(c["bytes"]),
1044
+ )[:3]
1045
+ names = ", ".join(
1046
+ f"{c['path']} {_human(int(c['bytes']))} ({c['age_secs'] / 86400:.0f}d idle)"
1047
+ for c in ranked
1048
+ )
1049
+ detail = f"top non-cache consumers: {names}" if names else (
1050
+ "no non-cache target dirs were passed in to check"
1051
+ )
1052
+ return (
1053
+ f"{_human(total)} cache cannot cover the free-space shortfall on its "
1054
+ f"own — evicting it would not resolve this, so it was left alone; "
1055
+ f"{detail}"
1056
+ )
771
1057
  over = _human(total - limit)
1058
+ blocked = blocked or []
1059
+ protected = protected or set()
1060
+ remaining = remaining or {}
772
1061
  if blocked:
773
1062
  why = f"live build in {', '.join(sorted(blocked))}"
774
1063
  elif protected: