code-coordinator 0.5.582__tar.gz → 0.5.584__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 (935) hide show
  1. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/audit.py +16 -0
  5. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/_common.py +38 -18
  6. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/drive.py +174 -20
  7. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/reports.py +116 -13
  8. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive.py +108 -2
  9. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reports.py +161 -0
  10. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.github/workflows/publish.yml +0 -0
  21. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.github/workflows/test.yml +0 -0
  22. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/.gitignore +0 -0
  23. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/CLAUDE.md +0 -0
  24. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/GOAL.md +0 -0
  25. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/LICENSE +0 -0
  26. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/MANIFEST.in +0 -0
  27. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/README.md +0 -0
  28. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/SOURCES.txt +0 -0
  29. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/dependency_links.txt +0 -0
  30. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/entry_points.txt +0 -0
  31. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/requires.txt +0 -0
  32. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/scm_file_list.json +0 -0
  33. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/code_coordinator.egg-info/top_level.txt +0 -0
  34. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/__init__.py +0 -0
  35. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/_board_mapping.py +0 -0
  36. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/acceptance.py +0 -0
  37. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/acceptance_drivers.py +0 -0
  38. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agent.py +0 -0
  39. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agent_app.py +0 -0
  40. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agent_update.py +0 -0
  41. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/auto_loop.py +0 -0
  46. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/backup.py +0 -0
  47. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/bugbash.py +0 -0
  55. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/claude_setup_token.py +0 -0
  62. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/client.py +0 -0
  64. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/codegen.py +0 -0
  65. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/backup.py +0 -0
  70. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/bugbash.py +0 -0
  71. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/ci.py +0 -0
  73. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/codegen.py +0 -0
  74. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/dr.py +0 -0
  77. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/machine.py +0 -0
  84. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/pr.py +0 -0
  90. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/release.py +0 -0
  91. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/repo.py +0 -0
  92. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/report.py +0 -0
  93. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/review.py +0 -0
  94. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/scorecard.py +0 -0
  95. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/sessions.py +0 -0
  96. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/setup.py +0 -0
  97. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/status.py +0 -0
  98. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/store_migrate.py +0 -0
  99. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/config.py +0 -0
  104. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/confirm_test.py +0 -0
  106. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/conflict_fix.py +0 -0
  107. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dao.py +0 -0
  108. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/reports.html +0 -0
  112. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/server.py +0 -0
  113. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dashboard/terminal.py +0 -0
  114. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/db.py +0 -0
  115. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dead_end.py +0 -0
  116. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/decomposition_chat.py +0 -0
  117. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/README.md +0 -0
  118. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-agent.service +0 -0
  119. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-backup.service +0 -0
  120. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-backup.timer +0 -0
  121. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-db-backup.service +0 -0
  122. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-db-backup.sh +0 -0
  123. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-db-backup.timer +0 -0
  124. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-dr-verify.service +0 -0
  125. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-dr-verify.timer +0 -0
  126. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-drive-queue.service +0 -0
  127. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-drive-queue.timer +0 -0
  128. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-failure-notify.service +0 -0
  129. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-fleet-watchdog.service +0 -0
  130. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  131. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-notify.service +0 -0
  132. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-notify.timer +0 -0
  133. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-release-propagate.service +0 -0
  134. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-release-propagate.timer +0 -0
  135. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-release-window.service +0 -0
  136. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-release-window.timer +0 -0
  137. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-serve.service +0 -0
  138. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-web-dist-build.service +0 -0
  139. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-web-dist-build.timer +0 -0
  140. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy/coord-web.service +0 -0
  141. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy_manifest.py +0 -0
  142. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deploy_units.py +0 -0
  143. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deprecation_telemetry.py +0 -0
  144. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/deps.py +0 -0
  145. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/diagnose.py +0 -0
  146. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dirlink.py +0 -0
  147. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dispatch.py +0 -0
  148. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dispatch_liveness.py +0 -0
  149. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dist_name.py +0 -0
  150. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dr_promote.py +0 -0
  151. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/dr_verify.py +0 -0
  152. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/drive_queue.py +0 -0
  153. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/drive_sessions_snapshot.py +0 -0
  154. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/drive_state.py +0 -0
  155. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/events.py +0 -0
  156. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/failure_class.py +0 -0
  157. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/failure_classifier.py +0 -0
  158. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/filelock.py +0 -0
  159. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/fleet_config_health.py +0 -0
  160. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/forge_availability.py +0 -0
  161. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/freshness.py +0 -0
  162. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gate_a.py +0 -0
  163. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gate_b.py +0 -0
  164. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gate_snapshot.py +0 -0
  165. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gates.py +0 -0
  166. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gen_board_fixture.py +0 -0
  167. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/github_ops.py +0 -0
  168. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/github_throttle.py +0 -0
  169. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/goal.py +0 -0
  170. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/graph_health.py +0 -0
  171. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/gtk_native_driver.py +0 -0
  172. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/__init__.py +0 -0
  173. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/aggregate.py +0 -0
  174. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/__init__.py +0 -0
  175. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/_ci_pin.py +0 -0
  176. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/agent_install.py +0 -0
  177. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/cargo_targets.py +0 -0
  178. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/claude_binary.py +0 -0
  179. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/config_drift.py +0 -0
  180. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  181. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/coord_web_ci_pin.py +0 -0
  182. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/deploy_lane_facts.py +0 -0
  183. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/disk.py +0 -0
  184. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/fleet_board.py +0 -0
  185. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  186. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/fleet_phantom.py +0 -0
  187. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/fleet_unit_drift.py +0 -0
  188. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/graph.py +0 -0
  189. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/graphify_cli.py +0 -0
  190. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/index_lock.py +0 -0
  191. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/issues_sync_staleness.py +0 -0
  192. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/local_machine_identity.py +0 -0
  193. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/plan_usage.py +0 -0
  194. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/pr_churn.py +0 -0
  195. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/release_cordon.py +0 -0
  196. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/repo_state.py +0 -0
  197. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/spawned_coord.py +0 -0
  198. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/stalled_pipeline.py +0 -0
  199. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/timer_active.py +0 -0
  200. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/toolchain.py +0 -0
  201. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/unit_drift.py +0 -0
  202. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/unit_enablement.py +0 -0
  203. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/wedged_drive_queue.py +0 -0
  204. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/checks/worktrees.py +0 -0
  205. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/cli.py +0 -0
  206. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/context.py +0 -0
  207. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/fleet_snapshot.py +0 -0
  208. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/models.py +0 -0
  209. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/pypi.py +0 -0
  210. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/registry.py +0 -0
  211. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/render.py +0 -0
  212. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/health/units.py +0 -0
  213. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/hooks.py +0 -0
  214. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/housekeeping.py +0 -0
  215. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/interactive.py +0 -0
  216. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/invariant_alarms.py +0 -0
  217. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/issue_store.py +0 -0
  218. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/issues_sync_status.py +0 -0
  219. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/liveness_auditor.py +0 -0
  220. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/mac_native_driver.py +0 -0
  221. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/machine_fault.py +0 -0
  222. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/machine_metrics.py +0 -0
  223. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/machine_onboard.py +0 -0
  224. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/machine_pause.py +0 -0
  225. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/machine_stats.py +0 -0
  226. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/merge_queue.py +0 -0
  227. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/milestone_chat.py +0 -0
  228. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/milestone_dispatch.py +0 -0
  229. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/milestone_gate.py +0 -0
  230. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/milestone_order.py +0 -0
  231. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/mock_author.py +0 -0
  232. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/models.py +0 -0
  233. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/network.py +0 -0
  234. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/new_issue_chat.py +0 -0
  235. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/__init__.py +0 -0
  236. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/baseline.py +0 -0
  237. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/cli.py +0 -0
  238. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/collect.py +0 -0
  239. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/digest.py +0 -0
  240. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/models.py +0 -0
  241. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/predicate.py +0 -0
  242. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/service.py +0 -0
  243. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/store.py +0 -0
  244. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notifier/transport.py +0 -0
  245. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/notify.py +0 -0
  246. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/openapi.py +0 -0
  247. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/overlap_fence.py +0 -0
  248. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/overlap_predict.py +0 -0
  249. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/parentage.py +0 -0
  250. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/parentage_github.py +0 -0
  251. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/pipeline.py +0 -0
  252. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/plan_parser.py +0 -0
  253. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/plans.py +0 -0
  254. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/platform_paths.py +0 -0
  255. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/portal_bridge.py +0 -0
  256. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/portal_store.py +0 -0
  257. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/portal_sync.py +0 -0
  258. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/pr_body_lint.py +0 -0
  259. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/prereqs.py +0 -0
  260. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/progress.py +0 -0
  261. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/providers/__init__.py +0 -0
  262. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/providers/base.py +0 -0
  263. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/providers/claude.py +0 -0
  264. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/providers/claude_pty.py +0 -0
  265. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/providers/opencode.py +0 -0
  266. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/queue_diagnose.py +0 -0
  267. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/reconcile.py +0 -0
  268. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/reconcile_tick.py +0 -0
  269. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/refine_chat.py +0 -0
  270. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/release_cordon.py +0 -0
  271. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/release_gate.py +0 -0
  272. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/release_propagate.py +0 -0
  273. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/release_verify.py +0 -0
  274. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/release_window.py +0 -0
  275. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/repo_dormancy.py +0 -0
  276. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/repo_edit.py +0 -0
  277. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/repo_onboard.py +0 -0
  278. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/rest_schema.py +0 -0
  279. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/restart_cmd.py +0 -0
  280. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/revalidate.py +0 -0
  281. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/review.py +0 -0
  282. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/scorecard.py +0 -0
  283. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/self_health.py +0 -0
  284. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/serve_app.py +0 -0
  285. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  286. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  287. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  288. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  289. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  290. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/portal-followup/SKILL.md +0 -0
  291. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/release-now/SKILL.md +0 -0
  292. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  293. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  294. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/skills/update-issue/SKILL.md +0 -0
  295. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/smoke.py +0 -0
  296. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/smoke_tags.py +0 -0
  297. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/spend_ceiling.py +0 -0
  298. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/split_work.py +0 -0
  299. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/sql.py +0 -0
  300. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/stage_projection.py +0 -0
  301. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/state.py +0 -0
  302. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/store_migrate.py +0 -0
  303. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/store_parity.py +0 -0
  304. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/templates/deploy-cloudflare.node.yml +0 -0
  305. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/test_author.py +0 -0
  306. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/test_chat.py +0 -0
  307. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/test_orchestrator.py +0 -0
  308. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/test_report.py +0 -0
  309. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/tui_pty_driver.py +0 -0
  310. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/tui_release.py +0 -0
  311. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/uat_checks.py +0 -0
  312. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/usage.py +0 -0
  313. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/usage_limits.py +0 -0
  314. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/usage_rollup.py +0 -0
  315. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/win_native_bridge.py +0 -0
  316. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/win_native_driver.py +0 -0
  317. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coord/worker_events.py +0 -0
  318. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/coordinator.example.yml +0 -0
  319. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-agent.service +0 -0
  320. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-backup.service +0 -0
  321. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-backup.timer +0 -0
  322. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-db-backup.service +0 -0
  323. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-db-backup.sh +0 -0
  324. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-db-backup.timer +0 -0
  325. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-dr-verify.service +0 -0
  326. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-dr-verify.timer +0 -0
  327. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-drive-queue.service +0 -0
  328. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-drive-queue.timer +0 -0
  329. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-failure-notify.service +0 -0
  330. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-failure-notify.sh +0 -0
  331. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-fleet-watchdog.service +0 -0
  332. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-fleet-watchdog.timer +0 -0
  333. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-notify.service +0 -0
  334. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-notify.timer +0 -0
  335. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-release-propagate.service +0 -0
  336. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-release-propagate.timer +0 -0
  337. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-release-window.service +0 -0
  338. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-release-window.timer +0 -0
  339. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-serve.service +0 -0
  340. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-web-dist-build.service +0 -0
  341. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-web-dist-build.sh +0 -0
  342. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-web-dist-build.timer +0 -0
  343. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-web-rollback.sh +0 -0
  344. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/coord-web.service +0 -0
  345. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/deploy/node-shim.sh +0 -0
  346. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ADR_COORD_TUI_CI.md +0 -0
  347. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  348. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ADR_COORD_WEB_CI.md +0 -0
  349. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ADR_COORD_WEB_DIST.md +0 -0
  350. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  351. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/AGENT_OPERATIONS.md +0 -0
  352. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ARCHITECTURE.md +0 -0
  353. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ARCH_SECURITY_GATES.md +0 -0
  354. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/COCKPIT.md +0 -0
  355. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/CONTROL_CENTER.md +0 -0
  356. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/COST_DISCIPLINE.md +0 -0
  357. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/CROSS_PLATFORM.md +0 -0
  358. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/CUSTOMER_FACING_APPS.md +0 -0
  359. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/CUSTOMER_PORTAL.md +0 -0
  360. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/DATA_STORE_SELECTION.md +0 -0
  361. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/DISASTER_RECOVERY.md +0 -0
  362. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/DRIVE_QUEUE.md +0 -0
  363. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/EPHEMERAL_WORKERS.md +0 -0
  364. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/FORGE_MIGRATION.md +0 -0
  365. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/GRAPHIFY_SETUP.md +0 -0
  366. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ISSUE_GUIDANCE.md +0 -0
  367. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/MAC_MINI.md +0 -0
  368. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  369. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/NOTIFIER.md +0 -0
  370. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/OPENCODE_VERIFICATION.md +0 -0
  371. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/OPERATING_GOTCHAS.md +0 -0
  372. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/OPERATOR_GUIDES.md +0 -0
  373. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/WSL_WINDOWS_WORKER.md +0 -0
  382. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/mocks/web/README.md +0 -0
  383. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/mocks/web/_tokens.css +0 -0
  384. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/mocks/web/issue-detail.html +0 -0
  385. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/mocks/web/pipeline-narrow.html +0 -0
  386. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/docs/mocks/web/pipeline-wide.html +0 -0
  387. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/graphify-out/.gitignore +0 -0
  388. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/install-agent.sh +0 -0
  389. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/pyproject.toml +0 -0
  390. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/audit_review_verdict_overrides.py +0 -0
  391. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  392. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/build-worker-image.sh +0 -0
  393. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/coordinator-machine.py +0 -0
  394. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/dr-down.sh +0 -0
  395. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/dr-up.sh +0 -0
  396. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/epic-down.sh +0 -0
  397. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/epic-up.sh +0 -0
  398. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/preflight.sh +0 -0
  399. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/provision-server.sh +0 -0
  400. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/provision-worker.sh +0 -0
  401. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  402. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  403. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/throwaway-vm.sh +0 -0
  404. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/azure-workers/verify-github-token.sh +0 -0
  405. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/check_gh_argv_containment.py +0 -0
  406. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/codegen.py +0 -0
  407. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-test-runner.sh +0 -0
  408. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  409. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  410. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  411. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  412. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/coord-venv-rollback.sh +0 -0
  413. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/drive-batch.sh +0 -0
  414. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/extract-coord-tui.sh +0 -0
  415. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/fleet_watchdog.py +0 -0
  416. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/gen_mock_index.py +0 -0
  418. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/lib/provision-core.sh +0 -0
  419. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/provision-machine.sh +0 -0
  421. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/run_tests_in_populated_home.sh +0 -0
  422. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/run_tests_without_gh.sh +0 -0
  423. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/setup-macmini.sh +0 -0
  424. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/smoke_437_interactive.py +0 -0
  425. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/verify-provision-noble.sh +0 -0
  426. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/verify_878_review_capture.py +0 -0
  427. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/verify_release_published.py +0 -0
  428. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/scripts/verify_release_wheel.py +0 -0
  429. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/setup.cfg +0 -0
  430. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/SMOKE_SET.md +0 -0
  431. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/__init__.py +0 -0
  432. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-37/conftest.py +0 -0
  433. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-37/contract.md +0 -0
  434. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-37/manifest.yml +0 -0
  435. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  436. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  437. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/contract.md +0 -0
  438. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  439. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  440. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/manifest.yml +0 -0
  441. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  442. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-51/tsconfig.json +0 -0
  443. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/backends.py +0 -0
  445. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/conftest.py +0 -0
  446. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/board-pipeline-basic.json +0 -0
  447. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  448. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  449. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  450. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  451. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/all_pass.json +0 -0
  452. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  453. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/mixed_fail.json +0 -0
  454. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  455. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  456. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/skip.json +0 -0
  457. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/playwright/truncated.json +0 -0
  458. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  459. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  460. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  461. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  462. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  463. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  478. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_graph_self_heal.py +0 -0
  479. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_health_h3.py +0 -0
  480. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_idle_restart.py +0 -0
  481. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_push_failure.py +0 -0
  482. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_reap.py +0 -0
  483. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_repos_and_pull.py +0 -0
  484. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_restart_services_endpoint.py +0 -0
  485. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_skills_self_heal.py +0 -0
  486. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_startup_diagnostics.py +0 -0
  487. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_update.py +0 -0
  488. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_update_bluegreen.py +0 -0
  489. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_usage_limit.py +0 -0
  490. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approve_capability_reroute_3241.py +0 -0
  493. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approve_dependency_busy_2804.py +0 -0
  494. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approve_reject_plan.py +0 -0
  495. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approve_usage_gate.py +0 -0
  496. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approved_work_2532.py +0 -0
  497. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_approved_work_2996.py +0 -0
  498. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_assignment_already_recorded_daemon.py +0 -0
  499. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_audit_log.py +0 -0
  500. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_audit_outcome.py +0 -0
  501. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_audit_query.py +0 -0
  502. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_auto_loop.py +0 -0
  503. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_auto_release_publish_2035.py +0 -0
  504. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_backend_selection.py +0 -0
  505. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_backup.py +0 -0
  506. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_schema.py +0 -0
  512. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_bugbash.py +0 -0
  519. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_check_gh_argv_containment.py +0 -0
  522. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_acceptance_gate_1950.py +0 -0
  523. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_fix.py +0 -0
  524. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_github.py +0 -0
  525. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_gitlab.py +0 -0
  526. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_parity_2091.py +0 -0
  527. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_ci_store.py +0 -0
  528. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_claim.py +0 -0
  529. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_claude_md_budget.py +0 -0
  530. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_claude_setup_token.py +0 -0
  531. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_acceptance.py +0 -0
  532. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_assign.py +0 -0
  533. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  534. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_assign_interactive_remote.py +0 -0
  535. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_assign_provider.py +0 -0
  536. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  537. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_audit.py +0 -0
  538. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_chat_continue.py +0 -0
  539. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_ci.py +0 -0
  540. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_codegen.py +0 -0
  541. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_decide.py +0 -0
  542. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_capability_rules.py +0 -0
  543. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_config_provenance.py +0 -0
  544. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_forge_availability.py +0 -0
  545. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_graph.py +0 -0
  546. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_self.py +0 -0
  547. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_diagnose_test_coverage.py +0 -0
  548. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_doctor.py +0 -0
  549. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_doctor_config_free_1801.py +0 -0
  550. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  551. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  552. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_drive_queue.py +0 -0
  554. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_escalate.py +0 -0
  555. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_fix_headless_review.py +0 -0
  556. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_gate_a.py +0 -0
  557. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_install_drift.py +0 -0
  558. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_install_skills.py +0 -0
  559. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_issue_comment.py +0 -0
  560. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_issue_create_label.py +0 -0
  561. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_issue_reopen.py +0 -0
  562. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_issue_view_list.py +0 -0
  563. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_issues.py +0 -0
  564. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_merge.py +0 -0
  565. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_assign.py +0 -0
  566. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_capture.py +0 -0
  567. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_chat_add_child.py +0 -0
  568. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_dispatch.py +0 -0
  569. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_gate_b.py +0 -0
  570. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_gate_c.py +0 -0
  571. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_order.py +0 -0
  572. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  573. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_milestone_ship.py +0 -0
  574. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_network.py +0 -0
  575. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_new_issue_chat.py +0 -0
  576. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_plans.py +0 -0
  577. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_portal.py +0 -0
  578. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_pr.py +0 -0
  579. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_pull_artifact.py +0 -0
  580. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_queue.py +0 -0
  581. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_reattach_sessions.py +0 -0
  582. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_refine_board.py +0 -0
  583. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_release_preflight.py +0 -0
  584. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_release_propagate.py +0 -0
  585. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_release_window.py +0 -0
  586. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_repo_2220.py +0 -0
  587. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  588. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_scorecard.py +0 -0
  589. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_serve_store_backend_3084.py +0 -0
  590. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_set_review_findings.py +0 -0
  591. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_advisory_terminal.py +0 -0
  592. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_contested_tag.py +0 -0
  593. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_invariant_alarms.py +0 -0
  594. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_machine_fault.py +0 -0
  595. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_merge_queue.py +0 -0
  596. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_provider.py +0 -0
  597. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_retried_3340.py +0 -0
  598. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_review_finalizing.py +0 -0
  599. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_supervisor_3366.py +0 -0
  600. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_test_failed_tag.py +0 -0
  601. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_status_usage_limit.py +0 -0
  602. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_sync_comments_873.py +0 -0
  603. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_test_plan.py +0 -0
  604. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_track.py +0 -0
  605. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_tui_update.py +0 -0
  606. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cli_wait.py +0 -0
  607. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_client.py +0 -0
  608. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_client_base_install.py +0 -0
  609. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_client_config_cache_atomic_3052.py +0 -0
  610. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_client_resource_migration_1946.py +0 -0
  611. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_commands_common.py +0 -0
  612. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_comments.py +0 -0
  613. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_completion_summary.py +0 -0
  614. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config.py +0 -0
  615. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_acceptance.py +0 -0
  616. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_audit.py +0 -0
  617. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_drift_check.py +0 -0
  618. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_effective.py +0 -0
  619. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_pricing.py +0 -0
  620. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  621. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_config_usage_gate.py +0 -0
  622. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_confirm_test.py +0 -0
  623. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_conflict_fix.py +0 -0
  624. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_conflict_fix_semantic.py +0 -0
  625. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  626. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test.py +0 -0
  627. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  628. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test_runner_baseline.py +0 -0
  629. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test_runner_populated_home.py +0 -0
  630. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test_runner_routing.py +0 -0
  631. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_test_runner_toolchain.py +0 -0
  632. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_uat.py +0 -0
  633. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coord_web_sse_restart_live.py +0 -0
  634. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_coordinator_machine.py +0 -0
  635. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_cross_platform_imports.py +0 -0
  636. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dao.py +0 -0
  637. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard.py +0 -0
  638. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_api.py +0 -0
  639. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_fixture.py +0 -0
  640. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_reports.py +0 -0
  641. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_server.py +0 -0
  642. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_terminal.py +0 -0
  643. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dashboard_terminal_live.py +0 -0
  644. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_db.py +0 -0
  645. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dead_end.py +0 -0
  646. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_decomposition_chat.py +0 -0
  647. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_coord_db_backup.py +0 -0
  648. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_coord_web_dist.py +0 -0
  649. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_coord_web_rollback.py +0 -0
  650. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_db_backup_unit.py +0 -0
  651. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_drive_queue_unit.py +0 -0
  652. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_failure_notify_unit.py +0 -0
  653. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_manifest.py +0 -0
  654. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_notify_unit.py +0 -0
  655. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_units_lane.py +0 -0
  656. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deploy_web_unit.py +0 -0
  657. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deprecation_telemetry.py +0 -0
  658. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_deps.py +0 -0
  659. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_diagnose.py +0 -0
  660. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dirlink.py +0 -0
  661. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dispatch.py +0 -0
  662. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dispatch_liveness.py +0 -0
  663. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dispatch_target_validation.py +0 -0
  664. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dispatch_workers.py +0 -0
  665. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dist_name.py +0 -0
  666. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_done_housekeeping.py +0 -0
  667. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dr_azure_scripts.py +0 -0
  668. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dr_promote.py +0 -0
  669. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_dr_verify.py +0 -0
  670. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_machine_fault.py +0 -0
  671. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue.py +0 -0
  672. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_blocked_rendering.py +0 -0
  673. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_launch_argv.py +0 -0
  674. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_max_parallel_config.py +0 -0
  675. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  676. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_roll_pending.py +0 -0
  677. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  678. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_sessions_snapshot.py +0 -0
  679. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_state.py +0 -0
  680. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_drive_tmux.py +0 -0
  681. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_epic_up_capability_detection.py +0 -0
  682. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  683. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_epic_up_image_provenance.py +0 -0
  684. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_errors.py +0 -0
  685. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_events.py +0 -0
  686. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_failure_class.py +0 -0
  687. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_failure_classifier.py +0 -0
  688. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_filelock.py +0 -0
  689. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  690. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fix_escalation_classifier.py +0 -0
  691. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fix_of_force_override.py +0 -0
  692. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fleet_config_health.py +0 -0
  693. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fleet_health_probes.py +0 -0
  694. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fleet_health_snapshot.py +0 -0
  695. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_fleet_watchdog.py +0 -0
  696. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_forge_availability.py +0 -0
  697. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_freshness.py +0 -0
  698. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gate_a.py +0 -0
  699. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gate_b.py +0 -0
  700. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gate_snapshot_staleness.py +0 -0
  701. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gates.py +0 -0
  702. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  703. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gen_mock_index.py +0 -0
  704. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_generated_rust_fixture.py +0 -0
  705. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_generated_rust_requests.py +0 -0
  706. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_generated_types_fixture.py +0 -0
  707. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_github_ops.py +0 -0
  708. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_github_throttle.py +0 -0
  709. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_goal.py +0 -0
  710. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_graph_health.py +0 -0
  711. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_graph_selfheal_absent_2237.py +0 -0
  712. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_gtk_native_driver.py +0 -0
  713. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_handoff.py +0 -0
  714. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_checks.py +0 -0
  715. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_cli.py +0 -0
  716. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_cli_graph.py +0 -0
  717. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_config.py +0 -0
  718. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_context.py +0 -0
  719. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_coord_tui_ci_pin.py +0 -0
  720. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_coord_web_ci_pin.py +0 -0
  721. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_deploy_lane_facts.py +0 -0
  722. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_fix.py +0 -0
  723. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_incident_regression.py +0 -0
  724. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_issues_sync_staleness.py +0 -0
  725. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_pr_churn.py +0 -0
  726. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_pypi.py +0 -0
  727. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_registry.py +0 -0
  728. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_release_cordon_probe.py +0 -0
  729. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_timer_active.py +0 -0
  730. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_toolchain.py +0 -0
  731. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_unit_drift.py +0 -0
  732. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_unit_enablement.py +0 -0
  733. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_health_wedged_drive_queue.py +0 -0
  734. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_hooks.py +0 -0
  735. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_housekeeping.py +0 -0
  736. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_human_attended_437.py +0 -0
  737. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_init.py +0 -0
  738. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_install_agent_capabilities_3515.py +0 -0
  739. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_install_agent_venv_2911.py +0 -0
  740. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  741. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_integration.py +0 -0
  742. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive.py +0 -0
  743. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_briefing_echo.py +0 -0
  744. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_pane_log_2541.py +0 -0
  745. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_prefill_state.py +0 -0
  746. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_session_relaunch.py +0 -0
  747. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_test_verdict_backstop.py +0 -0
  748. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_token_attribution.py +0 -0
  749. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_interactive_worktree.py +0 -0
  750. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_invariant_alarms.py +0 -0
  751. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_issue_store_seam.py +0 -0
  752. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_issues_sync_status.py +0 -0
  753. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_liveness_auditor.py +0 -0
  754. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_liveness_notify.py +0 -0
  755. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_lock_contention_ratchet.py +0 -0
  756. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_mac_native_driver.py +0 -0
  757. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_machine_fault.py +0 -0
  758. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_machine_metrics.py +0 -0
  759. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_machine_onboard.py +0 -0
  760. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_machine_pause.py +0 -0
  761. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_machine_stats.py +0 -0
  762. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_merge_queue.py +0 -0
  763. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_merge_verification.py +0 -0
  764. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_merge_verify.py +0 -0
  765. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_milestone_chat.py +0 -0
  766. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_milestone_dispatch.py +0 -0
  767. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_milestone_gate.py +0 -0
  768. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_milestone_order.py +0 -0
  769. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_milestone_seam.py +0 -0
  770. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_mock_author.py +0 -0
  771. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_model_tiering.py +0 -0
  772. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_models.py +0 -0
  773. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_models_config_labels.py +0 -0
  774. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_needs_attention.py +0 -0
  775. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_network.py +0 -0
  776. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_new_issue_chat.py +0 -0
  777. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_next_release_tag.py +0 -0
  778. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_node_shim.py +0 -0
  779. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_baseline.py +0 -0
  780. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_cli.py +0 -0
  781. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_collect.py +0 -0
  782. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_config.py +0 -0
  783. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_drive_seam.py +0 -0
  784. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_isolation.py +0 -0
  785. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_predicate.py +0 -0
  786. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_quiet_hours.py +0 -0
  787. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notifier_service.py +0 -0
  788. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notify.py +0 -0
  789. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_notify_drain.py +0 -0
  790. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_openapi.py +0 -0
  791. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_operational_defaults.py +0 -0
  792. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_overlap_fence.py +0 -0
  793. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_overlap_predict.py +0 -0
  794. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_packaged_deploy_units.py +0 -0
  795. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_parentage.py +0 -0
  796. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_paste_landed.py +0 -0
  797. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  798. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_pipeline.py +0 -0
  799. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_plan_followup_approve_plan_command.py +0 -0
  800. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_plan_followup_pr_command.py +0 -0
  801. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_plan_followup_review_command.py +0 -0
  802. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_plan_only.py +0 -0
  803. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_plan_parser.py +0 -0
  804. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_platform_paths.py +0 -0
  805. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_portal_bridge.py +0 -0
  806. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_portal_config.py +0 -0
  807. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_portal_store.py +0 -0
  808. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_portal_sync.py +0 -0
  809. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_pr_body_lint.py +0 -0
  810. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_prereqs.py +0 -0
  811. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_production_db_guard.py +0 -0
  812. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_progress.py +0 -0
  813. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_provider_seam.py +0 -0
  814. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_providers.py +0 -0
  815. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_providers_config_labels.py +0 -0
  816. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_providers_pty.py +0 -0
  817. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_provision_core.py +0 -0
  818. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_provision_machine.py +0 -0
  819. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_py_rust_mirror_inventory.py +0 -0
  820. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_quiet_hours.py +0 -0
  821. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_quiet_hours_store_2146.py +0 -0
  822. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reap_merged_sessions.py +0 -0
  823. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reap_stale_interactive_tick.py +0 -0
  824. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile.py +0 -0
  825. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_branch.py +0 -0
  826. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_completions.py +0 -0
  827. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  828. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_merges.py +0 -0
  829. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_no_agent_record.py +0 -0
  830. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_tick.py +0 -0
  831. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_reconcile_usage_limit_done.py +0 -0
  832. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_refine_chat.py +0 -0
  833. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_cordon_2101.py +0 -0
  834. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  835. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_cordon_deadlock_2240.py +0 -0
  836. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  837. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_cordon_stuck_2490.py +0 -0
  838. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_gate.py +0 -0
  839. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_propagate.py +0 -0
  840. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_propagate_threshold.py +0 -0
  841. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_roll_between_legs_2854.py +0 -0
  842. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_roll_window_handoff.py +0 -0
  843. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_unified_1242.py +0 -0
  844. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_verify.py +0 -0
  845. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_release_window.py +0 -0
  846. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_remote_auto_prune.py +0 -0
  847. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_remote_interactive_reaper.py +0 -0
  848. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_add.py +0 -0
  849. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_dormancy.py +0 -0
  850. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_edit_2220.py +0 -0
  851. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_graph_fleet_2237.py +0 -0
  852. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_max_parallel_3423.py +0 -0
  853. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_repo_onboard_2220.py +0 -0
  854. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_report_public_export.py +0 -0
  855. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_report_result_push.py +0 -0
  856. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_restart_cmd.py +0 -0
  857. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_retry.py +0 -0
  858. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_retry_advisory_1606.py +0 -0
  859. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_retry_escalation_classify_3360.py +0 -0
  860. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_retry_type_1636.py +0 -0
  861. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_revalidate.py +0 -0
  862. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review.py +0 -0
  863. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_end_review_without_verdict.py +0 -0
  864. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_parse_failure_diagnostic.py +0 -0
  865. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_reaffirm.py +0 -0
  866. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_state.py +0 -0
  867. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_verdict_backstop.py +0 -0
  868. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_verdict_override_audit.py +0 -0
  869. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_verdict_relay.py +0 -0
  870. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_review_zero_commits.py +0 -0
  871. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_scoped_review_wiring.py +0 -0
  872. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_scorecard.py +0 -0
  873. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_self_health.py +0 -0
  874. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_serve.py +0 -0
  875. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_serve_app.py +0 -0
  876. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_serve_app_board_trim.py +0 -0
  877. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_serve_rest_routes.py +0 -0
  878. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_session.py +0 -0
  879. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_slice_issue_attribution.py +0 -0
  880. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_smoke.py +0 -0
  881. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  882. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_smoke_live_checkout_restore.py +0 -0
  883. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_smoke_workflow.py +0 -0
  884. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_spend_ceiling.py +0 -0
  885. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_spend_ceiling_coordinator.py +0 -0
  886. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_split.py +0 -0
  887. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_split_work.py +0 -0
  888. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_sql_dialect.py +0 -0
  889. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_sqlite_connect_ratchet.py +0 -0
  890. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stage_projection.py +0 -0
  891. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stale_busy_reviewer_697.py +0 -0
  892. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stalled_pipeline.py +0 -0
  893. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_state.py +0 -0
  894. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_state_review_findings_daemon.py +0 -0
  895. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_status_fleet_footer.py +0 -0
  896. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stop_1567.py +0 -0
  897. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_store_contract.py +0 -0
  898. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_store_migrate.py +0 -0
  899. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stuck.py +0 -0
  900. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  901. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_terminal_command.py +0 -0
  902. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_author.py +0 -0
  903. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_chat.py +0 -0
  904. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_orchestrator.py +0 -0
  905. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_report.py +0 -0
  906. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_verdict_parsing.py +0 -0
  907. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_test_verdict_transcript_floor.py +0 -0
  908. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_text_io_encoding_audit.py +0 -0
  909. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_thin_client_board_audit.py +0 -0
  910. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_thin_client_config_load_1080.py +0 -0
  911. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_thin_client_daemon_routing_906.py +0 -0
  912. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_throwaway_vm.py +0 -0
  913. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_tmux_host.py +0 -0
  914. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_tmux_session.py +0 -0
  915. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_transcript_floor.py +0 -0
  916. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_tui_pty_driver.py +0 -0
  917. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_uat_checks.py +0 -0
  918. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_usage.py +0 -0
  919. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_usage_limits.py +0 -0
  920. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_usage_rollup.py +0 -0
  921. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_venv_live_install_2121.py +0 -0
  922. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_version_single_source.py +0 -0
  923. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_watch.py +0 -0
  924. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_win_native_bridge.py +0 -0
  925. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_win_native_driver.py +0 -0
  926. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  927. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worker_env_venv_isolation.py +0 -0
  928. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worker_events.py +0 -0
  929. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worker_image_pin_sync.py +0 -0
  930. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worker_safety.py +0 -0
  931. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worker_test_scoping.py +0 -0
  932. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worktree.py +0 -0
  933. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  934. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/test_write_parity.py +0 -0
  935. {code_coordinator-0.5.582 → code_coordinator-0.5.584}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.582
3
+ Version: 0.5.584
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.582
3
+ Version: 0.5.584
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.582",
2
+ "tag": "0.5.584",
3
3
  "distance": 0,
4
- "node": "g66c11e8b562c82e18514dbd82f17849abf5c1df2",
4
+ "node": "g9c11468b5bebc2d9a592eb89d3d9f3491f59754a",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -41,6 +41,7 @@ __all__ = [
41
41
  "audit_lock_contention_losses",
42
42
  "flush_lock_contention_summary",
43
43
  "sweep_operational_retention",
44
+ "resolve_operational_retention_days",
44
45
  ]
45
46
 
46
47
  # Valid values are documented in the issue but not enforced here — callers
@@ -325,6 +326,21 @@ def _resolve_operational_retention_days() -> float:
325
326
  return 0.0
326
327
 
327
328
 
329
+ def resolve_operational_retention_days() -> float:
330
+ """Public wrapper around :func:`_resolve_operational_retention_days`.
331
+
332
+ ``coord.reports``' ``deprecated-routes`` report (#1947) needs the exact
333
+ same number this module's own sweep caps itself to: a ``zero_calls``
334
+ route cannot be trusted for longer than data has actually been kept
335
+ around, so the gate's "observed window" must be capped at this value,
336
+ not re-derived from ``coordinator.yml`` a second way. One source of
337
+ truth for "how far back is audit data trustworthy" — see #2085 (one
338
+ question, one answer) for why a second config read here would be a bug
339
+ waiting to happen rather than a convenience.
340
+ """
341
+ return _resolve_operational_retention_days()
342
+
343
+
328
344
  def sweep_operational_retention(*, now: float | None = None, dry_run: bool = False) -> int:
329
345
  """Delete ``tier='operational'`` ``audit_log`` rows older than
330
346
  ``audit.operational_retention_days`` (#3469). Returns the number of
@@ -330,7 +330,23 @@ def _save_config_snapshot(
330
330
  pass
331
331
 
332
332
 
333
- def _load_config(path: Path | None, *, allow_thin_client: bool = True) -> Config:
333
+ def resolve_and_load_config(path: Path | None, *, allow_thin_client: bool = True) -> Config:
334
+ """Resolve *path* (thin-client aware) and parse it — the one place this
335
+ question is asked, so every caller that needs a *freshly loaded* config
336
+ (not just the one-time CLI boot in :func:`_load_config`, which also
337
+ writes the DB snapshot and exits the process on a parse failure) gets
338
+ the SAME resolution rule rather than a second, drifting copy (#2096,
339
+ "one question, one answer"). :func:`coord.drive.Driver`'s per-poll
340
+ config reload (#1654) is the other caller: unlike `_load_config`, it
341
+ must never call ``sys.exit`` (a bad mid-run edit must warn, not kill the
342
+ drive) and must never re-run ``_save_config_snapshot`` every poll (a
343
+ DELETE+INSERT into the shared ``machines`` table, meant for "this
344
+ process just booted", not "it's still running 50 polls later").
345
+
346
+ Raises :class:`ConfigError` on any resolution/parse failure — never
347
+ exits, never echoes. Callers that want the CLI's print-and-exit-2
348
+ behavior still go through :func:`_load_config`.
349
+ """
334
350
  # Resolve the default location ($COORD_CONFIG → ~/.coord/coordinator.yml →
335
351
  # ./coordinator.yml) when no explicit --config was given, so `coord` works on
336
352
  # a machine without a repo checkout and isn't sensitive to the CWD.
@@ -366,24 +382,28 @@ def _load_config(path: Path | None, *, allow_thin_client: bool = True) -> Config
366
382
  # caller of ``_load_config`` legitimately wants thin-client resolution
367
383
  # (they ARE clients of the daemon's board) — this flag exists so ONLY
368
384
  # `coord serve`'s own bootstrap can opt out.
385
+ if allow_thin_client:
386
+ from coord.client import resolve_board_service # noqa: PLC0415
387
+
388
+ svc = resolve_board_service()
389
+ if svc is not None:
390
+ from coord.client import fetch_remote_config # noqa: PLC0415
391
+
392
+ try:
393
+ path = fetch_remote_config(svc)
394
+ except Exception as exc: # noqa: BLE001 — do NOT fall through to
395
+ # load(path): path may point at a local file that happens to
396
+ # exist (the exact bypass this issue closes). Fail loudly
397
+ # instead of silently trusting whatever is on disk.
398
+ raise ConfigError(
399
+ f"could not fetch config from {svc.url}: {exc}"
400
+ ) from exc
401
+ return load(path)
402
+
403
+
404
+ def _load_config(path: Path | None, *, allow_thin_client: bool = True) -> Config:
369
405
  try:
370
- if allow_thin_client:
371
- from coord.client import resolve_board_service # noqa: PLC0415
372
-
373
- svc = resolve_board_service()
374
- if svc is not None:
375
- from coord.client import fetch_remote_config # noqa: PLC0415
376
-
377
- try:
378
- path = fetch_remote_config(svc)
379
- except Exception as exc: # noqa: BLE001 — do NOT fall through to
380
- # load(path): path may point at a local file that happens to
381
- # exist (the exact bypass this issue closes). Fail loudly
382
- # instead of silently trusting whatever is on disk.
383
- raise ConfigError(
384
- f"could not fetch config from {svc.url}: {exc}"
385
- ) from exc
386
- cfg = load(path)
406
+ cfg = resolve_and_load_config(path, allow_thin_client=allow_thin_client)
387
407
  except ConfigError as e:
388
408
  click.echo(f"error: {e}", err=True)
389
409
  sys.exit(2)
@@ -384,6 +384,33 @@ def _current_self_head() -> str | None:
384
384
  return self_freshness(fetch=False).head_sha
385
385
 
386
386
 
387
+ def _load_config_for_drive(config_path: str) -> Any:
388
+ """Real default for `Driver.config_loader` (#1654): re-read
389
+ coordinator.yml fresh — ``config_path`` empty resolves the usual
390
+ ``$COORD_CONFIG`` → ``~/.coord/coordinator.yml`` → ``./coordinator.yml``
391
+ chain, AND the thin-client (board_service) redirect, exactly like the
392
+ construction-time load in ``coord.commands._common._load_config`` —
393
+ calls the SAME ``resolve_and_load_config`` helper that function now
394
+ wraps, so a mid-run reload can never resolve a *different* file (or
395
+ skip the thin-client branch an ordinary client is expected to take)
396
+ than the one this drive started with (#2096, "one question, one
397
+ answer"). Deliberately NOT ``_load_config`` itself: that one also
398
+ ``sys.exit``s on a parse failure (a bad mid-run edit must warn, never
399
+ kill the drive — see ``Driver._reload_config``) and re-writes the
400
+ shared ``machines`` DB snapshot (meant for a one-time boot, not every
401
+ poll).
402
+
403
+ Imported lazily: ``coord.commands._common`` pulls in ``click``/
404
+ ``httpx``, and every pure decision function in this module already
405
+ takes an already-loaded config rather than touching disk itself — this
406
+ keeps that true for every caller except the one that's explicitly an
407
+ I/O shell.
408
+ """
409
+ from coord.commands._common import resolve_and_load_config # noqa: PLC0415
410
+
411
+ return resolve_and_load_config(Path(config_path) if config_path else None)
412
+
413
+
387
414
  def _bounded_tail(text: str, limit: int = _CAPTURED_OUTPUT_LIMIT) -> str:
388
415
  """*text*, or its last *limit* characters if longer — the tail, because
389
416
  the actionable line (a traceback's final "raise ...", a guard's remedy)
@@ -2111,6 +2138,39 @@ class Preflight:
2111
2138
  warnings: tuple[str, ...] = ()
2112
2139
 
2113
2140
 
2141
+ def check_usage_gate(
2142
+ config: Any, usage_limits: PlanLimits | None,
2143
+ ) -> str | None:
2144
+ """Evaluate the usage gate — raise on ``block``, return a warn message
2145
+ on ``warn``, ``None`` otherwise.
2146
+
2147
+ #1654: the SOLE place this question is asked, so :func:`preflight`'s
2148
+ one-time call at the top of a run and :meth:`Driver._loop`'s per-poll
2149
+ re-check (added for #1654, since the gate's own ``mode``/thresholds can
2150
+ change mid-run) can never drift into two different answers for the
2151
+ same inputs (#2096, "one question, one answer").
2152
+
2153
+ *config* of ``None`` skips the gate entirely (no ``usage_gate`` section
2154
+ to consult) — mirrors every pre-#1466 caller.
2155
+ """
2156
+ if config is None:
2157
+ return None
2158
+ gate_cfg = config.usage_gate
2159
+ limits = usage_limits if usage_limits is not None else PlanLimits(status="unknown")
2160
+ gate_result = evaluate_usage_gate(limits, gate_cfg)
2161
+ if gate_result.action == "block":
2162
+ raise DriveError(
2163
+ f"{gate_result.message} (usage_gate.mode: block) — refusing to "
2164
+ "dispatch. Wait for the window to reset, or lower urgency by "
2165
+ "raising the threshold / setting usage_gate.mode: warn in "
2166
+ "coordinator.yml.",
2167
+ EXIT_USAGE,
2168
+ )
2169
+ if gate_result.action == "warn":
2170
+ return f"{gate_result.message} (usage_gate.mode: warn — proceeding anyway)"
2171
+ return None
2172
+
2173
+
2114
2174
  def preflight(
2115
2175
  state: IssueState,
2116
2176
  opts: DriveOptions,
@@ -2165,20 +2225,9 @@ def preflight(
2165
2225
 
2166
2226
  warnings: list[str] = []
2167
2227
 
2168
- if config is not None:
2169
- gate_cfg = config.usage_gate
2170
- limits = usage_limits if usage_limits is not None else PlanLimits(status="unknown")
2171
- gate_result = evaluate_usage_gate(limits, gate_cfg)
2172
- if gate_result.action == "block":
2173
- raise DriveError(
2174
- f"{gate_result.message} (usage_gate.mode: block) — refusing to "
2175
- "dispatch. Wait for the window to reset, or lower urgency by "
2176
- "raising the threshold / setting usage_gate.mode: warn in "
2177
- "coordinator.yml.",
2178
- EXIT_USAGE,
2179
- )
2180
- if gate_result.action == "warn":
2181
- warnings.append(f"{gate_result.message} (usage_gate.mode: warn — proceeding anyway)")
2228
+ gate_warning = check_usage_gate(config, usage_limits)
2229
+ if gate_warning:
2230
+ warnings.append(gate_warning)
2182
2231
 
2183
2232
  if not state.auto_loop:
2184
2233
  warnings.append(
@@ -5399,6 +5448,13 @@ class Driver:
5399
5448
  # without a real git checkout — same shape as *usage_prober* above.
5400
5449
  # Defaults to the real, local-only (`fetch=False`) probe.
5401
5450
  self_head_probe: Callable[[], str | None] = _current_self_head
5451
+ # #1654: injected so tests can script a fake coordinator.yml reload
5452
+ # sequence without real YAML I/O — same injection shape as
5453
+ # *usage_prober*/*self_head_probe* above. Defaults to the real loader,
5454
+ # re-reading ``self.opts.config_path`` (empty string resolves the usual
5455
+ # ``$COORD_CONFIG`` → ``~/.coord/coordinator.yml`` → ``./coordinator.yml``
5456
+ # chain) fresh every call — see ``_reload_config``.
5457
+ config_loader: Callable[[str], Any] = _load_config_for_drive
5402
5458
 
5403
5459
  _run_log: Path | None = field(default=None, init=False, repr=False)
5404
5460
  # #2443: this session's own on-disk `coord` HEAD, captured once by
@@ -5426,6 +5482,17 @@ class Driver:
5426
5482
  # call, so it is only ever trustworthy read immediately after one, which
5427
5483
  # is exactly how `_loop` uses it.
5428
5484
  _last_run_output: str = field(default="", init=False, repr=False)
5485
+ # #1654: latches so a coordinator.yml that fails to parse mid-run (an
5486
+ # operator mid-edit, a truncated write) warns ONCE for the whole broken
5487
+ # window, not once per poll — `_reload_config` sets this on a failed
5488
+ # reload and clears it (with a short recovery log line) the first time a
5489
+ # reload succeeds again.
5490
+ _config_reload_broken: bool = field(default=False, init=False, repr=False)
5491
+ # #1654: the last usage-gate WARN message this run already printed, so a
5492
+ # `mode: warn` config that stays warn-worthy across many polls (the
5493
+ # common case — the usage window doesn't reset every poll) logs once per
5494
+ # DISTINCT message rather than spamming the identical line every tick.
5495
+ _last_usage_gate_warning: str | None = field(default=None, init=False, repr=False)
5429
5496
 
5430
5497
  def __post_init__(self) -> None:
5431
5498
  self.out = self.out or sys.stdout
@@ -5473,6 +5540,68 @@ class Driver:
5473
5540
  except DriveStateError as exc:
5474
5541
  raise DriveError(str(exc), EXIT_USAGE) from exc
5475
5542
 
5543
+ def _reload_config(self) -> None:
5544
+ """Re-read coordinator.yml at the top of every poll (#1654).
5545
+
5546
+ `self.config` used to be a pure construction-time snapshot the poll
5547
+ loop never revisited — a ladder/usage-gate edit made while a drive
5548
+ was already running had no effect until the NEXT invocation, which
5549
+ is exactly backwards for a lever (#1649's reroute mode, a tightened
5550
+ threshold) most likely to be flipped reactively, mid-window, because
5551
+ a drive is already running and burning credits. Cheap: one YAML
5552
+ parse against a loop that already shells out to a `coord`
5553
+ subprocess (`run_coord`) every tick.
5554
+
5555
+ A config that fails to parse (an operator mid-edit, a truncated
5556
+ write) must never kill an otherwise-healthy run: this keeps the
5557
+ last-good `self.config` and only warns — exactly ONCE for the whole
5558
+ broken window (`_config_reload_broken` latches it), not once per
5559
+ poll. `self.opts` (this invocation's own identity — the CLI flags)
5560
+ is never touched here; only `self.config` is replaced.
5561
+ """
5562
+ try:
5563
+ new_config = self.config_loader(self.opts.config_path)
5564
+ except Exception as exc: # noqa: BLE001 — a bad edit must never kill the drive
5565
+ if not self._config_reload_broken:
5566
+ self.warn(
5567
+ "coordinator.yml reload failed, keeping the last-known-"
5568
+ f"good config: {exc}"
5569
+ )
5570
+ self._config_reload_broken = True
5571
+ return
5572
+ if self._config_reload_broken:
5573
+ self.log(
5574
+ "coordinator.yml reload recovered — back to a fresh config"
5575
+ )
5576
+ self._config_reload_broken = False
5577
+ self._log_config_change(self.config, new_config)
5578
+ self.config = new_config
5579
+
5580
+ def _log_config_change(self, old: Any, new: Any) -> None:
5581
+ """Narrate a reload that changes a decision this loop actually makes
5582
+ (#1654), so a mid-run behaviour change is explicable from this run's
5583
+ own log afterwards rather than looking like nondeterminism.
5584
+
5585
+ Deliberately narrow — only the usage gate, the one knob this loop
5586
+ re-consults every poll (see `check_usage_gate` below) — rather than
5587
+ a full recursive diff of the whole `Config` object, which would be
5588
+ noisy (most fields are per-repo/machine topology this driver never
5589
+ reads for THIS issue) and risks echoing a secret accidentally pasted
5590
+ into coordinator.yml into this run's log.
5591
+ """
5592
+ old_gate, new_gate = old.usage_gate, new.usage_gate
5593
+ old_shape = (old_gate.mode, old_gate.session_threshold_pct, old_gate.week_threshold_pct)
5594
+ new_shape = (new_gate.mode, new_gate.session_threshold_pct, new_gate.week_threshold_pct)
5595
+ if old_shape != new_shape:
5596
+ self.log(
5597
+ "coordinator.yml reload: usage_gate changed "
5598
+ f"mode {old_gate.mode!r} -> {new_gate.mode!r}, "
5599
+ f"session_threshold_pct {old_gate.session_threshold_pct!r} -> "
5600
+ f"{new_gate.session_threshold_pct!r}, week_threshold_pct "
5601
+ f"{old_gate.week_threshold_pct!r} -> {new_gate.week_threshold_pct!r} "
5602
+ "— this run's next dispatch decision reflects the new config."
5603
+ )
5604
+
5476
5605
  # ── execution ───────────────────────────────────────────────────────
5477
5606
  def run_coord(self, args: tuple[str, ...], *, serialize_merge: bool = False) -> int:
5478
5607
  """Run a ``coord`` subcommand, echoing its output and appending to the log.
@@ -5751,12 +5880,15 @@ class Driver:
5751
5880
  if state is None:
5752
5881
  raise DriveError("could not read board state", EXIT_USAGE)
5753
5882
 
5754
- # #1466: probe ONCE here (not per-poll) — the underlying `claude -p
5755
- # "/usage"` call is itself cached ~60s (coord.usage_limits), but
5756
- # there's no reason to re-shell-out every loop iteration for a
5757
- # decision only made at the top of the run. Skipped entirely when
5758
- # the gate is off, so a `disabled` config never pays the subprocess
5759
- # cost.
5883
+ # #1466: this is the ONE-TIME preflight check — raises/warns before
5884
+ # the loop below ever starts, using whatever config this run was
5885
+ # launched with. #1654 added a SECOND, per-poll re-check
5886
+ # (`check_usage_gate`, called again right before every RUN action
5887
+ # below) against `self.config` AS RELOADED THAT TICK, so a mid-run
5888
+ # `usage_gate.mode`/threshold edit reaches the very next dispatch —
5889
+ # this first call only ever decides whether the run gets to start at
5890
+ # all. Skipped entirely when the gate is off, so a `disabled`
5891
+ # config never pays the subprocess cost.
5760
5892
  usage_limits = (
5761
5893
  self.usage_prober() if self.config.usage_gate.mode != "disabled" else None
5762
5894
  )
@@ -5876,6 +6008,12 @@ class Driver:
5876
6008
  )
5877
6009
  return EXIT_DEADLINE
5878
6010
 
6011
+ # #1654: re-read coordinator.yml before every decision this tick
6012
+ # makes — see `_reload_config`'s own docstring for why (a
6013
+ # construction-time snapshot made a mid-run ladder/usage-gate
6014
+ # edit invisible for the drive's entire remaining life).
6015
+ self._reload_config()
6016
+
5879
6017
  state = self.read_state()
5880
6018
  if state is None:
5881
6019
  self.sleeper(self.opts.poll)
@@ -6076,6 +6214,22 @@ class Driver:
6076
6214
  self.log(action.label)
6077
6215
 
6078
6216
  if action.kind == RUN:
6217
+ # #1654: re-check the usage gate against THIS poll's
6218
+ # (possibly just-reloaded) config, not the snapshot
6219
+ # `preflight()` consulted once before the loop started —
6220
+ # `check_usage_gate` is the SAME question preflight asks, so
6221
+ # a mid-run `usage_gate.mode` edit (warn -> block, or a
6222
+ # tightened threshold) reaches the very next dispatch
6223
+ # instead of only the next `coord drive` invocation.
6224
+ usage_limits = (
6225
+ self.usage_prober()
6226
+ if self.config.usage_gate.mode != "disabled"
6227
+ else None
6228
+ )
6229
+ gate_warning = check_usage_gate(self.config, usage_limits)
6230
+ if gate_warning and gate_warning != self._last_usage_gate_warning:
6231
+ self.warn(gate_warning)
6232
+ self._last_usage_gate_warning = gate_warning
6079
6233
  rc = self.run_coord(
6080
6234
  action.command, serialize_merge=action.serialize_merge
6081
6235
  )
@@ -4409,6 +4409,22 @@ def _validate_issue_cost_status(value: str) -> None:
4409
4409
  # the corpus level: if literally zero deprecation-category rows exist
4410
4410
  # anywhere (any route), collection cannot be confirmed live, so EVERY route
4411
4411
  # reads `no_data` rather than the misleadingly reassuring `zero_calls`.
4412
+ #
4413
+ # #1947's gate needs one more number this report didn't used to carry: NOT
4414
+ # just "zero calls ever recorded" but "zero calls across a window of at
4415
+ # least 30 days" — a route deprecated yesterday with zero calls so far is
4416
+ # not evidence of anything yet. `observed_secs`/`eligible` below answer that
4417
+ # without a second config read or a second place to get it wrong (#2085):
4418
+ # `observed_secs` is seeded from the EARLIEST deprecation-category row across
4419
+ # the whole corpus (a lower bound on how long telemetry has been live — it
4420
+ # can only ever UNDERSTATE the true window, never overstate it, which is the
4421
+ # safe direction for a retirement gate) and then capped at
4422
+ # `audit.operational_retention_days` — resolved by `run_deprecated_routes`
4423
+ # through `coord.audit.resolve_operational_retention_days`, the same cap that
4424
+ # module's own sweep enforces, and passed DOWN into the pure fold rather than
4425
+ # read inside it — because a row older than retention could have been swept
4426
+ # without a trace, so claiming a window longer than retention allows would
4427
+ # be exactly the "belief" #1945/#1947 exist to rule out.
4412
4428
 
4413
4429
  DEPRECATED_ROUTES_COLUMNS = [
4414
4430
  "route",
@@ -4417,6 +4433,8 @@ DEPRECATED_ROUTES_COLUMNS = [
4417
4433
  "last_call",
4418
4434
  "call_count",
4419
4435
  "clients",
4436
+ "observed_secs",
4437
+ "eligible",
4420
4438
  ]
4421
4439
 
4422
4440
  # One entry per DEPRECATED_ROUTES_COLUMNS entry, same order (#1760).
@@ -4427,6 +4445,8 @@ DEPRECATED_ROUTES_COLUMN_META = [
4427
4445
  ColumnMeta(id="last_call", label="Last Call", kind="timestamp"),
4428
4446
  ColumnMeta(id="call_count", label="Calls", kind="int", align="right"),
4429
4447
  ColumnMeta(id="clients", label="Clients", kind="list"),
4448
+ ColumnMeta(id="observed_secs", label="Observed For", kind="duration", align="right"),
4449
+ ColumnMeta(id="eligible", label="Retirement", kind="enum"),
4430
4450
  ]
4431
4451
 
4432
4452
  # `status` values. `no_data` and `zero_calls` are BOTH "nothing seen for
@@ -4436,12 +4456,26 @@ DEPRECATED_ROUTE_NO_DATA = "no_data"
4436
4456
  DEPRECATED_ROUTE_ZERO_CALLS = "zero_calls"
4437
4457
  DEPRECATED_ROUTE_IN_USE = "in_use"
4438
4458
 
4459
+ # `eligible` values (#1947) — the gate's own verdict, never the belief of
4460
+ # whoever is reading the table. `not_yet` covers every disqualifying case
4461
+ # (in_use, no_data, or zero_calls but not observed long enough) on purpose:
4462
+ # a reader who only checks for the literal string `eligible` can never be
4463
+ # fooled by a value this report predates adding.
4464
+ DEPRECATED_ROUTE_ELIGIBLE = "eligible"
4465
+ DEPRECATED_ROUTE_NOT_ELIGIBLE = "not_yet"
4466
+
4467
+ # The gate's own number (issue #1947): "a window of at least 30 days".
4468
+ # Named so it cannot silently drift between the report and anything that
4469
+ # later re-checks its verdict.
4470
+ DEPRECATION_RETIREMENT_WINDOW_DAYS = 30.0
4471
+
4439
4472
 
4440
4473
  def fold_deprecated_routes(
4441
4474
  entries: Iterable[Mapping[str, Any]],
4442
4475
  generated_at: float,
4443
4476
  *,
4444
4477
  routes: Mapping[str, str] | None = None,
4478
+ retention_days: float = 0.0,
4445
4479
  ) -> ReportResult:
4446
4480
  """Fold already-fetched deprecation-telemetry audit rows into a
4447
4481
  per-route snapshot. **Pure** — no DB, no daemon, no clock.
@@ -4456,6 +4490,18 @@ def fold_deprecated_routes(
4456
4490
  report reads it rather than redeclaring it (the ``routes=`` override
4457
4491
  exists purely so this stays a pure function a test can call without
4458
4492
  importing the daemon module).
4493
+
4494
+ ``retention_days`` is a PLAIN NUMBER here, defaulting to ``0``
4495
+ (uncapped), and is deliberately NOT resolved from ``coordinator.yml`` by
4496
+ this function: reading the ambient config would make a function
4497
+ documented as pure answer differently on a machine that happens to have
4498
+ a ``coordinator.yml`` with a small ``audit.operational_retention_days``
4499
+ than on one that has none — the host-dependent-result class #2170 exists
4500
+ to keep out of this suite. :func:`run_deprecated_routes` (the impure
4501
+ runner, which already owns the clock and the DB walk) resolves it from
4502
+ :func:`coord.audit.resolve_operational_retention_days` and passes it
4503
+ down, exactly as ``run_drive_queue_status`` resolves ``queue_escalation``
4504
+ for ``fold_drive_queue_status``.
4459
4505
  """
4460
4506
  if routes is None:
4461
4507
  from coord.serve_app import RPC_SUPERSEDED_BY_RESOURCE # noqa: PLC0415
@@ -4464,6 +4510,14 @@ def fold_deprecated_routes(
4464
4510
 
4465
4511
  entries = list(entries)
4466
4512
  any_data = bool(entries)
4513
+ # `or generated_at` would be wrong here: a `ts` of exactly `0.0` (epoch,
4514
+ # or a deliberately-zeroed test fixture) is falsy and must still count
4515
+ # as a real, very-old timestamp — not get silently replaced by "now".
4516
+ earliest_ts = (
4517
+ min(e.get("ts") if e.get("ts") is not None else generated_at for e in entries)
4518
+ if entries
4519
+ else None
4520
+ )
4467
4521
 
4468
4522
  by_route: dict[str, list[Mapping[str, Any]]] = {r: [] for r in routes}
4469
4523
  for entry in entries:
@@ -4495,6 +4549,18 @@ def fold_deprecated_routes(
4495
4549
  status = DEPRECATED_ROUTE_ZERO_CALLS
4496
4550
  else:
4497
4551
  status = DEPRECATED_ROUTE_NO_DATA
4552
+
4553
+ observed_secs: float | None = None
4554
+ eligible = DEPRECATED_ROUTE_NOT_ELIGIBLE
4555
+ if status == DEPRECATED_ROUTE_ZERO_CALLS and earliest_ts is not None:
4556
+ # `any_data` is True here, so `earliest_ts` is always set — the
4557
+ # `is not None` above is what lets a type checker see that too.
4558
+ observed_secs = max(0.0, generated_at - earliest_ts)
4559
+ if retention_days > 0:
4560
+ observed_secs = min(observed_secs, retention_days * 86400.0)
4561
+ if observed_secs >= DEPRECATION_RETIREMENT_WINDOW_DAYS * 86400.0:
4562
+ eligible = DEPRECATED_ROUTE_ELIGIBLE
4563
+
4498
4564
  rows.append(
4499
4565
  {
4500
4566
  "route": route,
@@ -4503,6 +4569,8 @@ def fold_deprecated_routes(
4503
4569
  "last_call": last_call,
4504
4570
  "call_count": len(calls),
4505
4571
  "clients": clients,
4572
+ "observed_secs": observed_secs,
4573
+ "eligible": eligible,
4506
4574
  }
4507
4575
  )
4508
4576
 
@@ -4517,6 +4585,14 @@ def fold_deprecated_routes(
4517
4585
  "`no_data`, not `zero_calls` — treat it as UNKNOWN, never as "
4518
4586
  "evidence it is safe to retire."
4519
4587
  )
4588
+ if any_data and 0 < retention_days < DEPRECATION_RETIREMENT_WINDOW_DAYS:
4589
+ notes.append(
4590
+ f"audit.operational_retention_days is {retention_days:g}, below "
4591
+ f"the {DEPRECATION_RETIREMENT_WINDOW_DAYS:g}-day window #1947's "
4592
+ "retirement gate requires — a `zero_calls` route can never "
4593
+ "accumulate enough trustworthy observed time to read `eligible` "
4594
+ "until this is raised (or disabled with `0`)."
4595
+ )
4520
4596
 
4521
4597
  return ReportResult(
4522
4598
  report_id="deprecated-routes",
@@ -4540,29 +4616,49 @@ def run_deprecated_routes(
4540
4616
  now: float | None = None,
4541
4617
  fetch: Callable[[float], tuple[Sequence[Mapping[str, Any]], bool]] | None = None,
4542
4618
  routes: Mapping[str, str] | None = None,
4619
+ retention_days: float | None = None,
4543
4620
  ) -> ReportResult:
4544
4621
  """Fetch every recorded deprecated-RPC-route call and fold it (#1945).
4545
4622
 
4546
- ``fetch``/``routes`` are test seams (mirrors every other ``run_*``'s
4547
- ``fetch=`` seam). Production always walks the FULL audit history
4548
- (``since=0``), never a recent window — "this route has not been called
4549
- in months" is exactly the number #1945 exists to produce, and a
4550
- windowed report would silently hide the very evidence retirement needs.
4551
- ``query_audit_log`` orders newest-first, so ``last_call`` is accurate
4552
- even if the walk is truncated by the page cap; only the full
4553
- client/version set and total ``call_count`` could then be incomplete,
4554
- which is called out in a note exactly like every other truncated fold
4555
- in this module.
4623
+ ``fetch``/``routes``/``retention_days`` are test seams (mirrors every
4624
+ other ``run_*``'s ``fetch=`` seam). Production always walks the FULL
4625
+ audit history (``since=0``), never a recent window — "this route has not
4626
+ been called in months" is exactly the number #1945 exists to produce,
4627
+ and a windowed report would silently hide the very evidence retirement
4628
+ needs. ``query_audit_log`` orders newest-first, so ``last_call`` is
4629
+ accurate even if the walk is truncated by the page cap; ``clients``/
4630
+ ``call_count``, and ``observed_secs``/``eligible`` (#1947) — which is
4631
+ seeded from the OLDEST entry in the walk — could then UNDERSTATE the
4632
+ true observed window (the oldest rows are exactly what truncation drops
4633
+ first), which is called out in a note exactly like every other truncated
4634
+ fold in this module. Understating is the safe direction for a
4635
+ retirement gate: it can only make `eligible` harder to earn, never
4636
+ easier.
4637
+
4638
+ ``retention_days`` defaults to :func:`coord.audit.
4639
+ resolve_operational_retention_days` — the SAME number
4640
+ ``coord.audit.sweep_operational_retention`` caps itself to, read here
4641
+ (the impure runner that already owns the clock and the DB walk) rather
4642
+ than inside the pure fold, so a direct fold caller never gets a
4643
+ host-dependent answer. Passing it explicitly is the test seam.
4556
4644
  """
4557
4645
  generated_at = time.time() if now is None else float(now)
4646
+ if retention_days is None:
4647
+ from coord.audit import resolve_operational_retention_days # noqa: PLC0415
4648
+
4649
+ retention_days = resolve_operational_retention_days()
4558
4650
  fetch_fn = _default_fetch_deprecation_entries if fetch is None else fetch
4559
4651
  entries, truncated = fetch_fn(generated_at)
4560
- result = fold_deprecated_routes(entries, generated_at, routes=routes)
4652
+ result = fold_deprecated_routes(
4653
+ entries, generated_at, routes=routes, retention_days=retention_days
4654
+ )
4561
4655
  if truncated:
4562
4656
  result.notes.append(
4563
4657
  "Audit history walk hit its page cap before covering the full "
4564
4658
  "history — `clients`/`call_count` may be missing older calls, "
4565
- "though `last_call` (newest-first order) is still accurate."
4659
+ "and `observed_secs` may understate the true window (the "
4660
+ "oldest rows are dropped first), though `last_call` "
4661
+ "(newest-first order) is still accurate."
4566
4662
  )
4567
4663
  return result
4568
4664
 
@@ -4959,7 +5055,14 @@ DEPRECATED_ROUTES = ReportDef(
4959
5055
  "count — evidence for retirement instead of belief (#1945). "
4960
5056
  "`status` distinguishes `in_use` from `zero_calls` (a real, "
4961
5057
  "actionable signal) from `no_data` (telemetry not confirmed live — "
4962
- "never safe to read as `zero_calls`)."
5058
+ "never safe to read as `zero_calls`). `eligible` is #1947's own "
5059
+ "gate verdict: `eligible` only when `status` is `zero_calls` AND "
5060
+ "`observed_secs` (capped at `audit.operational_retention_days`, "
5061
+ "never a config-trusting guess) covers at least 30 days — `not_yet` "
5062
+ "otherwise. A route's own `eligible` reading is still only one of "
5063
+ "#1947's three gate conditions; `coord release verify` showing "
5064
+ "every lane past the client migration is the other, checked "
5065
+ "separately."
4963
5066
  ),
4964
5067
  params=(),
4965
5068
  run=run_deprecated_routes,