code-coordinator 0.5.451__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.451 → code_coordinator-0.5.453}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/client.py +54 -3
  7. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dao.py +96 -0
  8. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/server.py +98 -14
  9. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_board.py +24 -1
  10. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/fleet_snapshot.py +31 -3
  11. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/serve_app.py +75 -17
  12. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/sql.py +36 -0
  13. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/conftest.py +20 -0
  14. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_read_path.py +77 -3
  15. code_coordinator-0.5.453/tests/test_client.py +206 -0
  16. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_api.py +9 -0
  17. code_coordinator-0.5.453/tests/test_dashboard_server.py +224 -0
  18. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_sql_dialect.py +58 -0
  19. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_sqlite_connect_ratchet.py +19 -5
  20. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_store_contract.py +15 -0
  21. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/board.md +0 -0
  22. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/complete-session.md +0 -0
  23. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.claude/commands/coordinator.md +0 -0
  24. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/_lib.sh +0 -0
  25. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-checkout +0 -0
  26. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-commit +0 -0
  27. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.githooks/post-merge +0 -0
  28. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/coord-ci-acceptance.yml +0 -0
  30. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/auto-release.yml +0 -0
  31. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/publish.yml +0 -0
  32. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/.gitignore +0 -0
  34. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/GOAL.md +0 -0
  36. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/LICENSE +0 -0
  37. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/README.md +0 -0
  39. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/approved_work.py +0 -0
  54. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/audit.py +0 -0
  55. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/auto_loop.py +0 -0
  56. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/backup.py +0 -0
  57. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/block_log.py +0 -0
  58. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_schema.py +0 -0
  59. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_service.py +0 -0
  60. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/board_wire.py +0 -0
  61. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/brain.py +0 -0
  62. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/branch_model.py +0 -0
  63. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/bug_intake.py +0 -0
  64. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/cargo_cache.py +0 -0
  65. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_fix.py +0 -0
  66. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_github.py +0 -0
  67. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_gitlab.py +0 -0
  68. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/ci_store.py +0 -0
  69. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/claim.py +0 -0
  70. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/cli.py +0 -0
  71. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/codegen.py +0 -0
  72. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/__init__.py +0 -0
  73. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/_common.py +0 -0
  74. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/acceptance.py +0 -0
  75. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/agent_ops.py +0 -0
  76. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/audit.py +0 -0
  77. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/backup.py +0 -0
  78. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/chat.py +0 -0
  79. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/codegen.py +0 -0
  80. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dispatch.py +0 -0
  81. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dispatch_workers.py +0 -0
  82. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/dr.py +0 -0
  83. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/drive.py +0 -0
  84. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/drive_queue.py +0 -0
  85. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/gate_a.py +0 -0
  86. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/gates.py +0 -0
  87. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/issues.py +0 -0
  88. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/lifecycle.py +0 -0
  89. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/machine.py +0 -0
  90. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/merge.py +0 -0
  91. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/milestone.py +0 -0
  92. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/plan_followup.py +0 -0
  93. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/plans.py +0 -0
  94. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/portal.py +0 -0
  95. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/pr.py +0 -0
  96. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/release.py +0 -0
  97. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/repo.py +0 -0
  98. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/report.py +0 -0
  99. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/review.py +0 -0
  100. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/scorecard.py +0 -0
  101. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/sessions.py +0 -0
  102. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/setup.py +0 -0
  103. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/status.py +0 -0
  104. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/store_migrate.py +0 -0
  105. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/terminal.py +0 -0
  106. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/test_gate.py +0 -0
  107. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/commands/tui.py +0 -0
  108. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/comments.py +0 -0
  109. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/config.py +0 -0
  110. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/config_reload.py +0 -0
  111. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/confirm_test.py +0 -0
  112. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/conflict_fix.py +0 -0
  113. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/__init__.py +0 -0
  114. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/fixture.py +0 -0
  115. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/index.html +0 -0
  116. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dashboard/terminal.py +0 -0
  117. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/db.py +0 -0
  118. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dead_end.py +0 -0
  119. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/decomposition_chat.py +0 -0
  120. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/README.md +0 -0
  121. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-agent.service +0 -0
  122. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-backup.service +0 -0
  123. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-backup.timer +0 -0
  124. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.service +0 -0
  125. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.sh +0 -0
  126. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-db-backup.timer +0 -0
  127. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.service +0 -0
  128. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-dr-verify.timer +0 -0
  129. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.service +0 -0
  130. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-drive-queue.timer +0 -0
  131. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-failure-notify.service +0 -0
  132. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.service +0 -0
  133. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  134. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-notify.service +0 -0
  135. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-notify.timer +0 -0
  136. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.service +0 -0
  137. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-propagate.timer +0 -0
  138. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.service +0 -0
  139. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-release-window.timer +0 -0
  140. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-serve.service +0 -0
  141. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.service +0 -0
  142. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web-dist-build.timer +0 -0
  143. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy/coord-web.service +0 -0
  144. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy_manifest.py +0 -0
  145. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deploy_units.py +0 -0
  146. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deprecation_telemetry.py +0 -0
  147. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/deps.py +0 -0
  148. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/diagnose.py +0 -0
  149. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dispatch.py +0 -0
  150. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dist_name.py +0 -0
  151. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dr_promote.py +0 -0
  152. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/dr_verify.py +0 -0
  153. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive.py +0 -0
  154. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive_queue.py +0 -0
  155. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/drive_state.py +0 -0
  156. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/events.py +0 -0
  157. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/failure_class.py +0 -0
  158. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/filelock.py +0 -0
  159. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/fleet_config_health.py +0 -0
  160. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/forge_availability.py +0 -0
  161. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/freshness.py +0 -0
  162. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_a.py +0 -0
  163. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_b.py +0 -0
  164. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gate_snapshot.py +0 -0
  165. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gates.py +0 -0
  166. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/gen_board_fixture.py +0 -0
  167. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/github_ops.py +0 -0
  168. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/github_throttle.py +0 -0
  169. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/goal.py +0 -0
  170. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/graph_health.py +0 -0
  171. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/__init__.py +0 -0
  172. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/aggregate.py +0 -0
  173. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/__init__.py +0 -0
  174. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/_ci_pin.py +0 -0
  175. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/agent_install.py +0 -0
  176. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/cargo_targets.py +0 -0
  177. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/claude_binary.py +0 -0
  178. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/config_drift.py +0 -0
  179. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  180. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/coord_web_ci_pin.py +0 -0
  181. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/deploy_lane_facts.py +0 -0
  182. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/disk.py +0 -0
  183. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  184. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_phantom.py +0 -0
  185. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/fleet_unit_drift.py +0 -0
  186. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/graph.py +0 -0
  187. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/graphify_cli.py +0 -0
  188. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/index_lock.py +0 -0
  189. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/issues_sync_staleness.py +0 -0
  190. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/plan_usage.py +0 -0
  191. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/pr_churn.py +0 -0
  192. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/release_cordon.py +0 -0
  193. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/repo_state.py +0 -0
  194. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/spawned_coord.py +0 -0
  195. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/stalled_pipeline.py +0 -0
  196. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/timer_active.py +0 -0
  197. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/toolchain.py +0 -0
  198. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/unit_drift.py +0 -0
  199. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/unit_enablement.py +0 -0
  200. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/wedged_drive_queue.py +0 -0
  201. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/checks/worktrees.py +0 -0
  202. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/cli.py +0 -0
  203. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/context.py +0 -0
  204. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/models.py +0 -0
  205. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/pypi.py +0 -0
  206. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/registry.py +0 -0
  207. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/render.py +0 -0
  208. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/health/units.py +0 -0
  209. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/hooks.py +0 -0
  210. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/housekeeping.py +0 -0
  211. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/interactive.py +0 -0
  212. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/issue_store.py +0 -0
  213. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/issues_sync_status.py +0 -0
  214. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/liveness_auditor.py +0 -0
  215. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_metrics.py +0 -0
  216. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_onboard.py +0 -0
  217. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_pause.py +0 -0
  218. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/machine_stats.py +0 -0
  219. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/merge_queue.py +0 -0
  220. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_chat.py +0 -0
  221. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_dispatch.py +0 -0
  222. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_gate.py +0 -0
  223. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/milestone_order.py +0 -0
  224. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/mock_author.py +0 -0
  225. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/models.py +0 -0
  226. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/network.py +0 -0
  227. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/new_issue_chat.py +0 -0
  228. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/__init__.py +0 -0
  229. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/baseline.py +0 -0
  230. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/cli.py +0 -0
  231. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/collect.py +0 -0
  232. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/digest.py +0 -0
  233. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/models.py +0 -0
  234. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/predicate.py +0 -0
  235. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/service.py +0 -0
  236. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/store.py +0 -0
  237. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notifier/transport.py +0 -0
  238. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/notify.py +0 -0
  239. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/openapi.py +0 -0
  240. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/overlap_fence.py +0 -0
  241. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/overlap_predict.py +0 -0
  242. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/parentage.py +0 -0
  243. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/parentage_github.py +0 -0
  244. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/pipeline.py +0 -0
  245. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/plan_parser.py +0 -0
  246. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/plans.py +0 -0
  247. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/platform_paths.py +0 -0
  248. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_bridge.py +0 -0
  249. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_store.py +0 -0
  250. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/portal_sync.py +0 -0
  251. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/pr_body_lint.py +0 -0
  252. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/prereqs.py +0 -0
  253. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/progress.py +0 -0
  254. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/__init__.py +0 -0
  255. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/base.py +0 -0
  256. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/claude.py +0 -0
  257. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/claude_pty.py +0 -0
  258. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/providers/opencode.py +0 -0
  259. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/queue_diagnose.py +0 -0
  260. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reconcile.py +0 -0
  261. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reconcile_tick.py +0 -0
  262. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/refine_chat.py +0 -0
  263. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_cordon.py +0 -0
  264. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_propagate.py +0 -0
  265. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_verify.py +0 -0
  266. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/release_window.py +0 -0
  267. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_dormancy.py +0 -0
  268. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_edit.py +0 -0
  269. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/repo_onboard.py +0 -0
  270. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/reports.py +0 -0
  271. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/rest_schema.py +0 -0
  272. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/revalidate.py +0 -0
  273. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/review.py +0 -0
  274. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/scorecard.py +0 -0
  275. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/self_health.py +0 -0
  276. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  277. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  278. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  279. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  280. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  281. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/portal-followup/SKILL.md +0 -0
  282. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/release-now/SKILL.md +0 -0
  283. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  284. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  285. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/skills/update-issue/SKILL.md +0 -0
  286. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/smoke.py +0 -0
  287. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/spend_ceiling.py +0 -0
  288. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/split_work.py +0 -0
  289. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/stage_projection.py +0 -0
  290. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/state.py +0 -0
  291. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/store_migrate.py +0 -0
  292. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/store_parity.py +0 -0
  293. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/templates/deploy-cloudflare.node.yml +0 -0
  294. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_author.py +0 -0
  295. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_chat.py +0 -0
  296. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_orchestrator.py +0 -0
  297. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/test_report.py +0 -0
  298. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/tui_release.py +0 -0
  299. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/uat_checks.py +0 -0
  300. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage.py +0 -0
  301. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage_limits.py +0 -0
  302. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/usage_rollup.py +0 -0
  303. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coord/worker_events.py +0 -0
  304. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/coordinator.example.yml +0 -0
  305. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-agent.service +0 -0
  306. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-backup.service +0 -0
  307. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-backup.timer +0 -0
  308. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.service +0 -0
  309. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.sh +0 -0
  310. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-db-backup.timer +0 -0
  311. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-dr-verify.service +0 -0
  312. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-dr-verify.timer +0 -0
  313. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-drive-queue.service +0 -0
  314. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-drive-queue.timer +0 -0
  315. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-failure-notify.service +0 -0
  316. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-failure-notify.sh +0 -0
  317. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.service +0 -0
  318. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-fleet-watchdog.timer +0 -0
  319. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-notify.service +0 -0
  320. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-notify.timer +0 -0
  321. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-propagate.service +0 -0
  322. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-propagate.timer +0 -0
  323. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-window.service +0 -0
  324. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-release-window.timer +0 -0
  325. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-serve.service +0 -0
  326. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.service +0 -0
  327. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.sh +0 -0
  328. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-dist-build.timer +0 -0
  329. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web-rollback.sh +0 -0
  330. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/coord-web.service +0 -0
  331. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/deploy/node-shim.sh +0 -0
  332. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_TUI_CI.md +0 -0
  333. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  334. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_CI.md +0 -0
  335. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_COORD_WEB_DIST.md +0 -0
  336. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  337. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/AGENT_OPERATIONS.md +0 -0
  338. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ARCHITECTURE.md +0 -0
  339. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ARCH_SECURITY_GATES.md +0 -0
  340. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/COCKPIT.md +0 -0
  341. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CONTROL_CENTER.md +0 -0
  342. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/COST_DISCIPLINE.md +0 -0
  343. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CROSS_PLATFORM.md +0 -0
  344. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CUSTOMER_FACING_APPS.md +0 -0
  345. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/CUSTOMER_PORTAL.md +0 -0
  346. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DATA_STORE_SELECTION.md +0 -0
  347. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DISASTER_RECOVERY.md +0 -0
  348. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/DRIVE_QUEUE.md +0 -0
  349. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/EPHEMERAL_WORKERS.md +0 -0
  350. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/FORGE_MIGRATION.md +0 -0
  351. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/GRAPHIFY_SETUP.md +0 -0
  352. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ISSUE_GUIDANCE.md +0 -0
  353. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/MAC_MINI.md +0 -0
  354. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  355. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/NOTIFIER.md +0 -0
  356. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPENCODE_VERIFICATION.md +0 -0
  357. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPERATING_GOTCHAS.md +0 -0
  358. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/OPERATOR_GUIDES.md +0 -0
  359. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/ORACLE_LOOP.md +0 -0
  360. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PHONE_WEBAPP.md +0 -0
  361. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PIPELINE_V2.md +0 -0
  362. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/PLATFORM_EVOLUTION.md +0 -0
  363. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/SECOND_BACKEND.md +0 -0
  364. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/STORE_SERVICE.md +0 -0
  365. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  366. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/WEB_CONTROL_CENTER.md +0 -0
  367. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/WSL_WINDOWS_WORKER.md +0 -0
  368. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/README.md +0 -0
  369. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/_tokens.css +0 -0
  370. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/issue-detail.html +0 -0
  371. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-narrow.html +0 -0
  372. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/docs/mocks/web/pipeline-wide.html +0 -0
  373. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/graphify-out/.gitignore +0 -0
  374. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/install-agent.sh +0 -0
  375. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/pyproject.toml +0 -0
  376. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/audit_review_verdict_overrides.py +0 -0
  377. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  378. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/build-worker-image.sh +0 -0
  379. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/coordinator-machine.py +0 -0
  380. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/dr-down.sh +0 -0
  381. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/dr-up.sh +0 -0
  382. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/epic-down.sh +0 -0
  383. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/epic-up.sh +0 -0
  384. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/preflight.sh +0 -0
  385. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/provision-server.sh +0 -0
  386. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/provision-worker.sh +0 -0
  387. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  388. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  389. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/throwaway-vm.sh +0 -0
  390. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/azure-workers/verify-github-token.sh +0 -0
  391. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/check_gh_argv_containment.py +0 -0
  392. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/codegen.py +0 -0
  393. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-test-runner.sh +0 -0
  394. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  395. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  396. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  397. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  398. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/coord-venv-rollback.sh +0 -0
  399. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/drive-batch.sh +0 -0
  400. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/extract-coord-tui.sh +0 -0
  401. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/fleet_watchdog.py +0 -0
  402. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/gen_board_fixture.py +0 -0
  403. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/gen_mock_index.py +0 -0
  404. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/lib/provision-core.sh +0 -0
  405. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/next_release_tag.py +0 -0
  406. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/provision-machine.sh +0 -0
  407. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/run_tests_in_populated_home.sh +0 -0
  408. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/run_tests_without_gh.sh +0 -0
  409. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/setup-macmini.sh +0 -0
  410. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/smoke_437_interactive.py +0 -0
  411. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify-provision-noble.sh +0 -0
  412. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_878_review_capture.py +0 -0
  413. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_release_published.py +0 -0
  414. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/scripts/verify_release_wheel.py +0 -0
  415. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/setup.cfg +0 -0
  416. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/SMOKE_SET.md +0 -0
  417. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/__init__.py +0 -0
  418. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/conftest.py +0 -0
  419. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/contract.md +0 -0
  420. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/manifest.yml +0 -0
  421. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  422. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  423. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/contract.md +0 -0
  424. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  425. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  426. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/manifest.yml +0 -0
  427. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  428. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-51/tsconfig.json +0 -0
  429. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  430. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/backends.py +0 -0
  431. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-basic.json +0 -0
  432. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  433. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  434. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  435. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  436. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/all_pass.json +0 -0
  437. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  438. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/mixed_fail.json +0 -0
  439. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  440. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  441. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/skip.json +0 -0
  442. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/playwright/truncated.json +0 -0
  443. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  444. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  445. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  446. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  447. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  448. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  449. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  450. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  451. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_acceptance.py +0 -0
  452. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_acceptance_drivers.py +0 -0
  453. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent.py +0 -0
  454. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_api_error.py +0 -0
  455. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_app.py +0 -0
  456. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_branch_base.py +0 -0
  457. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_branch_capture.py +0 -0
  458. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_config_free_1712.py +0 -0
  459. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_deploy_units_endpoint.py +0 -0
  460. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_dirty_worktree.py +0 -0
  461. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  462. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_graph_self_heal.py +0 -0
  463. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_health_h3.py +0 -0
  464. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_idle_restart.py +0 -0
  465. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_push_failure.py +0 -0
  466. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_reap.py +0 -0
  467. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_repos_and_pull.py +0 -0
  468. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_restart_services_endpoint.py +0 -0
  469. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_skills_self_heal.py +0 -0
  470. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_startup_diagnostics.py +0 -0
  471. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_update.py +0 -0
  472. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_update_bluegreen.py +0 -0
  473. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_usage_limit.py +0 -0
  474. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_agent_zero_commit.py +0 -0
  475. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ambient_home_isolation.py +0 -0
  476. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_capability_reroute_3241.py +0 -0
  477. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_dependency_busy_2804.py +0 -0
  478. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_reject_plan.py +0 -0
  479. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approve_usage_gate.py +0 -0
  480. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approved_work_2532.py +0 -0
  481. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_approved_work_2996.py +0 -0
  482. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_assignment_already_recorded_daemon.py +0 -0
  483. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_log.py +0 -0
  484. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_outcome.py +0 -0
  485. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_audit_query.py +0 -0
  486. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_auto_loop.py +0 -0
  487. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_auto_release_publish_2035.py +0 -0
  488. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_backend_selection.py +0 -0
  489. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_backup.py +0 -0
  490. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_base_checkout_restore.py +0 -0
  491. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_block_log.py +0 -0
  492. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_cap_762.py +0 -0
  493. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_fixture.py +0 -0
  494. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_schema.py +0 -0
  495. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_service.py +0 -0
  496. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_state.py +0 -0
  497. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_board_wire.py +0 -0
  498. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_brain.py +0 -0
  499. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_branch_model.py +0 -0
  500. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_bug_intake.py +0 -0
  501. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_build_worker_image_env_update.py +0 -0
  502. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cargo_cache.py +0 -0
  503. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_check_gh_argv_containment.py +0 -0
  504. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_acceptance_gate_1950.py +0 -0
  505. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_fix.py +0 -0
  506. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_github.py +0 -0
  507. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_gitlab.py +0 -0
  508. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_parity_2091.py +0 -0
  509. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_ci_store.py +0 -0
  510. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_claim.py +0 -0
  511. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_claude_md_budget.py +0 -0
  512. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_acceptance.py +0 -0
  513. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign.py +0 -0
  514. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  515. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_interactive_remote.py +0 -0
  516. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_provider.py +0 -0
  517. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  518. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_audit.py +0 -0
  519. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_chat_continue.py +0 -0
  520. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_codegen.py +0 -0
  521. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_decide.py +0 -0
  522. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_capability_rules.py +0 -0
  523. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_config_provenance.py +0 -0
  524. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_forge_availability.py +0 -0
  525. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_graph.py +0 -0
  526. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_self.py +0 -0
  527. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_diagnose_test_coverage.py +0 -0
  528. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor.py +0 -0
  529. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_free_1801.py +0 -0
  530. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  531. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  532. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_drive.py +0 -0
  533. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_drive_queue.py +0 -0
  534. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_escalate.py +0 -0
  535. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_fix_headless_review.py +0 -0
  536. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_gate_a.py +0 -0
  537. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_install_drift.py +0 -0
  538. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_install_skills.py +0 -0
  539. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_comment.py +0 -0
  540. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_create_label.py +0 -0
  541. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_reopen.py +0 -0
  542. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_issue_view_list.py +0 -0
  543. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_merge.py +0 -0
  544. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_assign.py +0 -0
  545. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_capture.py +0 -0
  546. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_chat_add_child.py +0 -0
  547. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_dispatch.py +0 -0
  548. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_b.py +0 -0
  549. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_gate_c.py +0 -0
  550. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_order.py +0 -0
  551. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  552. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_milestone_ship.py +0 -0
  553. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_network.py +0 -0
  554. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_new_issue_chat.py +0 -0
  555. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_plans.py +0 -0
  556. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_portal.py +0 -0
  557. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_pr.py +0 -0
  558. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_pull_artifact.py +0 -0
  559. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_queue.py +0 -0
  560. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_reattach_sessions.py +0 -0
  561. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_refine_board.py +0 -0
  562. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_preflight.py +0 -0
  563. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_propagate.py +0 -0
  564. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_release_window.py +0 -0
  565. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_repo_2220.py +0 -0
  566. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  567. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_scorecard.py +0 -0
  568. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_serve_store_backend_3084.py +0 -0
  569. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_set_review_findings.py +0 -0
  570. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_advisory_terminal.py +0 -0
  571. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_contested_tag.py +0 -0
  572. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_merge_queue.py +0 -0
  573. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_provider.py +0 -0
  574. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_review_finalizing.py +0 -0
  575. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_test_failed_tag.py +0 -0
  576. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_status_usage_limit.py +0 -0
  577. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_sync_comments_873.py +0 -0
  578. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_test_plan.py +0 -0
  579. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_track.py +0 -0
  580. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_tui_update.py +0 -0
  581. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cli_wait.py +0 -0
  582. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_base_install.py +0 -0
  583. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_config_cache_atomic_3052.py +0 -0
  584. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_client_resource_migration_1946.py +0 -0
  585. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_commands_common.py +0 -0
  586. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_comments.py +0 -0
  587. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_completion_summary.py +0 -0
  588. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config.py +0 -0
  589. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_acceptance.py +0 -0
  590. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_audit.py +0 -0
  591. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_drift_check.py +0 -0
  592. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_pricing.py +0 -0
  593. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  594. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_config_usage_gate.py +0 -0
  595. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_confirm_test.py +0 -0
  596. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_conflict_fix.py +0 -0
  597. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_conflict_fix_semantic.py +0 -0
  598. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  599. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test.py +0 -0
  600. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  601. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_baseline.py +0 -0
  602. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_populated_home.py +0 -0
  603. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_routing.py +0 -0
  604. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_test_runner_toolchain.py +0 -0
  605. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_uat.py +0 -0
  606. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coord_web_sse_restart_live.py +0 -0
  607. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_coordinator_machine.py +0 -0
  608. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_cross_platform_imports.py +0 -0
  609. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dao.py +0 -0
  610. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard.py +0 -0
  611. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_fixture.py +0 -0
  612. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_terminal.py +0 -0
  613. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dashboard_terminal_live.py +0 -0
  614. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_db.py +0 -0
  615. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dead_end.py +0 -0
  616. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_decomposition_chat.py +0 -0
  617. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_db_backup.py +0 -0
  618. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_dist.py +0 -0
  619. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_coord_web_rollback.py +0 -0
  620. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_db_backup_unit.py +0 -0
  621. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_drive_queue_unit.py +0 -0
  622. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_failure_notify_unit.py +0 -0
  623. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_manifest.py +0 -0
  624. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_notify_unit.py +0 -0
  625. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_units_lane.py +0 -0
  626. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deploy_web_unit.py +0 -0
  627. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deprecation_telemetry.py +0 -0
  628. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_deps.py +0 -0
  629. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_diagnose.py +0 -0
  630. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dispatch.py +0 -0
  631. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dispatch_target_validation.py +0 -0
  632. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dist_name.py +0 -0
  633. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_done_housekeeping.py +0 -0
  634. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_azure_scripts.py +0 -0
  635. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_promote.py +0 -0
  636. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_dr_verify.py +0 -0
  637. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive.py +0 -0
  638. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue.py +0 -0
  639. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_blocked_rendering.py +0 -0
  640. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_launch_argv.py +0 -0
  641. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  642. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_roll_pending.py +0 -0
  643. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  644. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_state.py +0 -0
  645. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_drive_tmux.py +0 -0
  646. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_capability_detection.py +0 -0
  647. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  648. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_epic_up_image_provenance.py +0 -0
  649. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_errors.py +0 -0
  650. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_events.py +0 -0
  651. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_failure_class.py +0 -0
  652. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_filelock.py +0 -0
  653. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  654. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fix_of_force_override.py +0 -0
  655. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_config_health.py +0 -0
  656. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_health_probes.py +0 -0
  657. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_health_snapshot.py +0 -0
  658. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_fleet_watchdog.py +0 -0
  659. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_forge_availability.py +0 -0
  660. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_freshness.py +0 -0
  661. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_a.py +0 -0
  662. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_b.py +0 -0
  663. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gate_snapshot_staleness.py +0 -0
  664. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gates.py +0 -0
  665. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  666. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_gen_mock_index.py +0 -0
  667. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_rust_fixture.py +0 -0
  668. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_rust_requests.py +0 -0
  669. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_generated_types_fixture.py +0 -0
  670. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_github_ops.py +0 -0
  671. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_github_throttle.py +0 -0
  672. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_goal.py +0 -0
  673. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_graph_health.py +0 -0
  674. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_graph_selfheal_absent_2237.py +0 -0
  675. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_handoff.py +0 -0
  676. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_checks.py +0 -0
  677. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_cli.py +0 -0
  678. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_cli_graph.py +0 -0
  679. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_config.py +0 -0
  680. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_context.py +0 -0
  681. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_coord_tui_ci_pin.py +0 -0
  682. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_coord_web_ci_pin.py +0 -0
  683. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_deploy_lane_facts.py +0 -0
  684. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_fix.py +0 -0
  685. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_incident_regression.py +0 -0
  686. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_issues_sync_staleness.py +0 -0
  687. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_pr_churn.py +0 -0
  688. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_pypi.py +0 -0
  689. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_registry.py +0 -0
  690. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_release_cordon_probe.py +0 -0
  691. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_timer_active.py +0 -0
  692. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_toolchain.py +0 -0
  693. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_unit_drift.py +0 -0
  694. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_unit_enablement.py +0 -0
  695. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_health_wedged_drive_queue.py +0 -0
  696. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_hooks.py +0 -0
  697. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_human_attended_437.py +0 -0
  698. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_init.py +0 -0
  699. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_install_agent_venv_2911.py +0 -0
  700. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_integration.py +0 -0
  701. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_briefing_echo.py +0 -0
  702. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_pane_log_2541.py +0 -0
  703. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_prefill_state.py +0 -0
  704. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_session_relaunch.py +0 -0
  705. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_test_verdict_backstop.py +0 -0
  706. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_token_attribution.py +0 -0
  707. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_interactive_worktree.py +0 -0
  708. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_issue_store_seam.py +0 -0
  709. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_issues_sync_status.py +0 -0
  710. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_liveness_auditor.py +0 -0
  711. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_liveness_notify.py +0 -0
  712. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_lock_contention_ratchet.py +0 -0
  713. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_metrics.py +0 -0
  714. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_onboard.py +0 -0
  715. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_pause.py +0 -0
  716. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_machine_stats.py +0 -0
  717. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_merge_queue.py +0 -0
  718. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_merge_verify.py +0 -0
  719. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_chat.py +0 -0
  720. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_dispatch.py +0 -0
  721. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_gate.py +0 -0
  722. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_order.py +0 -0
  723. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_milestone_seam.py +0 -0
  724. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_mock_author.py +0 -0
  725. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_model_tiering.py +0 -0
  726. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_models.py +0 -0
  727. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_models_config_labels.py +0 -0
  728. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_needs_attention.py +0 -0
  729. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_network.py +0 -0
  730. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_new_issue_chat.py +0 -0
  731. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_next_release_tag.py +0 -0
  732. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_node_shim.py +0 -0
  733. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_baseline.py +0 -0
  734. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_cli.py +0 -0
  735. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_collect.py +0 -0
  736. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_config.py +0 -0
  737. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_drive_seam.py +0 -0
  738. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_isolation.py +0 -0
  739. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_predicate.py +0 -0
  740. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_quiet_hours.py +0 -0
  741. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notifier_service.py +0 -0
  742. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notify.py +0 -0
  743. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_notify_drain.py +0 -0
  744. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_openapi.py +0 -0
  745. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_operational_defaults.py +0 -0
  746. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_overlap_fence.py +0 -0
  747. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_overlap_predict.py +0 -0
  748. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_packaged_deploy_units.py +0 -0
  749. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_parentage.py +0 -0
  750. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_paste_landed.py +0 -0
  751. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  752. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_pipeline.py +0 -0
  753. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_approve_plan_command.py +0 -0
  754. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_pr_command.py +0 -0
  755. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_followup_review_command.py +0 -0
  756. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_only.py +0 -0
  757. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_plan_parser.py +0 -0
  758. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_platform_paths.py +0 -0
  759. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_bridge.py +0 -0
  760. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_config.py +0 -0
  761. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_store.py +0 -0
  762. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_portal_sync.py +0 -0
  763. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_pr_body_lint.py +0 -0
  764. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_prereqs.py +0 -0
  765. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_production_db_guard.py +0 -0
  766. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_progress.py +0 -0
  767. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provider_seam.py +0 -0
  768. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers.py +0 -0
  769. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers_config_labels.py +0 -0
  770. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_providers_pty.py +0 -0
  771. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provision_core.py +0 -0
  772. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_provision_machine.py +0 -0
  773. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_py_rust_mirror_inventory.py +0 -0
  774. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_quiet_hours.py +0 -0
  775. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_quiet_hours_store_2146.py +0 -0
  776. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reap_merged_sessions.py +0 -0
  777. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reap_stale_interactive_tick.py +0 -0
  778. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile.py +0 -0
  779. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_branch.py +0 -0
  780. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_completions.py +0 -0
  781. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  782. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_merges.py +0 -0
  783. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_no_agent_record.py +0 -0
  784. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_tick.py +0 -0
  785. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reconcile_usage_limit_done.py +0 -0
  786. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_refine_chat.py +0 -0
  787. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_2101.py +0 -0
  788. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  789. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_deadlock_2240.py +0 -0
  790. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_cordon_stuck_2490.py +0 -0
  791. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_propagate.py +0 -0
  792. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_propagate_threshold.py +0 -0
  793. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_roll_between_legs_2854.py +0 -0
  794. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_roll_window_handoff.py +0 -0
  795. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_unified_1242.py +0 -0
  796. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_verify.py +0 -0
  797. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_release_window.py +0 -0
  798. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_remote_auto_prune.py +0 -0
  799. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_remote_interactive_reaper.py +0 -0
  800. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_add.py +0 -0
  801. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_dormancy.py +0 -0
  802. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_edit_2220.py +0 -0
  803. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_graph_fleet_2237.py +0 -0
  804. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_repo_onboard_2220.py +0 -0
  805. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_report_result_push.py +0 -0
  806. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_reports.py +0 -0
  807. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry.py +0 -0
  808. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry_advisory_1606.py +0 -0
  809. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_retry_type_1636.py +0 -0
  810. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_revalidate.py +0 -0
  811. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review.py +0 -0
  812. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_end_review_without_verdict.py +0 -0
  813. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_parse_failure_diagnostic.py +0 -0
  814. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_reaffirm.py +0 -0
  815. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_state.py +0 -0
  816. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_backstop.py +0 -0
  817. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_override_audit.py +0 -0
  818. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_verdict_relay.py +0 -0
  819. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_review_zero_commits.py +0 -0
  820. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_scoped_review_wiring.py +0 -0
  821. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_scorecard.py +0 -0
  822. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_self_health.py +0 -0
  823. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve.py +0 -0
  824. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_app.py +0 -0
  825. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_app_board_trim.py +0 -0
  826. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_serve_rest_routes.py +0 -0
  827. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_session.py +0 -0
  828. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_slice_issue_attribution.py +0 -0
  829. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke.py +0 -0
  830. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke_live_checkout_restore.py +0 -0
  831. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_smoke_workflow.py +0 -0
  832. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_spend_ceiling.py +0 -0
  833. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_spend_ceiling_coordinator.py +0 -0
  834. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_split.py +0 -0
  835. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_split_work.py +0 -0
  836. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stage_projection.py +0 -0
  837. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stale_busy_reviewer_697.py +0 -0
  838. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stalled_pipeline.py +0 -0
  839. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_state.py +0 -0
  840. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_state_review_findings_daemon.py +0 -0
  841. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_status_fleet_footer.py +0 -0
  842. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stop_1567.py +0 -0
  843. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_store_migrate.py +0 -0
  844. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stuck.py +0 -0
  845. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  846. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_terminal_command.py +0 -0
  847. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_author.py +0 -0
  848. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_chat.py +0 -0
  849. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_orchestrator.py +0 -0
  850. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_report.py +0 -0
  851. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_verdict_parsing.py +0 -0
  852. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_test_verdict_transcript_floor.py +0 -0
  853. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_text_io_encoding_audit.py +0 -0
  854. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_board_audit.py +0 -0
  855. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_config_load_1080.py +0 -0
  856. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_thin_client_daemon_routing_906.py +0 -0
  857. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_throwaway_vm.py +0 -0
  858. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_tmux_host.py +0 -0
  859. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_tmux_session.py +0 -0
  860. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_transcript_floor.py +0 -0
  861. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_uat_checks.py +0 -0
  862. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage.py +0 -0
  863. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage_limits.py +0 -0
  864. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_usage_rollup.py +0 -0
  865. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_venv_live_install_2121.py +0 -0
  866. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_version_single_source.py +0 -0
  867. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_watch.py +0 -0
  868. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  869. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_env_venv_isolation.py +0 -0
  870. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_events.py +0 -0
  871. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_image_pin_sync.py +0 -0
  872. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_safety.py +0 -0
  873. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worker_test_scoping.py +0 -0
  874. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worktree.py +0 -0
  875. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  876. {code_coordinator-0.5.451 → code_coordinator-0.5.453}/tests/test_write_parity.py +0 -0
  877. {code_coordinator-0.5.451 → 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.451
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.451
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
@@ -539,6 +539,7 @@ tests/test_cli_test_plan.py
539
539
  tests/test_cli_track.py
540
540
  tests/test_cli_tui_update.py
541
541
  tests/test_cli_wait.py
542
+ tests/test_client.py
542
543
  tests/test_client_base_install.py
543
544
  tests/test_client_config_cache_atomic_3052.py
544
545
  tests/test_client_resource_migration_1946.py
@@ -570,6 +571,7 @@ tests/test_dao.py
570
571
  tests/test_dashboard.py
571
572
  tests/test_dashboard_api.py
572
573
  tests/test_dashboard_fixture.py
574
+ tests/test_dashboard_server.py
573
575
  tests/test_dashboard_terminal.py
574
576
  tests/test_dashboard_terminal_live.py
575
577
  tests/test_db.py
@@ -565,6 +565,7 @@
565
565
  "tests/test_cli_track.py",
566
566
  "tests/test_cli_tui_update.py",
567
567
  "tests/test_cli_wait.py",
568
+ "tests/test_client.py",
568
569
  "tests/test_client_base_install.py",
569
570
  "tests/test_client_config_cache_atomic_3052.py",
570
571
  "tests/test_client_resource_migration_1946.py",
@@ -596,6 +597,7 @@
596
597
  "tests/test_dashboard.py",
597
598
  "tests/test_dashboard_api.py",
598
599
  "tests/test_dashboard_fixture.py",
600
+ "tests/test_dashboard_server.py",
599
601
  "tests/test_dashboard_terminal.py",
600
602
  "tests/test_dashboard_terminal_live.py",
601
603
  "tests/test_db.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.451",
2
+ "tag": "0.5.453",
3
3
  "distance": 0,
4
- "node": "g75985b1122962fa0ccd6b97ab453eabdc7a1b5e9",
4
+ "node": "gf9162e8b92018087ab923c640b8eb07b232cf9bd",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-11"
@@ -88,11 +88,62 @@ def _headers(svc: ServiceConfig) -> dict[str, str]:
88
88
  return headers
89
89
 
90
90
 
91
+ # #3295: per-service-URL ETag cache for `GET /board`, so a thin client that
92
+ # calls `fetch_board_payload()` repeatedly in a short window (dashboard
93
+ # panels each doing their own read, drive-queue polling, ...) gets a
94
+ # bodyless 304 back and reuses the last body instead of re-shipping and
95
+ # re-parsing the full board (measured at 3.5MB) on every call. The daemon
96
+ # has served `ETag` / honoured `If-None-Match` on `GET /board` since #1336;
97
+ # nothing on the server changes here, only this client now uses it.
98
+ # Process-local and never persisted — like `board_service._RESOURCE_ROUTE_SUPPORT`
99
+ # — so a fresh process (or a test) starts with an empty cache and the very
100
+ # next call is an unconditional GET.
101
+ _board_payload_cache: dict[str, tuple[str, dict]] = {}
102
+
103
+
104
+ def reset_board_payload_cache() -> None:
105
+ """Forget every cached ``(etag, body)`` pair (tests; #3295)."""
106
+ _board_payload_cache.clear()
107
+
108
+
91
109
  def fetch_board_payload(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> dict:
92
- """GET /board → the raw projection dict (also carries machines/merge_queue/…)."""
93
- resp = httpx.get(f"{svc.url}/board", headers=_headers(svc), timeout=timeout)
110
+ """GET /board → the raw projection dict (also carries machines/merge_queue/…).
111
+
112
+ #3295: sends ``If-None-Match`` with the ETag from this *svc.url*'s last
113
+ successful fetch, if any. A ``304`` means the daemon is telling us the
114
+ board hasn't changed since that ETag was minted — the cached body from
115
+ that fetch is still exactly correct, so it's returned as-is with no
116
+ re-parse. A ``200`` (first call for this URL, or the board really did
117
+ change) refreshes the cache with the new ``ETag``/body pair; a response
118
+ carrying no ``ETag`` at all clears any stale entry rather than caching
119
+ something we can't validate next time.
120
+ """
121
+ headers = _headers(svc)
122
+ cached = _board_payload_cache.get(svc.url)
123
+ if cached is not None:
124
+ headers["If-None-Match"] = cached[0]
125
+ resp = httpx.get(f"{svc.url}/board", headers=headers, timeout=timeout)
126
+ if resp.status_code == 304:
127
+ if cached is not None:
128
+ return cached[1]
129
+ # Should never happen — we only ever send `If-None-Match` when
130
+ # *cached* is set, so a 304 here means the daemon answered a
131
+ # conditional response to an unconditional request. Surfacing this
132
+ # loudly beats silently returning `None`/an empty board that looks
133
+ # like a real (if suspiciously quiet) fleet.
134
+ raise RuntimeError(
135
+ f"GET {svc.url}/board answered 304 but this client sent no "
136
+ "If-None-Match (no cached ETag for this service) — refusing to "
137
+ "guess at a board"
138
+ )
94
139
  resp.raise_for_status()
95
- return resp.json()
140
+ body = resp.json()
141
+ etag = resp.headers.get("ETag")
142
+ if etag:
143
+ _board_payload_cache[svc.url] = (etag, body)
144
+ else:
145
+ _board_payload_cache.pop(svc.url, None)
146
+ return body
96
147
 
97
148
 
98
149
  def fetch_healthz(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> dict:
@@ -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)
@@ -2378,22 +2378,90 @@ def build_app(
2378
2378
  # would take those down to protest a missing frontend.
2379
2379
  logger.warning("coord web: %s", webapp_bundle_missing_message(webapp_dist))
2380
2380
 
2381
+ # #3295: per-process board memo. Before this, EVERY `/api/*` request on
2382
+ # the daemon host (no `board_service` configured — the deployment
2383
+ # actually in use) fell through to `read_board()`: open sqlite, run the
2384
+ # query, walk every row through `assemble_board()`. A single screen load
2385
+ # (a few panels each polling their own endpoint) or one background
2386
+ # `_background_poller()` tick fanned that out into 2-5 independent
2387
+ # builds of the SAME board. In thin-client mode (`board_service`
2388
+ # configured) the equivalent waste was `_read_board_and_machine_health()`
2389
+ # and `_read_fleet_health()` each firing their OWN `fetch_board_payload()`
2390
+ # round trip for the same daemon snapshot.
2391
+ #
2392
+ # `_board_memo` is local to this `build_app()` closure — like
2393
+ # `_seen_terminal`/`_orphaned_since` below — never a module global, so
2394
+ # each dashboard process (and each test's own `build_app()`) gets an
2395
+ # independent memo that can never bleed into another's.
2396
+ _BOARD_MEMO_TTL_S = 2.0
2397
+ _board_memo: dict[str, Any] = {"at": 0.0, "board": None, "payload": None}
2398
+
2399
+ def _fetch_board_and_payload(): # -> tuple[Board, dict | None]
2400
+ """Uncached ``(board, payload)`` build — what the memo below wraps.
2401
+
2402
+ ``payload`` is the raw ``/board`` projection dict when this process
2403
+ is a thin client (``board_service`` configured) — it carries sibling
2404
+ keys (``fleet_health``, ...) a bare :class:`Board` does not — and
2405
+ ``None`` when reading the local DB/daemon-host path directly, since
2406
+ there is no daemon payload to share in that mode.
2407
+ """
2408
+ from coord import board_service # noqa: PLC0415
2409
+
2410
+ svc = board_service.resolve()
2411
+ if svc is not None:
2412
+ from coord.client import board_from_payload, fetch_board_payload # noqa: PLC0415
2413
+
2414
+ payload = fetch_board_payload(svc)
2415
+ return board_from_payload(payload), payload
2416
+ return read_board(), None
2417
+
2418
+ def _memoized_board_and_payload(): # -> tuple[Board, dict | None]
2419
+ """``(board, payload)``, rebuilt at most once per ``_BOARD_MEMO_TTL_S``.
2420
+
2421
+ The ONE read every board-shaped handler below goes through —
2422
+ ``_read_board()``, ``_read_board_and_machine_health()`` and
2423
+ ``_read_fleet_health()`` all call this rather than each doing their
2424
+ own ``read_board()``/``fetch_board_payload()`` (#3295: "one question,
2425
+ one answer" applies to *how the data is obtained*, not just what it
2426
+ says). A short TTL rather than invalidate-on-write: long enough to
2427
+ collapse a burst of requests (one screen load, one SSE tick) into a
2428
+ single build, short enough that no panel is ever more than ~2s
2429
+ behind the DB/daemon.
2430
+ """
2431
+ now = time.monotonic()
2432
+ if _board_memo["board"] is not None and (now - _board_memo["at"]) < _BOARD_MEMO_TTL_S:
2433
+ return _board_memo["board"], _board_memo["payload"]
2434
+ board, payload = _fetch_board_and_payload()
2435
+ _board_memo.update(at=now, board=board, payload=payload)
2436
+ return board, payload
2437
+
2381
2438
  def _read_board():
2382
- """The board for this request — seeded fixture or the live DB/daemon.
2439
+ """The board for this request — seeded fixture or the memoized live DB/daemon.
2383
2440
 
2384
2441
  Fixture mode rebuilds the Board from the raw payload on every call, so
2385
2442
  a handler that mutates what it is handed (``unstick`` →
2386
- ``mark_failed_by_id``) can't leak that into the next request.
2443
+ ``mark_failed_by_id``) can't leak that into the next request. Live
2444
+ mode goes through :func:`_memoized_board_and_payload` (#3295).
2387
2445
  """
2388
2446
  if _fixture is not None:
2389
2447
  return _fixture.board()
2390
- return read_board()
2448
+ board, _payload = _memoized_board_and_payload()
2449
+ return board
2391
2450
 
2392
2451
  def _write_board(board) -> None: # noqa: ANN001
2393
- """Persist *board* — a no-op in fixture mode (writes never execute)."""
2452
+ """Persist *board* — a no-op in fixture mode (writes never execute).
2453
+
2454
+ Invalidates the #3295 board memo rather than repopulating it with
2455
+ *board*: in thin-client mode the write only carries the mutated
2456
+ `Board`, not a fresh daemon payload (`fleet_health` et al.), so
2457
+ keeping a stale/partial cache entry around risks a subsequent
2458
+ `_read_fleet_health()`/`_read_board_and_machine_health()` call
2459
+ serving an empty block instead of paying for one more real read.
2460
+ """
2394
2461
  if _fixture is not None:
2395
2462
  return
2396
2463
  write_board(board)
2464
+ _board_memo.update(at=0.0, board=None, payload=None)
2397
2465
 
2398
2466
  def _read_board_and_machine_health() -> tuple: # -> tuple[Board, dict[str, dict]]
2399
2467
  """The board plus every configured machine's latest daemon-tick-
@@ -2423,16 +2491,19 @@ def build_app(
2423
2491
  install, or nothing has ticked the health refresher yet) — callers
2424
2492
  must treat that the same as an ``unknown`` state, never as healthy
2425
2493
  (#1485's failure mode).
2494
+
2495
+ #3295: the thin-client branch now reads through
2496
+ :func:`_memoized_board_and_payload` instead of calling
2497
+ ``fetch_board_payload`` itself — sharing the SAME daemon round trip
2498
+ ``_read_fleet_health()`` (and ``_read_board()``) make within the
2499
+ memo window, rather than each paying for its own.
2426
2500
  """
2427
2501
  from coord import board_service # noqa: PLC0415
2428
2502
 
2429
2503
  svc = board_service.resolve()
2430
2504
  if svc is not None:
2431
- from coord.client import board_from_payload, fetch_board_payload # noqa: PLC0415
2432
-
2433
- payload = fetch_board_payload(svc)
2434
- board = board_from_payload(payload)
2435
- rows = (payload.get("fleet_health") or {}).get("machine_health") or []
2505
+ board, payload = _memoized_board_and_payload()
2506
+ rows = ((payload or {}).get("fleet_health") or {}).get("machine_health") or []
2436
2507
  return board, {row["machine"]: row for row in rows}
2437
2508
 
2438
2509
  from coord.health.fleet_snapshot import machine_health_rows # noqa: PLC0415
@@ -2494,15 +2565,19 @@ def build_app(
2494
2565
  ``coord status``. Per-machine severities still come from the same
2495
2566
  row-assembly the thin-client path rides (``machine_health_rows``), so
2496
2567
  the two modes can't drift on that half.
2568
+
2569
+ #3295: the thin-client branch reads through
2570
+ :func:`_memoized_board_and_payload` — the same memo
2571
+ ``_read_board_and_machine_health()`` reads through — instead of
2572
+ issuing its own ``fetch_board_payload`` call, so the two no longer
2573
+ double the daemon I/O a single request burst costs.
2497
2574
  """
2498
2575
  from coord import board_service # noqa: PLC0415
2499
2576
 
2500
2577
  svc = board_service.resolve()
2501
2578
  if svc is not None:
2502
- from coord.client import fetch_board_payload # noqa: PLC0415
2503
-
2504
- payload = fetch_board_payload(svc)
2505
- return payload.get("fleet_health") or dict(_EMPTY_FLEET_HEALTH_BLOCK)
2579
+ _board, payload = _memoized_board_and_payload()
2580
+ return (payload or {}).get("fleet_health") or dict(_EMPTY_FLEET_HEALTH_BLOCK)
2506
2581
 
2507
2582
  from coord.health.aggregate import local_fleet_health_block # noqa: PLC0415
2508
2583
 
@@ -2746,12 +2821,21 @@ def build_app(
2746
2821
  _sessions_offline_since: dict[str, float] = {}
2747
2822
 
2748
2823
  async def _background_poller() -> None:
2749
- """Runs forever; polls agents every _POLL_INTERVAL seconds."""
2824
+ """Runs forever; polls agents every _POLL_INTERVAL seconds.
2825
+
2826
+ #3295: passes its own board read through the shared
2827
+ ``_read_board()``/memo rather than letting ``_poll_once`` fall back
2828
+ to its own bare ``read_board()`` — a tick landing inside a client's
2829
+ own ``/api/board`` poll window reuses that build instead of paying
2830
+ for a second one, and the tick's own build is then what the very
2831
+ next client poll reuses.
2832
+ """
2750
2833
  await asyncio.sleep(10) # Short initial delay so the server is ready
2751
2834
  while True:
2752
2835
  try:
2753
2836
  possibly_stuck = await _poll_once(
2754
2837
  config, event_source, _seen_terminal, _orphaned_since,
2838
+ board=_read_board(),
2755
2839
  needs_attention_seen=_needs_attention_seen,
2756
2840
  )
2757
2841
  event_source.publish(BOARD_UPDATED, {
@@ -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`