code-coordinator 0.5.451__tar.gz → 0.5.452__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.452}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/client.py +54 -3
  7. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dashboard/server.py +98 -14
  8. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/conftest.py +20 -0
  9. code_coordinator-0.5.452/tests/test_client.py +206 -0
  10. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dashboard_api.py +9 -0
  11. code_coordinator-0.5.452/tests/test_dashboard_server.py +224 -0
  12. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/.gitignore +0 -0
  25. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/GOAL.md +0 -0
  27. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/LICENSE +0 -0
  28. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/README.md +0 -0
  30. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/dependency_links.txt +0 -0
  31. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/entry_points.txt +0 -0
  32. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/requires.txt +0 -0
  33. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/code_coordinator.egg-info/top_level.txt +0 -0
  34. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/__init__.py +0 -0
  35. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/_board_mapping.py +0 -0
  36. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/acceptance.py +0 -0
  37. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/acceptance_drivers.py +0 -0
  38. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agent.py +0 -0
  39. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agent_app.py +0 -0
  40. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agent_update.py +0 -0
  41. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/backup.py +0 -0
  48. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/board_schema.py +0 -0
  50. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/codegen.py +0 -0
  63. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/backup.py +0 -0
  69. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/codegen.py +0 -0
  71. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/dr.py +0 -0
  74. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/machine.py +0 -0
  81. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/store_migrate.py +0 -0
  96. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/config.py +0 -0
  101. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dao.py +0 -0
  105. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dashboard/__init__.py +0 -0
  106. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dashboard/fixture.py +0 -0
  107. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dashboard/index.html +0 -0
  108. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/db.py +0 -0
  110. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-backup.service +0 -0
  115. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-backup.timer +0 -0
  116. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.service +0 -0
  117. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.sh +0 -0
  118. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.timer +0 -0
  119. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-dr-verify.service +0 -0
  120. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-dr-verify.timer +0 -0
  121. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-drive-queue.service +0 -0
  122. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-drive-queue.timer +0 -0
  123. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-failure-notify.service +0 -0
  124. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-fleet-watchdog.service +0 -0
  125. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  126. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-notify.service +0 -0
  127. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-notify.timer +0 -0
  128. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-release-propagate.service +0 -0
  129. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-release-propagate.timer +0 -0
  130. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-release-window.service +0 -0
  131. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-release-window.timer +0 -0
  132. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-serve.service +0 -0
  133. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-web-dist-build.service +0 -0
  134. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-web-dist-build.timer +0 -0
  135. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy/coord-web.service +0 -0
  136. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy_manifest.py +0 -0
  137. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deploy_units.py +0 -0
  138. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deprecation_telemetry.py +0 -0
  139. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/deps.py +0 -0
  140. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/diagnose.py +0 -0
  141. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dispatch.py +0 -0
  142. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dist_name.py +0 -0
  143. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dr_promote.py +0 -0
  144. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/dr_verify.py +0 -0
  145. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/drive.py +0 -0
  146. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/drive_queue.py +0 -0
  147. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/drive_state.py +0 -0
  148. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/events.py +0 -0
  149. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/failure_class.py +0 -0
  150. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/filelock.py +0 -0
  151. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/fleet_config_health.py +0 -0
  152. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/forge_availability.py +0 -0
  153. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/freshness.py +0 -0
  154. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/gate_a.py +0 -0
  155. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/gate_b.py +0 -0
  156. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/gate_snapshot.py +0 -0
  157. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/gates.py +0 -0
  158. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/gen_board_fixture.py +0 -0
  159. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/github_ops.py +0 -0
  160. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/github_throttle.py +0 -0
  161. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/goal.py +0 -0
  162. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/graph_health.py +0 -0
  163. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/__init__.py +0 -0
  164. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/aggregate.py +0 -0
  165. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/__init__.py +0 -0
  166. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/_ci_pin.py +0 -0
  167. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/agent_install.py +0 -0
  168. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/cargo_targets.py +0 -0
  169. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/claude_binary.py +0 -0
  170. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/config_drift.py +0 -0
  171. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  172. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/coord_web_ci_pin.py +0 -0
  173. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/deploy_lane_facts.py +0 -0
  174. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/disk.py +0 -0
  175. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/fleet_board.py +0 -0
  176. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  177. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/fleet_phantom.py +0 -0
  178. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/fleet_unit_drift.py +0 -0
  179. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/graph.py +0 -0
  180. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/graphify_cli.py +0 -0
  181. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/index_lock.py +0 -0
  182. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/issues_sync_staleness.py +0 -0
  183. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/plan_usage.py +0 -0
  184. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/pr_churn.py +0 -0
  185. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/release_cordon.py +0 -0
  186. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/repo_state.py +0 -0
  187. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/spawned_coord.py +0 -0
  188. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/stalled_pipeline.py +0 -0
  189. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/timer_active.py +0 -0
  190. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/toolchain.py +0 -0
  191. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/unit_drift.py +0 -0
  192. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/unit_enablement.py +0 -0
  193. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/wedged_drive_queue.py +0 -0
  194. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/checks/worktrees.py +0 -0
  195. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/cli.py +0 -0
  196. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/context.py +0 -0
  197. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/fleet_snapshot.py +0 -0
  198. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/models.py +0 -0
  199. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/pypi.py +0 -0
  200. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/registry.py +0 -0
  201. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/render.py +0 -0
  202. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/health/units.py +0 -0
  203. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/hooks.py +0 -0
  204. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/housekeeping.py +0 -0
  205. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/interactive.py +0 -0
  206. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/issue_store.py +0 -0
  207. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/issues_sync_status.py +0 -0
  208. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/liveness_auditor.py +0 -0
  209. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/machine_metrics.py +0 -0
  210. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/machine_onboard.py +0 -0
  211. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/machine_pause.py +0 -0
  212. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/machine_stats.py +0 -0
  213. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/merge_queue.py +0 -0
  214. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/milestone_chat.py +0 -0
  215. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/milestone_dispatch.py +0 -0
  216. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/milestone_gate.py +0 -0
  217. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/milestone_order.py +0 -0
  218. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/mock_author.py +0 -0
  219. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/models.py +0 -0
  220. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/network.py +0 -0
  221. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/new_issue_chat.py +0 -0
  222. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/__init__.py +0 -0
  223. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/baseline.py +0 -0
  224. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/cli.py +0 -0
  225. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/collect.py +0 -0
  226. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/digest.py +0 -0
  227. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/models.py +0 -0
  228. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/predicate.py +0 -0
  229. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/service.py +0 -0
  230. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/store.py +0 -0
  231. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notifier/transport.py +0 -0
  232. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/notify.py +0 -0
  233. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/openapi.py +0 -0
  234. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/overlap_fence.py +0 -0
  235. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/overlap_predict.py +0 -0
  236. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/parentage.py +0 -0
  237. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/parentage_github.py +0 -0
  238. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/pipeline.py +0 -0
  239. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/plan_parser.py +0 -0
  240. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/plans.py +0 -0
  241. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/platform_paths.py +0 -0
  242. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/portal_bridge.py +0 -0
  243. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/portal_store.py +0 -0
  244. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/portal_sync.py +0 -0
  245. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/pr_body_lint.py +0 -0
  246. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/prereqs.py +0 -0
  247. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/progress.py +0 -0
  248. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/providers/__init__.py +0 -0
  249. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/providers/base.py +0 -0
  250. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/providers/claude.py +0 -0
  251. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/providers/claude_pty.py +0 -0
  252. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/providers/opencode.py +0 -0
  253. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/queue_diagnose.py +0 -0
  254. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/reconcile.py +0 -0
  255. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/reconcile_tick.py +0 -0
  256. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/refine_chat.py +0 -0
  257. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/release_cordon.py +0 -0
  258. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/release_propagate.py +0 -0
  259. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/release_verify.py +0 -0
  260. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/release_window.py +0 -0
  261. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/repo_dormancy.py +0 -0
  262. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/repo_edit.py +0 -0
  263. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/repo_onboard.py +0 -0
  264. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/reports.py +0 -0
  265. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/rest_schema.py +0 -0
  266. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/revalidate.py +0 -0
  267. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/review.py +0 -0
  268. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/scorecard.py +0 -0
  269. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/self_health.py +0 -0
  270. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/serve_app.py +0 -0
  271. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  272. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  273. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  274. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  275. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  276. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/portal-followup/SKILL.md +0 -0
  277. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/release-now/SKILL.md +0 -0
  278. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  279. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  280. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/skills/update-issue/SKILL.md +0 -0
  281. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/smoke.py +0 -0
  282. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/spend_ceiling.py +0 -0
  283. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/split_work.py +0 -0
  284. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/sql.py +0 -0
  285. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/stage_projection.py +0 -0
  286. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/state.py +0 -0
  287. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/store_migrate.py +0 -0
  288. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/store_parity.py +0 -0
  289. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/templates/deploy-cloudflare.node.yml +0 -0
  290. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/test_author.py +0 -0
  291. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/test_chat.py +0 -0
  292. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/test_orchestrator.py +0 -0
  293. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/test_report.py +0 -0
  294. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/tui_release.py +0 -0
  295. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/uat_checks.py +0 -0
  296. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/usage.py +0 -0
  297. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/usage_limits.py +0 -0
  298. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/usage_rollup.py +0 -0
  299. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coord/worker_events.py +0 -0
  300. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/coordinator.example.yml +0 -0
  301. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-agent.service +0 -0
  302. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-backup.service +0 -0
  303. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-backup.timer +0 -0
  304. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-db-backup.service +0 -0
  305. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-db-backup.sh +0 -0
  306. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-db-backup.timer +0 -0
  307. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-dr-verify.service +0 -0
  308. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-dr-verify.timer +0 -0
  309. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-drive-queue.service +0 -0
  310. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-drive-queue.timer +0 -0
  311. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-failure-notify.service +0 -0
  312. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-failure-notify.sh +0 -0
  313. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-fleet-watchdog.service +0 -0
  314. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-fleet-watchdog.timer +0 -0
  315. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-notify.service +0 -0
  316. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-notify.timer +0 -0
  317. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-release-propagate.service +0 -0
  318. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-release-propagate.timer +0 -0
  319. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-release-window.service +0 -0
  320. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-release-window.timer +0 -0
  321. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-serve.service +0 -0
  322. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.service +0 -0
  323. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.sh +0 -0
  324. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.timer +0 -0
  325. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-web-rollback.sh +0 -0
  326. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/coord-web.service +0 -0
  327. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/deploy/node-shim.sh +0 -0
  328. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ADR_COORD_TUI_CI.md +0 -0
  329. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  330. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_CI.md +0 -0
  331. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_DIST.md +0 -0
  332. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  333. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/AGENT_OPERATIONS.md +0 -0
  334. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ARCHITECTURE.md +0 -0
  335. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ARCH_SECURITY_GATES.md +0 -0
  336. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/COCKPIT.md +0 -0
  337. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/CONTROL_CENTER.md +0 -0
  338. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/COST_DISCIPLINE.md +0 -0
  339. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/CROSS_PLATFORM.md +0 -0
  340. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/CUSTOMER_FACING_APPS.md +0 -0
  341. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/CUSTOMER_PORTAL.md +0 -0
  342. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/DATA_STORE_SELECTION.md +0 -0
  343. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/DISASTER_RECOVERY.md +0 -0
  344. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/DRIVE_QUEUE.md +0 -0
  345. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/EPHEMERAL_WORKERS.md +0 -0
  346. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/FORGE_MIGRATION.md +0 -0
  347. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/GRAPHIFY_SETUP.md +0 -0
  348. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ISSUE_GUIDANCE.md +0 -0
  349. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/MAC_MINI.md +0 -0
  350. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  351. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/NOTIFIER.md +0 -0
  352. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/OPENCODE_VERIFICATION.md +0 -0
  353. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/OPERATING_GOTCHAS.md +0 -0
  354. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/OPERATOR_GUIDES.md +0 -0
  355. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/ORACLE_LOOP.md +0 -0
  356. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/PHONE_WEBAPP.md +0 -0
  357. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/PIPELINE_V2.md +0 -0
  358. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/PLATFORM_EVOLUTION.md +0 -0
  359. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/SECOND_BACKEND.md +0 -0
  360. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/STORE_SERVICE.md +0 -0
  361. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  362. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/WEB_CONTROL_CENTER.md +0 -0
  363. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/WSL_WINDOWS_WORKER.md +0 -0
  364. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/mocks/web/README.md +0 -0
  365. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/mocks/web/_tokens.css +0 -0
  366. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/mocks/web/issue-detail.html +0 -0
  367. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/mocks/web/pipeline-narrow.html +0 -0
  368. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/docs/mocks/web/pipeline-wide.html +0 -0
  369. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/graphify-out/.gitignore +0 -0
  370. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/install-agent.sh +0 -0
  371. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/pyproject.toml +0 -0
  372. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/audit_review_verdict_overrides.py +0 -0
  373. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  374. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/build-worker-image.sh +0 -0
  375. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/coordinator-machine.py +0 -0
  376. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/dr-down.sh +0 -0
  377. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/dr-up.sh +0 -0
  378. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/epic-down.sh +0 -0
  379. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/epic-up.sh +0 -0
  380. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/preflight.sh +0 -0
  381. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/provision-server.sh +0 -0
  382. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/provision-worker.sh +0 -0
  383. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  384. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  385. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/throwaway-vm.sh +0 -0
  386. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/azure-workers/verify-github-token.sh +0 -0
  387. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/check_gh_argv_containment.py +0 -0
  388. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/codegen.py +0 -0
  389. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-test-runner.sh +0 -0
  390. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  391. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  392. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  393. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  394. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/coord-venv-rollback.sh +0 -0
  395. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/drive-batch.sh +0 -0
  396. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/extract-coord-tui.sh +0 -0
  397. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/fleet_watchdog.py +0 -0
  398. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/gen_board_fixture.py +0 -0
  399. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/gen_mock_index.py +0 -0
  400. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/lib/provision-core.sh +0 -0
  401. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/next_release_tag.py +0 -0
  402. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/provision-machine.sh +0 -0
  403. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/run_tests_in_populated_home.sh +0 -0
  404. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/run_tests_without_gh.sh +0 -0
  405. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/setup-macmini.sh +0 -0
  406. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/smoke_437_interactive.py +0 -0
  407. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/verify-provision-noble.sh +0 -0
  408. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/verify_878_review_capture.py +0 -0
  409. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/verify_release_published.py +0 -0
  410. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/scripts/verify_release_wheel.py +0 -0
  411. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/setup.cfg +0 -0
  412. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/SMOKE_SET.md +0 -0
  413. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/__init__.py +0 -0
  414. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-37/conftest.py +0 -0
  415. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-37/contract.md +0 -0
  416. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-37/manifest.yml +0 -0
  417. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  418. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  419. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/contract.md +0 -0
  420. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  421. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  422. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/manifest.yml +0 -0
  423. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  424. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-51/tsconfig.json +0 -0
  425. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  426. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/backends.py +0 -0
  427. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/board-pipeline-basic.json +0 -0
  428. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  429. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  430. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  431. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  432. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/all_pass.json +0 -0
  433. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  434. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/mixed_fail.json +0 -0
  435. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  436. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  437. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/skip.json +0 -0
  438. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/playwright/truncated.json +0 -0
  439. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  440. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  441. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  442. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  443. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  444. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  445. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  446. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_acceptance.py +0 -0
  448. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_acceptance_drivers.py +0 -0
  449. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent.py +0 -0
  450. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_api_error.py +0 -0
  451. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_app.py +0 -0
  452. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_branch_base.py +0 -0
  453. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_branch_capture.py +0 -0
  454. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_config_free_1712.py +0 -0
  455. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_deploy_units_endpoint.py +0 -0
  456. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_dirty_worktree.py +0 -0
  457. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  458. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_graph_self_heal.py +0 -0
  459. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_health_h3.py +0 -0
  460. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_idle_restart.py +0 -0
  461. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_push_failure.py +0 -0
  462. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_reap.py +0 -0
  463. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_repos_and_pull.py +0 -0
  464. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_restart_services_endpoint.py +0 -0
  465. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_skills_self_heal.py +0 -0
  466. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_startup_diagnostics.py +0 -0
  467. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_update.py +0 -0
  468. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_update_bluegreen.py +0 -0
  469. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_usage_limit.py +0 -0
  470. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_agent_zero_commit.py +0 -0
  471. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ambient_home_isolation.py +0 -0
  472. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approve_capability_reroute_3241.py +0 -0
  473. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approve_dependency_busy_2804.py +0 -0
  474. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approve_reject_plan.py +0 -0
  475. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approve_usage_gate.py +0 -0
  476. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approved_work_2532.py +0 -0
  477. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_approved_work_2996.py +0 -0
  478. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_assignment_already_recorded_daemon.py +0 -0
  479. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_audit_log.py +0 -0
  480. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_audit_outcome.py +0 -0
  481. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_audit_query.py +0 -0
  482. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_auto_loop.py +0 -0
  483. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_auto_release_publish_2035.py +0 -0
  484. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_backend_selection.py +0 -0
  485. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_backup.py +0 -0
  486. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_base_checkout_restore.py +0 -0
  487. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_block_log.py +0 -0
  488. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_cap_762.py +0 -0
  489. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_fixture.py +0 -0
  490. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_read_path.py +0 -0
  491. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_schema.py +0 -0
  492. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_service.py +0 -0
  493. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_state.py +0 -0
  494. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_board_wire.py +0 -0
  495. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_brain.py +0 -0
  496. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_branch_model.py +0 -0
  497. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_bug_intake.py +0 -0
  498. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_build_worker_image_env_update.py +0 -0
  499. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cargo_cache.py +0 -0
  500. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_check_gh_argv_containment.py +0 -0
  501. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_acceptance_gate_1950.py +0 -0
  502. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_fix.py +0 -0
  503. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_github.py +0 -0
  504. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_gitlab.py +0 -0
  505. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_parity_2091.py +0 -0
  506. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_ci_store.py +0 -0
  507. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_claim.py +0 -0
  508. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_claude_md_budget.py +0 -0
  509. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_acceptance.py +0 -0
  510. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_assign.py +0 -0
  511. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  512. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_assign_interactive_remote.py +0 -0
  513. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_assign_provider.py +0 -0
  514. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  515. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_audit.py +0 -0
  516. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_chat_continue.py +0 -0
  517. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_codegen.py +0 -0
  518. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_decide.py +0 -0
  519. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_capability_rules.py +0 -0
  520. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_config_provenance.py +0 -0
  521. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_forge_availability.py +0 -0
  522. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_graph.py +0 -0
  523. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_self.py +0 -0
  524. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_diagnose_test_coverage.py +0 -0
  525. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_doctor.py +0 -0
  526. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_doctor_config_free_1801.py +0 -0
  527. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  528. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  529. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_drive.py +0 -0
  530. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_drive_queue.py +0 -0
  531. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_escalate.py +0 -0
  532. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_fix_headless_review.py +0 -0
  533. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_gate_a.py +0 -0
  534. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_install_drift.py +0 -0
  535. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_install_skills.py +0 -0
  536. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_issue_comment.py +0 -0
  537. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_issue_create_label.py +0 -0
  538. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_issue_reopen.py +0 -0
  539. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_issue_view_list.py +0 -0
  540. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_merge.py +0 -0
  541. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_assign.py +0 -0
  542. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_capture.py +0 -0
  543. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_chat_add_child.py +0 -0
  544. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_dispatch.py +0 -0
  545. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_gate_b.py +0 -0
  546. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_gate_c.py +0 -0
  547. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_order.py +0 -0
  548. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  549. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_milestone_ship.py +0 -0
  550. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_network.py +0 -0
  551. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_new_issue_chat.py +0 -0
  552. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_plans.py +0 -0
  553. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_portal.py +0 -0
  554. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_pr.py +0 -0
  555. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_pull_artifact.py +0 -0
  556. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_queue.py +0 -0
  557. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_reattach_sessions.py +0 -0
  558. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_refine_board.py +0 -0
  559. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_release_preflight.py +0 -0
  560. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_release_propagate.py +0 -0
  561. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_release_window.py +0 -0
  562. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_repo_2220.py +0 -0
  563. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  564. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_scorecard.py +0 -0
  565. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_serve_store_backend_3084.py +0 -0
  566. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_set_review_findings.py +0 -0
  567. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_advisory_terminal.py +0 -0
  568. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_contested_tag.py +0 -0
  569. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_merge_queue.py +0 -0
  570. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_provider.py +0 -0
  571. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_review_finalizing.py +0 -0
  572. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_test_failed_tag.py +0 -0
  573. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_status_usage_limit.py +0 -0
  574. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_sync_comments_873.py +0 -0
  575. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_test_plan.py +0 -0
  576. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_track.py +0 -0
  577. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_tui_update.py +0 -0
  578. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cli_wait.py +0 -0
  579. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_client_base_install.py +0 -0
  580. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_client_config_cache_atomic_3052.py +0 -0
  581. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_client_resource_migration_1946.py +0 -0
  582. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_commands_common.py +0 -0
  583. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_comments.py +0 -0
  584. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_completion_summary.py +0 -0
  585. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config.py +0 -0
  586. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_acceptance.py +0 -0
  587. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_audit.py +0 -0
  588. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_drift_check.py +0 -0
  589. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_pricing.py +0 -0
  590. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  591. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_config_usage_gate.py +0 -0
  592. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_confirm_test.py +0 -0
  593. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_conflict_fix.py +0 -0
  594. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_conflict_fix_semantic.py +0 -0
  595. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  596. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test.py +0 -0
  597. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  598. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test_runner_baseline.py +0 -0
  599. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test_runner_populated_home.py +0 -0
  600. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test_runner_routing.py +0 -0
  601. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_test_runner_toolchain.py +0 -0
  602. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_uat.py +0 -0
  603. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coord_web_sse_restart_live.py +0 -0
  604. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_coordinator_machine.py +0 -0
  605. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_cross_platform_imports.py +0 -0
  606. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dao.py +0 -0
  607. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dashboard.py +0 -0
  608. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dashboard_fixture.py +0 -0
  609. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dashboard_terminal.py +0 -0
  610. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dashboard_terminal_live.py +0 -0
  611. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_db.py +0 -0
  612. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dead_end.py +0 -0
  613. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_decomposition_chat.py +0 -0
  614. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_coord_db_backup.py +0 -0
  615. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_coord_web_dist.py +0 -0
  616. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_coord_web_rollback.py +0 -0
  617. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_db_backup_unit.py +0 -0
  618. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_drive_queue_unit.py +0 -0
  619. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_failure_notify_unit.py +0 -0
  620. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_manifest.py +0 -0
  621. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_notify_unit.py +0 -0
  622. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_units_lane.py +0 -0
  623. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deploy_web_unit.py +0 -0
  624. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deprecation_telemetry.py +0 -0
  625. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_deps.py +0 -0
  626. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_diagnose.py +0 -0
  627. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dispatch.py +0 -0
  628. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dispatch_target_validation.py +0 -0
  629. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dist_name.py +0 -0
  630. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_done_housekeeping.py +0 -0
  631. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dr_azure_scripts.py +0 -0
  632. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dr_promote.py +0 -0
  633. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_dr_verify.py +0 -0
  634. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive.py +0 -0
  635. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue.py +0 -0
  636. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue_blocked_rendering.py +0 -0
  637. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue_launch_argv.py +0 -0
  638. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  639. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue_roll_pending.py +0 -0
  640. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  641. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_state.py +0 -0
  642. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_drive_tmux.py +0 -0
  643. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_epic_up_capability_detection.py +0 -0
  644. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  645. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_epic_up_image_provenance.py +0 -0
  646. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_errors.py +0 -0
  647. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_events.py +0 -0
  648. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_failure_class.py +0 -0
  649. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_filelock.py +0 -0
  650. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  651. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_fix_of_force_override.py +0 -0
  652. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_fleet_config_health.py +0 -0
  653. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_fleet_health_probes.py +0 -0
  654. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_fleet_health_snapshot.py +0 -0
  655. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_fleet_watchdog.py +0 -0
  656. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_forge_availability.py +0 -0
  657. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_freshness.py +0 -0
  658. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gate_a.py +0 -0
  659. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gate_b.py +0 -0
  660. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gate_snapshot_staleness.py +0 -0
  661. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gates.py +0 -0
  662. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  663. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_gen_mock_index.py +0 -0
  664. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_generated_rust_fixture.py +0 -0
  665. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_generated_rust_requests.py +0 -0
  666. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_generated_types_fixture.py +0 -0
  667. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_github_ops.py +0 -0
  668. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_github_throttle.py +0 -0
  669. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_goal.py +0 -0
  670. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_graph_health.py +0 -0
  671. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_graph_selfheal_absent_2237.py +0 -0
  672. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_handoff.py +0 -0
  673. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_checks.py +0 -0
  674. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_cli.py +0 -0
  675. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_cli_graph.py +0 -0
  676. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_config.py +0 -0
  677. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_context.py +0 -0
  678. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_coord_tui_ci_pin.py +0 -0
  679. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_coord_web_ci_pin.py +0 -0
  680. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_deploy_lane_facts.py +0 -0
  681. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_fix.py +0 -0
  682. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_incident_regression.py +0 -0
  683. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_issues_sync_staleness.py +0 -0
  684. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_pr_churn.py +0 -0
  685. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_pypi.py +0 -0
  686. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_registry.py +0 -0
  687. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_release_cordon_probe.py +0 -0
  688. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_timer_active.py +0 -0
  689. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_toolchain.py +0 -0
  690. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_unit_drift.py +0 -0
  691. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_unit_enablement.py +0 -0
  692. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_health_wedged_drive_queue.py +0 -0
  693. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_hooks.py +0 -0
  694. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_human_attended_437.py +0 -0
  695. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_init.py +0 -0
  696. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_install_agent_venv_2911.py +0 -0
  697. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_integration.py +0 -0
  698. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_briefing_echo.py +0 -0
  699. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_pane_log_2541.py +0 -0
  700. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_prefill_state.py +0 -0
  701. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_session_relaunch.py +0 -0
  702. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_test_verdict_backstop.py +0 -0
  703. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_token_attribution.py +0 -0
  704. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_interactive_worktree.py +0 -0
  705. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_issue_store_seam.py +0 -0
  706. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_issues_sync_status.py +0 -0
  707. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_liveness_auditor.py +0 -0
  708. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_liveness_notify.py +0 -0
  709. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_lock_contention_ratchet.py +0 -0
  710. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_machine_metrics.py +0 -0
  711. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_machine_onboard.py +0 -0
  712. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_machine_pause.py +0 -0
  713. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_machine_stats.py +0 -0
  714. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_merge_queue.py +0 -0
  715. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_merge_verify.py +0 -0
  716. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_milestone_chat.py +0 -0
  717. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_milestone_dispatch.py +0 -0
  718. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_milestone_gate.py +0 -0
  719. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_milestone_order.py +0 -0
  720. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_milestone_seam.py +0 -0
  721. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_mock_author.py +0 -0
  722. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_model_tiering.py +0 -0
  723. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_models.py +0 -0
  724. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_models_config_labels.py +0 -0
  725. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_needs_attention.py +0 -0
  726. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_network.py +0 -0
  727. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_new_issue_chat.py +0 -0
  728. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_next_release_tag.py +0 -0
  729. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_node_shim.py +0 -0
  730. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_baseline.py +0 -0
  731. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_cli.py +0 -0
  732. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_collect.py +0 -0
  733. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_config.py +0 -0
  734. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_drive_seam.py +0 -0
  735. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_isolation.py +0 -0
  736. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_predicate.py +0 -0
  737. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_quiet_hours.py +0 -0
  738. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notifier_service.py +0 -0
  739. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notify.py +0 -0
  740. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_notify_drain.py +0 -0
  741. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_openapi.py +0 -0
  742. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_operational_defaults.py +0 -0
  743. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_overlap_fence.py +0 -0
  744. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_overlap_predict.py +0 -0
  745. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_packaged_deploy_units.py +0 -0
  746. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_parentage.py +0 -0
  747. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_paste_landed.py +0 -0
  748. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  749. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_pipeline.py +0 -0
  750. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_plan_followup_approve_plan_command.py +0 -0
  751. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_plan_followup_pr_command.py +0 -0
  752. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_plan_followup_review_command.py +0 -0
  753. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_plan_only.py +0 -0
  754. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_plan_parser.py +0 -0
  755. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_platform_paths.py +0 -0
  756. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_portal_bridge.py +0 -0
  757. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_portal_config.py +0 -0
  758. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_portal_store.py +0 -0
  759. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_portal_sync.py +0 -0
  760. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_pr_body_lint.py +0 -0
  761. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_prereqs.py +0 -0
  762. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_production_db_guard.py +0 -0
  763. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_progress.py +0 -0
  764. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_provider_seam.py +0 -0
  765. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_providers.py +0 -0
  766. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_providers_config_labels.py +0 -0
  767. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_providers_pty.py +0 -0
  768. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_provision_core.py +0 -0
  769. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_provision_machine.py +0 -0
  770. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_py_rust_mirror_inventory.py +0 -0
  771. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_quiet_hours.py +0 -0
  772. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_quiet_hours_store_2146.py +0 -0
  773. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reap_merged_sessions.py +0 -0
  774. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reap_stale_interactive_tick.py +0 -0
  775. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile.py +0 -0
  776. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_branch.py +0 -0
  777. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_completions.py +0 -0
  778. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  779. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_merges.py +0 -0
  780. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_no_agent_record.py +0 -0
  781. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_tick.py +0 -0
  782. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reconcile_usage_limit_done.py +0 -0
  783. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_refine_chat.py +0 -0
  784. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_cordon_2101.py +0 -0
  785. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  786. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_cordon_deadlock_2240.py +0 -0
  787. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_cordon_stuck_2490.py +0 -0
  788. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_propagate.py +0 -0
  789. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_propagate_threshold.py +0 -0
  790. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_roll_between_legs_2854.py +0 -0
  791. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_roll_window_handoff.py +0 -0
  792. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_unified_1242.py +0 -0
  793. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_verify.py +0 -0
  794. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_release_window.py +0 -0
  795. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_remote_auto_prune.py +0 -0
  796. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_remote_interactive_reaper.py +0 -0
  797. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_repo_add.py +0 -0
  798. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_repo_dormancy.py +0 -0
  799. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_repo_edit_2220.py +0 -0
  800. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_repo_graph_fleet_2237.py +0 -0
  801. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_repo_onboard_2220.py +0 -0
  802. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_report_result_push.py +0 -0
  803. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_reports.py +0 -0
  804. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_retry.py +0 -0
  805. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_retry_advisory_1606.py +0 -0
  806. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_retry_type_1636.py +0 -0
  807. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_revalidate.py +0 -0
  808. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review.py +0 -0
  809. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_end_review_without_verdict.py +0 -0
  810. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_parse_failure_diagnostic.py +0 -0
  811. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_reaffirm.py +0 -0
  812. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_state.py +0 -0
  813. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_verdict_backstop.py +0 -0
  814. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_verdict_override_audit.py +0 -0
  815. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_verdict_relay.py +0 -0
  816. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_review_zero_commits.py +0 -0
  817. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_scoped_review_wiring.py +0 -0
  818. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_scorecard.py +0 -0
  819. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_self_health.py +0 -0
  820. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_serve.py +0 -0
  821. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_serve_app.py +0 -0
  822. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_serve_app_board_trim.py +0 -0
  823. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_serve_rest_routes.py +0 -0
  824. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_session.py +0 -0
  825. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_slice_issue_attribution.py +0 -0
  826. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_smoke.py +0 -0
  827. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_smoke_live_checkout_restore.py +0 -0
  828. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_smoke_workflow.py +0 -0
  829. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_spend_ceiling.py +0 -0
  830. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_spend_ceiling_coordinator.py +0 -0
  831. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_split.py +0 -0
  832. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_split_work.py +0 -0
  833. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_sql_dialect.py +0 -0
  834. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_sqlite_connect_ratchet.py +0 -0
  835. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stage_projection.py +0 -0
  836. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stale_busy_reviewer_697.py +0 -0
  837. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stalled_pipeline.py +0 -0
  838. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_state.py +0 -0
  839. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_state_review_findings_daemon.py +0 -0
  840. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_status_fleet_footer.py +0 -0
  841. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stop_1567.py +0 -0
  842. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_store_contract.py +0 -0
  843. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_store_migrate.py +0 -0
  844. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stuck.py +0 -0
  845. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  846. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_terminal_command.py +0 -0
  847. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_author.py +0 -0
  848. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_chat.py +0 -0
  849. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_orchestrator.py +0 -0
  850. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_report.py +0 -0
  851. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_verdict_parsing.py +0 -0
  852. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_test_verdict_transcript_floor.py +0 -0
  853. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_text_io_encoding_audit.py +0 -0
  854. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_thin_client_board_audit.py +0 -0
  855. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_thin_client_config_load_1080.py +0 -0
  856. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_thin_client_daemon_routing_906.py +0 -0
  857. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_throwaway_vm.py +0 -0
  858. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_tmux_host.py +0 -0
  859. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_tmux_session.py +0 -0
  860. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_transcript_floor.py +0 -0
  861. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_uat_checks.py +0 -0
  862. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_usage.py +0 -0
  863. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_usage_limits.py +0 -0
  864. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_usage_rollup.py +0 -0
  865. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_venv_live_install_2121.py +0 -0
  866. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_version_single_source.py +0 -0
  867. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_watch.py +0 -0
  868. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  869. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worker_env_venv_isolation.py +0 -0
  870. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worker_events.py +0 -0
  871. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worker_image_pin_sync.py +0 -0
  872. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worker_safety.py +0 -0
  873. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worker_test_scoping.py +0 -0
  874. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worktree.py +0 -0
  875. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  876. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/tests/test_write_parity.py +0 -0
  877. {code_coordinator-0.5.451 → code_coordinator-0.5.452}/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.452
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.452
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.452",
3
3
  "distance": 0,
4
- "node": "g75985b1122962fa0ccd6b97ab453eabdc7a1b5e9",
4
+ "node": "g69efb323ff5ace2c8783a4e3eb8deb0b37b5aff0",
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:
@@ -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, {
@@ -139,6 +139,26 @@ def _fresh_resource_route_support():
139
139
  board_service.reset_resource_route_support()
140
140
 
141
141
 
142
+ @pytest.fixture(autouse=True)
143
+ def _fresh_board_payload_cache():
144
+ """#3295: forget every cached ``GET /board`` ETag/body between tests.
145
+
146
+ ``coord.client.fetch_board_payload`` now memoizes ``(etag, body)`` per
147
+ service URL so a thin client sending a repeat ``If-None-Match`` can reuse
148
+ the daemon's 304. That memo is module-level — same shape as
149
+ ``_fresh_resource_route_support`` above — so without a reset a test that
150
+ populates it for a fake ``http://daemon:7435`` (a URL string reused
151
+ across dozens of unrelated tests) would leak a stale ``If-None-Match``
152
+ header, and a stale cached body, into the next test that happens to
153
+ reuse it.
154
+ """
155
+ from coord import client as _cc
156
+
157
+ _cc.reset_board_payload_cache()
158
+ yield
159
+ _cc.reset_board_payload_cache()
160
+
161
+
142
162
  @pytest.fixture(autouse=True)
143
163
  def _no_real_webapp_bundle(monkeypatch, tmp_path):
144
164
  """#2009: never let the HOST's live webapp bundle change a test's answer.
@@ -0,0 +1,206 @@
1
+ """Tests for #3295's client-side conditional GET.
2
+
3
+ ``coord.client.fetch_board_payload`` now keeps a ``(etag, body)`` pair per
4
+ service URL and sends ``If-None-Match`` on every subsequent call, reusing the
5
+ cached body on a ``304`` instead of re-shipping/re-parsing the full board
6
+ (measured at 3.5MB) every time a thin-client dashboard reads it. The daemon
7
+ side of this (``ETag`` on ``GET /board``, honouring ``If-None-Match``) has
8
+ existed since #1336 — nothing server-side changes here, only this client now
9
+ uses it.
10
+
11
+ See ``tests/test_dashboard_server.py`` for #3295's other, independent half:
12
+ the per-process board memo in ``coord/dashboard/server.py`` that fixes the
13
+ non-thin-client (daemon-host) deployment.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import httpx
19
+ import pytest
20
+
21
+ import coord.client as cc
22
+
23
+
24
+ @pytest.fixture(autouse=True)
25
+ def _clean_board_payload_cache():
26
+ """Isolate each test from every other's cached ETag/body.
27
+
28
+ Not relying solely on the (already autouse, repo-wide) conftest fixture
29
+ of the same shape — this module's own tests are the direct spec for the
30
+ cache, so they assert their pre/post state explicitly rather than
31
+ trusting a fixture defined elsewhere.
32
+ """
33
+ cc.reset_board_payload_cache()
34
+ yield
35
+ cc.reset_board_payload_cache()
36
+
37
+
38
+ class _FakeResponse:
39
+ """Minimal stand-in for ``httpx.Response`` — just what
40
+ ``fetch_board_payload`` reads: ``status_code``, ``headers``,
41
+ ``raise_for_status()``, ``json()``.
42
+ """
43
+
44
+ def __init__(self, *, status_code: int = 200, json_body=None, etag: str | None = None):
45
+ self.status_code = status_code
46
+ self._json_body = json_body
47
+ self.headers: dict[str, str] = {"ETag": etag} if etag else {}
48
+
49
+ def raise_for_status(self) -> None:
50
+ if self.status_code >= 400:
51
+ raise httpx.HTTPStatusError("boom", request=None, response=self)
52
+
53
+ def json(self):
54
+ return self._json_body
55
+
56
+
57
+ def _svc(url: str = "http://daemon:7435") -> cc.ServiceConfig:
58
+ return cc.ServiceConfig(url=url)
59
+
60
+
61
+ class TestFetchBoardPayloadConditionalGet:
62
+ def test_first_call_for_a_url_sends_no_if_none_match(self, monkeypatch) -> None:
63
+ captured: dict = {}
64
+
65
+ def fake_get(url, *, headers=None, **kw):
66
+ captured["headers"] = headers
67
+ return _FakeResponse(json_body={"round_number": 1}, etag='"v1"')
68
+
69
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
70
+
71
+ body = cc.fetch_board_payload(_svc())
72
+
73
+ assert body == {"round_number": 1}
74
+ assert "If-None-Match" not in captured["headers"]
75
+
76
+ def test_second_call_sends_the_etag_cached_from_the_first(self, monkeypatch) -> None:
77
+ headers_sent: list[dict] = []
78
+
79
+ def fake_get(url, *, headers=None, **kw):
80
+ headers_sent.append(headers)
81
+ return _FakeResponse(json_body={"round_number": 1}, etag='"v1"')
82
+
83
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
84
+ svc = _svc()
85
+
86
+ cc.fetch_board_payload(svc)
87
+ cc.fetch_board_payload(svc)
88
+
89
+ assert len(headers_sent) == 2
90
+ assert "If-None-Match" not in headers_sent[0]
91
+ assert headers_sent[1]["If-None-Match"] == '"v1"'
92
+
93
+ def test_304_reuses_the_cached_body_and_never_touches_json(self, monkeypatch) -> None:
94
+ """The whole point: a validated-unchanged response must not pay for
95
+ parsing a (potentially multi-MB) body it doesn't have."""
96
+ headers_sent: list[dict] = []
97
+ first_body = {"round_number": 1, "assignments": ["x"] * 50}
98
+
99
+ def fake_get(url, *, headers=None, **kw):
100
+ headers_sent.append(headers)
101
+ if len(headers_sent) == 1:
102
+ return _FakeResponse(json_body=first_body, etag='"v1"')
103
+
104
+ def _must_not_be_called():
105
+ raise AssertionError("json() called on a 304 — body was refetched")
106
+
107
+ resp = _FakeResponse(status_code=304)
108
+ resp.json = _must_not_be_called
109
+ return resp
110
+
111
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
112
+ svc = _svc()
113
+
114
+ first = cc.fetch_board_payload(svc)
115
+ second = cc.fetch_board_payload(svc)
116
+
117
+ assert first == first_body
118
+ assert second == first_body
119
+ assert headers_sent[1]["If-None-Match"] == '"v1"'
120
+
121
+ def test_a_new_etag_on_200_replaces_the_cached_one(self, monkeypatch) -> None:
122
+ responses = [
123
+ _FakeResponse(json_body={"round_number": 1}, etag='"v1"'),
124
+ _FakeResponse(json_body={"round_number": 2}, etag='"v2"'),
125
+ ]
126
+ headers_sent: list[dict] = []
127
+
128
+ def fake_get(url, *, headers=None, **kw):
129
+ headers_sent.append(headers)
130
+ return responses.pop(0)
131
+
132
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
133
+ svc = _svc()
134
+
135
+ first = cc.fetch_board_payload(svc)
136
+ second = cc.fetch_board_payload(svc)
137
+
138
+ assert first == {"round_number": 1}
139
+ assert second == {"round_number": 2}
140
+ assert headers_sent[1]["If-None-Match"] == '"v1"'
141
+
142
+ # A third call must send the NEW etag ("v2"), never the stale "v1" —
143
+ # proves the cache was actually replaced, not just appended to.
144
+ def fake_get_third(url, *, headers=None, **kw):
145
+ headers_sent.append(headers)
146
+ return _FakeResponse(json_body={"round_number": 2}, etag='"v2"')
147
+
148
+ monkeypatch.setattr(cc.httpx, "get", fake_get_third)
149
+ cc.fetch_board_payload(svc)
150
+ assert headers_sent[2]["If-None-Match"] == '"v2"'
151
+
152
+ def test_cache_is_scoped_per_service_url(self, monkeypatch) -> None:
153
+ """Two different daemons (or a test's two fake ones) must never
154
+ share a cache entry, or a client pointed at daemon B could send
155
+ daemon A's ETag and silently trust a body that was never daemon B's."""
156
+
157
+ def fake_get(url, *, headers=None, **kw):
158
+ etag = '"a-1"' if url.startswith("http://a:") else '"b-1"'
159
+ return _FakeResponse(json_body={"url": url}, etag=etag)
160
+
161
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
162
+
163
+ cc.fetch_board_payload(_svc("http://a:7435"))
164
+ cc.fetch_board_payload(_svc("http://b:7435"))
165
+
166
+ assert cc._board_payload_cache["http://a:7435"][0] == '"a-1"'
167
+ assert cc._board_payload_cache["http://b:7435"][0] == '"b-1"'
168
+
169
+ def test_response_without_an_etag_is_not_cached(self, monkeypatch) -> None:
170
+ def fake_get(url, *, headers=None, **kw):
171
+ return _FakeResponse(json_body={"round_number": 1}) # no ETag
172
+
173
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
174
+
175
+ cc.fetch_board_payload(_svc())
176
+
177
+ assert "http://daemon:7435" not in cc._board_payload_cache
178
+
179
+ def test_a_304_with_no_prior_cache_raises_instead_of_guessing(self, monkeypatch) -> None:
180
+ """A #2096 "gate can fail" check on the cache itself: without this
181
+ guard, an unconditional GET answered 304 (a daemon bug — this client
182
+ never sends `If-None-Match` with nothing cached) would fall through
183
+ to `resp.json()` on a bodyless response and silently return `None`
184
+ — indistinguishable from "board successfully fetched, contents:
185
+ nothing". Refusing outright is the honest failure."""
186
+
187
+ def fake_get(url, *, headers=None, **kw):
188
+ assert "If-None-Match" not in (headers or {})
189
+ return _FakeResponse(status_code=304)
190
+
191
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
192
+
193
+ with pytest.raises(RuntimeError):
194
+ cc.fetch_board_payload(_svc())
195
+
196
+ def test_reset_board_payload_cache_clears_every_entry(self, monkeypatch) -> None:
197
+ def fake_get(url, *, headers=None, **kw):
198
+ return _FakeResponse(json_body={"round_number": 1}, etag='"v1"')
199
+
200
+ monkeypatch.setattr(cc.httpx, "get", fake_get)
201
+ cc.fetch_board_payload(_svc())
202
+ assert cc._board_payload_cache
203
+
204
+ cc.reset_board_payload_cache()
205
+
206
+ assert cc._board_payload_cache == {}
@@ -697,6 +697,11 @@ class TestMachinesAPI:
697
697
 
698
698
  class _Resp:
699
699
  status_code = 200
700
+ # #3295: fetch_board_payload now reads the ETag off a real
701
+ # response's `.headers` to decide whether to cache the body
702
+ # for a future `If-None-Match` — an empty mapping here means
703
+ # "no ETag returned", which is a valid (if uncacheable) 200.
704
+ headers: dict = {}
700
705
 
701
706
  def raise_for_status(self):
702
707
  return None
@@ -1129,6 +1134,10 @@ class TestMachinesHealthAPI:
1129
1134
 
1130
1135
  class _Resp:
1131
1136
  status_code = 200
1137
+ # #3295: see the identical comment in
1138
+ # TestMachinesAPI.test_thin_client_reads_the_daemons_published_fleet_health_block
1139
+ # — fetch_board_payload now reads `.headers` for an ETag.
1140
+ headers: dict = {}
1132
1141
 
1133
1142
  def raise_for_status(self):
1134
1143
  return None