code-coordinator 0.5.450__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.450 → code_coordinator-0.5.452}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/client.py +54 -3
  7. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dashboard/server.py +98 -14
  8. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/serve_app.py +136 -8
  9. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/conftest.py +20 -0
  10. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_read_path.py +234 -8
  11. code_coordinator-0.5.452/tests/test_client.py +206 -0
  12. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dashboard_api.py +9 -0
  13. code_coordinator-0.5.452/tests/test_dashboard_server.py +224 -0
  14. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_sqlite_connect_ratchet.py +11 -3
  15. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/.gitignore +0 -0
  28. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/GOAL.md +0 -0
  30. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/LICENSE +0 -0
  31. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/README.md +0 -0
  33. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/approved_work.py +0 -0
  48. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/backup.py +0 -0
  51. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/board_schema.py +0 -0
  53. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/ci_fix.py +0 -0
  60. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/ci_gitlab.py +0 -0
  62. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/ci_store.py +0 -0
  63. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/claim.py +0 -0
  64. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/cli.py +0 -0
  65. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/codegen.py +0 -0
  66. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/backup.py +0 -0
  72. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/codegen.py +0 -0
  74. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/dr.py +0 -0
  77. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/machine.py +0 -0
  84. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/pr.py +0 -0
  90. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/release.py +0 -0
  91. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/repo.py +0 -0
  92. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/report.py +0 -0
  93. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/review.py +0 -0
  94. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/scorecard.py +0 -0
  95. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/sessions.py +0 -0
  96. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/setup.py +0 -0
  97. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/status.py +0 -0
  98. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/store_migrate.py +0 -0
  99. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/config.py +0 -0
  104. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/confirm_test.py +0 -0
  106. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/conflict_fix.py +0 -0
  107. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dao.py +0 -0
  108. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dashboard/terminal.py +0 -0
  112. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/db.py +0 -0
  113. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dead_end.py +0 -0
  114. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/decomposition_chat.py +0 -0
  115. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/README.md +0 -0
  116. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-agent.service +0 -0
  117. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-backup.service +0 -0
  118. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-backup.timer +0 -0
  119. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.service +0 -0
  120. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.sh +0 -0
  121. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-db-backup.timer +0 -0
  122. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-dr-verify.service +0 -0
  123. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-dr-verify.timer +0 -0
  124. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-drive-queue.service +0 -0
  125. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-drive-queue.timer +0 -0
  126. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-failure-notify.service +0 -0
  127. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-fleet-watchdog.service +0 -0
  128. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  129. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-notify.service +0 -0
  130. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-notify.timer +0 -0
  131. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-release-propagate.service +0 -0
  132. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-release-propagate.timer +0 -0
  133. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-release-window.service +0 -0
  134. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-release-window.timer +0 -0
  135. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-serve.service +0 -0
  136. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-web-dist-build.service +0 -0
  137. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-web-dist-build.timer +0 -0
  138. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy/coord-web.service +0 -0
  139. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy_manifest.py +0 -0
  140. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deploy_units.py +0 -0
  141. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deprecation_telemetry.py +0 -0
  142. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/deps.py +0 -0
  143. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/diagnose.py +0 -0
  144. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dispatch.py +0 -0
  145. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/drive_queue.py +0 -0
  150. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/drive_state.py +0 -0
  151. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/events.py +0 -0
  152. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/failure_class.py +0 -0
  153. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/filelock.py +0 -0
  154. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/fleet_config_health.py +0 -0
  155. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/forge_availability.py +0 -0
  156. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/freshness.py +0 -0
  157. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/gate_a.py +0 -0
  158. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/gate_b.py +0 -0
  159. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/gate_snapshot.py +0 -0
  160. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/gates.py +0 -0
  161. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/gen_board_fixture.py +0 -0
  162. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/github_ops.py +0 -0
  163. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/github_throttle.py +0 -0
  164. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/goal.py +0 -0
  165. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/graph_health.py +0 -0
  166. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/__init__.py +0 -0
  167. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/aggregate.py +0 -0
  168. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/__init__.py +0 -0
  169. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/_ci_pin.py +0 -0
  170. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/agent_install.py +0 -0
  171. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/cargo_targets.py +0 -0
  172. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/claude_binary.py +0 -0
  173. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/config_drift.py +0 -0
  174. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  175. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/coord_web_ci_pin.py +0 -0
  176. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/deploy_lane_facts.py +0 -0
  177. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/disk.py +0 -0
  178. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/fleet_board.py +0 -0
  179. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  180. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/fleet_phantom.py +0 -0
  181. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/fleet_unit_drift.py +0 -0
  182. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/graph.py +0 -0
  183. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/graphify_cli.py +0 -0
  184. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/index_lock.py +0 -0
  185. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/issues_sync_staleness.py +0 -0
  186. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/plan_usage.py +0 -0
  187. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/pr_churn.py +0 -0
  188. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/release_cordon.py +0 -0
  189. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/repo_state.py +0 -0
  190. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/spawned_coord.py +0 -0
  191. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/stalled_pipeline.py +0 -0
  192. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/timer_active.py +0 -0
  193. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/toolchain.py +0 -0
  194. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/unit_drift.py +0 -0
  195. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/unit_enablement.py +0 -0
  196. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/wedged_drive_queue.py +0 -0
  197. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/checks/worktrees.py +0 -0
  198. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/cli.py +0 -0
  199. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/context.py +0 -0
  200. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/fleet_snapshot.py +0 -0
  201. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/models.py +0 -0
  202. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/pypi.py +0 -0
  203. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/registry.py +0 -0
  204. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/render.py +0 -0
  205. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/health/units.py +0 -0
  206. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/hooks.py +0 -0
  207. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/housekeeping.py +0 -0
  208. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/interactive.py +0 -0
  209. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/issue_store.py +0 -0
  210. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/issues_sync_status.py +0 -0
  211. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/liveness_auditor.py +0 -0
  212. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/machine_metrics.py +0 -0
  213. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/machine_onboard.py +0 -0
  214. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/machine_pause.py +0 -0
  215. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/machine_stats.py +0 -0
  216. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/merge_queue.py +0 -0
  217. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/milestone_chat.py +0 -0
  218. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/milestone_dispatch.py +0 -0
  219. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/milestone_gate.py +0 -0
  220. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/milestone_order.py +0 -0
  221. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/mock_author.py +0 -0
  222. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/models.py +0 -0
  223. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/network.py +0 -0
  224. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/new_issue_chat.py +0 -0
  225. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/__init__.py +0 -0
  226. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/baseline.py +0 -0
  227. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/cli.py +0 -0
  228. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/collect.py +0 -0
  229. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/digest.py +0 -0
  230. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/models.py +0 -0
  231. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/predicate.py +0 -0
  232. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/service.py +0 -0
  233. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/store.py +0 -0
  234. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notifier/transport.py +0 -0
  235. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/notify.py +0 -0
  236. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/openapi.py +0 -0
  237. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/overlap_fence.py +0 -0
  238. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/overlap_predict.py +0 -0
  239. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/parentage.py +0 -0
  240. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/parentage_github.py +0 -0
  241. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/pipeline.py +0 -0
  242. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/plan_parser.py +0 -0
  243. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/plans.py +0 -0
  244. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/platform_paths.py +0 -0
  245. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/portal_bridge.py +0 -0
  246. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/portal_store.py +0 -0
  247. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/portal_sync.py +0 -0
  248. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/pr_body_lint.py +0 -0
  249. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/prereqs.py +0 -0
  250. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/progress.py +0 -0
  251. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/providers/__init__.py +0 -0
  252. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/providers/base.py +0 -0
  253. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/providers/claude.py +0 -0
  254. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/providers/claude_pty.py +0 -0
  255. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/providers/opencode.py +0 -0
  256. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/queue_diagnose.py +0 -0
  257. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/reconcile.py +0 -0
  258. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/reconcile_tick.py +0 -0
  259. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/refine_chat.py +0 -0
  260. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/release_cordon.py +0 -0
  261. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/release_propagate.py +0 -0
  262. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/release_verify.py +0 -0
  263. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/release_window.py +0 -0
  264. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/repo_dormancy.py +0 -0
  265. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/repo_edit.py +0 -0
  266. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/repo_onboard.py +0 -0
  267. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/reports.py +0 -0
  268. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/rest_schema.py +0 -0
  269. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/revalidate.py +0 -0
  270. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/review.py +0 -0
  271. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/scorecard.py +0 -0
  272. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/self_health.py +0 -0
  273. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  274. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  275. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  276. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  277. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  278. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/portal-followup/SKILL.md +0 -0
  279. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/release-now/SKILL.md +0 -0
  280. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  281. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  282. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/skills/update-issue/SKILL.md +0 -0
  283. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/smoke.py +0 -0
  284. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/spend_ceiling.py +0 -0
  285. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/split_work.py +0 -0
  286. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/sql.py +0 -0
  287. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/stage_projection.py +0 -0
  288. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/state.py +0 -0
  289. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/store_migrate.py +0 -0
  290. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/store_parity.py +0 -0
  291. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/templates/deploy-cloudflare.node.yml +0 -0
  292. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/test_author.py +0 -0
  293. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/test_chat.py +0 -0
  294. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/test_orchestrator.py +0 -0
  295. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/test_report.py +0 -0
  296. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/tui_release.py +0 -0
  297. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/uat_checks.py +0 -0
  298. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/usage.py +0 -0
  299. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/usage_limits.py +0 -0
  300. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/usage_rollup.py +0 -0
  301. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coord/worker_events.py +0 -0
  302. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/coordinator.example.yml +0 -0
  303. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-agent.service +0 -0
  304. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-backup.service +0 -0
  305. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-backup.timer +0 -0
  306. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-db-backup.service +0 -0
  307. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-db-backup.sh +0 -0
  308. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-db-backup.timer +0 -0
  309. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-dr-verify.service +0 -0
  310. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-dr-verify.timer +0 -0
  311. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-drive-queue.service +0 -0
  312. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-drive-queue.timer +0 -0
  313. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-failure-notify.service +0 -0
  314. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-failure-notify.sh +0 -0
  315. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-fleet-watchdog.service +0 -0
  316. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-fleet-watchdog.timer +0 -0
  317. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-notify.service +0 -0
  318. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-notify.timer +0 -0
  319. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-release-propagate.service +0 -0
  320. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-release-propagate.timer +0 -0
  321. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-release-window.service +0 -0
  322. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-release-window.timer +0 -0
  323. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-serve.service +0 -0
  324. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.service +0 -0
  325. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.sh +0 -0
  326. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-web-dist-build.timer +0 -0
  327. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-web-rollback.sh +0 -0
  328. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/coord-web.service +0 -0
  329. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/deploy/node-shim.sh +0 -0
  330. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ADR_COORD_TUI_CI.md +0 -0
  331. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  332. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_CI.md +0 -0
  333. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ADR_COORD_WEB_DIST.md +0 -0
  334. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  335. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/AGENT_OPERATIONS.md +0 -0
  336. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ARCHITECTURE.md +0 -0
  337. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ARCH_SECURITY_GATES.md +0 -0
  338. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/COCKPIT.md +0 -0
  339. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/CONTROL_CENTER.md +0 -0
  340. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/COST_DISCIPLINE.md +0 -0
  341. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/CROSS_PLATFORM.md +0 -0
  342. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/CUSTOMER_FACING_APPS.md +0 -0
  343. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/CUSTOMER_PORTAL.md +0 -0
  344. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/DATA_STORE_SELECTION.md +0 -0
  345. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/DISASTER_RECOVERY.md +0 -0
  346. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/DRIVE_QUEUE.md +0 -0
  347. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/EPHEMERAL_WORKERS.md +0 -0
  348. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/FORGE_MIGRATION.md +0 -0
  349. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/GRAPHIFY_SETUP.md +0 -0
  350. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ISSUE_GUIDANCE.md +0 -0
  351. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/MAC_MINI.md +0 -0
  352. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  353. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/NOTIFIER.md +0 -0
  354. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/OPENCODE_VERIFICATION.md +0 -0
  355. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/OPERATING_GOTCHAS.md +0 -0
  356. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/OPERATOR_GUIDES.md +0 -0
  357. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/ORACLE_LOOP.md +0 -0
  358. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/PHONE_WEBAPP.md +0 -0
  359. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/PIPELINE_V2.md +0 -0
  360. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/PLATFORM_EVOLUTION.md +0 -0
  361. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/SECOND_BACKEND.md +0 -0
  362. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/STORE_SERVICE.md +0 -0
  363. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  364. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/WEB_CONTROL_CENTER.md +0 -0
  365. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/WSL_WINDOWS_WORKER.md +0 -0
  366. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/mocks/web/README.md +0 -0
  367. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/mocks/web/_tokens.css +0 -0
  368. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/mocks/web/issue-detail.html +0 -0
  369. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/mocks/web/pipeline-narrow.html +0 -0
  370. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/docs/mocks/web/pipeline-wide.html +0 -0
  371. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/graphify-out/.gitignore +0 -0
  372. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/install-agent.sh +0 -0
  373. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/pyproject.toml +0 -0
  374. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/audit_review_verdict_overrides.py +0 -0
  375. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  376. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/build-worker-image.sh +0 -0
  377. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/coordinator-machine.py +0 -0
  378. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/dr-down.sh +0 -0
  379. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/dr-up.sh +0 -0
  380. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/epic-down.sh +0 -0
  381. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/epic-up.sh +0 -0
  382. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/preflight.sh +0 -0
  383. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/provision-server.sh +0 -0
  384. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/provision-worker.sh +0 -0
  385. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  386. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  387. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/throwaway-vm.sh +0 -0
  388. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/azure-workers/verify-github-token.sh +0 -0
  389. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/check_gh_argv_containment.py +0 -0
  390. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/codegen.py +0 -0
  391. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-test-runner.sh +0 -0
  392. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  393. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  394. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  395. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  396. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/coord-venv-rollback.sh +0 -0
  397. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/drive-batch.sh +0 -0
  398. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/extract-coord-tui.sh +0 -0
  399. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/fleet_watchdog.py +0 -0
  400. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/gen_board_fixture.py +0 -0
  401. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/gen_mock_index.py +0 -0
  402. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/lib/provision-core.sh +0 -0
  403. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/next_release_tag.py +0 -0
  404. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/provision-machine.sh +0 -0
  405. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/run_tests_in_populated_home.sh +0 -0
  406. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/run_tests_without_gh.sh +0 -0
  407. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/setup-macmini.sh +0 -0
  408. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/smoke_437_interactive.py +0 -0
  409. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/verify-provision-noble.sh +0 -0
  410. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/verify_878_review_capture.py +0 -0
  411. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/verify_release_published.py +0 -0
  412. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/scripts/verify_release_wheel.py +0 -0
  413. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/setup.cfg +0 -0
  414. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/SMOKE_SET.md +0 -0
  415. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/__init__.py +0 -0
  416. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-37/conftest.py +0 -0
  417. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-37/contract.md +0 -0
  418. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-37/manifest.yml +0 -0
  419. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  420. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  421. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/contract.md +0 -0
  422. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  423. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  424. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/manifest.yml +0 -0
  425. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  426. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-51/tsconfig.json +0 -0
  427. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  428. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/backends.py +0 -0
  429. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/board-pipeline-basic.json +0 -0
  430. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  431. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  432. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  433. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  434. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/all_pass.json +0 -0
  435. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  436. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/mixed_fail.json +0 -0
  437. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  438. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  439. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/skip.json +0 -0
  440. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/playwright/truncated.json +0 -0
  441. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  442. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  443. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  444. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  445. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  446. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  447. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  448. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  449. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_acceptance.py +0 -0
  450. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_acceptance_drivers.py +0 -0
  451. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent.py +0 -0
  452. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_api_error.py +0 -0
  453. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_app.py +0 -0
  454. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_branch_base.py +0 -0
  455. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_branch_capture.py +0 -0
  456. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_config_free_1712.py +0 -0
  457. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_deploy_units_endpoint.py +0 -0
  458. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_dirty_worktree.py +0 -0
  459. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  460. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_graph_self_heal.py +0 -0
  461. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_health_h3.py +0 -0
  462. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_idle_restart.py +0 -0
  463. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_push_failure.py +0 -0
  464. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_reap.py +0 -0
  465. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_repos_and_pull.py +0 -0
  466. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_restart_services_endpoint.py +0 -0
  467. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_skills_self_heal.py +0 -0
  468. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_startup_diagnostics.py +0 -0
  469. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_update.py +0 -0
  470. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_update_bluegreen.py +0 -0
  471. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_usage_limit.py +0 -0
  472. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_agent_zero_commit.py +0 -0
  473. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ambient_home_isolation.py +0 -0
  474. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approve_capability_reroute_3241.py +0 -0
  475. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approve_dependency_busy_2804.py +0 -0
  476. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approve_reject_plan.py +0 -0
  477. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approve_usage_gate.py +0 -0
  478. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approved_work_2532.py +0 -0
  479. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_approved_work_2996.py +0 -0
  480. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_assignment_already_recorded_daemon.py +0 -0
  481. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_audit_log.py +0 -0
  482. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_audit_outcome.py +0 -0
  483. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_audit_query.py +0 -0
  484. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_auto_loop.py +0 -0
  485. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_auto_release_publish_2035.py +0 -0
  486. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_backend_selection.py +0 -0
  487. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_backup.py +0 -0
  488. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_base_checkout_restore.py +0 -0
  489. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_block_log.py +0 -0
  490. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_cap_762.py +0 -0
  491. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_fixture.py +0 -0
  492. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_schema.py +0 -0
  493. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_service.py +0 -0
  494. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_state.py +0 -0
  495. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_board_wire.py +0 -0
  496. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_brain.py +0 -0
  497. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_branch_model.py +0 -0
  498. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_bug_intake.py +0 -0
  499. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_build_worker_image_env_update.py +0 -0
  500. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cargo_cache.py +0 -0
  501. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_check_gh_argv_containment.py +0 -0
  502. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_acceptance_gate_1950.py +0 -0
  503. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_fix.py +0 -0
  504. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_github.py +0 -0
  505. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_gitlab.py +0 -0
  506. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_parity_2091.py +0 -0
  507. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_ci_store.py +0 -0
  508. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_claim.py +0 -0
  509. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_claude_md_budget.py +0 -0
  510. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_acceptance.py +0 -0
  511. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_assign.py +0 -0
  512. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  513. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_assign_interactive_remote.py +0 -0
  514. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_assign_provider.py +0 -0
  515. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  516. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_audit.py +0 -0
  517. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_chat_continue.py +0 -0
  518. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_codegen.py +0 -0
  519. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_decide.py +0 -0
  520. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_capability_rules.py +0 -0
  521. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_config_provenance.py +0 -0
  522. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_forge_availability.py +0 -0
  523. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_graph.py +0 -0
  524. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_self.py +0 -0
  525. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_diagnose_test_coverage.py +0 -0
  526. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_doctor.py +0 -0
  527. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_doctor_config_free_1801.py +0 -0
  528. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  529. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  530. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_drive.py +0 -0
  531. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_drive_queue.py +0 -0
  532. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_escalate.py +0 -0
  533. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_fix_headless_review.py +0 -0
  534. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_gate_a.py +0 -0
  535. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_install_drift.py +0 -0
  536. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_install_skills.py +0 -0
  537. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_issue_comment.py +0 -0
  538. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_issue_create_label.py +0 -0
  539. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_issue_reopen.py +0 -0
  540. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_issue_view_list.py +0 -0
  541. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_merge.py +0 -0
  542. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_assign.py +0 -0
  543. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_capture.py +0 -0
  544. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_chat_add_child.py +0 -0
  545. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_dispatch.py +0 -0
  546. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_gate_b.py +0 -0
  547. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_gate_c.py +0 -0
  548. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_order.py +0 -0
  549. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  550. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_milestone_ship.py +0 -0
  551. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_network.py +0 -0
  552. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_new_issue_chat.py +0 -0
  553. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_plans.py +0 -0
  554. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_portal.py +0 -0
  555. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_pr.py +0 -0
  556. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_pull_artifact.py +0 -0
  557. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_queue.py +0 -0
  558. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_reattach_sessions.py +0 -0
  559. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_refine_board.py +0 -0
  560. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_release_preflight.py +0 -0
  561. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_release_propagate.py +0 -0
  562. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_release_window.py +0 -0
  563. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_repo_2220.py +0 -0
  564. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  565. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_scorecard.py +0 -0
  566. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_serve_store_backend_3084.py +0 -0
  567. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_set_review_findings.py +0 -0
  568. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_advisory_terminal.py +0 -0
  569. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_contested_tag.py +0 -0
  570. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_merge_queue.py +0 -0
  571. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_provider.py +0 -0
  572. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_review_finalizing.py +0 -0
  573. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_test_failed_tag.py +0 -0
  574. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_status_usage_limit.py +0 -0
  575. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_sync_comments_873.py +0 -0
  576. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_test_plan.py +0 -0
  577. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_track.py +0 -0
  578. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_tui_update.py +0 -0
  579. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cli_wait.py +0 -0
  580. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_client_base_install.py +0 -0
  581. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_client_config_cache_atomic_3052.py +0 -0
  582. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_client_resource_migration_1946.py +0 -0
  583. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_commands_common.py +0 -0
  584. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_comments.py +0 -0
  585. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_completion_summary.py +0 -0
  586. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config.py +0 -0
  587. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_acceptance.py +0 -0
  588. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_audit.py +0 -0
  589. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_drift_check.py +0 -0
  590. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_pricing.py +0 -0
  591. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  592. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_config_usage_gate.py +0 -0
  593. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_confirm_test.py +0 -0
  594. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_conflict_fix.py +0 -0
  595. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_conflict_fix_semantic.py +0 -0
  596. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  597. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test.py +0 -0
  598. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  599. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test_runner_baseline.py +0 -0
  600. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test_runner_populated_home.py +0 -0
  601. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test_runner_routing.py +0 -0
  602. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_test_runner_toolchain.py +0 -0
  603. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_uat.py +0 -0
  604. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coord_web_sse_restart_live.py +0 -0
  605. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_coordinator_machine.py +0 -0
  606. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_cross_platform_imports.py +0 -0
  607. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dao.py +0 -0
  608. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dashboard.py +0 -0
  609. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dashboard_fixture.py +0 -0
  610. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dashboard_terminal.py +0 -0
  611. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dashboard_terminal_live.py +0 -0
  612. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_db.py +0 -0
  613. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dead_end.py +0 -0
  614. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_decomposition_chat.py +0 -0
  615. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_coord_db_backup.py +0 -0
  616. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_coord_web_dist.py +0 -0
  617. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_coord_web_rollback.py +0 -0
  618. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_db_backup_unit.py +0 -0
  619. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_drive_queue_unit.py +0 -0
  620. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_failure_notify_unit.py +0 -0
  621. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_manifest.py +0 -0
  622. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_notify_unit.py +0 -0
  623. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_units_lane.py +0 -0
  624. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deploy_web_unit.py +0 -0
  625. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deprecation_telemetry.py +0 -0
  626. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_deps.py +0 -0
  627. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_diagnose.py +0 -0
  628. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dispatch.py +0 -0
  629. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dispatch_target_validation.py +0 -0
  630. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dist_name.py +0 -0
  631. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_done_housekeeping.py +0 -0
  632. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dr_azure_scripts.py +0 -0
  633. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dr_promote.py +0 -0
  634. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_dr_verify.py +0 -0
  635. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive.py +0 -0
  636. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue.py +0 -0
  637. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue_blocked_rendering.py +0 -0
  638. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue_launch_argv.py +0 -0
  639. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  640. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue_roll_pending.py +0 -0
  641. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  642. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_state.py +0 -0
  643. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_drive_tmux.py +0 -0
  644. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_epic_up_capability_detection.py +0 -0
  645. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  646. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_epic_up_image_provenance.py +0 -0
  647. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_errors.py +0 -0
  648. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_events.py +0 -0
  649. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_failure_class.py +0 -0
  650. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_filelock.py +0 -0
  651. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  652. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_fix_of_force_override.py +0 -0
  653. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_fleet_config_health.py +0 -0
  654. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_fleet_health_probes.py +0 -0
  655. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_fleet_health_snapshot.py +0 -0
  656. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_fleet_watchdog.py +0 -0
  657. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_forge_availability.py +0 -0
  658. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_freshness.py +0 -0
  659. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gate_a.py +0 -0
  660. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gate_b.py +0 -0
  661. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gate_snapshot_staleness.py +0 -0
  662. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gates.py +0 -0
  663. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  664. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_gen_mock_index.py +0 -0
  665. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_generated_rust_fixture.py +0 -0
  666. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_generated_rust_requests.py +0 -0
  667. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_generated_types_fixture.py +0 -0
  668. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_github_ops.py +0 -0
  669. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_github_throttle.py +0 -0
  670. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_goal.py +0 -0
  671. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_graph_health.py +0 -0
  672. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_graph_selfheal_absent_2237.py +0 -0
  673. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_handoff.py +0 -0
  674. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_checks.py +0 -0
  675. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_cli.py +0 -0
  676. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_cli_graph.py +0 -0
  677. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_config.py +0 -0
  678. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_context.py +0 -0
  679. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_coord_tui_ci_pin.py +0 -0
  680. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_coord_web_ci_pin.py +0 -0
  681. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_deploy_lane_facts.py +0 -0
  682. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_fix.py +0 -0
  683. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_incident_regression.py +0 -0
  684. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_issues_sync_staleness.py +0 -0
  685. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_pr_churn.py +0 -0
  686. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_pypi.py +0 -0
  687. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_registry.py +0 -0
  688. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_release_cordon_probe.py +0 -0
  689. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_timer_active.py +0 -0
  690. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_toolchain.py +0 -0
  691. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_unit_drift.py +0 -0
  692. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_unit_enablement.py +0 -0
  693. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_health_wedged_drive_queue.py +0 -0
  694. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_hooks.py +0 -0
  695. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_human_attended_437.py +0 -0
  696. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_init.py +0 -0
  697. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_install_agent_venv_2911.py +0 -0
  698. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_integration.py +0 -0
  699. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_briefing_echo.py +0 -0
  700. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_pane_log_2541.py +0 -0
  701. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_prefill_state.py +0 -0
  702. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_session_relaunch.py +0 -0
  703. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_test_verdict_backstop.py +0 -0
  704. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_token_attribution.py +0 -0
  705. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_interactive_worktree.py +0 -0
  706. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_issue_store_seam.py +0 -0
  707. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_issues_sync_status.py +0 -0
  708. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_liveness_auditor.py +0 -0
  709. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_liveness_notify.py +0 -0
  710. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_lock_contention_ratchet.py +0 -0
  711. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_machine_metrics.py +0 -0
  712. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_machine_onboard.py +0 -0
  713. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_machine_pause.py +0 -0
  714. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_machine_stats.py +0 -0
  715. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_merge_queue.py +0 -0
  716. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_merge_verify.py +0 -0
  717. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_milestone_chat.py +0 -0
  718. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_milestone_dispatch.py +0 -0
  719. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_milestone_gate.py +0 -0
  720. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_milestone_order.py +0 -0
  721. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_milestone_seam.py +0 -0
  722. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_mock_author.py +0 -0
  723. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_model_tiering.py +0 -0
  724. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_models.py +0 -0
  725. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_models_config_labels.py +0 -0
  726. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_needs_attention.py +0 -0
  727. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_network.py +0 -0
  728. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_new_issue_chat.py +0 -0
  729. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_next_release_tag.py +0 -0
  730. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_node_shim.py +0 -0
  731. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_baseline.py +0 -0
  732. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_cli.py +0 -0
  733. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_collect.py +0 -0
  734. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_config.py +0 -0
  735. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_drive_seam.py +0 -0
  736. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_isolation.py +0 -0
  737. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_predicate.py +0 -0
  738. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_quiet_hours.py +0 -0
  739. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notifier_service.py +0 -0
  740. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notify.py +0 -0
  741. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_notify_drain.py +0 -0
  742. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_openapi.py +0 -0
  743. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_operational_defaults.py +0 -0
  744. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_overlap_fence.py +0 -0
  745. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_overlap_predict.py +0 -0
  746. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_packaged_deploy_units.py +0 -0
  747. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_parentage.py +0 -0
  748. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_paste_landed.py +0 -0
  749. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  750. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_pipeline.py +0 -0
  751. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_plan_followup_approve_plan_command.py +0 -0
  752. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_plan_followup_pr_command.py +0 -0
  753. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_plan_followup_review_command.py +0 -0
  754. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_plan_only.py +0 -0
  755. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_plan_parser.py +0 -0
  756. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_platform_paths.py +0 -0
  757. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_portal_bridge.py +0 -0
  758. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_portal_config.py +0 -0
  759. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_portal_store.py +0 -0
  760. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_portal_sync.py +0 -0
  761. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_pr_body_lint.py +0 -0
  762. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_prereqs.py +0 -0
  763. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_production_db_guard.py +0 -0
  764. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_progress.py +0 -0
  765. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_provider_seam.py +0 -0
  766. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_providers.py +0 -0
  767. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_providers_config_labels.py +0 -0
  768. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_providers_pty.py +0 -0
  769. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_provision_core.py +0 -0
  770. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_provision_machine.py +0 -0
  771. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_py_rust_mirror_inventory.py +0 -0
  772. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_quiet_hours.py +0 -0
  773. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_quiet_hours_store_2146.py +0 -0
  774. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reap_merged_sessions.py +0 -0
  775. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reap_stale_interactive_tick.py +0 -0
  776. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile.py +0 -0
  777. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_branch.py +0 -0
  778. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_completions.py +0 -0
  779. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  780. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_merges.py +0 -0
  781. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_no_agent_record.py +0 -0
  782. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_tick.py +0 -0
  783. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reconcile_usage_limit_done.py +0 -0
  784. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_refine_chat.py +0 -0
  785. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_cordon_2101.py +0 -0
  786. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  787. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_cordon_deadlock_2240.py +0 -0
  788. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_cordon_stuck_2490.py +0 -0
  789. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_propagate.py +0 -0
  790. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_propagate_threshold.py +0 -0
  791. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_roll_between_legs_2854.py +0 -0
  792. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_roll_window_handoff.py +0 -0
  793. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_unified_1242.py +0 -0
  794. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_verify.py +0 -0
  795. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_release_window.py +0 -0
  796. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_remote_auto_prune.py +0 -0
  797. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_remote_interactive_reaper.py +0 -0
  798. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_repo_add.py +0 -0
  799. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_repo_dormancy.py +0 -0
  800. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_repo_edit_2220.py +0 -0
  801. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_repo_graph_fleet_2237.py +0 -0
  802. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_repo_onboard_2220.py +0 -0
  803. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_report_result_push.py +0 -0
  804. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_reports.py +0 -0
  805. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_retry.py +0 -0
  806. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_retry_advisory_1606.py +0 -0
  807. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_retry_type_1636.py +0 -0
  808. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_revalidate.py +0 -0
  809. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review.py +0 -0
  810. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_end_review_without_verdict.py +0 -0
  811. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_parse_failure_diagnostic.py +0 -0
  812. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_reaffirm.py +0 -0
  813. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_state.py +0 -0
  814. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_verdict_backstop.py +0 -0
  815. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_verdict_override_audit.py +0 -0
  816. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_verdict_relay.py +0 -0
  817. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_review_zero_commits.py +0 -0
  818. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_scoped_review_wiring.py +0 -0
  819. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_scorecard.py +0 -0
  820. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_self_health.py +0 -0
  821. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_serve.py +0 -0
  822. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_serve_app.py +0 -0
  823. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_serve_app_board_trim.py +0 -0
  824. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_serve_rest_routes.py +0 -0
  825. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_session.py +0 -0
  826. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_slice_issue_attribution.py +0 -0
  827. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_smoke.py +0 -0
  828. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_smoke_live_checkout_restore.py +0 -0
  829. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_smoke_workflow.py +0 -0
  830. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_spend_ceiling.py +0 -0
  831. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_spend_ceiling_coordinator.py +0 -0
  832. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_split.py +0 -0
  833. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_split_work.py +0 -0
  834. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_sql_dialect.py +0 -0
  835. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stage_projection.py +0 -0
  836. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stale_busy_reviewer_697.py +0 -0
  837. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stalled_pipeline.py +0 -0
  838. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_state.py +0 -0
  839. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_state_review_findings_daemon.py +0 -0
  840. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_status_fleet_footer.py +0 -0
  841. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stop_1567.py +0 -0
  842. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_store_contract.py +0 -0
  843. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_store_migrate.py +0 -0
  844. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stuck.py +0 -0
  845. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  846. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_terminal_command.py +0 -0
  847. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_author.py +0 -0
  848. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_chat.py +0 -0
  849. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_orchestrator.py +0 -0
  850. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_report.py +0 -0
  851. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_verdict_parsing.py +0 -0
  852. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_test_verdict_transcript_floor.py +0 -0
  853. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_text_io_encoding_audit.py +0 -0
  854. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_thin_client_board_audit.py +0 -0
  855. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_thin_client_config_load_1080.py +0 -0
  856. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_thin_client_daemon_routing_906.py +0 -0
  857. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_throwaway_vm.py +0 -0
  858. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_tmux_host.py +0 -0
  859. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_tmux_session.py +0 -0
  860. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_transcript_floor.py +0 -0
  861. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_uat_checks.py +0 -0
  862. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_usage.py +0 -0
  863. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_usage_limits.py +0 -0
  864. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_usage_rollup.py +0 -0
  865. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_venv_live_install_2121.py +0 -0
  866. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_version_single_source.py +0 -0
  867. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_watch.py +0 -0
  868. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  869. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worker_env_venv_isolation.py +0 -0
  870. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worker_events.py +0 -0
  871. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worker_image_pin_sync.py +0 -0
  872. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worker_safety.py +0 -0
  873. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worker_test_scoping.py +0 -0
  874. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worktree.py +0 -0
  875. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  876. {code_coordinator-0.5.450 → code_coordinator-0.5.452}/tests/test_write_parity.py +0 -0
  877. {code_coordinator-0.5.450 → 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.450
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.450
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.450",
2
+ "tag": "0.5.452",
3
3
  "distance": 0,
4
- "node": "g6d7a8b2b3bfaa147e2a191a6475f1bdbbf4cac6e",
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, {
@@ -5665,6 +5665,104 @@ def openapi_spec() -> dict:
5665
5665
  )
5666
5666
 
5667
5667
 
5668
+ # #3293: keys whose values are inherently volatile per-build (a sliding
5669
+ # window count) but carry no board-state signal of their own — excluded from
5670
+ # the ``/board`` ETag DIGEST INPUT only (see ``_board_digest_projection``
5671
+ # below and ``_stamp_board_version``'s docstring). Every one of these fields
5672
+ # still ships on the wire, unchanged; this only stops them from deciding
5673
+ # whether the version bumps.
5674
+ _BOARD_DIGEST_VOLATILE_TOP_KEYS = frozenset({"audit_recent_count"})
5675
+
5676
+
5677
+ def _board_digest_projection(result: dict) -> dict:
5678
+ """A copy of *result* with digest-irrelevant volatile fields stripped.
5679
+
5680
+ Used ONLY to compute the ``/board`` ETag/version digest (#3293) — the
5681
+ actual wire body is `result` itself, untouched. Three culprits, in order
5682
+ of how often they move (see issue #3293's measurements):
5683
+
5684
+ - ``audit_recent_count``: a sliding 900s window count, changed on
5685
+ essentially every build.
5686
+ - ``issues[*].synced_at``: ~788 rows share one sync timestamp that moves
5687
+ on the issues-sync tick, re-digesting the whole issues section at once.
5688
+ - ``fleet_health``: moves on the 60s health tick. Its ``refreshed_at``
5689
+ clock and its ``fleet_board_latency`` check are excluded — the latter
5690
+ measures THIS /board response's own fetch latency and serialized size
5691
+ and stores that measurement inside the response, which is structurally
5692
+ self-invalidating for a content digest.
5693
+
5694
+ Deliberately narrow: per-machine health severities/results/headrooms are
5695
+ left in the digest, because a real state change there (a machine going
5696
+ offline, a disk filling up) SHOULD bump the ETag — only the fields that
5697
+ move on their own, independent of any real state change, are excluded.
5698
+ """
5699
+ projection = {
5700
+ k: v for k, v in result.items() if k not in _BOARD_DIGEST_VOLATILE_TOP_KEYS
5701
+ }
5702
+
5703
+ issues = projection.get("issues")
5704
+ if isinstance(issues, list):
5705
+ projection["issues"] = [
5706
+ {k: v for k, v in issue.items() if k != "synced_at"}
5707
+ if isinstance(issue, dict) else issue
5708
+ for issue in issues
5709
+ ]
5710
+
5711
+ fleet_health = projection.get("fleet_health")
5712
+ if isinstance(fleet_health, dict):
5713
+ projection["fleet_health"] = _board_digest_fleet_health(fleet_health)
5714
+
5715
+ return projection
5716
+
5717
+
5718
+ def _board_digest_fleet_health(fleet_health: dict) -> dict:
5719
+ """Strip ``fleet_health``'s clocks + self-referential latency check.
5720
+
5721
+ See ``_board_digest_projection`` — digest input only, never the wire body.
5722
+ """
5723
+ masked = {k: v for k, v in fleet_health.items() if k != "refreshed_at"}
5724
+
5725
+ machine_health = masked.get("machine_health")
5726
+ if isinstance(machine_health, list):
5727
+ masked["machine_health"] = [
5728
+ _board_digest_health_row(row) if isinstance(row, dict) else row
5729
+ for row in machine_health
5730
+ ]
5731
+
5732
+ fleet_checks = masked.get("fleet_checks")
5733
+ if isinstance(fleet_checks, list):
5734
+ masked["fleet_checks"] = [
5735
+ _board_digest_check_result(c) if isinstance(c, dict) else c
5736
+ for c in fleet_checks
5737
+ ]
5738
+
5739
+ return masked
5740
+
5741
+
5742
+ def _board_digest_health_row(row: dict) -> dict:
5743
+ """Drop one machine's poll clocks (``received_at``/``checked_at``) from
5744
+ the digest input — the results/severity/headroom that actually describe
5745
+ the machine's state stay in, per ``_board_digest_projection``'s docstring.
5746
+ """
5747
+ return {k: v for k, v in row.items() if k not in ("received_at", "checked_at")}
5748
+
5749
+
5750
+ def _board_digest_check_result(check: dict) -> dict:
5751
+ """Drop ``fleet_board_latency``'s self-measurement from the digest input.
5752
+
5753
+ This one check answers "how fast/big was the /board response that is
5754
+ carrying this very check result?" — its ``headroom`` text and ``values``
5755
+ (``latency_ms``/``payload_bytes``) are a measurement of the response
5756
+ embedded in the response, so they change on every build regardless of
5757
+ whether anything a human/client cares about actually changed. Every
5758
+ other fleet check's headroom/values reflect real, digest-worthy state
5759
+ and are left untouched.
5760
+ """
5761
+ if check.get("check_id") != "fleet_board_latency":
5762
+ return check
5763
+ return {k: v for k, v in check.items() if k not in ("headroom", "values")}
5764
+
5765
+
5668
5766
  def build_app(
5669
5767
  store: CoordStore,
5670
5768
  config: Config,
@@ -5768,13 +5866,31 @@ def build_app(
5768
5866
  _board_inflight: asyncio.Future[tuple] | None = None
5769
5867
 
5770
5868
  def _stamp_board_version(result: dict) -> tuple[str, bytes]:
5771
- """Serialize *result* to JSON exactly once, bump the version when the
5772
- content changed, stamp ``board_version`` into the payload, and
5773
- return ``(etag, body_bytes)`` the SAME bytes serve as both the
5774
- content-hash input and the wire body (#1597 Part 2: previously this
5775
- hashed a separate ``sort_keys=True`` dump and the caller re-encoded
5776
- the dict a second time via ``JSONResponse`` ~10 MB of JSON work per
5777
- build for a 5 MB board).
5869
+ """Serialize *result* to JSON exactly once for the wire body, bump
5870
+ the version when a STABLE PROJECTION of the content changed, stamp
5871
+ ``board_version`` into the payload, and return ``(etag, body_bytes)``.
5872
+
5873
+ #1597 Part 2: the wire ``body`` bytes below are the same bytes
5874
+ published to callers no second encoder pass for the response
5875
+ itself.
5876
+
5877
+ #3293: the content-hash input is deliberately NOT those same bytes
5878
+ any more. The payload embeds fields that move on every build without
5879
+ any board-state signal of their own — ``audit_recent_count`` (a
5880
+ sliding 900s window count), ``issues[*].synced_at`` (~788 rows
5881
+ re-stamped on one shared sync tick), and ``fleet_health``'s clocks
5882
+ and its self-referential ``fleet_board_latency`` check (which
5883
+ measures THIS response's own fetch latency/size and stores the
5884
+ measurement inside the response being measured). Hashing those made
5885
+ the ETag change on effectively every request, defeating #1336's
5886
+ cache-validated polling entirely. ``_board_digest_projection`` builds
5887
+ a masked copy for hashing only; the wire ``body`` — and every field
5888
+ in it, unchanged — still carries the real values. This does cost a
5889
+ second JSON encode of (most of) the payload on every cache-miss
5890
+ rebuild, which is rare relative to requests (TTL-cached in between);
5891
+ that's the trade #1597 avoided but #3293 requires; a truly stable
5892
+ ETag that lets pollers 304 is worth far more than skipping it on the
5893
+ rebuild path.
5778
5894
 
5779
5895
  ``board_version`` can't be known before the hash is computed (it
5780
5896
  depends on whether the hash changed), so it is deliberately excluded
@@ -5822,7 +5938,19 @@ def build_app(
5822
5938
  indent=None, separators=(",", ":"), default=str,
5823
5939
  ).encode("utf-8")
5824
5940
  else:
5825
- digest = hashlib.sha256(body).hexdigest()[:16]
5941
+ # #3293: hash a stable PROJECTION of the content, not the wire
5942
+ # bytes themselves — see the docstring above. The wire `body`
5943
+ # computed just above is untouched and still carries every
5944
+ # field, including the ones excluded here.
5945
+ # No `default=str` needed (unlike the fallback above): reaching
5946
+ # this branch means the strict encode of `result` just SUCCEEDED,
5947
+ # and the projection is a key-subset of those same values, so it
5948
+ # cannot contain a type the strict encoder would reject.
5949
+ digest_body = _json.dumps(
5950
+ _board_digest_projection(result), ensure_ascii=False,
5951
+ allow_nan=False, indent=None, separators=(",", ":"),
5952
+ ).encode("utf-8")
5953
+ digest = hashlib.sha256(digest_body).hexdigest()[:16]
5826
5954
  if digest != _board_hash:
5827
5955
  _board_hash = digest
5828
5956
  _board_version += 1
@@ -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.