code-coordinator 0.5.452__tar.gz → 0.5.453__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 (877) hide show
  1. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dao.py +96 -0
  5. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_board.py +24 -1
  6. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/fleet_snapshot.py +31 -3
  7. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/serve_app.py +75 -17
  8. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/sql.py +36 -0
  9. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_read_path.py +77 -3
  10. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_sql_dialect.py +58 -0
  11. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_sqlite_connect_ratchet.py +19 -5
  12. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_store_contract.py +15 -0
  13. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/.gitignore +0 -0
  26. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/GOAL.md +0 -0
  28. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/LICENSE +0 -0
  29. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/README.md +0 -0
  31. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/backup.py +0 -0
  51. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/client.py +0 -0
  66. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/codegen.py +0 -0
  67. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/backup.py +0 -0
  73. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/codegen.py +0 -0
  75. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/dr.py +0 -0
  78. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/drive.py +0 -0
  79. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/drive_queue.py +0 -0
  80. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/gate_a.py +0 -0
  81. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/gates.py +0 -0
  82. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/issues.py +0 -0
  83. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/lifecycle.py +0 -0
  84. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/machine.py +0 -0
  85. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/merge.py +0 -0
  86. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/milestone.py +0 -0
  87. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/plan_followup.py +0 -0
  88. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/plans.py +0 -0
  89. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/portal.py +0 -0
  90. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/pr.py +0 -0
  91. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/release.py +0 -0
  92. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/repo.py +0 -0
  93. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/report.py +0 -0
  94. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/review.py +0 -0
  95. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/scorecard.py +0 -0
  96. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/sessions.py +0 -0
  97. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/setup.py +0 -0
  98. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/status.py +0 -0
  99. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/store_migrate.py +0 -0
  100. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/terminal.py +0 -0
  101. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/test_gate.py +0 -0
  102. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/commands/tui.py +0 -0
  103. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/comments.py +0 -0
  104. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/config.py +0 -0
  105. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/config_reload.py +0 -0
  106. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/confirm_test.py +0 -0
  107. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/conflict_fix.py +0 -0
  108. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/server.py +0 -0
  112. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dashboard/terminal.py +0 -0
  113. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/db.py +0 -0
  114. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dead_end.py +0 -0
  115. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/decomposition_chat.py +0 -0
  116. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/README.md +0 -0
  117. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-agent.service +0 -0
  118. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-backup.service +0 -0
  119. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-backup.timer +0 -0
  120. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.service +0 -0
  121. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.sh +0 -0
  122. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.timer +0 -0
  123. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.service +0 -0
  124. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.timer +0 -0
  125. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.service +0 -0
  126. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.timer +0 -0
  127. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-failure-notify.service +0 -0
  128. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.service +0 -0
  129. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  130. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-notify.service +0 -0
  131. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-notify.timer +0 -0
  132. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.service +0 -0
  133. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.timer +0 -0
  134. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.service +0 -0
  135. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.timer +0 -0
  136. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-serve.service +0 -0
  137. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.service +0 -0
  138. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.timer +0 -0
  139. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy/coord-web.service +0 -0
  140. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy_manifest.py +0 -0
  141. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deploy_units.py +0 -0
  142. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deprecation_telemetry.py +0 -0
  143. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/deps.py +0 -0
  144. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/diagnose.py +0 -0
  145. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dispatch.py +0 -0
  146. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dist_name.py +0 -0
  147. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dr_promote.py +0 -0
  148. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/dr_verify.py +0 -0
  149. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive.py +0 -0
  150. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive_queue.py +0 -0
  151. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/drive_state.py +0 -0
  152. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/events.py +0 -0
  153. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/failure_class.py +0 -0
  154. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/filelock.py +0 -0
  155. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/fleet_config_health.py +0 -0
  156. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/forge_availability.py +0 -0
  157. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/freshness.py +0 -0
  158. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_a.py +0 -0
  159. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_b.py +0 -0
  160. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gate_snapshot.py +0 -0
  161. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gates.py +0 -0
  162. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/gen_board_fixture.py +0 -0
  163. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/github_ops.py +0 -0
  164. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/github_throttle.py +0 -0
  165. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/goal.py +0 -0
  166. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/graph_health.py +0 -0
  167. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/__init__.py +0 -0
  168. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/aggregate.py +0 -0
  169. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/__init__.py +0 -0
  170. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/_ci_pin.py +0 -0
  171. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/agent_install.py +0 -0
  172. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/cargo_targets.py +0 -0
  173. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/claude_binary.py +0 -0
  174. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/config_drift.py +0 -0
  175. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  176. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/coord_web_ci_pin.py +0 -0
  177. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/deploy_lane_facts.py +0 -0
  178. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/disk.py +0 -0
  179. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  180. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_phantom.py +0 -0
  181. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/fleet_unit_drift.py +0 -0
  182. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/graph.py +0 -0
  183. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/graphify_cli.py +0 -0
  184. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/index_lock.py +0 -0
  185. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/issues_sync_staleness.py +0 -0
  186. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/plan_usage.py +0 -0
  187. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/pr_churn.py +0 -0
  188. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/release_cordon.py +0 -0
  189. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/repo_state.py +0 -0
  190. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/spawned_coord.py +0 -0
  191. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/stalled_pipeline.py +0 -0
  192. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/timer_active.py +0 -0
  193. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/toolchain.py +0 -0
  194. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/unit_drift.py +0 -0
  195. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/unit_enablement.py +0 -0
  196. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/wedged_drive_queue.py +0 -0
  197. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/checks/worktrees.py +0 -0
  198. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/cli.py +0 -0
  199. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/context.py +0 -0
  200. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/models.py +0 -0
  201. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/pypi.py +0 -0
  202. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/registry.py +0 -0
  203. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/render.py +0 -0
  204. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/health/units.py +0 -0
  205. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/hooks.py +0 -0
  206. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/housekeeping.py +0 -0
  207. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/interactive.py +0 -0
  208. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/issue_store.py +0 -0
  209. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/issues_sync_status.py +0 -0
  210. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/liveness_auditor.py +0 -0
  211. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_metrics.py +0 -0
  212. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_onboard.py +0 -0
  213. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_pause.py +0 -0
  214. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/machine_stats.py +0 -0
  215. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/merge_queue.py +0 -0
  216. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_chat.py +0 -0
  217. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_dispatch.py +0 -0
  218. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_gate.py +0 -0
  219. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/milestone_order.py +0 -0
  220. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/mock_author.py +0 -0
  221. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/models.py +0 -0
  222. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/network.py +0 -0
  223. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/new_issue_chat.py +0 -0
  224. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/__init__.py +0 -0
  225. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/baseline.py +0 -0
  226. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/cli.py +0 -0
  227. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/collect.py +0 -0
  228. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/digest.py +0 -0
  229. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/models.py +0 -0
  230. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/predicate.py +0 -0
  231. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/service.py +0 -0
  232. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/store.py +0 -0
  233. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notifier/transport.py +0 -0
  234. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/notify.py +0 -0
  235. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/openapi.py +0 -0
  236. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/overlap_fence.py +0 -0
  237. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/overlap_predict.py +0 -0
  238. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/parentage.py +0 -0
  239. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/parentage_github.py +0 -0
  240. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/pipeline.py +0 -0
  241. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/plan_parser.py +0 -0
  242. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/plans.py +0 -0
  243. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/platform_paths.py +0 -0
  244. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_bridge.py +0 -0
  245. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_store.py +0 -0
  246. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/portal_sync.py +0 -0
  247. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/pr_body_lint.py +0 -0
  248. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/prereqs.py +0 -0
  249. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/progress.py +0 -0
  250. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/__init__.py +0 -0
  251. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/base.py +0 -0
  252. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/claude.py +0 -0
  253. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/claude_pty.py +0 -0
  254. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/providers/opencode.py +0 -0
  255. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/queue_diagnose.py +0 -0
  256. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reconcile.py +0 -0
  257. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reconcile_tick.py +0 -0
  258. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/refine_chat.py +0 -0
  259. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_cordon.py +0 -0
  260. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_propagate.py +0 -0
  261. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_verify.py +0 -0
  262. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/release_window.py +0 -0
  263. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_dormancy.py +0 -0
  264. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_edit.py +0 -0
  265. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/repo_onboard.py +0 -0
  266. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/reports.py +0 -0
  267. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/rest_schema.py +0 -0
  268. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/revalidate.py +0 -0
  269. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/review.py +0 -0
  270. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/scorecard.py +0 -0
  271. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/self_health.py +0 -0
  272. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  273. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  274. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  275. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  276. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  277. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/portal-followup/SKILL.md +0 -0
  278. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/release-now/SKILL.md +0 -0
  279. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  280. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  281. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/skills/update-issue/SKILL.md +0 -0
  282. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/smoke.py +0 -0
  283. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/spend_ceiling.py +0 -0
  284. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/split_work.py +0 -0
  285. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/stage_projection.py +0 -0
  286. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/state.py +0 -0
  287. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/store_migrate.py +0 -0
  288. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/store_parity.py +0 -0
  289. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/templates/deploy-cloudflare.node.yml +0 -0
  290. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_author.py +0 -0
  291. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_chat.py +0 -0
  292. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_orchestrator.py +0 -0
  293. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/test_report.py +0 -0
  294. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/tui_release.py +0 -0
  295. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/uat_checks.py +0 -0
  296. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage.py +0 -0
  297. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage_limits.py +0 -0
  298. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/usage_rollup.py +0 -0
  299. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coord/worker_events.py +0 -0
  300. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/coordinator.example.yml +0 -0
  301. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-agent.service +0 -0
  302. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-backup.service +0 -0
  303. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-backup.timer +0 -0
  304. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.service +0 -0
  305. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.sh +0 -0
  306. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-db-backup.timer +0 -0
  307. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-dr-verify.service +0 -0
  308. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-dr-verify.timer +0 -0
  309. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-drive-queue.service +0 -0
  310. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-drive-queue.timer +0 -0
  311. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-failure-notify.service +0 -0
  312. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-failure-notify.sh +0 -0
  313. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.service +0 -0
  314. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.timer +0 -0
  315. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-notify.service +0 -0
  316. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-notify.timer +0 -0
  317. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-propagate.service +0 -0
  318. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-propagate.timer +0 -0
  319. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-window.service +0 -0
  320. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-release-window.timer +0 -0
  321. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-serve.service +0 -0
  322. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.service +0 -0
  323. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.sh +0 -0
  324. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.timer +0 -0
  325. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web-rollback.sh +0 -0
  326. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/coord-web.service +0 -0
  327. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/deploy/node-shim.sh +0 -0
  328. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_TUI_CI.md +0 -0
  329. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  330. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_CI.md +0 -0
  331. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_DIST.md +0 -0
  332. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  333. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/AGENT_OPERATIONS.md +0 -0
  334. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ARCHITECTURE.md +0 -0
  335. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ARCH_SECURITY_GATES.md +0 -0
  336. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/COCKPIT.md +0 -0
  337. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/COST_DISCIPLINE.md +0 -0
  339. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CROSS_PLATFORM.md +0 -0
  340. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CUSTOMER_FACING_APPS.md +0 -0
  341. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/CUSTOMER_PORTAL.md +0 -0
  342. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DATA_STORE_SELECTION.md +0 -0
  343. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DISASTER_RECOVERY.md +0 -0
  344. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/DRIVE_QUEUE.md +0 -0
  345. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/EPHEMERAL_WORKERS.md +0 -0
  346. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/FORGE_MIGRATION.md +0 -0
  347. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/GRAPHIFY_SETUP.md +0 -0
  348. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ISSUE_GUIDANCE.md +0 -0
  349. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/MAC_MINI.md +0 -0
  350. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  351. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/NOTIFIER.md +0 -0
  352. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPENCODE_VERIFICATION.md +0 -0
  353. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPERATING_GOTCHAS.md +0 -0
  354. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/OPERATOR_GUIDES.md +0 -0
  355. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/ORACLE_LOOP.md +0 -0
  356. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PHONE_WEBAPP.md +0 -0
  357. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PIPELINE_V2.md +0 -0
  358. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/PLATFORM_EVOLUTION.md +0 -0
  359. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/SECOND_BACKEND.md +0 -0
  360. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/STORE_SERVICE.md +0 -0
  361. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  362. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/WEB_CONTROL_CENTER.md +0 -0
  363. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/WSL_WINDOWS_WORKER.md +0 -0
  364. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/README.md +0 -0
  365. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/_tokens.css +0 -0
  366. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/issue-detail.html +0 -0
  367. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-narrow.html +0 -0
  368. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-wide.html +0 -0
  369. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/graphify-out/.gitignore +0 -0
  370. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/install-agent.sh +0 -0
  371. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/pyproject.toml +0 -0
  372. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/audit_review_verdict_overrides.py +0 -0
  373. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  374. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/build-worker-image.sh +0 -0
  375. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/coordinator-machine.py +0 -0
  376. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/dr-down.sh +0 -0
  377. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/dr-up.sh +0 -0
  378. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/epic-down.sh +0 -0
  379. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/epic-up.sh +0 -0
  380. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/preflight.sh +0 -0
  381. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/provision-server.sh +0 -0
  382. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/provision-worker.sh +0 -0
  383. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  384. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  385. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/throwaway-vm.sh +0 -0
  386. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/azure-workers/verify-github-token.sh +0 -0
  387. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/check_gh_argv_containment.py +0 -0
  388. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/codegen.py +0 -0
  389. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-test-runner.sh +0 -0
  390. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  391. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  392. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  393. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  394. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/coord-venv-rollback.sh +0 -0
  395. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/drive-batch.sh +0 -0
  396. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/extract-coord-tui.sh +0 -0
  397. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/fleet_watchdog.py +0 -0
  398. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/gen_board_fixture.py +0 -0
  399. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/gen_mock_index.py +0 -0
  400. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/lib/provision-core.sh +0 -0
  401. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/next_release_tag.py +0 -0
  402. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/provision-machine.sh +0 -0
  403. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/run_tests_in_populated_home.sh +0 -0
  404. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/run_tests_without_gh.sh +0 -0
  405. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/setup-macmini.sh +0 -0
  406. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/smoke_437_interactive.py +0 -0
  407. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify-provision-noble.sh +0 -0
  408. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_878_review_capture.py +0 -0
  409. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_release_published.py +0 -0
  410. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/scripts/verify_release_wheel.py +0 -0
  411. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/setup.cfg +0 -0
  412. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/SMOKE_SET.md +0 -0
  413. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/__init__.py +0 -0
  414. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/conftest.py +0 -0
  415. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/contract.md +0 -0
  416. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/manifest.yml +0 -0
  417. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  418. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  419. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/contract.md +0 -0
  420. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  421. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  422. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/manifest.yml +0 -0
  423. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  424. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-51/tsconfig.json +0 -0
  425. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  426. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/backends.py +0 -0
  427. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/conftest.py +0 -0
  428. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-basic.json +0 -0
  429. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  430. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  431. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  432. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  433. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/all_pass.json +0 -0
  434. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  435. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/mixed_fail.json +0 -0
  436. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  437. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  438. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/skip.json +0 -0
  439. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/playwright/truncated.json +0 -0
  440. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  441. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  442. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  443. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  444. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  445. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  446. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  447. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  448. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_acceptance.py +0 -0
  449. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_acceptance_drivers.py +0 -0
  450. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent.py +0 -0
  451. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_api_error.py +0 -0
  452. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_app.py +0 -0
  453. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_branch_base.py +0 -0
  454. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_branch_capture.py +0 -0
  455. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_config_free_1712.py +0 -0
  456. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_deploy_units_endpoint.py +0 -0
  457. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_dirty_worktree.py +0 -0
  458. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  459. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_graph_self_heal.py +0 -0
  460. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_health_h3.py +0 -0
  461. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_idle_restart.py +0 -0
  462. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_push_failure.py +0 -0
  463. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_reap.py +0 -0
  464. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_repos_and_pull.py +0 -0
  465. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_restart_services_endpoint.py +0 -0
  466. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_skills_self_heal.py +0 -0
  467. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_startup_diagnostics.py +0 -0
  468. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_update.py +0 -0
  469. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_update_bluegreen.py +0 -0
  470. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_usage_limit.py +0 -0
  471. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_agent_zero_commit.py +0 -0
  472. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ambient_home_isolation.py +0 -0
  473. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_capability_reroute_3241.py +0 -0
  474. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_dependency_busy_2804.py +0 -0
  475. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_reject_plan.py +0 -0
  476. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approve_usage_gate.py +0 -0
  477. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approved_work_2532.py +0 -0
  478. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_approved_work_2996.py +0 -0
  479. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_assignment_already_recorded_daemon.py +0 -0
  480. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_log.py +0 -0
  481. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_outcome.py +0 -0
  482. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_audit_query.py +0 -0
  483. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_auto_loop.py +0 -0
  484. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_auto_release_publish_2035.py +0 -0
  485. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_backend_selection.py +0 -0
  486. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_backup.py +0 -0
  487. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_base_checkout_restore.py +0 -0
  488. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_block_log.py +0 -0
  489. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_cap_762.py +0 -0
  490. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_fixture.py +0 -0
  491. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_schema.py +0 -0
  492. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_service.py +0 -0
  493. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_state.py +0 -0
  494. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_board_wire.py +0 -0
  495. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_brain.py +0 -0
  496. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_branch_model.py +0 -0
  497. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_bug_intake.py +0 -0
  498. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_build_worker_image_env_update.py +0 -0
  499. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cargo_cache.py +0 -0
  500. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_check_gh_argv_containment.py +0 -0
  501. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_acceptance_gate_1950.py +0 -0
  502. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_fix.py +0 -0
  503. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_github.py +0 -0
  504. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_gitlab.py +0 -0
  505. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_parity_2091.py +0 -0
  506. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_ci_store.py +0 -0
  507. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_claim.py +0 -0
  508. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_claude_md_budget.py +0 -0
  509. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_acceptance.py +0 -0
  510. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign.py +0 -0
  511. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  512. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_remote.py +0 -0
  513. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_provider.py +0 -0
  514. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  515. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_audit.py +0 -0
  516. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_chat_continue.py +0 -0
  517. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_codegen.py +0 -0
  518. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_decide.py +0 -0
  519. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_capability_rules.py +0 -0
  520. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_config_provenance.py +0 -0
  521. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_forge_availability.py +0 -0
  522. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_graph.py +0 -0
  523. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_self.py +0 -0
  524. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_diagnose_test_coverage.py +0 -0
  525. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor.py +0 -0
  526. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_free_1801.py +0 -0
  527. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  528. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  529. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_drive.py +0 -0
  530. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_drive_queue.py +0 -0
  531. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_escalate.py +0 -0
  532. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_fix_headless_review.py +0 -0
  533. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_gate_a.py +0 -0
  534. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_install_drift.py +0 -0
  535. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_install_skills.py +0 -0
  536. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_comment.py +0 -0
  537. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_create_label.py +0 -0
  538. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_reopen.py +0 -0
  539. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_issue_view_list.py +0 -0
  540. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_merge.py +0 -0
  541. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_assign.py +0 -0
  542. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_capture.py +0 -0
  543. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_chat_add_child.py +0 -0
  544. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_dispatch.py +0 -0
  545. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_b.py +0 -0
  546. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_c.py +0 -0
  547. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_order.py +0 -0
  548. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  549. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_milestone_ship.py +0 -0
  550. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_network.py +0 -0
  551. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_new_issue_chat.py +0 -0
  552. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_plans.py +0 -0
  553. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_portal.py +0 -0
  554. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_pr.py +0 -0
  555. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_pull_artifact.py +0 -0
  556. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_queue.py +0 -0
  557. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_reattach_sessions.py +0 -0
  558. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_refine_board.py +0 -0
  559. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_preflight.py +0 -0
  560. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_propagate.py +0 -0
  561. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_release_window.py +0 -0
  562. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_repo_2220.py +0 -0
  563. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  564. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_scorecard.py +0 -0
  565. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_serve_store_backend_3084.py +0 -0
  566. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_set_review_findings.py +0 -0
  567. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_advisory_terminal.py +0 -0
  568. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_contested_tag.py +0 -0
  569. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_merge_queue.py +0 -0
  570. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_provider.py +0 -0
  571. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_review_finalizing.py +0 -0
  572. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_test_failed_tag.py +0 -0
  573. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_status_usage_limit.py +0 -0
  574. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_sync_comments_873.py +0 -0
  575. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_test_plan.py +0 -0
  576. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_track.py +0 -0
  577. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_tui_update.py +0 -0
  578. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cli_wait.py +0 -0
  579. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client.py +0 -0
  580. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_base_install.py +0 -0
  581. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_config_cache_atomic_3052.py +0 -0
  582. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_client_resource_migration_1946.py +0 -0
  583. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_commands_common.py +0 -0
  584. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_comments.py +0 -0
  585. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_completion_summary.py +0 -0
  586. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config.py +0 -0
  587. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_acceptance.py +0 -0
  588. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_audit.py +0 -0
  589. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_drift_check.py +0 -0
  590. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_pricing.py +0 -0
  591. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  592. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_config_usage_gate.py +0 -0
  593. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_confirm_test.py +0 -0
  594. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_conflict_fix.py +0 -0
  595. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_conflict_fix_semantic.py +0 -0
  596. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  597. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test.py +0 -0
  598. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  599. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_baseline.py +0 -0
  600. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_populated_home.py +0 -0
  601. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_routing.py +0 -0
  602. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_test_runner_toolchain.py +0 -0
  603. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_uat.py +0 -0
  604. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coord_web_sse_restart_live.py +0 -0
  605. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_coordinator_machine.py +0 -0
  606. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_cross_platform_imports.py +0 -0
  607. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dao.py +0 -0
  608. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard.py +0 -0
  609. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_api.py +0 -0
  610. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_fixture.py +0 -0
  611. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_server.py +0 -0
  612. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_terminal.py +0 -0
  613. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dashboard_terminal_live.py +0 -0
  614. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_db.py +0 -0
  615. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dead_end.py +0 -0
  616. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_decomposition_chat.py +0 -0
  617. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_db_backup.py +0 -0
  618. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_dist.py +0 -0
  619. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_rollback.py +0 -0
  620. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_db_backup_unit.py +0 -0
  621. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_drive_queue_unit.py +0 -0
  622. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_failure_notify_unit.py +0 -0
  623. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_manifest.py +0 -0
  624. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_notify_unit.py +0 -0
  625. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_units_lane.py +0 -0
  626. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deploy_web_unit.py +0 -0
  627. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deprecation_telemetry.py +0 -0
  628. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_deps.py +0 -0
  629. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_diagnose.py +0 -0
  630. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dispatch.py +0 -0
  631. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dispatch_target_validation.py +0 -0
  632. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dist_name.py +0 -0
  633. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_done_housekeeping.py +0 -0
  634. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_azure_scripts.py +0 -0
  635. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_promote.py +0 -0
  636. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_dr_verify.py +0 -0
  637. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive.py +0 -0
  638. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue.py +0 -0
  639. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_blocked_rendering.py +0 -0
  640. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_launch_argv.py +0 -0
  641. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  642. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_roll_pending.py +0 -0
  643. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  644. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_state.py +0 -0
  645. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_drive_tmux.py +0 -0
  646. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_capability_detection.py +0 -0
  647. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  648. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_epic_up_image_provenance.py +0 -0
  649. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_errors.py +0 -0
  650. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_events.py +0 -0
  651. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_failure_class.py +0 -0
  652. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_filelock.py +0 -0
  653. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  654. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fix_of_force_override.py +0 -0
  655. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_config_health.py +0 -0
  656. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_health_probes.py +0 -0
  657. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_health_snapshot.py +0 -0
  658. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_fleet_watchdog.py +0 -0
  659. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_forge_availability.py +0 -0
  660. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_freshness.py +0 -0
  661. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_a.py +0 -0
  662. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_b.py +0 -0
  663. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gate_snapshot_staleness.py +0 -0
  664. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gates.py +0 -0
  665. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  666. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_gen_mock_index.py +0 -0
  667. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_rust_fixture.py +0 -0
  668. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_rust_requests.py +0 -0
  669. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_generated_types_fixture.py +0 -0
  670. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_github_ops.py +0 -0
  671. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_github_throttle.py +0 -0
  672. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_goal.py +0 -0
  673. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_graph_health.py +0 -0
  674. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_graph_selfheal_absent_2237.py +0 -0
  675. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_handoff.py +0 -0
  676. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_checks.py +0 -0
  677. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_cli.py +0 -0
  678. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_cli_graph.py +0 -0
  679. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_config.py +0 -0
  680. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_context.py +0 -0
  681. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_coord_tui_ci_pin.py +0 -0
  682. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_coord_web_ci_pin.py +0 -0
  683. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_deploy_lane_facts.py +0 -0
  684. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_fix.py +0 -0
  685. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_incident_regression.py +0 -0
  686. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_issues_sync_staleness.py +0 -0
  687. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_pr_churn.py +0 -0
  688. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_pypi.py +0 -0
  689. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_registry.py +0 -0
  690. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_release_cordon_probe.py +0 -0
  691. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_timer_active.py +0 -0
  692. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_toolchain.py +0 -0
  693. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_unit_drift.py +0 -0
  694. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_unit_enablement.py +0 -0
  695. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_health_wedged_drive_queue.py +0 -0
  696. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_hooks.py +0 -0
  697. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_human_attended_437.py +0 -0
  698. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_init.py +0 -0
  699. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_install_agent_venv_2911.py +0 -0
  700. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_integration.py +0 -0
  701. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_briefing_echo.py +0 -0
  702. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_pane_log_2541.py +0 -0
  703. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_prefill_state.py +0 -0
  704. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_session_relaunch.py +0 -0
  705. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_test_verdict_backstop.py +0 -0
  706. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_token_attribution.py +0 -0
  707. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_interactive_worktree.py +0 -0
  708. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_issue_store_seam.py +0 -0
  709. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_issues_sync_status.py +0 -0
  710. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_liveness_auditor.py +0 -0
  711. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_liveness_notify.py +0 -0
  712. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_lock_contention_ratchet.py +0 -0
  713. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_metrics.py +0 -0
  714. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_onboard.py +0 -0
  715. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_pause.py +0 -0
  716. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_machine_stats.py +0 -0
  717. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_merge_queue.py +0 -0
  718. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_merge_verify.py +0 -0
  719. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_chat.py +0 -0
  720. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_dispatch.py +0 -0
  721. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_gate.py +0 -0
  722. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_order.py +0 -0
  723. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_milestone_seam.py +0 -0
  724. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_mock_author.py +0 -0
  725. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_model_tiering.py +0 -0
  726. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_models.py +0 -0
  727. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_models_config_labels.py +0 -0
  728. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_needs_attention.py +0 -0
  729. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_network.py +0 -0
  730. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_new_issue_chat.py +0 -0
  731. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_next_release_tag.py +0 -0
  732. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_node_shim.py +0 -0
  733. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_baseline.py +0 -0
  734. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_cli.py +0 -0
  735. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_collect.py +0 -0
  736. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_config.py +0 -0
  737. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_drive_seam.py +0 -0
  738. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_isolation.py +0 -0
  739. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_predicate.py +0 -0
  740. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_quiet_hours.py +0 -0
  741. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notifier_service.py +0 -0
  742. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notify.py +0 -0
  743. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_notify_drain.py +0 -0
  744. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_openapi.py +0 -0
  745. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_operational_defaults.py +0 -0
  746. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_overlap_fence.py +0 -0
  747. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_overlap_predict.py +0 -0
  748. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_packaged_deploy_units.py +0 -0
  749. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_parentage.py +0 -0
  750. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_paste_landed.py +0 -0
  751. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  752. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_pipeline.py +0 -0
  753. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_approve_plan_command.py +0 -0
  754. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_pr_command.py +0 -0
  755. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_followup_review_command.py +0 -0
  756. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_only.py +0 -0
  757. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_plan_parser.py +0 -0
  758. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_platform_paths.py +0 -0
  759. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_bridge.py +0 -0
  760. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_config.py +0 -0
  761. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_store.py +0 -0
  762. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_portal_sync.py +0 -0
  763. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_pr_body_lint.py +0 -0
  764. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_prereqs.py +0 -0
  765. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_production_db_guard.py +0 -0
  766. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_progress.py +0 -0
  767. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provider_seam.py +0 -0
  768. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers.py +0 -0
  769. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers_config_labels.py +0 -0
  770. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_providers_pty.py +0 -0
  771. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provision_core.py +0 -0
  772. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_provision_machine.py +0 -0
  773. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_py_rust_mirror_inventory.py +0 -0
  774. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_quiet_hours.py +0 -0
  775. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_quiet_hours_store_2146.py +0 -0
  776. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reap_merged_sessions.py +0 -0
  777. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reap_stale_interactive_tick.py +0 -0
  778. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile.py +0 -0
  779. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_branch.py +0 -0
  780. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_completions.py +0 -0
  781. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  782. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_merges.py +0 -0
  783. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_no_agent_record.py +0 -0
  784. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_tick.py +0 -0
  785. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reconcile_usage_limit_done.py +0 -0
  786. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_refine_chat.py +0 -0
  787. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_2101.py +0 -0
  788. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  789. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_deadlock_2240.py +0 -0
  790. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_cordon_stuck_2490.py +0 -0
  791. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_propagate.py +0 -0
  792. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_propagate_threshold.py +0 -0
  793. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_roll_between_legs_2854.py +0 -0
  794. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_roll_window_handoff.py +0 -0
  795. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_unified_1242.py +0 -0
  796. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_verify.py +0 -0
  797. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_release_window.py +0 -0
  798. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_remote_auto_prune.py +0 -0
  799. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_remote_interactive_reaper.py +0 -0
  800. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_add.py +0 -0
  801. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_dormancy.py +0 -0
  802. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_edit_2220.py +0 -0
  803. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_graph_fleet_2237.py +0 -0
  804. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_repo_onboard_2220.py +0 -0
  805. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_report_result_push.py +0 -0
  806. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_reports.py +0 -0
  807. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry.py +0 -0
  808. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry_advisory_1606.py +0 -0
  809. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_retry_type_1636.py +0 -0
  810. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_revalidate.py +0 -0
  811. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review.py +0 -0
  812. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_end_review_without_verdict.py +0 -0
  813. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_parse_failure_diagnostic.py +0 -0
  814. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_reaffirm.py +0 -0
  815. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_state.py +0 -0
  816. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_backstop.py +0 -0
  817. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_override_audit.py +0 -0
  818. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_verdict_relay.py +0 -0
  819. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_review_zero_commits.py +0 -0
  820. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_scoped_review_wiring.py +0 -0
  821. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_scorecard.py +0 -0
  822. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_self_health.py +0 -0
  823. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve.py +0 -0
  824. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_app.py +0 -0
  825. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_app_board_trim.py +0 -0
  826. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_serve_rest_routes.py +0 -0
  827. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_session.py +0 -0
  828. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_slice_issue_attribution.py +0 -0
  829. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke.py +0 -0
  830. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke_live_checkout_restore.py +0 -0
  831. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_smoke_workflow.py +0 -0
  832. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_spend_ceiling.py +0 -0
  833. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_spend_ceiling_coordinator.py +0 -0
  834. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_split.py +0 -0
  835. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_split_work.py +0 -0
  836. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stage_projection.py +0 -0
  837. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stale_busy_reviewer_697.py +0 -0
  838. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stalled_pipeline.py +0 -0
  839. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_state.py +0 -0
  840. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_state_review_findings_daemon.py +0 -0
  841. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_status_fleet_footer.py +0 -0
  842. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stop_1567.py +0 -0
  843. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_store_migrate.py +0 -0
  844. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stuck.py +0 -0
  845. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  846. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_terminal_command.py +0 -0
  847. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_author.py +0 -0
  848. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_chat.py +0 -0
  849. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_orchestrator.py +0 -0
  850. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_report.py +0 -0
  851. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_verdict_parsing.py +0 -0
  852. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_test_verdict_transcript_floor.py +0 -0
  853. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_text_io_encoding_audit.py +0 -0
  854. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_board_audit.py +0 -0
  855. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_config_load_1080.py +0 -0
  856. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_thin_client_daemon_routing_906.py +0 -0
  857. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_throwaway_vm.py +0 -0
  858. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_tmux_host.py +0 -0
  859. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_tmux_session.py +0 -0
  860. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_transcript_floor.py +0 -0
  861. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_uat_checks.py +0 -0
  862. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage.py +0 -0
  863. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage_limits.py +0 -0
  864. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_usage_rollup.py +0 -0
  865. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_venv_live_install_2121.py +0 -0
  866. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_version_single_source.py +0 -0
  867. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_watch.py +0 -0
  868. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  869. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_env_venv_isolation.py +0 -0
  870. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_events.py +0 -0
  871. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_image_pin_sync.py +0 -0
  872. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_safety.py +0 -0
  873. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worker_test_scoping.py +0 -0
  874. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worktree.py +0 -0
  875. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  876. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/tests/test_write_parity.py +0 -0
  877. {code_coordinator-0.5.452 → code_coordinator-0.5.453}/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.453
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.453
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.452",
2
+ "tag": "0.5.453",
3
3
  "distance": 0,
4
- "node": "g69efb323ff5ace2c8783a4e3eb8deb0b37b5aff0",
4
+ "node": "gf9162e8b92018087ab923c640b8eb07b232cf9bd",
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`
@@ -5821,14 +5821,30 @@ def build_app(
5821
5821
 
5822
5822
  _machine_metrics_sampler = machine_metrics_sampler or MachineMetricsSampler()
5823
5823
 
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
5824
+ # Cache for the computed /board projection so burst polls from the TUI
5825
+ # don't each pay the full board_projection + merge-plan + stage-projection
5826
5826
  # 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.
5827
+ # (one board per daemon instance).
5828
+ #
5829
+ # #3294: the cache's PRIMARY invalidation trigger is "has anything
5830
+ # written since this build?" (``store.change_token()``, ``dao.CoordStore``
5831
+ # protocol — SQLite: ``PRAGMA data_version``), not a fixed clock. A 1.5 s
5832
+ # TTL forced a full rebuild on essentially every poll, because pollers
5833
+ # run at 5 s and always missed the window — and the rebuild (the
5834
+ # ``fleet_board_latency`` check's own 0.65-0.8 s measurement) is what
5835
+ # actually held the GIL, not the wire cost the ETag already covers.
5836
+ # ``COORD_BOARD_CACHE_TTL`` (default below) survives only as a SAFETY
5837
+ # UPPER BOUND — a rebuild is forced past that age regardless of the
5838
+ # change token, in case the token's source ever misses a write path —
5839
+ # not as the primary trigger. Busted immediately on board-mutating POSTs
5840
+ # (``_bust_board_cache``, unchanged by #3294) so a user action is visible
5841
+ # on the very next poll without waiting on either signal.
5830
5842
  _board_cache: dict | None = None
5831
5843
  _board_cache_at: float = 0.0
5844
+ # #3294: the ``store.change_token()`` value as of ``_board_cache``'s
5845
+ # build. A poll is served from cache only when the CURRENT token still
5846
+ # equals this one — i.e. nothing has written since.
5847
+ _board_cache_token: str | None = None
5832
5848
  # #1597 Part 2: the fully-rendered JSON bytes for the currently-cached
5833
5849
  # build, shared verbatim by every response that serves ``_board_cache``
5834
5850
  # (a fresh build's own responses, every single-flight follower, and
@@ -6040,18 +6056,35 @@ def build_app(
6040
6056
  # config reloads prompt.
6041
6057
  _refresh_config()
6042
6058
 
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.
6059
+ # Part 2 (cache): serve the cached projection when nothing has
6060
+ # written since it was built (#3294). Burst polls (TUI polls every
6061
+ # ~2 s) hit the cache; the real computation only runs when a write
6062
+ # actually happened. Cache is also busted immediately by the
6063
+ # board-mutating POST handlers below so user actions are visible on
6064
+ # the very next poll without waiting on either signal.
6048
6065
  import time as _time # noqa: PLC0415
6049
- _ttl = float(os.getenv("COORD_BOARD_CACHE_TTL", "1.5"))
6066
+ # Safety upper bound only (#3294) — see the comment on
6067
+ # `_board_cache_token` above. Raised from the pre-#3294 1.5 s default
6068
+ # now that the change-token check is the primary trigger.
6069
+ _safety_ttl = float(os.getenv("COORD_BOARD_CACHE_TTL", "30"))
6050
6070
  _now = _time.monotonic()
6051
6071
  nonlocal _board_cache, _board_cache_at, _board_cache_built_at, _board_body
6052
- nonlocal _board_inflight
6072
+ nonlocal _board_cache_token, _board_inflight
6053
6073
  _client_etag = request.headers.get("if-none-match")
6054
6074
 
6075
+ # #3294: cheap "did anything write?" probe — see
6076
+ # `dao.CoordStore.change_token`'s docstring. Run inline (not
6077
+ # threadpooled) like `_refresh_config()`'s stat() just above: a
6078
+ # single PRAGMA on an already-open connection, not I/O of the shape
6079
+ # #1336 invariant 1 guards against. A failure here must never crash
6080
+ # the read path over a cache optimization — treat it as "assume
6081
+ # changed" (a sentinel that can never equal a real cached token) so
6082
+ # the worst case is an extra rebuild, never a wedged/stale cache.
6083
+ try:
6084
+ _current_token: str | None = store.change_token()
6085
+ except Exception: # noqa: BLE001 — fail toward rebuilding, not crashing
6086
+ _current_token = None
6087
+
6055
6088
  def _respond(result: dict, etag: str | None, body: bytes | None) -> Response:
6056
6089
  if _client_etag and etag and _client_etag == etag:
6057
6090
  # STILL identical to what the client holds — spare the wire
@@ -6076,7 +6109,18 @@ def build_app(
6076
6109
  _cached_etag = _board_etag
6077
6110
  _cached_at = _board_cache_at
6078
6111
  _cached_body = _board_body
6079
- if _cached is not None and (_now - _cached_at) < _ttl:
6112
+ _cached_token = _board_cache_token
6113
+ # #3294: fresh iff nothing wrote since this build (token still
6114
+ # matches) AND we're inside the safety-TTL ceiling. `_cached_token
6115
+ # is not None` rules out a `None == None` false match when either
6116
+ # side came from a failed change_token() read (see above).
6117
+ _fresh = (
6118
+ _cached is not None
6119
+ and _cached_token is not None
6120
+ and _cached_token == _current_token
6121
+ and (_now - _cached_at) < _safety_ttl
6122
+ )
6123
+ if _fresh:
6080
6124
  return _respond(_cached, _cached_etag, _cached_body)
6081
6125
 
6082
6126
  # #1597 Part 1: single-flight the rebuild. On a cache miss, at most
@@ -6122,12 +6166,24 @@ def build_app(
6122
6166
  # concurrent request calls _refresh_config() while _build() is running.
6123
6167
  _cfg = config
6124
6168
 
6125
- def _build() -> tuple[float, dict]:
6169
+ def _build() -> tuple[float, str | None, dict]:
6126
6170
  # Snapshot-order stamp: captured immediately before the DB read so
6127
6171
  # the publish step below can reject a build whose snapshot is
6128
6172
  # older than the one already cached (concurrent rebuilds can
6129
6173
  # finish out of order).
6130
6174
  _built_at = _time.monotonic()
6175
+ # #3294: the change token AS OF this build's snapshot moment —
6176
+ # published alongside the cache below so the *next* request's
6177
+ # freshness check compares against "what had (or hadn't) written
6178
+ # by the time THIS build started", not some later moment.
6179
+ # `None` (never a real token — see `_current_token` above) if the
6180
+ # read itself fails; that means the published cache below can
6181
+ # never look "fresh" to a later poll, which is the safe direction
6182
+ # to fail in.
6183
+ try:
6184
+ _built_token = store.change_token()
6185
+ except Exception: # noqa: BLE001 — see `_current_token` above
6186
+ _built_token = None
6131
6187
  # ── board projection ──────────────────────────────────────────────
6132
6188
  try:
6133
6189
  projection = store.board_projection()
@@ -6593,7 +6649,7 @@ def build_app(
6593
6649
  from coord.board_wire import bound_board_payload as _bound # noqa: PLC0415
6594
6650
 
6595
6651
  _bound(projection)
6596
- return _built_at, projection
6652
+ return _built_at, _built_token, projection
6597
6653
 
6598
6654
  # This coroutine is the single-flight leader: it alone runs _build(),
6599
6655
  # then fans its outcome out to every waiter (itself plus every
@@ -6601,7 +6657,7 @@ def build_app(
6601
6657
  # of the acceptance test, and why a failed build must reach every
6602
6658
  # waiter rather than wedging the followers.
6603
6659
  try:
6604
- built_at, result = await run_in_threadpool(_build)
6660
+ built_at, built_token, result = await run_in_threadpool(_build)
6605
6661
  except _BoardReadError as e:
6606
6662
  _board_inflight = None # clear FIRST: a retry must build fresh,
6607
6663
  # never see a "done" future and think it must wait on this one.
@@ -6650,7 +6706,9 @@ def build_app(
6650
6706
  _board_body = body
6651
6707
  _board_cache_at = _time.monotonic()
6652
6708
  _board_cache_built_at = built_at
6653
- # #1630: feed this build's own latency + wire size to the
6709
+ _board_cache_token = built_token # #3294
6710
+ # #1630/#3294: feed this build's own latency + wire size
6711
+ # (+ the fact that a build happened at all) to the
6654
6712
  # fleet-health snapshot's board-latency check — read back
6655
6713
  # on the health-poll tick's own cadence, never recomputed
6656
6714
  # inline (see FleetHealthRefresher.record_board_stats).
@@ -1195,6 +1195,42 @@ def sqlite_integrity_check(conn: Any) -> str:
1195
1195
  return str(rows[0][0]) if rows else "<no output>"
1196
1196
 
1197
1197
 
1198
+ def sqlite_data_version(conn: Any) -> str:
1199
+ """SQLite's ``PRAGMA data_version`` for *conn*, as an opaque string.
1200
+
1201
+ The value changes whenever **another** connection commits to the same
1202
+ database file, which makes it a cheap "has anything been written since I
1203
+ last looked?" signal — see :meth:`coord.dao.SqliteStore.change_token`,
1204
+ its only caller, which backs the ``/board`` read path's write-driven
1205
+ cache invalidation (#3294).
1206
+
1207
+ Two properties the caller depends on, both SQLite's, not this helper's:
1208
+ the value is **relative to the connection that reads it** (a freshly
1209
+ opened connection always reports the same baseline no matter how many
1210
+ commits preceded it, and only starts advancing once *it* has observed a
1211
+ change), so the caller must reuse one long-lived connection; and it does
1212
+ **not** move for this connection's own writes. See
1213
+ https://sqlite.org/pragma.html#pragma_data_version.
1214
+
1215
+ Lives here for the same reason :func:`sqlite_journal_mode`,
1216
+ :func:`sqlite_wal_checkpoint_truncate` and :func:`sqlite_integrity_check`
1217
+ do: ``PRAGMA`` is SQLite-only statement text with no Postgres equivalent
1218
+ to translate to, and this module is the one place in the tree allowed to
1219
+ spell one (enforced by ``tests/test_sql_dialect.py::
1220
+ test_no_sqlite_only_construct_in_statement_text_outside_db_and_seam``).
1221
+ SQLite-only: callers must already know *conn* is a SQLite connection —
1222
+ this helper does not dialect-guard, matching the rest of that family.
1223
+
1224
+ An empty result (which real SQLite never produces, but a stubbed
1225
+ connection in a test can) degrades to ``"0"``. That is a *constant*, so a
1226
+ caller comparing two such tokens sees "unchanged" — callers that cannot
1227
+ tolerate a false "unchanged" must treat an exception here as "assume
1228
+ changed", which is what ``change_token``'s caller does.
1229
+ """
1230
+ row = execute(conn, "PRAGMA data_version").fetchone()
1231
+ return str(row[0]) if row is not None else "0"
1232
+
1233
+
1198
1234
  def driver_error(conn: Any) -> type[BaseException]:
1199
1235
  """The DB-API ``Error`` base class *conn*'s driver raises (#2766).
1200
1236
 
@@ -186,6 +186,70 @@ def test_board_version_bumps_when_content_changes(
186
186
  assert r3.headers["etag"] != r1.headers["etag"]
187
187
 
188
188
 
189
+ # ── #3294: the cache rebuilds on a write, not on a clock ─────────────────────
190
+
191
+
192
+ def test_board_rebuild_trigger_is_a_write_not_the_ttl_clock(
193
+ detail_db: Path, valid_config_path: Path, monkeypatch
194
+ ) -> None:
195
+ """#3294 acceptance: two ``/board`` requests with NO intervening write
196
+ must produce exactly one ``board_projection()`` build, and a write
197
+ between them must force a second — asserted on a build counter, never on
198
+ timing (the issue's own words: "Timing-based assertions will be flaky —
199
+ count builds").
200
+
201
+ The write here is a RAW external SQLite commit — not a POST to
202
+ ``/board``, which already busted the cache explicitly and always did.
203
+ This is the case #3294 actually exists for: the drive-queue timer and a
204
+ concurrent ``coord notify`` write the DB directly, with no daemon POST
205
+ anywhere in the picture. Before #3294 a write from either of those
206
+ sources was invisible to the ``/board`` cache until its TTL (1.5 s by
207
+ default, pre-fix) happened to expire on its own. This test pins the
208
+ safety-TTL to a deliberately generous 60 s specifically so the *only*
209
+ thing that can explain the second build is the change-token check
210
+ noticing the external write — a TTL-only cache would still be showing
211
+ the stale, pre-write board at that point.
212
+ """
213
+ call_count = 0
214
+ original_projection = SqliteStore.board_projection
215
+
216
+ def counting_projection(self): # noqa: ANN001
217
+ nonlocal call_count
218
+ call_count += 1
219
+ return original_projection(self)
220
+
221
+ monkeypatch.setattr(SqliteStore, "board_projection", counting_projection)
222
+ monkeypatch.setenv("COORD_BOARD_CACHE_TTL", "60") # generous safety ceiling
223
+
224
+ cfg = load_config(valid_config_path)
225
+ app = build_app(SqliteStore(detail_db), cfg)
226
+ with TestClient(app) as cli:
227
+ r1 = cli.get("/board")
228
+ assert r1.status_code == 200
229
+ assert call_count == 1
230
+
231
+ r2 = cli.get("/board")
232
+ assert r2.status_code == 200
233
+ assert call_count == 1, "no write happened — must still be exactly one build"
234
+
235
+ # A write from OUTSIDE the daemon entirely: no POST /board, no
236
+ # `_bust_board_cache()` call — the drive-queue-timer / `coord notify`
237
+ # shape the issue names.
238
+ conn = sqlite3.connect(str(detail_db))
239
+ conn.execute(
240
+ "UPDATE assignments SET status='failed' WHERE assignment_id='work1'"
241
+ )
242
+ conn.commit()
243
+ conn.close()
244
+
245
+ r3 = cli.get("/board")
246
+ assert r3.status_code == 200
247
+ assert call_count == 2, (
248
+ "an external write must trigger a rebuild via the change token, "
249
+ "well before the 60s safety TTL elapses"
250
+ )
251
+
252
+
189
253
  def test_board_digest_projection_masks_only_the_named_volatile_fields() -> None:
190
254
  """#3293 unit-level check on ``_board_digest_projection`` itself: the
191
255
  three named culprits (``audit_recent_count``, ``issues[*].synced_at``,
@@ -420,12 +484,22 @@ def test_stale_concurrent_rebuild_is_never_published(
420
484
 
421
485
  monkeypatch.setenv("COORD_BOARD_CACHE_TTL", "1000") # cache once published
422
486
 
487
+ # #3294: `_build()` is faked below (it never touches the real store), so
488
+ # pin `store.change_token()` to a fixed value too — otherwise the
489
+ # handler's real (unmocked) freshness check would compare the fake
490
+ # build's canned token against the REAL store's live `PRAGMA
491
+ # data_version` and never see a match, breaking the cache-hit path this
492
+ # test relies on for its final 304. Irrelevant to what this test
493
+ # actually exercises (out-of-order publish, not change detection).
494
+ store = SqliteStore(detail_db)
495
+ monkeypatch.setattr(store, "change_token", lambda: "fixed-token")
496
+
423
497
  # Deterministic out-of-order completion: the first request's build
424
498
  # carries a NEWER snapshot stamp than the second's (as if the second
425
499
  # started earlier but finished later).
426
500
  results = iter([
427
- (100.0, {"round_number": 1, "marker": "NEW"}),
428
- (50.0, {"round_number": 1, "marker": "STALE"}),
501
+ (100.0, "fixed-token", {"round_number": 1, "marker": "NEW"}),
502
+ (50.0, "fixed-token", {"round_number": 1, "marker": "STALE"}),
429
503
  ])
430
504
 
431
505
  async def _fake_run_in_threadpool(fn, *args): # noqa: ANN001, ARG001
@@ -434,7 +508,7 @@ def test_stale_concurrent_rebuild_is_never_published(
434
508
  monkeypatch.setattr(sc, "run_in_threadpool", _fake_run_in_threadpool)
435
509
 
436
510
  cfg = load_config(valid_config_path)
437
- app = build_app(SqliteStore(detail_db), cfg)
511
+ app = build_app(store, cfg)
438
512
  with TestClient(app) as cli:
439
513
  r1 = cli.get("/board")
440
514
  assert r1.json()["marker"] == "NEW"
@@ -542,6 +542,64 @@ def test_sqlite_integrity_check_degrades_to_a_placeholder_on_an_empty_result(mon
542
542
  assert sql.sqlite_integrity_check(object()) == "<no output>"
543
543
 
544
544
 
545
+ # ── change detection: sqlite_data_version (#3294) ────────────────────────
546
+ #
547
+ # The /board read path's write-driven cache invalidation calls this instead
548
+ # of spelling `PRAGMA data_version` in coord/dao.py, where the SQLite-only
549
+ # statement-text ratchet below would (correctly) reject it.
550
+
551
+
552
+ def test_sqlite_data_version_advances_when_another_connection_commits(tmp_path):
553
+ """The property #3294's cache depends on: the token MOVES on somebody
554
+ else's commit, and holds still when nobody writes.
555
+
556
+ Both halves matter and neither implies the other — a helper that returned
557
+ a fresh constant every call would pass "it changed" while making the
558
+ cache useless, and one that returned a hardcoded constant would pass "it
559
+ held still" while making the cache serve stale boards forever. Driven
560
+ through two real connections on a file DB because that *is* the semantics
561
+ under test: `PRAGMA data_version` only reports commits made by a
562
+ connection other than the reader's own.
563
+ """
564
+ db = tmp_path / "dv.db"
565
+ writer = sqlite3.connect(str(db))
566
+ reader = sqlite3.connect(str(db))
567
+ try:
568
+ writer.execute("CREATE TABLE t (id INTEGER PRIMARY KEY)")
569
+ writer.commit()
570
+
571
+ before = sql.sqlite_data_version(reader)
572
+ assert sql.sqlite_data_version(reader) == before, (
573
+ "no write happened between these two reads — the token must not move"
574
+ )
575
+
576
+ writer.execute("INSERT INTO t (id) VALUES (1)")
577
+ writer.commit()
578
+
579
+ assert sql.sqlite_data_version(reader) != before, (
580
+ "another connection committed — the token must move, or the "
581
+ "/board cache can never notice an external write"
582
+ )
583
+ finally:
584
+ reader.close()
585
+ writer.close()
586
+
587
+
588
+ def test_sqlite_data_version_degrades_to_a_constant_on_an_empty_result(monkeypatch):
589
+ """Real SQLite always answers with a row, but a stub (or a connection in
590
+ an exotic state) might not. Degrade to a constant rather than raising:
591
+ ``change_token``'s caller treats an exception as "assume changed", and an
592
+ IndexError escaping here would turn a missing PRAGMA row into a permanent
593
+ rebuild-on-every-request."""
594
+
595
+ class _Cursor:
596
+ def fetchone(self):
597
+ return None
598
+
599
+ monkeypatch.setattr(sql, "execute", lambda conn, statement, params=(): _Cursor())
600
+ assert sql.sqlite_data_version(object()) == "0"
601
+
602
+
545
603
  # ── row factory ──────────────────────────────────────────────────────────
546
604
 
547
605