code-coordinator 0.5.452__tar.gz → 0.5.454__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 (878) hide show
  1. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dao.py +96 -0
  7. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/fleet_board.py +24 -1
  8. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/fleet_snapshot.py +31 -3
  9. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/housekeeping.py +85 -7
  10. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/serve_app.py +110 -19
  11. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/sql.py +36 -0
  12. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/state.py +84 -10
  13. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_read_path.py +77 -3
  14. code_coordinator-0.5.454/tests/test_housekeeping.py +259 -0
  15. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_sql_dialect.py +58 -0
  16. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_sqlite_connect_ratchet.py +36 -5
  17. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_store_contract.py +15 -0
  18. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  26. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.github/coord-ci-acceptance.yml +0 -0
  27. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.github/workflows/auto-release.yml +0 -0
  28. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.github/workflows/publish.yml +0 -0
  29. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.github/workflows/test.yml +0 -0
  30. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/.gitignore +0 -0
  31. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/CLAUDE.md +0 -0
  32. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/GOAL.md +0 -0
  33. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/LICENSE +0 -0
  34. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/MANIFEST.in +0 -0
  35. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/README.md +0 -0
  36. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/dependency_links.txt +0 -0
  37. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/entry_points.txt +0 -0
  38. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/requires.txt +0 -0
  39. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agent.py +0 -0
  45. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agent_app.py +0 -0
  46. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agent_update.py +0 -0
  47. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agents/opencode/.gitignore +0 -0
  48. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agents/opencode/agents/work.md +0 -0
  49. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/agents/opencode/routing.jsonc +0 -0
  50. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/approved_work.py +0 -0
  51. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/backup.py +0 -0
  54. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/block_log.py +0 -0
  55. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/board_schema.py +0 -0
  56. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/ci_fix.py +0 -0
  63. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/ci_gitlab.py +0 -0
  65. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/ci_store.py +0 -0
  66. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/client.py +0 -0
  69. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/codegen.py +0 -0
  70. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/__init__.py +0 -0
  71. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/_common.py +0 -0
  72. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/acceptance.py +0 -0
  73. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/agent_ops.py +0 -0
  74. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/audit.py +0 -0
  75. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/backup.py +0 -0
  76. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/chat.py +0 -0
  77. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/codegen.py +0 -0
  78. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/dispatch.py +0 -0
  79. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/dispatch_workers.py +0 -0
  80. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/dr.py +0 -0
  81. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/drive.py +0 -0
  82. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/drive_queue.py +0 -0
  83. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/gate_a.py +0 -0
  84. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/gates.py +0 -0
  85. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/issues.py +0 -0
  86. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/lifecycle.py +0 -0
  87. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/machine.py +0 -0
  88. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/merge.py +0 -0
  89. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/milestone.py +0 -0
  90. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/plan_followup.py +0 -0
  91. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/plans.py +0 -0
  92. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/portal.py +0 -0
  93. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/pr.py +0 -0
  94. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/release.py +0 -0
  95. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/repo.py +0 -0
  96. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/report.py +0 -0
  97. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/review.py +0 -0
  98. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/scorecard.py +0 -0
  99. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/sessions.py +0 -0
  100. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/setup.py +0 -0
  101. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/status.py +0 -0
  102. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/store_migrate.py +0 -0
  103. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/terminal.py +0 -0
  104. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/test_gate.py +0 -0
  105. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/commands/tui.py +0 -0
  106. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/comments.py +0 -0
  107. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/config.py +0 -0
  108. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/config_reload.py +0 -0
  109. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/confirm_test.py +0 -0
  110. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/conflict_fix.py +0 -0
  111. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dashboard/__init__.py +0 -0
  112. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dashboard/fixture.py +0 -0
  113. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dashboard/index.html +0 -0
  114. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dashboard/server.py +0 -0
  115. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dashboard/terminal.py +0 -0
  116. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/db.py +0 -0
  117. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dead_end.py +0 -0
  118. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/decomposition_chat.py +0 -0
  119. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/README.md +0 -0
  120. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-agent.service +0 -0
  121. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-backup.service +0 -0
  122. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-backup.timer +0 -0
  123. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-db-backup.service +0 -0
  124. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-db-backup.sh +0 -0
  125. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-db-backup.timer +0 -0
  126. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-dr-verify.service +0 -0
  127. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-dr-verify.timer +0 -0
  128. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-drive-queue.service +0 -0
  129. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-drive-queue.timer +0 -0
  130. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-failure-notify.service +0 -0
  131. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-fleet-watchdog.service +0 -0
  132. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  133. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-notify.service +0 -0
  134. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-notify.timer +0 -0
  135. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-release-propagate.service +0 -0
  136. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-release-propagate.timer +0 -0
  137. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-release-window.service +0 -0
  138. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-release-window.timer +0 -0
  139. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-serve.service +0 -0
  140. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-web-dist-build.service +0 -0
  141. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-web-dist-build.timer +0 -0
  142. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy/coord-web.service +0 -0
  143. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy_manifest.py +0 -0
  144. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deploy_units.py +0 -0
  145. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deprecation_telemetry.py +0 -0
  146. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/deps.py +0 -0
  147. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/diagnose.py +0 -0
  148. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dispatch.py +0 -0
  149. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dist_name.py +0 -0
  150. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dr_promote.py +0 -0
  151. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/dr_verify.py +0 -0
  152. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/drive.py +0 -0
  153. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/drive_queue.py +0 -0
  154. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/drive_state.py +0 -0
  155. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/events.py +0 -0
  156. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/failure_class.py +0 -0
  157. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/filelock.py +0 -0
  158. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/fleet_config_health.py +0 -0
  159. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/forge_availability.py +0 -0
  160. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/freshness.py +0 -0
  161. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/gate_a.py +0 -0
  162. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/gate_b.py +0 -0
  163. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/gate_snapshot.py +0 -0
  164. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/gates.py +0 -0
  165. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/gen_board_fixture.py +0 -0
  166. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/github_ops.py +0 -0
  167. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/github_throttle.py +0 -0
  168. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/goal.py +0 -0
  169. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/graph_health.py +0 -0
  170. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/__init__.py +0 -0
  171. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/aggregate.py +0 -0
  172. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/__init__.py +0 -0
  173. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/_ci_pin.py +0 -0
  174. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/agent_install.py +0 -0
  175. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/cargo_targets.py +0 -0
  176. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/claude_binary.py +0 -0
  177. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/config_drift.py +0 -0
  178. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  179. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/coord_web_ci_pin.py +0 -0
  180. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/deploy_lane_facts.py +0 -0
  181. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/disk.py +0 -0
  182. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  183. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/fleet_phantom.py +0 -0
  184. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/fleet_unit_drift.py +0 -0
  185. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/graph.py +0 -0
  186. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/graphify_cli.py +0 -0
  187. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/index_lock.py +0 -0
  188. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/issues_sync_staleness.py +0 -0
  189. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/plan_usage.py +0 -0
  190. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/pr_churn.py +0 -0
  191. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/release_cordon.py +0 -0
  192. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/repo_state.py +0 -0
  193. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/spawned_coord.py +0 -0
  194. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/stalled_pipeline.py +0 -0
  195. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/timer_active.py +0 -0
  196. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/toolchain.py +0 -0
  197. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/unit_drift.py +0 -0
  198. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/unit_enablement.py +0 -0
  199. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/wedged_drive_queue.py +0 -0
  200. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/checks/worktrees.py +0 -0
  201. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/cli.py +0 -0
  202. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/context.py +0 -0
  203. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/models.py +0 -0
  204. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/pypi.py +0 -0
  205. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/registry.py +0 -0
  206. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/render.py +0 -0
  207. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/health/units.py +0 -0
  208. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/hooks.py +0 -0
  209. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/interactive.py +0 -0
  210. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/issue_store.py +0 -0
  211. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/issues_sync_status.py +0 -0
  212. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/liveness_auditor.py +0 -0
  213. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/machine_metrics.py +0 -0
  214. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/machine_onboard.py +0 -0
  215. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/machine_pause.py +0 -0
  216. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/machine_stats.py +0 -0
  217. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/merge_queue.py +0 -0
  218. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/milestone_chat.py +0 -0
  219. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/milestone_dispatch.py +0 -0
  220. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/milestone_gate.py +0 -0
  221. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/milestone_order.py +0 -0
  222. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/mock_author.py +0 -0
  223. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/models.py +0 -0
  224. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/network.py +0 -0
  225. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/new_issue_chat.py +0 -0
  226. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/__init__.py +0 -0
  227. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/baseline.py +0 -0
  228. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/cli.py +0 -0
  229. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/collect.py +0 -0
  230. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/digest.py +0 -0
  231. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/models.py +0 -0
  232. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/predicate.py +0 -0
  233. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/service.py +0 -0
  234. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/store.py +0 -0
  235. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notifier/transport.py +0 -0
  236. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/notify.py +0 -0
  237. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/openapi.py +0 -0
  238. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/overlap_fence.py +0 -0
  239. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/overlap_predict.py +0 -0
  240. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/parentage.py +0 -0
  241. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/parentage_github.py +0 -0
  242. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/pipeline.py +0 -0
  243. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/plan_parser.py +0 -0
  244. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/plans.py +0 -0
  245. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/platform_paths.py +0 -0
  246. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/portal_bridge.py +0 -0
  247. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/portal_store.py +0 -0
  248. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/portal_sync.py +0 -0
  249. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/pr_body_lint.py +0 -0
  250. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/prereqs.py +0 -0
  251. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/progress.py +0 -0
  252. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/providers/__init__.py +0 -0
  253. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/providers/base.py +0 -0
  254. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/providers/claude.py +0 -0
  255. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/providers/claude_pty.py +0 -0
  256. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/providers/opencode.py +0 -0
  257. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/queue_diagnose.py +0 -0
  258. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/reconcile.py +0 -0
  259. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/reconcile_tick.py +0 -0
  260. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/refine_chat.py +0 -0
  261. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/release_cordon.py +0 -0
  262. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/release_propagate.py +0 -0
  263. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/release_verify.py +0 -0
  264. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/release_window.py +0 -0
  265. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/repo_dormancy.py +0 -0
  266. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/repo_edit.py +0 -0
  267. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/repo_onboard.py +0 -0
  268. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/reports.py +0 -0
  269. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/rest_schema.py +0 -0
  270. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/revalidate.py +0 -0
  271. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/review.py +0 -0
  272. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/scorecard.py +0 -0
  273. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/self_health.py +0 -0
  274. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  275. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  276. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  277. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  278. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  279. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/portal-followup/SKILL.md +0 -0
  280. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/release-now/SKILL.md +0 -0
  281. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  282. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  283. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/skills/update-issue/SKILL.md +0 -0
  284. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/smoke.py +0 -0
  285. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/spend_ceiling.py +0 -0
  286. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/split_work.py +0 -0
  287. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/stage_projection.py +0 -0
  288. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/store_migrate.py +0 -0
  289. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/store_parity.py +0 -0
  290. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/templates/deploy-cloudflare.node.yml +0 -0
  291. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/test_author.py +0 -0
  292. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/test_chat.py +0 -0
  293. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/test_orchestrator.py +0 -0
  294. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/test_report.py +0 -0
  295. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/tui_release.py +0 -0
  296. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/uat_checks.py +0 -0
  297. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/usage.py +0 -0
  298. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/usage_limits.py +0 -0
  299. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/usage_rollup.py +0 -0
  300. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coord/worker_events.py +0 -0
  301. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/coordinator.example.yml +0 -0
  302. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-agent.service +0 -0
  303. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-backup.service +0 -0
  304. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-backup.timer +0 -0
  305. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-db-backup.service +0 -0
  306. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-db-backup.sh +0 -0
  307. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-db-backup.timer +0 -0
  308. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-dr-verify.service +0 -0
  309. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-dr-verify.timer +0 -0
  310. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-drive-queue.service +0 -0
  311. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-drive-queue.timer +0 -0
  312. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-failure-notify.service +0 -0
  313. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-failure-notify.sh +0 -0
  314. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-fleet-watchdog.service +0 -0
  315. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-fleet-watchdog.timer +0 -0
  316. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-notify.service +0 -0
  317. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-notify.timer +0 -0
  318. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-release-propagate.service +0 -0
  319. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-release-propagate.timer +0 -0
  320. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-release-window.service +0 -0
  321. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-release-window.timer +0 -0
  322. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-serve.service +0 -0
  323. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-web-dist-build.service +0 -0
  324. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-web-dist-build.sh +0 -0
  325. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-web-dist-build.timer +0 -0
  326. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-web-rollback.sh +0 -0
  327. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/coord-web.service +0 -0
  328. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/deploy/node-shim.sh +0 -0
  329. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ADR_COORD_TUI_CI.md +0 -0
  330. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  331. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ADR_COORD_WEB_CI.md +0 -0
  332. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ADR_COORD_WEB_DIST.md +0 -0
  333. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  334. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/AGENT_OPERATIONS.md +0 -0
  335. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ARCHITECTURE.md +0 -0
  336. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ARCH_SECURITY_GATES.md +0 -0
  337. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/COCKPIT.md +0 -0
  338. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/CONTROL_CENTER.md +0 -0
  339. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/COST_DISCIPLINE.md +0 -0
  340. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/CROSS_PLATFORM.md +0 -0
  341. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/CUSTOMER_FACING_APPS.md +0 -0
  342. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/CUSTOMER_PORTAL.md +0 -0
  343. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/DATA_STORE_SELECTION.md +0 -0
  344. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/DISASTER_RECOVERY.md +0 -0
  345. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/DRIVE_QUEUE.md +0 -0
  346. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/EPHEMERAL_WORKERS.md +0 -0
  347. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/FORGE_MIGRATION.md +0 -0
  348. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/GRAPHIFY_SETUP.md +0 -0
  349. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ISSUE_GUIDANCE.md +0 -0
  350. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/MAC_MINI.md +0 -0
  351. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  352. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/NOTIFIER.md +0 -0
  353. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/OPENCODE_VERIFICATION.md +0 -0
  354. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/OPERATING_GOTCHAS.md +0 -0
  355. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/OPERATOR_GUIDES.md +0 -0
  356. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/ORACLE_LOOP.md +0 -0
  357. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/PHONE_WEBAPP.md +0 -0
  358. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/PIPELINE_V2.md +0 -0
  359. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/PLATFORM_EVOLUTION.md +0 -0
  360. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/SECOND_BACKEND.md +0 -0
  361. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/STORE_SERVICE.md +0 -0
  362. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  363. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/WEB_CONTROL_CENTER.md +0 -0
  364. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/WSL_WINDOWS_WORKER.md +0 -0
  365. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/mocks/web/README.md +0 -0
  366. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/mocks/web/_tokens.css +0 -0
  367. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/mocks/web/issue-detail.html +0 -0
  368. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/mocks/web/pipeline-narrow.html +0 -0
  369. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/docs/mocks/web/pipeline-wide.html +0 -0
  370. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/graphify-out/.gitignore +0 -0
  371. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/install-agent.sh +0 -0
  372. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/pyproject.toml +0 -0
  373. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/audit_review_verdict_overrides.py +0 -0
  374. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  375. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/build-worker-image.sh +0 -0
  376. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/coordinator-machine.py +0 -0
  377. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/dr-down.sh +0 -0
  378. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/dr-up.sh +0 -0
  379. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/epic-down.sh +0 -0
  380. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/epic-up.sh +0 -0
  381. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/preflight.sh +0 -0
  382. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/provision-server.sh +0 -0
  383. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/provision-worker.sh +0 -0
  384. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  385. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  386. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/throwaway-vm.sh +0 -0
  387. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/azure-workers/verify-github-token.sh +0 -0
  388. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/check_gh_argv_containment.py +0 -0
  389. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/codegen.py +0 -0
  390. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-test-runner.sh +0 -0
  391. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  392. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  393. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  394. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  395. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/coord-venv-rollback.sh +0 -0
  396. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/drive-batch.sh +0 -0
  397. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/extract-coord-tui.sh +0 -0
  398. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/fleet_watchdog.py +0 -0
  399. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/gen_board_fixture.py +0 -0
  400. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/gen_mock_index.py +0 -0
  401. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/lib/provision-core.sh +0 -0
  402. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/next_release_tag.py +0 -0
  403. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/provision-machine.sh +0 -0
  404. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/run_tests_in_populated_home.sh +0 -0
  405. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/run_tests_without_gh.sh +0 -0
  406. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/setup-macmini.sh +0 -0
  407. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/smoke_437_interactive.py +0 -0
  408. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/verify-provision-noble.sh +0 -0
  409. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/verify_878_review_capture.py +0 -0
  410. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/verify_release_published.py +0 -0
  411. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/scripts/verify_release_wheel.py +0 -0
  412. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/setup.cfg +0 -0
  413. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/SMOKE_SET.md +0 -0
  414. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/__init__.py +0 -0
  415. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-37/conftest.py +0 -0
  416. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-37/contract.md +0 -0
  417. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-37/manifest.yml +0 -0
  418. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  419. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  420. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/contract.md +0 -0
  421. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  422. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  423. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/manifest.yml +0 -0
  424. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  425. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-51/tsconfig.json +0 -0
  426. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  427. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/backends.py +0 -0
  428. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/conftest.py +0 -0
  429. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/board-pipeline-basic.json +0 -0
  430. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  431. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  432. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  433. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  434. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/all_pass.json +0 -0
  435. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  436. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/mixed_fail.json +0 -0
  437. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  438. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  439. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/skip.json +0 -0
  440. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/playwright/truncated.json +0 -0
  441. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  442. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  443. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  444. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  445. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  446. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  447. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  448. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  449. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_acceptance.py +0 -0
  450. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_acceptance_drivers.py +0 -0
  451. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent.py +0 -0
  452. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_api_error.py +0 -0
  453. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_app.py +0 -0
  454. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_branch_base.py +0 -0
  455. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_branch_capture.py +0 -0
  456. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_config_free_1712.py +0 -0
  457. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_deploy_units_endpoint.py +0 -0
  458. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_dirty_worktree.py +0 -0
  459. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  460. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_graph_self_heal.py +0 -0
  461. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_health_h3.py +0 -0
  462. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_idle_restart.py +0 -0
  463. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_push_failure.py +0 -0
  464. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_reap.py +0 -0
  465. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_repos_and_pull.py +0 -0
  466. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_restart_services_endpoint.py +0 -0
  467. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_skills_self_heal.py +0 -0
  468. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_startup_diagnostics.py +0 -0
  469. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_update.py +0 -0
  470. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_update_bluegreen.py +0 -0
  471. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_usage_limit.py +0 -0
  472. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_agent_zero_commit.py +0 -0
  473. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ambient_home_isolation.py +0 -0
  474. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approve_capability_reroute_3241.py +0 -0
  475. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approve_dependency_busy_2804.py +0 -0
  476. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approve_reject_plan.py +0 -0
  477. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approve_usage_gate.py +0 -0
  478. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approved_work_2532.py +0 -0
  479. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_approved_work_2996.py +0 -0
  480. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_assignment_already_recorded_daemon.py +0 -0
  481. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_audit_log.py +0 -0
  482. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_audit_outcome.py +0 -0
  483. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_audit_query.py +0 -0
  484. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_auto_loop.py +0 -0
  485. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_auto_release_publish_2035.py +0 -0
  486. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_backend_selection.py +0 -0
  487. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_backup.py +0 -0
  488. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_base_checkout_restore.py +0 -0
  489. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_block_log.py +0 -0
  490. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_cap_762.py +0 -0
  491. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_fixture.py +0 -0
  492. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_schema.py +0 -0
  493. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_service.py +0 -0
  494. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_state.py +0 -0
  495. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_board_wire.py +0 -0
  496. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_brain.py +0 -0
  497. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_branch_model.py +0 -0
  498. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_bug_intake.py +0 -0
  499. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_build_worker_image_env_update.py +0 -0
  500. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cargo_cache.py +0 -0
  501. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_check_gh_argv_containment.py +0 -0
  502. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_acceptance_gate_1950.py +0 -0
  503. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_fix.py +0 -0
  504. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_github.py +0 -0
  505. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_gitlab.py +0 -0
  506. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_parity_2091.py +0 -0
  507. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_ci_store.py +0 -0
  508. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_claim.py +0 -0
  509. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_claude_md_budget.py +0 -0
  510. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_acceptance.py +0 -0
  511. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_assign.py +0 -0
  512. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  513. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_assign_interactive_remote.py +0 -0
  514. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_assign_provider.py +0 -0
  515. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  516. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_audit.py +0 -0
  517. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_chat_continue.py +0 -0
  518. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_codegen.py +0 -0
  519. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_decide.py +0 -0
  520. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_capability_rules.py +0 -0
  521. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_config_provenance.py +0 -0
  522. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_forge_availability.py +0 -0
  523. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_graph.py +0 -0
  524. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_self.py +0 -0
  525. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_diagnose_test_coverage.py +0 -0
  526. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_doctor.py +0 -0
  527. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_doctor_config_free_1801.py +0 -0
  528. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  529. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  530. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_drive.py +0 -0
  531. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_drive_queue.py +0 -0
  532. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_escalate.py +0 -0
  533. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_fix_headless_review.py +0 -0
  534. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_gate_a.py +0 -0
  535. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_install_drift.py +0 -0
  536. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_install_skills.py +0 -0
  537. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_issue_comment.py +0 -0
  538. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_issue_create_label.py +0 -0
  539. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_issue_reopen.py +0 -0
  540. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_issue_view_list.py +0 -0
  541. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_merge.py +0 -0
  542. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_assign.py +0 -0
  543. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_capture.py +0 -0
  544. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_chat_add_child.py +0 -0
  545. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_dispatch.py +0 -0
  546. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_gate_b.py +0 -0
  547. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_gate_c.py +0 -0
  548. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_order.py +0 -0
  549. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  550. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_milestone_ship.py +0 -0
  551. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_network.py +0 -0
  552. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_new_issue_chat.py +0 -0
  553. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_plans.py +0 -0
  554. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_portal.py +0 -0
  555. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_pr.py +0 -0
  556. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_pull_artifact.py +0 -0
  557. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_queue.py +0 -0
  558. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_reattach_sessions.py +0 -0
  559. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_refine_board.py +0 -0
  560. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_release_preflight.py +0 -0
  561. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_release_propagate.py +0 -0
  562. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_release_window.py +0 -0
  563. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_repo_2220.py +0 -0
  564. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  565. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_scorecard.py +0 -0
  566. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_serve_store_backend_3084.py +0 -0
  567. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_set_review_findings.py +0 -0
  568. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_advisory_terminal.py +0 -0
  569. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_contested_tag.py +0 -0
  570. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_merge_queue.py +0 -0
  571. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_provider.py +0 -0
  572. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_review_finalizing.py +0 -0
  573. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_test_failed_tag.py +0 -0
  574. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_status_usage_limit.py +0 -0
  575. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_sync_comments_873.py +0 -0
  576. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_test_plan.py +0 -0
  577. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_track.py +0 -0
  578. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_tui_update.py +0 -0
  579. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cli_wait.py +0 -0
  580. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_client.py +0 -0
  581. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_client_base_install.py +0 -0
  582. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_client_config_cache_atomic_3052.py +0 -0
  583. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_client_resource_migration_1946.py +0 -0
  584. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_commands_common.py +0 -0
  585. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_comments.py +0 -0
  586. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_completion_summary.py +0 -0
  587. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config.py +0 -0
  588. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_acceptance.py +0 -0
  589. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_audit.py +0 -0
  590. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_drift_check.py +0 -0
  591. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_pricing.py +0 -0
  592. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  593. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_config_usage_gate.py +0 -0
  594. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_confirm_test.py +0 -0
  595. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_conflict_fix.py +0 -0
  596. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_conflict_fix_semantic.py +0 -0
  597. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  598. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test.py +0 -0
  599. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  600. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test_runner_baseline.py +0 -0
  601. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test_runner_populated_home.py +0 -0
  602. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test_runner_routing.py +0 -0
  603. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_test_runner_toolchain.py +0 -0
  604. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_uat.py +0 -0
  605. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coord_web_sse_restart_live.py +0 -0
  606. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_coordinator_machine.py +0 -0
  607. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_cross_platform_imports.py +0 -0
  608. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dao.py +0 -0
  609. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard.py +0 -0
  610. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard_api.py +0 -0
  611. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard_fixture.py +0 -0
  612. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard_server.py +0 -0
  613. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard_terminal.py +0 -0
  614. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dashboard_terminal_live.py +0 -0
  615. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_db.py +0 -0
  616. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dead_end.py +0 -0
  617. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_decomposition_chat.py +0 -0
  618. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_coord_db_backup.py +0 -0
  619. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_coord_web_dist.py +0 -0
  620. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_coord_web_rollback.py +0 -0
  621. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_db_backup_unit.py +0 -0
  622. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_drive_queue_unit.py +0 -0
  623. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_failure_notify_unit.py +0 -0
  624. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_manifest.py +0 -0
  625. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_notify_unit.py +0 -0
  626. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_units_lane.py +0 -0
  627. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deploy_web_unit.py +0 -0
  628. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deprecation_telemetry.py +0 -0
  629. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_deps.py +0 -0
  630. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_diagnose.py +0 -0
  631. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dispatch.py +0 -0
  632. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dispatch_target_validation.py +0 -0
  633. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dist_name.py +0 -0
  634. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_done_housekeeping.py +0 -0
  635. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dr_azure_scripts.py +0 -0
  636. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dr_promote.py +0 -0
  637. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_dr_verify.py +0 -0
  638. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive.py +0 -0
  639. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue.py +0 -0
  640. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue_blocked_rendering.py +0 -0
  641. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue_launch_argv.py +0 -0
  642. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  643. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue_roll_pending.py +0 -0
  644. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  645. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_state.py +0 -0
  646. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_drive_tmux.py +0 -0
  647. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_epic_up_capability_detection.py +0 -0
  648. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  649. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_epic_up_image_provenance.py +0 -0
  650. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_errors.py +0 -0
  651. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_events.py +0 -0
  652. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_failure_class.py +0 -0
  653. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_filelock.py +0 -0
  654. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  655. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_fix_of_force_override.py +0 -0
  656. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_fleet_config_health.py +0 -0
  657. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_fleet_health_probes.py +0 -0
  658. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_fleet_health_snapshot.py +0 -0
  659. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_fleet_watchdog.py +0 -0
  660. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_forge_availability.py +0 -0
  661. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_freshness.py +0 -0
  662. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gate_a.py +0 -0
  663. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gate_b.py +0 -0
  664. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gate_snapshot_staleness.py +0 -0
  665. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gates.py +0 -0
  666. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  667. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_gen_mock_index.py +0 -0
  668. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_generated_rust_fixture.py +0 -0
  669. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_generated_rust_requests.py +0 -0
  670. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_generated_types_fixture.py +0 -0
  671. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_github_ops.py +0 -0
  672. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_github_throttle.py +0 -0
  673. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_goal.py +0 -0
  674. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_graph_health.py +0 -0
  675. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_graph_selfheal_absent_2237.py +0 -0
  676. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_handoff.py +0 -0
  677. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_checks.py +0 -0
  678. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_cli.py +0 -0
  679. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_cli_graph.py +0 -0
  680. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_config.py +0 -0
  681. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_context.py +0 -0
  682. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_coord_tui_ci_pin.py +0 -0
  683. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_coord_web_ci_pin.py +0 -0
  684. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_deploy_lane_facts.py +0 -0
  685. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_fix.py +0 -0
  686. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_incident_regression.py +0 -0
  687. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_issues_sync_staleness.py +0 -0
  688. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_pr_churn.py +0 -0
  689. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_pypi.py +0 -0
  690. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_registry.py +0 -0
  691. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_release_cordon_probe.py +0 -0
  692. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_timer_active.py +0 -0
  693. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_toolchain.py +0 -0
  694. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_unit_drift.py +0 -0
  695. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_unit_enablement.py +0 -0
  696. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_health_wedged_drive_queue.py +0 -0
  697. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_hooks.py +0 -0
  698. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_human_attended_437.py +0 -0
  699. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_init.py +0 -0
  700. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_install_agent_venv_2911.py +0 -0
  701. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_integration.py +0 -0
  702. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_briefing_echo.py +0 -0
  703. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_pane_log_2541.py +0 -0
  704. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_prefill_state.py +0 -0
  705. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_session_relaunch.py +0 -0
  706. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_test_verdict_backstop.py +0 -0
  707. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_token_attribution.py +0 -0
  708. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_interactive_worktree.py +0 -0
  709. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_issue_store_seam.py +0 -0
  710. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_issues_sync_status.py +0 -0
  711. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_liveness_auditor.py +0 -0
  712. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_liveness_notify.py +0 -0
  713. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_lock_contention_ratchet.py +0 -0
  714. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_machine_metrics.py +0 -0
  715. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_machine_onboard.py +0 -0
  716. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_machine_pause.py +0 -0
  717. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_machine_stats.py +0 -0
  718. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_merge_queue.py +0 -0
  719. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_merge_verify.py +0 -0
  720. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_milestone_chat.py +0 -0
  721. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_milestone_dispatch.py +0 -0
  722. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_milestone_gate.py +0 -0
  723. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_milestone_order.py +0 -0
  724. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_milestone_seam.py +0 -0
  725. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_mock_author.py +0 -0
  726. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_model_tiering.py +0 -0
  727. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_models.py +0 -0
  728. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_models_config_labels.py +0 -0
  729. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_needs_attention.py +0 -0
  730. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_network.py +0 -0
  731. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_new_issue_chat.py +0 -0
  732. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_next_release_tag.py +0 -0
  733. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_node_shim.py +0 -0
  734. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_baseline.py +0 -0
  735. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_cli.py +0 -0
  736. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_collect.py +0 -0
  737. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_config.py +0 -0
  738. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_drive_seam.py +0 -0
  739. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_isolation.py +0 -0
  740. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_predicate.py +0 -0
  741. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_quiet_hours.py +0 -0
  742. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notifier_service.py +0 -0
  743. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notify.py +0 -0
  744. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_notify_drain.py +0 -0
  745. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_openapi.py +0 -0
  746. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_operational_defaults.py +0 -0
  747. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_overlap_fence.py +0 -0
  748. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_overlap_predict.py +0 -0
  749. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_packaged_deploy_units.py +0 -0
  750. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_parentage.py +0 -0
  751. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_paste_landed.py +0 -0
  752. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  753. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_pipeline.py +0 -0
  754. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_plan_followup_approve_plan_command.py +0 -0
  755. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_plan_followup_pr_command.py +0 -0
  756. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_plan_followup_review_command.py +0 -0
  757. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_plan_only.py +0 -0
  758. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_plan_parser.py +0 -0
  759. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_platform_paths.py +0 -0
  760. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_portal_bridge.py +0 -0
  761. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_portal_config.py +0 -0
  762. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_portal_store.py +0 -0
  763. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_portal_sync.py +0 -0
  764. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_pr_body_lint.py +0 -0
  765. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_prereqs.py +0 -0
  766. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_production_db_guard.py +0 -0
  767. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_progress.py +0 -0
  768. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_provider_seam.py +0 -0
  769. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_providers.py +0 -0
  770. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_providers_config_labels.py +0 -0
  771. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_providers_pty.py +0 -0
  772. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_provision_core.py +0 -0
  773. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_provision_machine.py +0 -0
  774. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_py_rust_mirror_inventory.py +0 -0
  775. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_quiet_hours.py +0 -0
  776. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_quiet_hours_store_2146.py +0 -0
  777. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reap_merged_sessions.py +0 -0
  778. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reap_stale_interactive_tick.py +0 -0
  779. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile.py +0 -0
  780. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_branch.py +0 -0
  781. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_completions.py +0 -0
  782. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  783. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_merges.py +0 -0
  784. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_no_agent_record.py +0 -0
  785. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_tick.py +0 -0
  786. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reconcile_usage_limit_done.py +0 -0
  787. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_refine_chat.py +0 -0
  788. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_cordon_2101.py +0 -0
  789. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  790. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_cordon_deadlock_2240.py +0 -0
  791. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_cordon_stuck_2490.py +0 -0
  792. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_propagate.py +0 -0
  793. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_propagate_threshold.py +0 -0
  794. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_roll_between_legs_2854.py +0 -0
  795. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_roll_window_handoff.py +0 -0
  796. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_unified_1242.py +0 -0
  797. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_verify.py +0 -0
  798. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_release_window.py +0 -0
  799. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_remote_auto_prune.py +0 -0
  800. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_remote_interactive_reaper.py +0 -0
  801. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_repo_add.py +0 -0
  802. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_repo_dormancy.py +0 -0
  803. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_repo_edit_2220.py +0 -0
  804. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_repo_graph_fleet_2237.py +0 -0
  805. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_repo_onboard_2220.py +0 -0
  806. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_report_result_push.py +0 -0
  807. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_reports.py +0 -0
  808. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_retry.py +0 -0
  809. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_retry_advisory_1606.py +0 -0
  810. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_retry_type_1636.py +0 -0
  811. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_revalidate.py +0 -0
  812. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review.py +0 -0
  813. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_end_review_without_verdict.py +0 -0
  814. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_parse_failure_diagnostic.py +0 -0
  815. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_reaffirm.py +0 -0
  816. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_state.py +0 -0
  817. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_verdict_backstop.py +0 -0
  818. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_verdict_override_audit.py +0 -0
  819. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_verdict_relay.py +0 -0
  820. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_review_zero_commits.py +0 -0
  821. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_scoped_review_wiring.py +0 -0
  822. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_scorecard.py +0 -0
  823. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_self_health.py +0 -0
  824. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_serve.py +0 -0
  825. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_serve_app.py +0 -0
  826. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_serve_app_board_trim.py +0 -0
  827. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_serve_rest_routes.py +0 -0
  828. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_session.py +0 -0
  829. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_slice_issue_attribution.py +0 -0
  830. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_smoke.py +0 -0
  831. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_smoke_live_checkout_restore.py +0 -0
  832. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_smoke_workflow.py +0 -0
  833. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_spend_ceiling.py +0 -0
  834. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_spend_ceiling_coordinator.py +0 -0
  835. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_split.py +0 -0
  836. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_split_work.py +0 -0
  837. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stage_projection.py +0 -0
  838. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stale_busy_reviewer_697.py +0 -0
  839. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stalled_pipeline.py +0 -0
  840. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_state.py +0 -0
  841. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_state_review_findings_daemon.py +0 -0
  842. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_status_fleet_footer.py +0 -0
  843. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stop_1567.py +0 -0
  844. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_store_migrate.py +0 -0
  845. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stuck.py +0 -0
  846. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  847. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_terminal_command.py +0 -0
  848. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_author.py +0 -0
  849. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_chat.py +0 -0
  850. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_orchestrator.py +0 -0
  851. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_report.py +0 -0
  852. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_verdict_parsing.py +0 -0
  853. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_test_verdict_transcript_floor.py +0 -0
  854. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_text_io_encoding_audit.py +0 -0
  855. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_thin_client_board_audit.py +0 -0
  856. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_thin_client_config_load_1080.py +0 -0
  857. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_thin_client_daemon_routing_906.py +0 -0
  858. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_throwaway_vm.py +0 -0
  859. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_tmux_host.py +0 -0
  860. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_tmux_session.py +0 -0
  861. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_transcript_floor.py +0 -0
  862. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_uat_checks.py +0 -0
  863. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_usage.py +0 -0
  864. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_usage_limits.py +0 -0
  865. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_usage_rollup.py +0 -0
  866. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_venv_live_install_2121.py +0 -0
  867. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_version_single_source.py +0 -0
  868. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_watch.py +0 -0
  869. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  870. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worker_env_venv_isolation.py +0 -0
  871. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worker_events.py +0 -0
  872. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worker_image_pin_sync.py +0 -0
  873. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worker_safety.py +0 -0
  874. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worker_test_scoping.py +0 -0
  875. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worktree.py +0 -0
  876. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  877. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/tests/test_write_parity.py +0 -0
  878. {code_coordinator-0.5.452 → code_coordinator-0.5.454}/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.452
3
+ Version: 0.5.454
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.452
3
+ Version: 0.5.454
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
@@ -657,6 +657,7 @@ tests/test_health_unit_drift.py
657
657
  tests/test_health_unit_enablement.py
658
658
  tests/test_health_wedged_drive_queue.py
659
659
  tests/test_hooks.py
660
+ tests/test_housekeeping.py
660
661
  tests/test_human_attended_437.py
661
662
  tests/test_init.py
662
663
  tests/test_install_agent_venv_2911.py
@@ -683,6 +683,7 @@
683
683
  "tests/test_health_unit_enablement.py",
684
684
  "tests/test_health_wedged_drive_queue.py",
685
685
  "tests/test_hooks.py",
686
+ "tests/test_housekeeping.py",
686
687
  "tests/test_human_attended_437.py",
687
688
  "tests/test_init.py",
688
689
  "tests/test_install_agent_venv_2911.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.452",
2
+ "tag": "0.5.454",
3
3
  "distance": 0,
4
- "node": "g69efb323ff5ace2c8783a4e3eb8deb0b37b5aff0",
4
+ "node": "ga4a99bfd3ea79dd343b5828974ef637592ae4897",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-11"
@@ -78,6 +78,7 @@ from __future__ import annotations
78
78
  import json
79
79
  import os
80
80
  import sqlite3
81
+ import threading
81
82
  import time
82
83
  from contextlib import closing
83
84
  from pathlib import Path
@@ -186,6 +187,9 @@ class CoordStore(Protocol):
186
187
  def get_assignment(self, assignment_id: str) -> dict | None: ...
187
188
  def get_issue(self, repo_name: str, number: int) -> dict | None: ...
188
189
 
190
+ # ── change detection (#3294) ────────────────────────────────────────────
191
+ def change_token(self) -> str: ...
192
+
189
193
 
190
194
  def compute_board_keep_ids(
191
195
  assignment_index: list[dict],
@@ -305,10 +309,28 @@ class SqliteStore:
305
309
  pooling under real load) and never migrates the DB. ``board_projection``
306
310
  opens a single connection so the whole payload is one consistent
307
311
  snapshot.
312
+
313
+ ``change_token()`` (#3294) is the one exception to "fresh connection per
314
+ call": ``PRAGMA data_version`` is relative to the connection that reads
315
+ it — a brand-new SQLite connection always reports the same baseline
316
+ value no matter how many *other* connections have committed writes
317
+ before it opened, and only starts advancing once IT has observed a
318
+ change. So the cheap "did anything write?" signal only works against a
319
+ connection this store keeps open across calls; see ``_change_conn``
320
+ below and ``change_token``'s docstring.
308
321
  """
309
322
 
310
323
  def __init__(self, db_path: Path | str | None = None) -> None:
311
324
  self._path = Path(db_path) if db_path is not None else DB_PATH
325
+ # #3294: lazily-opened, kept-open connection dedicated to
326
+ # `change_token()` — see the class docstring for why this one
327
+ # connection is the exception to "fresh connection per call".
328
+ # Guarded by `_change_lock` because it is shared between the event
329
+ # loop thread (the /board handler's initial freshness check) and a
330
+ # threadpool worker (the same handler's rebuild leader) — see
331
+ # coord.serve_app's board().
332
+ self._change_conn: Any = None
333
+ self._change_lock = threading.Lock()
312
334
 
313
335
  # ── connection ────────────────────────────────────────────────────────────
314
336
  def _connect(self) -> Any:
@@ -576,3 +598,77 @@ class SqliteStore:
576
598
  # retention cap; `after_json` arrives decoded as a real list.
577
599
  "drive_queue": self._table(conn, "drive_queue", order="position"),
578
600
  }
601
+
602
+ # ── change detection (#3294) ────────────────────────────────────────────
603
+ def _open_change_conn(self) -> Any:
604
+ conn = sql.connect(
605
+ backend=sql.DIALECT_SQLITE,
606
+ sqlite_path=self._path,
607
+ read_only=True,
608
+ check_same_thread=False,
609
+ )
610
+ sql.apply_row_factory(conn)
611
+ sql.apply_connection_setup(conn, read_only=True)
612
+ return conn
613
+
614
+ def change_token(self) -> str:
615
+ """A cheap, opaque "has anything been written since I last asked?" token.
616
+
617
+ Backs the ``/board`` read path's cache invalidation in
618
+ ``coord.serve_app`` (the board() handler's cache block): a 1.5 s TTL
619
+ forced a full board rebuild on essentially every poll even when
620
+ nothing had changed, because pollers run at 5 s and always missed the
621
+ window. This token replaces "younger than N seconds" with "no write
622
+ since this build" as the PRIMARY trigger -- the TTL survives only as
623
+ a safety upper bound (see serve_app.py) in case this token's source
624
+ ever misses a write path.
625
+
626
+ SQLite: :func:`coord.sql.sqlite_data_version` (``PRAGMA
627
+ data_version``, spelled in the dialect seam rather than here --
628
+ ``PRAGMA`` is SQLite-only statement text and ``coord/sql.py`` is the
629
+ one module allowed to name one, #2782/#1948), which changes whenever
630
+ ANY connection -- not just this process's own POSTs, but the
631
+ drive-queue timer and a concurrent ``coord notify`` writing locally
632
+ too -- commits to the database file. **Unlike every other read in
633
+ this class, this is NOT a fresh connection per call**: ``data_version``
634
+ is relative to the connection that reads it, and a brand-new
635
+ connection always reports the same baseline value regardless of how
636
+ many other connections committed before it opened -- it only starts
637
+ advancing once it has personally observed a change. So this method
638
+ reuses one connection (``_change_conn``, opened lazily, guarded by
639
+ ``_change_lock`` since it's shared between the event loop thread and
640
+ a threadpool worker -- see ``coord.serve_app.board()``) across every
641
+ call for the life of this ``SqliteStore``. See
642
+ https://sqlite.org/pragma.html#pragma_data_version. A failure (e.g.
643
+ the connection went stale) reopens once and, failing that, propagates
644
+ -- callers must treat any exception here as "assume changed, rebuild"
645
+ rather than crash the read path over a cache optimization.
646
+
647
+ Postgres (#827's in-flight lane): TODO(#3294-pg) -- ``data_version``
648
+ has no Postgres equivalent. A ``board_revision`` sequence bumped at
649
+ each write choke point (the ``_*_local()`` family in
650
+ ``coord/state.py``) or a ``LISTEN``/``NOTIFY`` channel are the two
651
+ candidates the issue names; until one lands, this returns a constant
652
+ so two calls always compare equal and the cache degrades to
653
+ "TTL-only" -- exactly today's (pre-#3294) behaviour -- rather than
654
+ silently caching forever or rebuilding on every request.
655
+ """
656
+ target = db_mod._resolve_store_target()
657
+ if target.backend == sql.DIALECT_POSTGRES:
658
+ return "pg-change-token-unimplemented" # TODO(#3294-pg)
659
+ with self._change_lock:
660
+ if self._change_conn is None:
661
+ self._change_conn = self._open_change_conn()
662
+ try:
663
+ return sql.sqlite_data_version(self._change_conn)
664
+ except Exception: # noqa: BLE001 — reopen-once fallback, see below
665
+ # Stale/broken connection (e.g. the underlying file was
666
+ # replaced out from under us) — reopen once. A repeat
667
+ # failure propagates to the caller, which treats it as
668
+ # "assume changed" rather than serving a false cache hit.
669
+ try:
670
+ self._change_conn.close()
671
+ except Exception: # noqa: BLE001 — already broken, best effort
672
+ pass
673
+ self._change_conn = self._open_change_conn()
674
+ return sql.sqlite_data_version(self._change_conn)
@@ -7,6 +7,16 @@ Like the other fleet checks in this package, the daemon's ``/board`` handler
7
7
  (``coord.serve_app``) is the thing that actually measures its own latency and
8
8
  serialized body size on each rebuild; this probe only judges the numbers it's
9
9
  handed.
10
+
11
+ #3294 added a third, advisory-only number: how many rebuilds actually
12
+ *published* in the last 60s (``board_builds_per_minute`` on ``daemon_host``,
13
+ tracked by ``FleetHealthRefresher.record_board_stats``). The ``/board`` cache
14
+ used to rebuild on a fixed 1.5s TTL regardless of whether anything had
15
+ written — pollers run at 5s, so that meant a rebuild on nearly every poll.
16
+ The cache's primary trigger is now "a write happened" (``dao.CoordStore.
17
+ change_token``); this field is what makes that claim measurable rather than
18
+ assumed. Never affects severity — a burst of real writes legitimately drives
19
+ it up.
10
20
  """
11
21
 
12
22
  from __future__ import annotations
@@ -41,6 +51,13 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
41
51
  dh = ctx.fleet.daemon_host or {}
42
52
  latency_ms = dh.get("board_latency_ms")
43
53
  payload_bytes = dh.get("board_payload_bytes")
54
+ # #3294: how many /board REBUILDS (not requests) published in the last
55
+ # 60s — the direct measurement of whether the write-triggered cache
56
+ # (dao.CoordStore.change_token, replacing the old 1.5s TTL) is actually
57
+ # cutting rebuilds, rather than an assumption. Advisory only: absent on
58
+ # an older daemon that hasn't published a build yet, and never affects
59
+ # severity below — a burst of real writes legitimately drives this up.
60
+ builds_per_minute = dh.get("board_builds_per_minute")
44
61
 
45
62
  if latency_ms is None and payload_bytes is None:
46
63
  return CheckResult(
@@ -72,6 +89,8 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
72
89
  parts.append(f"{latency_ms:.0f}ms")
73
90
  if payload_bytes is not None:
74
91
  parts.append(human_bytes(payload_bytes))
92
+ if builds_per_minute is not None:
93
+ parts.append(f"{builds_per_minute} build/min")
75
94
  headroom = " / ".join(parts) if parts else "no data"
76
95
  if severity is not Severity.OK:
77
96
  headroom += f" ({', '.join(reasons)})"
@@ -85,5 +104,9 @@ def probe_board_latency(ctx: HealthContext) -> CheckResult:
85
104
  f"warn at {human_bytes(_PAYLOAD_WARN_BYTES)}/{_LATENCY_WARN_MS:.0f}ms, "
86
105
  f"crit at {human_bytes(_PAYLOAD_CRIT_BYTES)}/{_LATENCY_CRIT_MS:.0f}ms"
87
106
  ),
88
- values={"latency_ms": latency_ms, "payload_bytes": payload_bytes},
107
+ values={
108
+ "latency_ms": latency_ms,
109
+ "payload_bytes": payload_bytes,
110
+ "builds_per_minute": builds_per_minute,
111
+ },
89
112
  )
@@ -39,6 +39,7 @@ import json
39
39
  import logging
40
40
  import os
41
41
  import time
42
+ from collections import deque
42
43
  from dataclasses import dataclass, field
43
44
  from pathlib import Path
44
45
 
@@ -276,6 +277,13 @@ class FleetHealthRefresher:
276
277
  # than fabricating a 0.
277
278
  self._board_latency_ms: float | None = None
278
279
  self._board_payload_bytes: int | None = None
280
+ # #3294: one timestamp per PUBLISHED /board build (never per request
281
+ # — a cache hit or a 304 doesn't rebuild, so it doesn't append here).
282
+ # This is the daemon-side, directly-measured answer to "did #3294's
283
+ # write-triggered cache actually cut rebuilds?", rather than an
284
+ # assumption — see `_builds_per_minute` and `probe_board_latency`
285
+ # (coord/health/checks/fleet_board.py).
286
+ self._board_build_timestamps: deque[float] = deque()
279
287
 
280
288
  def snapshot(self) -> FleetHealthSnapshot:
281
289
  return self._snapshot
@@ -284,12 +292,31 @@ class FleetHealthRefresher:
284
292
  """Called by the /board handler after each publish (#1630/#1597).
285
293
 
286
294
  Deliberately NOT I/O and NOT gated on the tick cadence — recording a
287
- float+int is free, and the alternative (recomputing board latency
288
- independently from this refresher) would mean building a whole
289
- second board just to measure it, defeating the point of the check.
295
+ float+int (+ one timestamp, #3294) is free, and the alternative
296
+ (recomputing board latency independently from this refresher) would
297
+ mean building a whole second board just to measure it, defeating the
298
+ point of the check.
290
299
  """
291
300
  self._board_latency_ms = latency_ms
292
301
  self._board_payload_bytes = payload_bytes
302
+ self._board_build_timestamps.append(time.time())
303
+ self._prune_build_timestamps()
304
+
305
+ def _prune_build_timestamps(self, now: float | None = None) -> None:
306
+ """Drop build timestamps older than 60s — #3294's rolling window."""
307
+ cutoff = (now if now is not None else time.time()) - 60.0
308
+ timestamps = self._board_build_timestamps
309
+ while timestamps and timestamps[0] < cutoff:
310
+ timestamps.popleft()
311
+
312
+ def _builds_per_minute(self, now: float) -> int:
313
+ """#3294: how many /board REBUILDS (not requests) published in the
314
+ last 60s — the direct measurement backing the write-triggered
315
+ cache's whole premise ("rebuilds should track writes, not a 5s poll
316
+ clock"). Read by `refresh()` below into ``daemon_host`` for
317
+ ``fleet_board_latency`` (coord/health/checks/fleet_board.py)."""
318
+ self._prune_build_timestamps(now)
319
+ return len(self._board_build_timestamps)
293
320
 
294
321
  def refresh(self, config) -> FleetHealthSnapshot: # noqa: ANN001 — coord.config.Config
295
322
  from coord import network, state # noqa: PLC0415
@@ -376,6 +403,7 @@ class FleetHealthRefresher:
376
403
  daemon_host["phantom_running"] = self._phantom_running_rows(machines)
377
404
  daemon_host["board_latency_ms"] = self._board_latency_ms
378
405
  daemon_host["board_payload_bytes"] = self._board_payload_bytes
406
+ daemon_host["board_builds_per_minute"] = self._builds_per_minute(now)
379
407
  # #2858: per-repo issues-sync staleness — a small local JSON read
380
408
  # (coord.issues_sync_status), same "daemon-host-local fact" shape as
381
409
  # the two lines above. `coord.health.checks.issues_sync_staleness`
@@ -41,6 +41,30 @@ is wired in too, reclaiming ``~/.coord/confirm-worktrees/`` entries that
41
41
  outlived ``confirm_branch``'s own per-run cleanup. That is disk hygiene, not
42
42
  DB archiving, but reusing this sweep's cadence beats inventing a second timer
43
43
  for a second maintenance job.
44
+
45
+ #3296: the same sweep also archives two tables #1107/#762 never reached —
46
+ both ~800 KB of every ``/board`` poll with no retention policy at all, per a
47
+ live-fleet sample that found 1,114 ``drive_queue`` rows all ``state=done``
48
+ and 13 of 14 ``plans`` rows belonging to assignments no longer on the board:
49
+
50
+ * terminal ``drive_queue`` rows (:data:`coord.drive_queue.TERMINAL_QUEUE_STATES`
51
+ — the same "is this queue entry terminal" answer the tick processor itself
52
+ uses, not a second definition) older than the retention window ->
53
+ ``drive_queue_archive``. Age is read off the row's own last-touched
54
+ timestamp (``reason_at`` if the row was ever updated post-launch, else
55
+ ``launched_at``, else ``enqueued_at``) — the same fallback chain
56
+ ``merge_queue``'s ``last_attempt or enqueued_at`` uses just below.
57
+ * ``plans`` rows whose ``assignment_id`` no longer appears in the live
58
+ ``assignments`` table (i.e. that assignment has itself already been
59
+ archived — by this sweep or an earlier one) -> ``plans_archive``. A plan
60
+ can only orphan once its assignment ages out, which already implies it is
61
+ past the retention window, so no separate cutoff is needed for ``plans``.
62
+
63
+ Both move via the same ``_move_rows``/``_ensure_archive_mirror`` machinery
64
+ above — move-not-delete, dumb-mirror archive tables — so ``GET
65
+ /drive-queue?state=...`` can still retrieve archived history (see
66
+ ``coord.serve_app``) and nothing is ever unreachable, only un-shipped by
67
+ default from the live table / board projection.
44
68
  """
45
69
 
46
70
  from __future__ import annotations
@@ -71,6 +95,10 @@ _NOTIFICATIONS_ARCHIVE = "notifications_archive"
71
95
  _MERGE_QUEUE = "merge_queue"
72
96
  _MERGE_QUEUE_ARCHIVE = "merge_queue_archive"
73
97
  _MERGE_QUEUE_MERGED_STATE = "merged"
98
+ _DRIVE_QUEUE = "drive_queue"
99
+ _DRIVE_QUEUE_ARCHIVE = "drive_queue_archive"
100
+ _PLANS = "plans"
101
+ _PLANS_ARCHIVE = "plans_archive"
74
102
  _BATCH = 400 # keep IN(...) clauses well under SQLite's 999-variable limit
75
103
 
76
104
 
@@ -148,20 +176,27 @@ def _move_rows(
148
176
 
149
177
  def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
150
178
  """Archive stale terminal assignments + their notifications + merged
151
- merge_queue entries, and reclaim leaked confirm-worktree directories.
179
+ merge_queue entries + terminal drive_queue rows + orphaned plans, and
180
+ reclaim leaked confirm-worktree directories.
152
181
 
153
182
  Returns ``{"archived_assignments": N, "archived_notifications": M,
154
- "archived_merge_queue": K, "removed_confirm_worktrees": W, "dry_run": bool,
155
- "retention_days": D}``. ``archived_*``/``removed_confirm_worktrees`` are
156
- the counts that were (or, for ``dry_run``, would be) moved/deleted. A
157
- no-op returns zeros.
183
+ "archived_merge_queue": K, "archived_drive_queue": Q, "archived_plans": P,
184
+ "removed_confirm_worktrees": W, "dry_run": bool, "retention_days": D}``.
185
+ ``archived_*``/``removed_confirm_worktrees`` are the counts that were (or,
186
+ for ``dry_run``, would be) moved/deleted. A no-op returns zeros.
158
187
 
159
188
  Conservative by construction: nothing active, recent (within the archive
160
189
  window), queued-for-merge, latest-of-an-open-issue, or review-linked to any
161
190
  such row is ever moved. Merge queue entries are archived only once they
162
191
  are in the terminal ``MERGED`` state (#1107 Part 3) — non-terminal /
163
192
  conflicted entries are left for ``prune_stale_queue_entries`` or manual
164
- ``coord merge --drop``.
193
+ ``coord merge --drop``. Drive-queue entries are archived only once they
194
+ are in a :data:`coord.drive_queue.TERMINAL_QUEUE_STATES` state AND older
195
+ than the retention window (#3296) — a fresh ``done``/``blocked``/
196
+ ``failed`` row stays put until it ages out, same as everything else this
197
+ sweep touches. ``plans`` rows follow their assignment: once an
198
+ assignment_id no longer appears in the live ``assignments`` table, its
199
+ plan is orphaned and moves too.
165
200
 
166
201
  #2974: ``removed_confirm_worktrees`` is independent of the DB-archiving
167
202
  ``cutoff``/``retention_days`` above (it has its own, much shorter,
@@ -179,6 +214,8 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
179
214
  "archived_assignments": 0,
180
215
  "archived_notifications": 0,
181
216
  "archived_merge_queue": 0,
217
+ "archived_drive_queue": 0,
218
+ "archived_plans": 0,
182
219
  "removed_confirm_worktrees": len(swept_worktrees["removed"]),
183
220
  "dry_run": dry_run,
184
221
  "retention_days": _archive_retention_days(),
@@ -240,10 +277,47 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
240
277
  )
241
278
  ]
242
279
 
280
+ # #3296: terminal drive_queue rows past the retention window. Reuses
281
+ # `coord.drive_queue.TERMINAL_QUEUE_STATES` — the same "is this queue
282
+ # entry terminal" the tick processor itself answers — rather than a
283
+ # second, driftable definition here.
284
+ from coord.drive_queue import TERMINAL_QUEUE_STATES # noqa: PLC0415
285
+
286
+ dq_rows = sql.execute(
287
+ conn,
288
+ "SELECT id, state, reason_at, launched_at, enqueued_at " # noqa: S608
289
+ f"FROM {_DRIVE_QUEUE}",
290
+ ).fetchall()
291
+ dq_candidates = [
292
+ r["id"]
293
+ for r in dq_rows
294
+ if (r["state"] or "").lower() in TERMINAL_QUEUE_STATES
295
+ and (r["reason_at"] or r["launched_at"] or r["enqueued_at"] or 0) < cutoff
296
+ ]
297
+
298
+ # #3296: `plans` rows whose assignment is no longer in the live
299
+ # `assignments` table — orphaned either by the archiving just computed
300
+ # above, or by an earlier sweep (run before this feature existed, hence
301
+ # the live fleet's 13-of-14-orphaned sample). No separate cutoff: a plan
302
+ # can only orphan once its assignment ages out, which already implies
303
+ # it's past the retention window.
304
+ live_assignment_ids = {r["assignment_id"] for r in index} - candidate_set
305
+ plan_candidates = [
306
+ r["assignment_id"]
307
+ for r in sql.execute(
308
+ conn, f"SELECT assignment_id FROM {_PLANS}" # noqa: S608
309
+ ).fetchall()
310
+ if r["assignment_id"] and r["assignment_id"] not in live_assignment_ids
311
+ ]
312
+
243
313
  result["archived_assignments"] = len(candidates)
244
314
  result["archived_notifications"] = len(notif_ids)
245
315
  result["archived_merge_queue"] = len(mq_merged_ids)
246
- if dry_run or (not candidates and not notif_ids and not mq_merged_ids):
316
+ result["archived_drive_queue"] = len(dq_candidates)
317
+ result["archived_plans"] = len(plan_candidates)
318
+ if dry_run or not (
319
+ candidates or notif_ids or mq_merged_ids or dq_candidates or plan_candidates
320
+ ):
247
321
  return result
248
322
 
249
323
  with conn:
@@ -259,4 +333,8 @@ def sweep(*, dry_run: bool = False, now: float | None = None) -> dict:
259
333
  _move_rows(
260
334
  conn, _MERGE_QUEUE, _MERGE_QUEUE_ARCHIVE, "assignment_id", mq_merged_ids
261
335
  )
336
+ if dq_candidates:
337
+ _move_rows(conn, _DRIVE_QUEUE, _DRIVE_QUEUE_ARCHIVE, "id", dq_candidates)
338
+ if plan_candidates:
339
+ _move_rows(conn, _PLANS, _PLANS_ARCHIVE, "assignment_id", plan_candidates)
262
340
  return result
@@ -4800,7 +4800,11 @@ def openapi_spec() -> dict:
4800
4800
  "summary": (
4801
4801
  "#1753: read the operator-declared `coord drive` work "
4802
4802
  "queue in run order. Filter by repo_name (+ optional "
4803
- "issue_number); omit both to list the whole queue."
4803
+ "issue_number); omit both to list the whole queue. "
4804
+ "#3296: an explicit `state` also pulls in matching rows "
4805
+ "`coord.housekeeping.sweep()` has since archived, so "
4806
+ "terminal history stays reachable after it ages out of "
4807
+ "the live table."
4804
4808
  ),
4805
4809
  "parameters": [
4806
4810
  {
@@ -4811,6 +4815,16 @@ def openapi_spec() -> dict:
4811
4815
  "name": "issue_number", "in": "query", "required": False,
4812
4816
  "schema": {"type": "integer"},
4813
4817
  },
4818
+ {
4819
+ "name": "state", "in": "query", "required": False,
4820
+ "schema": {"type": "string"},
4821
+ "description": (
4822
+ "#3296: filter by drive_queue.state (e.g. "
4823
+ "'done'/'blocked'/'failed'). When given, also "
4824
+ "reads drive_queue_archive so archived rows "
4825
+ "matching this state are still returned."
4826
+ ),
4827
+ },
4814
4828
  ],
4815
4829
  "responses": {
4816
4830
  "200": {"description": "OK"},
@@ -5821,14 +5835,30 @@ def build_app(
5821
5835
 
5822
5836
  _machine_metrics_sampler = machine_metrics_sampler or MachineMetricsSampler()
5823
5837
 
5824
- # Short-TTL cache for the computed /board projection so burst polls from the
5825
- # TUI don't each pay the full board_projection + merge-plan + stage-projection
5838
+ # Cache for the computed /board projection so burst polls from the TUI
5839
+ # don't each pay the full board_projection + merge-plan + stage-projection
5826
5840
  # recomputation (~465-issue load measured in the issue). Keyed to nothing
5827
- # (one board per daemon instance). TTL controlled by COORD_BOARD_CACHE_TTL
5828
- # (default 1.5 s). Busted immediately on board-mutating POSTs so a user
5829
- # action is visible on the very next poll without waiting out the TTL.
5841
+ # (one board per daemon instance).
5842
+ #
5843
+ # #3294: the cache's PRIMARY invalidation trigger is "has anything
5844
+ # written since this build?" (``store.change_token()``, ``dao.CoordStore``
5845
+ # protocol — SQLite: ``PRAGMA data_version``), not a fixed clock. A 1.5 s
5846
+ # TTL forced a full rebuild on essentially every poll, because pollers
5847
+ # run at 5 s and always missed the window — and the rebuild (the
5848
+ # ``fleet_board_latency`` check's own 0.65-0.8 s measurement) is what
5849
+ # actually held the GIL, not the wire cost the ETag already covers.
5850
+ # ``COORD_BOARD_CACHE_TTL`` (default below) survives only as a SAFETY
5851
+ # UPPER BOUND — a rebuild is forced past that age regardless of the
5852
+ # change token, in case the token's source ever misses a write path —
5853
+ # not as the primary trigger. Busted immediately on board-mutating POSTs
5854
+ # (``_bust_board_cache``, unchanged by #3294) so a user action is visible
5855
+ # on the very next poll without waiting on either signal.
5830
5856
  _board_cache: dict | None = None
5831
5857
  _board_cache_at: float = 0.0
5858
+ # #3294: the ``store.change_token()`` value as of ``_board_cache``'s
5859
+ # build. A poll is served from cache only when the CURRENT token still
5860
+ # equals this one — i.e. nothing has written since.
5861
+ _board_cache_token: str | None = None
5832
5862
  # #1597 Part 2: the fully-rendered JSON bytes for the currently-cached
5833
5863
  # build, shared verbatim by every response that serves ``_board_cache``
5834
5864
  # (a fresh build's own responses, every single-flight follower, and
@@ -6040,18 +6070,35 @@ def build_app(
6040
6070
  # config reloads prompt.
6041
6071
  _refresh_config()
6042
6072
 
6043
- # Part 2 (cache): serve a cached projection if it's still within the TTL.
6044
- # Burst polls (TUI polls every ~2 s) hit the cache; the real computation
6045
- # only runs once per TTL window. Cache is busted immediately by the
6046
- # board-mutating POST handlers below so user actions are visible on the
6047
- # very next poll without waiting out the TTL.
6073
+ # Part 2 (cache): serve the cached projection when nothing has
6074
+ # written since it was built (#3294). Burst polls (TUI polls every
6075
+ # ~2 s) hit the cache; the real computation only runs when a write
6076
+ # actually happened. Cache is also busted immediately by the
6077
+ # board-mutating POST handlers below so user actions are visible on
6078
+ # the very next poll without waiting on either signal.
6048
6079
  import time as _time # noqa: PLC0415
6049
- _ttl = float(os.getenv("COORD_BOARD_CACHE_TTL", "1.5"))
6080
+ # Safety upper bound only (#3294) — see the comment on
6081
+ # `_board_cache_token` above. Raised from the pre-#3294 1.5 s default
6082
+ # now that the change-token check is the primary trigger.
6083
+ _safety_ttl = float(os.getenv("COORD_BOARD_CACHE_TTL", "30"))
6050
6084
  _now = _time.monotonic()
6051
6085
  nonlocal _board_cache, _board_cache_at, _board_cache_built_at, _board_body
6052
- nonlocal _board_inflight
6086
+ nonlocal _board_cache_token, _board_inflight
6053
6087
  _client_etag = request.headers.get("if-none-match")
6054
6088
 
6089
+ # #3294: cheap "did anything write?" probe — see
6090
+ # `dao.CoordStore.change_token`'s docstring. Run inline (not
6091
+ # threadpooled) like `_refresh_config()`'s stat() just above: a
6092
+ # single PRAGMA on an already-open connection, not I/O of the shape
6093
+ # #1336 invariant 1 guards against. A failure here must never crash
6094
+ # the read path over a cache optimization — treat it as "assume
6095
+ # changed" (a sentinel that can never equal a real cached token) so
6096
+ # the worst case is an extra rebuild, never a wedged/stale cache.
6097
+ try:
6098
+ _current_token: str | None = store.change_token()
6099
+ except Exception: # noqa: BLE001 — fail toward rebuilding, not crashing
6100
+ _current_token = None
6101
+
6055
6102
  def _respond(result: dict, etag: str | None, body: bytes | None) -> Response:
6056
6103
  if _client_etag and etag and _client_etag == etag:
6057
6104
  # STILL identical to what the client holds — spare the wire
@@ -6076,7 +6123,18 @@ def build_app(
6076
6123
  _cached_etag = _board_etag
6077
6124
  _cached_at = _board_cache_at
6078
6125
  _cached_body = _board_body
6079
- if _cached is not None and (_now - _cached_at) < _ttl:
6126
+ _cached_token = _board_cache_token
6127
+ # #3294: fresh iff nothing wrote since this build (token still
6128
+ # matches) AND we're inside the safety-TTL ceiling. `_cached_token
6129
+ # is not None` rules out a `None == None` false match when either
6130
+ # side came from a failed change_token() read (see above).
6131
+ _fresh = (
6132
+ _cached is not None
6133
+ and _cached_token is not None
6134
+ and _cached_token == _current_token
6135
+ and (_now - _cached_at) < _safety_ttl
6136
+ )
6137
+ if _fresh:
6080
6138
  return _respond(_cached, _cached_etag, _cached_body)
6081
6139
 
6082
6140
  # #1597 Part 1: single-flight the rebuild. On a cache miss, at most
@@ -6122,12 +6180,24 @@ def build_app(
6122
6180
  # concurrent request calls _refresh_config() while _build() is running.
6123
6181
  _cfg = config
6124
6182
 
6125
- def _build() -> tuple[float, dict]:
6183
+ def _build() -> tuple[float, str | None, dict]:
6126
6184
  # Snapshot-order stamp: captured immediately before the DB read so
6127
6185
  # the publish step below can reject a build whose snapshot is
6128
6186
  # older than the one already cached (concurrent rebuilds can
6129
6187
  # finish out of order).
6130
6188
  _built_at = _time.monotonic()
6189
+ # #3294: the change token AS OF this build's snapshot moment —
6190
+ # published alongside the cache below so the *next* request's
6191
+ # freshness check compares against "what had (or hadn't) written
6192
+ # by the time THIS build started", not some later moment.
6193
+ # `None` (never a real token — see `_current_token` above) if the
6194
+ # read itself fails; that means the published cache below can
6195
+ # never look "fresh" to a later poll, which is the safe direction
6196
+ # to fail in.
6197
+ try:
6198
+ _built_token = store.change_token()
6199
+ except Exception: # noqa: BLE001 — see `_current_token` above
6200
+ _built_token = None
6131
6201
  # ── board projection ──────────────────────────────────────────────
6132
6202
  try:
6133
6203
  projection = store.board_projection()
@@ -6593,7 +6663,7 @@ def build_app(
6593
6663
  from coord.board_wire import bound_board_payload as _bound # noqa: PLC0415
6594
6664
 
6595
6665
  _bound(projection)
6596
- return _built_at, projection
6666
+ return _built_at, _built_token, projection
6597
6667
 
6598
6668
  # This coroutine is the single-flight leader: it alone runs _build(),
6599
6669
  # then fans its outcome out to every waiter (itself plus every
@@ -6601,7 +6671,7 @@ def build_app(
6601
6671
  # of the acceptance test, and why a failed build must reach every
6602
6672
  # waiter rather than wedging the followers.
6603
6673
  try:
6604
- built_at, result = await run_in_threadpool(_build)
6674
+ built_at, built_token, result = await run_in_threadpool(_build)
6605
6675
  except _BoardReadError as e:
6606
6676
  _board_inflight = None # clear FIRST: a retry must build fresh,
6607
6677
  # never see a "done" future and think it must wait on this one.
@@ -6650,7 +6720,9 @@ def build_app(
6650
6720
  _board_body = body
6651
6721
  _board_cache_at = _time.monotonic()
6652
6722
  _board_cache_built_at = built_at
6653
- # #1630: feed this build's own latency + wire size to the
6723
+ _board_cache_token = built_token # #3294
6724
+ # #1630/#3294: feed this build's own latency + wire size
6725
+ # (+ the fact that a build happened at all) to the
6654
6726
  # fleet-health snapshot's board-latency check — read back
6655
6727
  # on the health-poll tick's own cadence, never recomputed
6656
6728
  # inline (see FleetHealthRefresher.record_board_stats).
@@ -8687,9 +8759,16 @@ def build_app(
8687
8759
  # filters to that repo; `repo_name` + `issue_number` narrows to the (at
8688
8760
  # most one) entry for that issue; neither given lists the whole queue
8689
8761
  # (hand-sized by definition — one row per issue an operator queued).
8762
+ #
8763
+ # #3296: `?state=` additionally reads `drive_queue_archive` — the
8764
+ # live table alone would silently lose a terminal entry the moment
8765
+ # `coord.housekeeping.sweep()` ages it out, making archived history
8766
+ # unreachable rather than merely un-shipped-by-default from the
8767
+ # unfiltered list.
8690
8768
  from coord import state # noqa: PLC0415
8691
8769
 
8692
8770
  repo_name = request.query_params.get("repo_name")
8771
+ state_filter = request.query_params.get("state")
8693
8772
  raw_issue = request.query_params.get("issue_number")
8694
8773
  issue_number = None
8695
8774
  if raw_issue is not None:
@@ -8702,9 +8781,21 @@ def build_app(
8702
8781
  try:
8703
8782
  if repo_name and issue_number is not None:
8704
8783
  entry = state._get_drive_queue_entry_local(repo_name, issue_number)
8784
+ if entry is None and state_filter:
8785
+ entry = state._get_drive_queue_archive_entry_local(
8786
+ repo_name, issue_number
8787
+ )
8788
+ if (
8789
+ entry is not None
8790
+ and state_filter
8791
+ and entry.get("state") != state_filter
8792
+ ):
8793
+ entry = None
8705
8794
  entries = [entry] if entry else []
8706
8795
  else:
8707
- entries = state._list_drive_queue_local(repo_name)
8796
+ entries = state._list_drive_queue_local(
8797
+ repo_name, state=state_filter
8798
+ )
8708
8799
  except Exception as e: # noqa: BLE001
8709
8800
  return JSONResponse(
8710
8801
  {"error": "drive-queue read failed", "detail": str(e)},