code-coordinator 0.5.583__tar.gz → 0.5.585__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.583 → code_coordinator-0.5.585}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/_common.py +38 -18
  5. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/config.py +33 -10
  6. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/drive.py +174 -20
  7. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/usage_rollup.py +33 -13
  8. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive.py +108 -2
  9. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_usage.py +38 -0
  10. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_usage_rollup.py +68 -1
  11. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.github/workflows/test.yml +0 -0
  23. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/.gitignore +0 -0
  24. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/CLAUDE.md +0 -0
  25. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/GOAL.md +0 -0
  26. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/LICENSE +0 -0
  27. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/MANIFEST.in +0 -0
  28. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/README.md +0 -0
  29. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/SOURCES.txt +0 -0
  30. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/scm_file_list.json +0 -0
  34. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/approved_work.py +0 -0
  46. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/backup.py +0 -0
  49. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/board_schema.py +0 -0
  51. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/bugbash.py +0 -0
  57. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/ci_fix.py +0 -0
  59. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/ci_gitlab.py +0 -0
  61. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/claude_setup_token.py +0 -0
  64. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/client.py +0 -0
  66. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/codegen.py +0 -0
  67. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/backup.py +0 -0
  72. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/bugbash.py +0 -0
  73. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/ci.py +0 -0
  75. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/codegen.py +0 -0
  76. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/dispatch.py +0 -0
  77. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/dispatch_workers.py +0 -0
  78. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/dr.py +0 -0
  79. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/drive.py +0 -0
  80. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/drive_queue.py +0 -0
  81. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/machine.py +0 -0
  86. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/merge.py +0 -0
  87. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/milestone.py +0 -0
  88. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/plan_followup.py +0 -0
  89. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/plans.py +0 -0
  90. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/portal.py +0 -0
  91. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/pr.py +0 -0
  92. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/release.py +0 -0
  93. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/store_migrate.py +0 -0
  101. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/terminal.py +0 -0
  102. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/test_gate.py +0 -0
  103. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/commands/tui.py +0 -0
  104. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/comments.py +0 -0
  105. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/config_reload.py +0 -0
  106. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/confirm_test.py +0 -0
  107. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/conflict_fix.py +0 -0
  108. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dao.py +0 -0
  109. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/__init__.py +0 -0
  110. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/fixture.py +0 -0
  111. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/index.html +0 -0
  112. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/reports.html +0 -0
  113. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/server.py +0 -0
  114. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dashboard/terminal.py +0 -0
  115. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/db.py +0 -0
  116. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dead_end.py +0 -0
  117. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/decomposition_chat.py +0 -0
  118. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/README.md +0 -0
  119. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-agent.service +0 -0
  120. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-backup.service +0 -0
  121. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-backup.timer +0 -0
  122. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-db-backup.service +0 -0
  123. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-db-backup.sh +0 -0
  124. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-db-backup.timer +0 -0
  125. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-dr-verify.service +0 -0
  126. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-dr-verify.timer +0 -0
  127. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-drive-queue.service +0 -0
  128. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-drive-queue.timer +0 -0
  129. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-failure-notify.service +0 -0
  130. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-fleet-watchdog.service +0 -0
  131. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  132. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-notify.service +0 -0
  133. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-notify.timer +0 -0
  134. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-release-propagate.service +0 -0
  135. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-release-propagate.timer +0 -0
  136. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-release-window.service +0 -0
  137. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-release-window.timer +0 -0
  138. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-serve.service +0 -0
  139. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-web-dist-build.service +0 -0
  140. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-web-dist-build.timer +0 -0
  141. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy/coord-web.service +0 -0
  142. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy_manifest.py +0 -0
  143. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deploy_units.py +0 -0
  144. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deprecation_telemetry.py +0 -0
  145. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/deps.py +0 -0
  146. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/diagnose.py +0 -0
  147. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dirlink.py +0 -0
  148. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dispatch.py +0 -0
  149. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dispatch_liveness.py +0 -0
  150. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dr_promote.py +0 -0
  152. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/dr_verify.py +0 -0
  153. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/drive_queue.py +0 -0
  154. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/drive_sessions_snapshot.py +0 -0
  155. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/drive_state.py +0 -0
  156. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/events.py +0 -0
  157. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/failure_class.py +0 -0
  158. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/failure_classifier.py +0 -0
  159. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/filelock.py +0 -0
  160. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/fleet_config_health.py +0 -0
  161. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/forge_availability.py +0 -0
  162. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/freshness.py +0 -0
  163. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gate_a.py +0 -0
  164. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gate_b.py +0 -0
  165. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gate_snapshot.py +0 -0
  166. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gates.py +0 -0
  167. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gen_board_fixture.py +0 -0
  168. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/github_ops.py +0 -0
  169. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/github_throttle.py +0 -0
  170. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/goal.py +0 -0
  171. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/graph_health.py +0 -0
  172. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/gtk_native_driver.py +0 -0
  173. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/__init__.py +0 -0
  174. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/aggregate.py +0 -0
  175. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/__init__.py +0 -0
  176. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/_ci_pin.py +0 -0
  177. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/agent_install.py +0 -0
  178. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/cargo_targets.py +0 -0
  179. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/claude_binary.py +0 -0
  180. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/config_drift.py +0 -0
  181. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  182. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/coord_web_ci_pin.py +0 -0
  183. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/deploy_lane_facts.py +0 -0
  184. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/disk.py +0 -0
  185. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/fleet_board.py +0 -0
  186. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  187. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/fleet_phantom.py +0 -0
  188. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/fleet_unit_drift.py +0 -0
  189. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/graph.py +0 -0
  190. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/graphify_cli.py +0 -0
  191. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/index_lock.py +0 -0
  192. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/issues_sync_staleness.py +0 -0
  193. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/local_machine_identity.py +0 -0
  194. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/plan_usage.py +0 -0
  195. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/pr_churn.py +0 -0
  196. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/release_cordon.py +0 -0
  197. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/repo_state.py +0 -0
  198. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/spawned_coord.py +0 -0
  199. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/stalled_pipeline.py +0 -0
  200. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/timer_active.py +0 -0
  201. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/toolchain.py +0 -0
  202. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/unit_drift.py +0 -0
  203. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/unit_enablement.py +0 -0
  204. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/wedged_drive_queue.py +0 -0
  205. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/checks/worktrees.py +0 -0
  206. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/cli.py +0 -0
  207. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/context.py +0 -0
  208. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/fleet_snapshot.py +0 -0
  209. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/models.py +0 -0
  210. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/pypi.py +0 -0
  211. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/registry.py +0 -0
  212. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/render.py +0 -0
  213. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/health/units.py +0 -0
  214. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/hooks.py +0 -0
  215. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/housekeeping.py +0 -0
  216. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/interactive.py +0 -0
  217. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/invariant_alarms.py +0 -0
  218. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/issue_store.py +0 -0
  219. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/issues_sync_status.py +0 -0
  220. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/liveness_auditor.py +0 -0
  221. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/mac_native_driver.py +0 -0
  222. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/machine_fault.py +0 -0
  223. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/machine_metrics.py +0 -0
  224. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/machine_onboard.py +0 -0
  225. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/machine_pause.py +0 -0
  226. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/machine_stats.py +0 -0
  227. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/merge_queue.py +0 -0
  228. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/milestone_chat.py +0 -0
  229. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/milestone_dispatch.py +0 -0
  230. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/milestone_gate.py +0 -0
  231. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/milestone_order.py +0 -0
  232. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/mock_author.py +0 -0
  233. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/models.py +0 -0
  234. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/network.py +0 -0
  235. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/new_issue_chat.py +0 -0
  236. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/__init__.py +0 -0
  237. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/baseline.py +0 -0
  238. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/cli.py +0 -0
  239. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/collect.py +0 -0
  240. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/digest.py +0 -0
  241. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/models.py +0 -0
  242. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/predicate.py +0 -0
  243. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/service.py +0 -0
  244. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/store.py +0 -0
  245. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notifier/transport.py +0 -0
  246. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/notify.py +0 -0
  247. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/openapi.py +0 -0
  248. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/overlap_fence.py +0 -0
  249. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/overlap_predict.py +0 -0
  250. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/parentage.py +0 -0
  251. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/parentage_github.py +0 -0
  252. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/pipeline.py +0 -0
  253. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/plan_parser.py +0 -0
  254. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/plans.py +0 -0
  255. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/platform_paths.py +0 -0
  256. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/portal_bridge.py +0 -0
  257. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/portal_store.py +0 -0
  258. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/portal_sync.py +0 -0
  259. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/pr_body_lint.py +0 -0
  260. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/prereqs.py +0 -0
  261. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/progress.py +0 -0
  262. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/providers/__init__.py +0 -0
  263. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/providers/base.py +0 -0
  264. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/providers/claude.py +0 -0
  265. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/providers/claude_pty.py +0 -0
  266. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/providers/opencode.py +0 -0
  267. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/queue_diagnose.py +0 -0
  268. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/reconcile.py +0 -0
  269. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/reconcile_tick.py +0 -0
  270. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/refine_chat.py +0 -0
  271. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/release_cordon.py +0 -0
  272. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/release_gate.py +0 -0
  273. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/release_propagate.py +0 -0
  274. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/release_verify.py +0 -0
  275. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/release_window.py +0 -0
  276. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/repo_dormancy.py +0 -0
  277. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/repo_edit.py +0 -0
  278. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/repo_onboard.py +0 -0
  279. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/reports.py +0 -0
  280. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/rest_schema.py +0 -0
  281. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/restart_cmd.py +0 -0
  282. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/revalidate.py +0 -0
  283. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/review.py +0 -0
  284. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/scorecard.py +0 -0
  285. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/self_health.py +0 -0
  286. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/serve_app.py +0 -0
  287. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  288. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  289. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  290. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  291. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  292. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/portal-followup/SKILL.md +0 -0
  293. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/release-now/SKILL.md +0 -0
  294. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  295. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  296. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/skills/update-issue/SKILL.md +0 -0
  297. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/smoke.py +0 -0
  298. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/smoke_tags.py +0 -0
  299. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/spend_ceiling.py +0 -0
  300. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/split_work.py +0 -0
  301. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/sql.py +0 -0
  302. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/stage_projection.py +0 -0
  303. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/state.py +0 -0
  304. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/store_migrate.py +0 -0
  305. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/store_parity.py +0 -0
  306. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/templates/deploy-cloudflare.node.yml +0 -0
  307. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/test_author.py +0 -0
  308. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/test_chat.py +0 -0
  309. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/test_orchestrator.py +0 -0
  310. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/test_report.py +0 -0
  311. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/tui_pty_driver.py +0 -0
  312. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/tui_release.py +0 -0
  313. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/uat_checks.py +0 -0
  314. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/usage.py +0 -0
  315. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/usage_limits.py +0 -0
  316. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/win_native_bridge.py +0 -0
  317. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/win_native_driver.py +0 -0
  318. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coord/worker_events.py +0 -0
  319. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/coordinator.example.yml +0 -0
  320. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-agent.service +0 -0
  321. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-backup.service +0 -0
  322. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-backup.timer +0 -0
  323. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-db-backup.service +0 -0
  324. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-db-backup.sh +0 -0
  325. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-db-backup.timer +0 -0
  326. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-dr-verify.service +0 -0
  327. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-dr-verify.timer +0 -0
  328. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-drive-queue.service +0 -0
  329. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-drive-queue.timer +0 -0
  330. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-failure-notify.service +0 -0
  331. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-failure-notify.sh +0 -0
  332. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-fleet-watchdog.service +0 -0
  333. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-fleet-watchdog.timer +0 -0
  334. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-notify.service +0 -0
  335. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-notify.timer +0 -0
  336. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-release-propagate.service +0 -0
  337. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-release-propagate.timer +0 -0
  338. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-release-window.service +0 -0
  339. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-release-window.timer +0 -0
  340. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-serve.service +0 -0
  341. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-web-dist-build.service +0 -0
  342. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-web-dist-build.sh +0 -0
  343. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-web-dist-build.timer +0 -0
  344. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-web-rollback.sh +0 -0
  345. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/coord-web.service +0 -0
  346. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/deploy/node-shim.sh +0 -0
  347. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ADR_COORD_TUI_CI.md +0 -0
  348. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  349. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ADR_COORD_WEB_CI.md +0 -0
  350. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ADR_COORD_WEB_DIST.md +0 -0
  351. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  352. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/AGENT_OPERATIONS.md +0 -0
  353. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ARCHITECTURE.md +0 -0
  354. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ARCH_SECURITY_GATES.md +0 -0
  355. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/COCKPIT.md +0 -0
  356. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/CONTROL_CENTER.md +0 -0
  357. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/COST_DISCIPLINE.md +0 -0
  358. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/CROSS_PLATFORM.md +0 -0
  359. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/CUSTOMER_FACING_APPS.md +0 -0
  360. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/CUSTOMER_PORTAL.md +0 -0
  361. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/DATA_STORE_SELECTION.md +0 -0
  362. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/DISASTER_RECOVERY.md +0 -0
  363. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/DRIVE_QUEUE.md +0 -0
  364. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/EPHEMERAL_WORKERS.md +0 -0
  365. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/FORGE_MIGRATION.md +0 -0
  366. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/GRAPHIFY_SETUP.md +0 -0
  367. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ISSUE_GUIDANCE.md +0 -0
  368. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/MAC_MINI.md +0 -0
  369. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  370. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/NOTIFIER.md +0 -0
  371. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/OPENCODE_VERIFICATION.md +0 -0
  372. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/OPERATING_GOTCHAS.md +0 -0
  373. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/OPERATOR_GUIDES.md +0 -0
  374. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/ORACLE_LOOP.md +0 -0
  375. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/PHONE_WEBAPP.md +0 -0
  376. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/PIPELINE_V2.md +0 -0
  377. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/PLATFORM_EVOLUTION.md +0 -0
  378. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/SECOND_BACKEND.md +0 -0
  379. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/STORE_SERVICE.md +0 -0
  380. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  381. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/WEB_CONTROL_CENTER.md +0 -0
  382. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/WSL_WINDOWS_WORKER.md +0 -0
  383. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/mocks/web/README.md +0 -0
  384. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/mocks/web/_tokens.css +0 -0
  385. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/mocks/web/issue-detail.html +0 -0
  386. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/mocks/web/pipeline-narrow.html +0 -0
  387. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/docs/mocks/web/pipeline-wide.html +0 -0
  388. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/graphify-out/.gitignore +0 -0
  389. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/install-agent.sh +0 -0
  390. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/pyproject.toml +0 -0
  391. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/audit_review_verdict_overrides.py +0 -0
  392. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  393. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/build-worker-image.sh +0 -0
  394. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/coordinator-machine.py +0 -0
  395. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/dr-down.sh +0 -0
  396. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/dr-up.sh +0 -0
  397. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/epic-down.sh +0 -0
  398. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/epic-up.sh +0 -0
  399. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/preflight.sh +0 -0
  400. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/provision-server.sh +0 -0
  401. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/provision-worker.sh +0 -0
  402. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  403. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  404. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/throwaway-vm.sh +0 -0
  405. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/azure-workers/verify-github-token.sh +0 -0
  406. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/check_gh_argv_containment.py +0 -0
  407. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/codegen.py +0 -0
  408. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-test-runner.sh +0 -0
  409. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  410. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  411. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  412. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  413. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/coord-venv-rollback.sh +0 -0
  414. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/drive-batch.sh +0 -0
  415. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/extract-coord-tui.sh +0 -0
  416. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/fleet_watchdog.py +0 -0
  417. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/gen_board_fixture.py +0 -0
  418. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/gen_mock_index.py +0 -0
  419. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/lib/provision-core.sh +0 -0
  420. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/next_release_tag.py +0 -0
  421. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/provision-machine.sh +0 -0
  422. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/run_tests_in_populated_home.sh +0 -0
  423. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/run_tests_without_gh.sh +0 -0
  424. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/setup-macmini.sh +0 -0
  425. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/smoke_437_interactive.py +0 -0
  426. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/verify-provision-noble.sh +0 -0
  427. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/verify_878_review_capture.py +0 -0
  428. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/verify_release_published.py +0 -0
  429. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/scripts/verify_release_wheel.py +0 -0
  430. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/setup.cfg +0 -0
  431. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/SMOKE_SET.md +0 -0
  432. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/__init__.py +0 -0
  433. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-37/conftest.py +0 -0
  434. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-37/contract.md +0 -0
  435. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-37/manifest.yml +0 -0
  436. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  437. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  438. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/contract.md +0 -0
  439. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  440. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  441. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/manifest.yml +0 -0
  442. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-51/tsconfig.json +0 -0
  444. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/backends.py +0 -0
  446. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/conftest.py +0 -0
  447. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/board-pipeline-basic.json +0 -0
  448. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  449. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  450. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  451. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  452. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/all_pass.json +0 -0
  453. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  454. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/mixed_fail.json +0 -0
  455. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  456. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  457. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/skip.json +0 -0
  458. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/playwright/truncated.json +0 -0
  459. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  460. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  461. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  462. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  463. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  464. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  465. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  466. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  467. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_acceptance.py +0 -0
  469. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_acceptance_drivers.py +0 -0
  470. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  479. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_skills_self_heal.py +0 -0
  487. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approve_capability_reroute_3241.py +0 -0
  494. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approve_dependency_busy_2804.py +0 -0
  495. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approved_work_2532.py +0 -0
  498. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_approved_work_2996.py +0 -0
  499. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_assignment_already_recorded_daemon.py +0 -0
  500. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_audit_log.py +0 -0
  501. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_audit_outcome.py +0 -0
  502. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_audit_query.py +0 -0
  503. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_auto_loop.py +0 -0
  504. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_auto_release_publish_2035.py +0 -0
  505. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_backend_selection.py +0 -0
  506. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_backup.py +0 -0
  507. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_schema.py +0 -0
  513. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_service.py +0 -0
  514. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_state.py +0 -0
  515. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_board_wire.py +0 -0
  516. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_brain.py +0 -0
  517. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_branch_model.py +0 -0
  518. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_bug_intake.py +0 -0
  519. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_bugbash.py +0 -0
  520. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_check_gh_argv_containment.py +0 -0
  523. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_fix.py +0 -0
  525. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_github.py +0 -0
  526. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_gitlab.py +0 -0
  527. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_parity_2091.py +0 -0
  528. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_ci_store.py +0 -0
  529. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_claim.py +0 -0
  530. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_claude_md_budget.py +0 -0
  531. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_claude_setup_token.py +0 -0
  532. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_acceptance.py +0 -0
  533. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_assign.py +0 -0
  534. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  535. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_assign_interactive_remote.py +0 -0
  536. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_assign_provider.py +0 -0
  537. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  538. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_ci.py +0 -0
  541. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_codegen.py +0 -0
  542. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_decide.py +0 -0
  543. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_capability_rules.py +0 -0
  544. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_config_provenance.py +0 -0
  545. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_forge_availability.py +0 -0
  546. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_graph.py +0 -0
  547. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_self.py +0 -0
  548. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_diagnose_test_coverage.py +0 -0
  549. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  553. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_drive.py +0 -0
  554. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_drive_queue.py +0 -0
  555. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_issue_comment.py +0 -0
  561. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_issue_create_label.py +0 -0
  562. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_issue_reopen.py +0 -0
  563. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_issue_view_list.py +0 -0
  564. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_issues.py +0 -0
  565. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_pr.py +0 -0
  580. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_pull_artifact.py +0 -0
  581. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_queue.py +0 -0
  582. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_reattach_sessions.py +0 -0
  583. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_refine_board.py +0 -0
  584. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_release_preflight.py +0 -0
  585. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_release_propagate.py +0 -0
  586. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_release_window.py +0 -0
  587. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_repo_2220.py +0 -0
  588. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  589. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_scorecard.py +0 -0
  590. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_serve_store_backend_3084.py +0 -0
  591. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_set_review_findings.py +0 -0
  592. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_advisory_terminal.py +0 -0
  593. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_contested_tag.py +0 -0
  594. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_invariant_alarms.py +0 -0
  595. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_machine_fault.py +0 -0
  596. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_merge_queue.py +0 -0
  597. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_provider.py +0 -0
  598. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_retried_3340.py +0 -0
  599. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_review_finalizing.py +0 -0
  600. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_supervisor_3366.py +0 -0
  601. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_test_failed_tag.py +0 -0
  602. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_status_usage_limit.py +0 -0
  603. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_sync_comments_873.py +0 -0
  604. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_test_plan.py +0 -0
  605. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_track.py +0 -0
  606. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_tui_update.py +0 -0
  607. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cli_wait.py +0 -0
  608. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_client.py +0 -0
  609. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_client_base_install.py +0 -0
  610. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_client_config_cache_atomic_3052.py +0 -0
  611. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_client_resource_migration_1946.py +0 -0
  612. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_commands_common.py +0 -0
  613. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_comments.py +0 -0
  614. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_completion_summary.py +0 -0
  615. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config.py +0 -0
  616. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_acceptance.py +0 -0
  617. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_audit.py +0 -0
  618. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_drift_check.py +0 -0
  619. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_effective.py +0 -0
  620. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_pricing.py +0 -0
  621. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  622. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_config_usage_gate.py +0 -0
  623. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_confirm_test.py +0 -0
  624. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_conflict_fix.py +0 -0
  625. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_conflict_fix_semantic.py +0 -0
  626. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  627. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test.py +0 -0
  628. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  629. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test_runner_baseline.py +0 -0
  630. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test_runner_populated_home.py +0 -0
  631. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test_runner_routing.py +0 -0
  632. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_test_runner_toolchain.py +0 -0
  633. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_uat.py +0 -0
  634. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coord_web_sse_restart_live.py +0 -0
  635. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_coordinator_machine.py +0 -0
  636. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_cross_platform_imports.py +0 -0
  637. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dao.py +0 -0
  638. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard.py +0 -0
  639. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_api.py +0 -0
  640. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_fixture.py +0 -0
  641. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_reports.py +0 -0
  642. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_server.py +0 -0
  643. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_terminal.py +0 -0
  644. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dashboard_terminal_live.py +0 -0
  645. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_db.py +0 -0
  646. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dead_end.py +0 -0
  647. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_decomposition_chat.py +0 -0
  648. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_coord_db_backup.py +0 -0
  649. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_coord_web_dist.py +0 -0
  650. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_coord_web_rollback.py +0 -0
  651. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_db_backup_unit.py +0 -0
  652. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_drive_queue_unit.py +0 -0
  653. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_failure_notify_unit.py +0 -0
  654. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_manifest.py +0 -0
  655. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_notify_unit.py +0 -0
  656. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_units_lane.py +0 -0
  657. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deploy_web_unit.py +0 -0
  658. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deprecation_telemetry.py +0 -0
  659. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_deps.py +0 -0
  660. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_diagnose.py +0 -0
  661. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dirlink.py +0 -0
  662. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dispatch.py +0 -0
  663. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dispatch_liveness.py +0 -0
  664. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dispatch_target_validation.py +0 -0
  665. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dispatch_workers.py +0 -0
  666. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dist_name.py +0 -0
  667. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_done_housekeeping.py +0 -0
  668. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dr_azure_scripts.py +0 -0
  669. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dr_promote.py +0 -0
  670. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_dr_verify.py +0 -0
  671. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_machine_fault.py +0 -0
  672. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue.py +0 -0
  673. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_blocked_rendering.py +0 -0
  674. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_launch_argv.py +0 -0
  675. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_max_parallel_config.py +0 -0
  676. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  677. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_roll_pending.py +0 -0
  678. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  679. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_sessions_snapshot.py +0 -0
  680. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_state.py +0 -0
  681. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_drive_tmux.py +0 -0
  682. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_epic_up_capability_detection.py +0 -0
  683. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  684. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_epic_up_image_provenance.py +0 -0
  685. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_errors.py +0 -0
  686. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_events.py +0 -0
  687. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_failure_class.py +0 -0
  688. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_failure_classifier.py +0 -0
  689. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_filelock.py +0 -0
  690. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  691. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fix_escalation_classifier.py +0 -0
  692. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fix_of_force_override.py +0 -0
  693. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fleet_config_health.py +0 -0
  694. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fleet_health_probes.py +0 -0
  695. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fleet_health_snapshot.py +0 -0
  696. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_fleet_watchdog.py +0 -0
  697. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_forge_availability.py +0 -0
  698. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_freshness.py +0 -0
  699. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gate_a.py +0 -0
  700. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gate_b.py +0 -0
  701. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gate_snapshot_staleness.py +0 -0
  702. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gates.py +0 -0
  703. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  704. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gen_mock_index.py +0 -0
  705. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_generated_rust_fixture.py +0 -0
  706. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_generated_rust_requests.py +0 -0
  707. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_generated_types_fixture.py +0 -0
  708. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_github_ops.py +0 -0
  709. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_github_throttle.py +0 -0
  710. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_goal.py +0 -0
  711. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_graph_health.py +0 -0
  712. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_graph_selfheal_absent_2237.py +0 -0
  713. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_gtk_native_driver.py +0 -0
  714. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_handoff.py +0 -0
  715. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_checks.py +0 -0
  716. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_cli.py +0 -0
  717. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_cli_graph.py +0 -0
  718. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_config.py +0 -0
  719. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_context.py +0 -0
  720. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_coord_tui_ci_pin.py +0 -0
  721. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_coord_web_ci_pin.py +0 -0
  722. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_deploy_lane_facts.py +0 -0
  723. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_fix.py +0 -0
  724. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_incident_regression.py +0 -0
  725. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_issues_sync_staleness.py +0 -0
  726. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_pr_churn.py +0 -0
  727. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_pypi.py +0 -0
  728. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_registry.py +0 -0
  729. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_release_cordon_probe.py +0 -0
  730. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_timer_active.py +0 -0
  731. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_toolchain.py +0 -0
  732. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_unit_drift.py +0 -0
  733. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_unit_enablement.py +0 -0
  734. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_health_wedged_drive_queue.py +0 -0
  735. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_hooks.py +0 -0
  736. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_housekeeping.py +0 -0
  737. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_human_attended_437.py +0 -0
  738. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_init.py +0 -0
  739. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_install_agent_capabilities_3515.py +0 -0
  740. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_install_agent_venv_2911.py +0 -0
  741. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  742. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_integration.py +0 -0
  743. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive.py +0 -0
  744. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_briefing_echo.py +0 -0
  745. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_pane_log_2541.py +0 -0
  746. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_prefill_state.py +0 -0
  747. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_session_relaunch.py +0 -0
  748. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_test_verdict_backstop.py +0 -0
  749. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_token_attribution.py +0 -0
  750. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_interactive_worktree.py +0 -0
  751. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_invariant_alarms.py +0 -0
  752. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_issue_store_seam.py +0 -0
  753. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_issues_sync_status.py +0 -0
  754. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_liveness_auditor.py +0 -0
  755. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_liveness_notify.py +0 -0
  756. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_lock_contention_ratchet.py +0 -0
  757. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_mac_native_driver.py +0 -0
  758. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_machine_fault.py +0 -0
  759. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_machine_metrics.py +0 -0
  760. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_machine_onboard.py +0 -0
  761. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_machine_pause.py +0 -0
  762. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_machine_stats.py +0 -0
  763. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_merge_queue.py +0 -0
  764. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_merge_verification.py +0 -0
  765. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_merge_verify.py +0 -0
  766. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_milestone_chat.py +0 -0
  767. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_milestone_dispatch.py +0 -0
  768. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_milestone_gate.py +0 -0
  769. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_milestone_order.py +0 -0
  770. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_milestone_seam.py +0 -0
  771. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_mock_author.py +0 -0
  772. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_model_tiering.py +0 -0
  773. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_models.py +0 -0
  774. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_models_config_labels.py +0 -0
  775. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_needs_attention.py +0 -0
  776. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_network.py +0 -0
  777. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_new_issue_chat.py +0 -0
  778. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_next_release_tag.py +0 -0
  779. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_node_shim.py +0 -0
  780. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_baseline.py +0 -0
  781. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_cli.py +0 -0
  782. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_collect.py +0 -0
  783. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_config.py +0 -0
  784. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_drive_seam.py +0 -0
  785. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_isolation.py +0 -0
  786. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_predicate.py +0 -0
  787. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_quiet_hours.py +0 -0
  788. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notifier_service.py +0 -0
  789. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notify.py +0 -0
  790. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_notify_drain.py +0 -0
  791. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_openapi.py +0 -0
  792. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_operational_defaults.py +0 -0
  793. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_overlap_fence.py +0 -0
  794. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_overlap_predict.py +0 -0
  795. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_packaged_deploy_units.py +0 -0
  796. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_parentage.py +0 -0
  797. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_paste_landed.py +0 -0
  798. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  799. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_pipeline.py +0 -0
  800. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_plan_followup_approve_plan_command.py +0 -0
  801. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_plan_followup_pr_command.py +0 -0
  802. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_plan_followup_review_command.py +0 -0
  803. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_plan_only.py +0 -0
  804. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_plan_parser.py +0 -0
  805. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_platform_paths.py +0 -0
  806. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_portal_bridge.py +0 -0
  807. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_portal_config.py +0 -0
  808. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_portal_store.py +0 -0
  809. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_portal_sync.py +0 -0
  810. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_pr_body_lint.py +0 -0
  811. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_prereqs.py +0 -0
  812. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_production_db_guard.py +0 -0
  813. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_progress.py +0 -0
  814. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_provider_seam.py +0 -0
  815. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_providers.py +0 -0
  816. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_providers_config_labels.py +0 -0
  817. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_providers_pty.py +0 -0
  818. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_provision_core.py +0 -0
  819. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_provision_machine.py +0 -0
  820. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_py_rust_mirror_inventory.py +0 -0
  821. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_quiet_hours.py +0 -0
  822. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_quiet_hours_store_2146.py +0 -0
  823. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reap_merged_sessions.py +0 -0
  824. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reap_stale_interactive_tick.py +0 -0
  825. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile.py +0 -0
  826. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_branch.py +0 -0
  827. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_completions.py +0 -0
  828. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  829. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_merges.py +0 -0
  830. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_no_agent_record.py +0 -0
  831. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_tick.py +0 -0
  832. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reconcile_usage_limit_done.py +0 -0
  833. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_refine_chat.py +0 -0
  834. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_cordon_2101.py +0 -0
  835. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  836. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_cordon_deadlock_2240.py +0 -0
  837. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  838. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_cordon_stuck_2490.py +0 -0
  839. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_gate.py +0 -0
  840. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_propagate.py +0 -0
  841. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_propagate_threshold.py +0 -0
  842. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_roll_between_legs_2854.py +0 -0
  843. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_roll_window_handoff.py +0 -0
  844. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_unified_1242.py +0 -0
  845. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_verify.py +0 -0
  846. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_release_window.py +0 -0
  847. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_remote_auto_prune.py +0 -0
  848. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_remote_interactive_reaper.py +0 -0
  849. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_add.py +0 -0
  850. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_dormancy.py +0 -0
  851. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_edit_2220.py +0 -0
  852. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_graph_fleet_2237.py +0 -0
  853. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_max_parallel_3423.py +0 -0
  854. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_repo_onboard_2220.py +0 -0
  855. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_report_public_export.py +0 -0
  856. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_report_result_push.py +0 -0
  857. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_reports.py +0 -0
  858. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_restart_cmd.py +0 -0
  859. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_retry.py +0 -0
  860. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_retry_advisory_1606.py +0 -0
  861. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_retry_escalation_classify_3360.py +0 -0
  862. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_retry_type_1636.py +0 -0
  863. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_revalidate.py +0 -0
  864. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review.py +0 -0
  865. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_end_review_without_verdict.py +0 -0
  866. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_parse_failure_diagnostic.py +0 -0
  867. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_reaffirm.py +0 -0
  868. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_state.py +0 -0
  869. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_verdict_backstop.py +0 -0
  870. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_verdict_override_audit.py +0 -0
  871. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_verdict_relay.py +0 -0
  872. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_review_zero_commits.py +0 -0
  873. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_scoped_review_wiring.py +0 -0
  874. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_scorecard.py +0 -0
  875. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_self_health.py +0 -0
  876. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_serve.py +0 -0
  877. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_serve_app.py +0 -0
  878. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_serve_app_board_trim.py +0 -0
  879. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_serve_rest_routes.py +0 -0
  880. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_session.py +0 -0
  881. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_slice_issue_attribution.py +0 -0
  882. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_smoke.py +0 -0
  883. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  884. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_smoke_live_checkout_restore.py +0 -0
  885. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_smoke_workflow.py +0 -0
  886. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_spend_ceiling.py +0 -0
  887. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_spend_ceiling_coordinator.py +0 -0
  888. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_split.py +0 -0
  889. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_split_work.py +0 -0
  890. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_sql_dialect.py +0 -0
  891. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_sqlite_connect_ratchet.py +0 -0
  892. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stage_projection.py +0 -0
  893. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stale_busy_reviewer_697.py +0 -0
  894. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stalled_pipeline.py +0 -0
  895. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_state.py +0 -0
  896. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_state_review_findings_daemon.py +0 -0
  897. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_status_fleet_footer.py +0 -0
  898. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stop_1567.py +0 -0
  899. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_store_contract.py +0 -0
  900. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_store_migrate.py +0 -0
  901. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stuck.py +0 -0
  902. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  903. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_terminal_command.py +0 -0
  904. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_author.py +0 -0
  905. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_chat.py +0 -0
  906. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_orchestrator.py +0 -0
  907. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_report.py +0 -0
  908. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_verdict_parsing.py +0 -0
  909. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_test_verdict_transcript_floor.py +0 -0
  910. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_text_io_encoding_audit.py +0 -0
  911. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_thin_client_board_audit.py +0 -0
  912. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_thin_client_config_load_1080.py +0 -0
  913. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_thin_client_daemon_routing_906.py +0 -0
  914. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_throwaway_vm.py +0 -0
  915. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_tmux_host.py +0 -0
  916. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_tmux_session.py +0 -0
  917. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_transcript_floor.py +0 -0
  918. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_tui_pty_driver.py +0 -0
  919. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_uat_checks.py +0 -0
  920. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_usage_limits.py +0 -0
  921. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_venv_live_install_2121.py +0 -0
  922. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_version_single_source.py +0 -0
  923. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_watch.py +0 -0
  924. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_win_native_bridge.py +0 -0
  925. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_win_native_driver.py +0 -0
  926. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  927. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worker_env_venv_isolation.py +0 -0
  928. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worker_events.py +0 -0
  929. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worker_image_pin_sync.py +0 -0
  930. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worker_safety.py +0 -0
  931. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worker_test_scoping.py +0 -0
  932. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worktree.py +0 -0
  933. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  934. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/tests/test_write_parity.py +0 -0
  935. {code_coordinator-0.5.583 → code_coordinator-0.5.585}/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.583
3
+ Version: 0.5.585
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.583
3
+ Version: 0.5.585
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.583",
2
+ "tag": "0.5.585",
3
3
  "distance": 0,
4
- "node": "g7a2c5345c680bb8cf246a98b62f7a92cdd561b3f",
4
+ "node": "g6570ba34fa9c63377f21997b6b8a6170f499b760",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -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)
@@ -1933,21 +1933,44 @@ def _default_pricing() -> dict[str, ModelRates]:
1933
1933
 
1934
1934
  @dataclass
1935
1935
  class PricingConfig:
1936
- """``pricing:`` block (#1118) — per-canonical-model per-1M-token USD rates.
1937
-
1938
- ``models`` maps a canonical model key (``"sonnet"``, ``"opus"``,
1939
- ``"haiku"``, or any operator-added key) to its :class:`ModelRates`. An
1940
- absent ``pricing:`` block in coordinator.yml still yields the built-in
1941
- defaults via :func:`_default_pricing`. A model key with no entry here
1942
- (e.g. ``"(unknown)"``, or a genuinely unrecognized model string) has no
1943
- rate — :mod:`coord.usage_rollup` treats that as "no estimate possible"
1944
- and flags the group rather than silently reporting $0.
1936
+ """``pricing:`` block (#1118) — per-1M-token USD rates, keyed by model.
1937
+
1938
+ ``models`` maps a pricing key to its :class:`ModelRates`. The key shape
1939
+ is whatever :func:`coord.usage_rollup.normalize_model` resolves a leg's
1940
+ raw ``model`` field to, and there are exactly two cases (#1651):
1941
+
1942
+ - One of the four built-in Anthropic tiers — ``"sonnet"``, ``"opus"``,
1943
+ ``"haiku"``, ``"fable"`` — which ``normalize_model`` also maps every
1944
+ versioned id of (e.g. ``"claude-sonnet-4-6"``) onto.
1945
+ - Any other model's **own route key, spelled exactly as the route that
1946
+ dispatches it identifies it** — e.g. the escalation ladder's (#55)
1947
+ OpenCode Zen ``provider/model`` strings, ``"opencode/glm-5.2"`` or
1948
+ ``"deepseek/deepseek-chat"`` (see ``ProviderDef.model`` /
1949
+ ``coord.config.model_plausible_for_provider_type``). There is
1950
+ deliberately only ONE spelling of a given non-Anthropic model across
1951
+ this config — the same string ``coordinator.yml``'s ``providers:`` /
1952
+ ``models.labels``/``escalation`` already uses to route to it — rather
1953
+ than a second "pricing alias" that could drift out of sync with the
1954
+ routing key.
1955
+
1956
+ An absent ``pricing:`` block in coordinator.yml still yields the
1957
+ built-in Anthropic defaults via :func:`_default_pricing`; a
1958
+ non-Anthropic key is simply absent until an operator adds it. A model
1959
+ key with no entry here (e.g. ``"(unknown)"``, a genuinely unrecognized
1960
+ model string, or a real but un-configured route key) has no rate —
1961
+ :mod:`coord.usage_rollup` treats that as "no estimate possible" and
1962
+ flags the leg/group as unknown rather than silently reporting $0.
1945
1963
  """
1946
1964
 
1947
1965
  models: dict[str, ModelRates] = field(default_factory=_default_pricing)
1948
1966
 
1949
1967
  def rates_for(self, canonical_model: str) -> ModelRates | None:
1950
- """Look up rates for a canonical model key, or ``None`` if unpriced."""
1968
+ """Look up rates for a pricing key, or ``None`` if unpriced.
1969
+
1970
+ *canonical_model* is whatever :func:`coord.usage_rollup.
1971
+ normalize_model` returned — a built-in Anthropic tier name, or a
1972
+ passed-through non-Anthropic route key (see the class docstring).
1973
+ """
1951
1974
  return self.models.get(canonical_model)
1952
1975
 
1953
1976
 
@@ -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
  )
@@ -46,24 +46,42 @@ from coord.config import ModelRates, PricingConfig
46
46
 
47
47
  # ── Model normalization ──────────────────────────────────────────────────────
48
48
 
49
- # Canonical keys this module recognizes out of the box. Anything else is
50
- # "(unknown)" — never guessed, never silently priced at $0.
49
+ # Canonical keys this module recognizes out of the box (the four Anthropic
50
+ # tiers). Anything else PASSES THROUGH verbatim (lowercased/stripped) rather
51
+ # than collapsing to "(unknown)" — see #1651: once the escalation ladder
52
+ # (#55) routes to a non-Anthropic model, its board `model` field is whatever
53
+ # key that route identifies itself by (e.g. the OpenCode Zen `provider/model`
54
+ # shape, `"opencode/glm-5.2"`, `"deepseek/deepseek-chat"` — see
55
+ # `coord.config.model_plausible_for_provider_type`). A `pricing.models` entry
56
+ # keyed with that EXACT string (same spelling as the route/`ProviderDef.model`
57
+ # that produced it — there is deliberately only one spelling, never a second
58
+ # "friendly" alias to keep in sync) now reaches `PricingConfig.rates_for`
59
+ # instead of being shadowed by a hardcoded "(unknown)". A key with no such
60
+ # entry still resolves to no rate (`rates_for` returns `None`) and is flagged
61
+ # unknown exactly as before — nothing is ever *guessed* into a tier.
51
62
  _KNOWN_CANONICAL = ("sonnet", "opus", "haiku", "fable")
52
63
 
53
64
  UNKNOWN_MODEL = "(unknown)"
54
65
 
55
66
 
56
67
  def normalize_model(model: str | None) -> str:
57
- """Normalize a raw ``model`` field to a canonical pricing key.
68
+ """Normalize a raw ``model`` field to a pricing key.
58
69
 
59
- Handles bare aliases (``"sonnet"``, ``"opus"``, ``"haiku"``, ``"fable"``),
60
- versioned ids (``"claude-sonnet-4-6"``, ``"claude-opus-4-7"``,
70
+ Handles bare Anthropic aliases (``"sonnet"``, ``"opus"``, ``"haiku"``,
71
+ ``"fable"``), versioned ids (``"claude-sonnet-4-6"``, ``"claude-opus-4-7"``,
61
72
  ``"claude-haiku-4-5"``, ``"claude-fable-5"``, and future dated variants —
62
73
  matched by substring so a new date suffix doesn't need a code change),
63
- and the empty/``None``/``"(unknown)"`` cases. Anything that doesn't match
64
- one of the four known tiers returns ``"(unknown)"`` — the estimator
65
- treats that as "no rate available" and flags it, rather than defaulting
66
- to a tier that might be wrong.
74
+ and the empty/``None``/``"(unknown)"`` cases, which all map to
75
+ ``"(unknown)"``.
76
+
77
+ Anything else — notably a non-Anthropic route key from the escalation
78
+ ladder (#55), e.g. ``"opencode/glm-5.2"`` — is returned **unchanged**
79
+ (just lowercased/stripped) rather than forced to ``"(unknown)"``. That
80
+ passthrough is what lets :meth:`coord.config.PricingConfig.rates_for`
81
+ see the model's own key and find an operator-configured rate for it
82
+ (#1651); a key nobody configured still produces no rate there (``None``)
83
+ and the estimator flags it unknown exactly as before — this function
84
+ never *guesses* a tier for an unrecognized string.
67
85
  """
68
86
  if not model:
69
87
  return UNKNOWN_MODEL
@@ -75,7 +93,7 @@ def normalize_model(model: str | None) -> str:
75
93
  for canonical in _KNOWN_CANONICAL:
76
94
  if canonical in text:
77
95
  return canonical
78
- return UNKNOWN_MODEL
96
+ return text
79
97
 
80
98
 
81
99
  # ── Timestamp parsing ─────────────────────────────────────────────────────────
@@ -232,9 +250,11 @@ def leg_cost(row: dict, pricing: PricingConfig) -> tuple[float, float, bool]:
232
250
  verbatim as ``cost_captured`` and never also gets an estimate (no
233
251
  double-counting). A leg with ``cost_usd`` in ``{None, 0}`` **and** any
234
252
  tokens gets an estimate from *pricing*, keyed by the leg's normalized
235
- model — unless the model doesn't map to a priced tier, in which case no
236
- estimate is produced and ``unknown_model`` is ``True`` (never a silent
237
- $0). A leg with no tokens and no captured cost is simply zero everywhere.
253
+ model (see :func:`normalize_model` — a canonical Anthropic tier, or a
254
+ non-Anthropic model's own route key, e.g. ``"opencode/glm-5.2"``) —
255
+ unless *pricing* has no rate for that key, in which case no estimate is
256
+ produced and ``unknown_model`` is ``True`` (never a silent $0). A leg
257
+ with no tokens and no captured cost is simply zero everywhere.
238
258
  """
239
259
  raw_cost = row.get("cost_usd")
240
260
  try:
@@ -428,6 +428,102 @@ def test_driver_loop_disabled_gate_never_calls_the_prober(driver_factory):
428
428
  assert calls == []
429
429
 
430
430
 
431
+ # ── #1654: the poll loop re-reads coordinator.yml every tick ───────────────
432
+
433
+
434
+ def test_driver_loop_picks_up_a_mid_run_usage_gate_change_on_the_next_poll(
435
+ driver_factory, capsys,
436
+ ):
437
+ """A `usage_gate.mode` edit made WHILE a drive is already polling must
438
+ reach the very next dispatch decision, not just the next `coord drive`
439
+ invocation (#1654's motivating #1653 scenario). Scripts a config_loader
440
+ that hands back the construction-time (`warn`) config on the first
441
+ reload and a `block`-mode config on every reload after — exactly like
442
+ an operator editing coordinator.yml between two polls."""
443
+ cfg_warn = _config_with_gate(mode="warn", session_threshold_pct=50.0)
444
+ cfg_block = _config_with_gate(mode="block", session_threshold_pct=50.0)
445
+ reloads = [cfg_warn, cfg_block]
446
+ calls = {"n": 0}
447
+
448
+ def loader(_path):
449
+ idx = min(calls["n"], len(reloads) - 1)
450
+ calls["n"] += 1
451
+ return reloads[idx]
452
+
453
+ driver = driver_factory(
454
+ [{"assignments": []}],
455
+ opts=DriveOptions(machine="precision", poll=1.0, deadline_mins=10.0),
456
+ config=cfg_warn,
457
+ usage_prober=lambda: PlanLimits(status="ok", session_pct=95.0),
458
+ config_loader=loader,
459
+ )
460
+ with pytest.raises(DriveError) as exc:
461
+ driver.run()
462
+ assert exc.value.exit_code == EXIT_USAGE
463
+ assert "block" in str(exc.value)
464
+ # Exactly one `coord assign` reached the subprocess boundary — the FIRST
465
+ # poll's reload still saw `warn` (construction-time config, unchanged),
466
+ # so it dispatched; the SECOND poll's reload already saw `block`, so the
467
+ # usage gate refused before a second `coord assign` was ever spawned.
468
+ assert len(driver.recorded) == 1
469
+ captured = capsys.readouterr()
470
+ # The reload's own narration is informational (`self.log`, not
471
+ # `self.warn`) — it goes to stdout, distinct from the usage gate's own
472
+ # warn-level lines on stderr asserted above via `exc.value`.
473
+ assert "usage_gate changed" in captured.out
474
+ assert "'warn' -> 'block'" in captured.out
475
+
476
+
477
+ def test_driver_loop_survives_a_mid_run_config_parse_failure(driver_factory, capsys):
478
+ """A coordinator.yml an operator is mid-editing (truncated write, a
479
+ YAML typo) must never kill an otherwise-healthy drive: the last-good
480
+ config stays in force, the drive keeps running to its deadline, and the
481
+ warning is printed exactly once for the whole broken window — not once
482
+ per poll."""
483
+ cfg = make_config()
484
+
485
+ def broken_loader(_path):
486
+ raise ValueError("while parsing a block mapping")
487
+
488
+ driver = driver_factory(
489
+ [board(status="running")],
490
+ opts=DriveOptions(machine="precision", poll=1.0, deadline_mins=2.5 / 60.0),
491
+ config=cfg,
492
+ config_loader=broken_loader,
493
+ )
494
+ assert driver.run() == EXIT_DEADLINE
495
+ assert driver.config is cfg # last-good snapshot, never replaced
496
+ err = capsys.readouterr().err
497
+ assert err.count("coordinator.yml reload failed") == 1
498
+
499
+
500
+ def test_driver_loop_config_reload_never_mutates_opts(driver_factory):
501
+ """`self.opts` is this invocation's own identity (the CLI flags) — a
502
+ config reload must never touch it, even across several successful
503
+ reloads that DO change `self.config`."""
504
+ cfg_a = _config_with_gate(mode="warn", session_threshold_pct=50.0)
505
+ cfg_b = _config_with_gate(mode="disabled")
506
+ reloads = [cfg_a, cfg_b, cfg_a, cfg_b]
507
+ calls = {"n": 0}
508
+
509
+ def loader(_path):
510
+ idx = min(calls["n"], len(reloads) - 1)
511
+ calls["n"] += 1
512
+ return reloads[idx]
513
+
514
+ opts = DriveOptions(machine="precision", poll=1.0, deadline_mins=3.5 / 60.0)
515
+ driver = driver_factory(
516
+ [board(status="running")], opts=opts, config=cfg_a, config_loader=loader,
517
+ )
518
+ assert driver.run() == EXIT_DEADLINE
519
+ assert driver.opts is opts
520
+ assert driver.opts.machine == "precision"
521
+ assert driver.opts.poll == 1.0
522
+ # The reload really did run (and really did change self.config) —
523
+ # otherwise this test would trivially pass by never exercising reload.
524
+ assert calls["n"] >= 2
525
+
526
+
431
527
  # ═══════════════════════════════════════════════════════════════════════════
432
528
  # no work yet: plan / dispatch
433
529
  # ═══════════════════════════════════════════════════════════════════════════
@@ -6294,7 +6390,7 @@ def driver_factory(tmp_path, monkeypatch, capsys):
6294
6390
 
6295
6391
  def make(
6296
6392
  payloads, *, opts=None, verifier=None, config=None, oracle_gate=None,
6297
- usage_prober=None, self_head_probe=None, ticks=200,
6393
+ usage_prober=None, self_head_probe=None, config_loader=None, ticks=200,
6298
6394
  ):
6299
6395
  clock = {"t": 0.0}
6300
6396
  recorded: list[list[str]] = []
@@ -6305,14 +6401,24 @@ def driver_factory(tmp_path, monkeypatch, capsys):
6305
6401
 
6306
6402
  monkeypatch.setattr("coord.drive.subprocess.run", fake_run)
6307
6403
 
6404
+ resolved_config = config or make_config()
6308
6405
  driver = Driver(
6309
6406
  repo=REPO,
6310
6407
  issue=ISSUE,
6311
6408
  opts=opts or DriveOptions(machine="precision", poll=1.0),
6312
- config=config or make_config(),
6409
+ config=resolved_config,
6313
6410
  fetcher=FakeFetcher(payloads),
6314
6411
  verifier=verifier or FakeVerifier(),
6315
6412
  oracle_gate=oracle_gate,
6413
+ # #1654: default to a no-op reload (hands back the SAME config
6414
+ # object every poll) — a real driver re-reads coordinator.yml
6415
+ # from disk every tick, but defaulting to that here would make
6416
+ # every existing test in this module implicitly depend on
6417
+ # `$COORD_CONFIG`/`~/.coord/coordinator.yml` resolving
6418
+ # successfully (or silently latching the one-warn-only path),
6419
+ # neither of which is what those tests are about. Tests
6420
+ # exercising the reload itself pass their own.
6421
+ config_loader=config_loader or (lambda _path: resolved_config),
6316
6422
  # #1466: never let a Driver test shell out to a real `claude -p
6317
6423
  # "/usage"` — default to a stub reporting "unknown" (same as no
6318
6424
  # probe at all), which the gate always treats as "proceed,