code-coordinator 0.5.243__tar.gz → 0.5.244__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 (852) hide show
  1. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/__init__.py +20 -2
  7. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/board_bool_guard.py +9 -0
  8. code_coordinator-0.5.244/coord/board_schema.py +393 -0
  9. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dao.py +40 -55
  10. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dashboard/server.py +12 -30
  11. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/db.py +372 -350
  12. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/drive.py +57 -2
  13. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/drive_queue.py +34 -5
  14. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/drive_state.py +33 -34
  15. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/gates.py +32 -21
  16. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/github_ops.py +35 -2
  17. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/merge_queue.py +355 -40
  18. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/openapi.py +7 -80
  19. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/serve_app.py +16 -32
  20. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/state.py +36 -23
  21. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/gen_board_fixture.py +12 -10
  22. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/conftest.py +38 -0
  23. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_fixture.py +10 -5
  24. code_coordinator-0.5.244/tests/test_board_schema.py +404 -0
  25. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_test_runner_populated_home.py +4 -2
  26. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_test_runner_routing.py +3 -1
  27. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_db.py +215 -0
  28. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive.py +94 -0
  29. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue.py +76 -0
  30. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_state.py +40 -0
  31. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_epic_up_down_symlinked_config_1887.py +3 -1
  32. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gates.py +27 -0
  33. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_github_ops.py +59 -0
  34. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_merge_queue.py +448 -0
  35. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_openapi.py +3 -3
  36. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_state.py +98 -0
  37. code_coordinator-0.5.244/tests/test_store_contract.py +1021 -0
  38. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_version_single_source.py +58 -0
  39. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worker_image_pin_sync.py +6 -4
  40. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.claude/commands/board.md +0 -0
  41. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.claude/commands/complete-session.md +0 -0
  42. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.claude/commands/coordinator.md +0 -0
  43. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.githooks/_lib.sh +0 -0
  44. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.githooks/post-checkout +0 -0
  45. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.githooks/post-commit +0 -0
  46. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.githooks/post-merge +0 -0
  47. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  48. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/coord-ci-acceptance.yml +0 -0
  49. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/workflows/auto-release.yml +0 -0
  50. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/workflows/cargo-test.yml +0 -0
  51. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/workflows/publish.yml +0 -0
  52. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/workflows/release-tui.yml +0 -0
  53. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.github/workflows/test.yml +0 -0
  54. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/.gitignore +0 -0
  55. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/CLAUDE.md +0 -0
  56. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/GOAL.md +0 -0
  57. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/LICENSE +0 -0
  58. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/MANIFEST.in +0 -0
  59. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/README.md +0 -0
  60. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/dependency_links.txt +0 -0
  61. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/entry_points.txt +0 -0
  62. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/requires.txt +0 -0
  63. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/code_coordinator.egg-info/top_level.txt +0 -0
  64. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/_board_mapping.py +0 -0
  65. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/acceptance.py +0 -0
  66. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/acceptance_drivers.py +0 -0
  67. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agent.py +0 -0
  68. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agent_app.py +0 -0
  69. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agent_update.py +0 -0
  70. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agents/opencode/.gitignore +0 -0
  71. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agents/opencode/agents/work.md +0 -0
  72. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/agents/opencode/routing.jsonc +0 -0
  73. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/approved_work.py +0 -0
  74. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/audit.py +0 -0
  75. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/auto_loop.py +0 -0
  76. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/block_log.py +0 -0
  77. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/board_service.py +0 -0
  78. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/board_wire.py +0 -0
  79. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/brain.py +0 -0
  80. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/branch_model.py +0 -0
  81. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/bug_intake.py +0 -0
  82. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/cargo_cache.py +0 -0
  83. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/ci_fix.py +0 -0
  84. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/ci_github.py +0 -0
  85. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/ci_gitlab.py +0 -0
  86. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/ci_store.py +0 -0
  87. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/claim.py +0 -0
  88. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/cli.py +0 -0
  89. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/client.py +0 -0
  90. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/__init__.py +0 -0
  91. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/_common.py +0 -0
  92. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/acceptance.py +0 -0
  93. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/agent_ops.py +0 -0
  94. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/audit.py +0 -0
  95. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/chat.py +0 -0
  96. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/dispatch.py +0 -0
  97. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/dispatch_workers.py +0 -0
  98. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/drive.py +0 -0
  99. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/drive_queue.py +0 -0
  100. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/gate_a.py +0 -0
  101. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/gates.py +0 -0
  102. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/issues.py +0 -0
  103. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/lifecycle.py +0 -0
  104. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/merge.py +0 -0
  105. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/milestone.py +0 -0
  106. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/plan_followup.py +0 -0
  107. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/plans.py +0 -0
  108. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/portal.py +0 -0
  109. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/release.py +0 -0
  110. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/repo.py +0 -0
  111. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/report.py +0 -0
  112. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/review.py +0 -0
  113. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/scorecard.py +0 -0
  114. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/sessions.py +0 -0
  115. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/setup.py +0 -0
  116. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/status.py +0 -0
  117. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/terminal.py +0 -0
  118. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/test_gate.py +0 -0
  119. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/commands/tui.py +0 -0
  120. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/comments.py +0 -0
  121. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/config.py +0 -0
  122. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/config_reload.py +0 -0
  123. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/confirm_test.py +0 -0
  124. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/conflict_fix.py +0 -0
  125. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dashboard/__init__.py +0 -0
  126. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dashboard/fixture.py +0 -0
  127. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dashboard/index.html +0 -0
  128. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dashboard/terminal.py +0 -0
  129. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dead_end.py +0 -0
  130. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/decomposition_chat.py +0 -0
  131. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/README.md +0 -0
  132. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-agent.service +0 -0
  133. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-db-backup.service +0 -0
  134. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-db-backup.sh +0 -0
  135. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-db-backup.timer +0 -0
  136. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-drive-queue.service +0 -0
  137. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-drive-queue.timer +0 -0
  138. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-failure-notify.service +0 -0
  139. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-fleet-watchdog.service +0 -0
  140. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  141. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-notify.service +0 -0
  142. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-notify.timer +0 -0
  143. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-release-propagate.service +0 -0
  144. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-release-propagate.timer +0 -0
  145. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-release-window.service +0 -0
  146. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-release-window.timer +0 -0
  147. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-serve.service +0 -0
  148. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-web-dist-build.service +0 -0
  149. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-web-dist-build.timer +0 -0
  150. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy/coord-web.service +0 -0
  151. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy_manifest.py +0 -0
  152. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deploy_units.py +0 -0
  153. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/deps.py +0 -0
  154. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/diagnose.py +0 -0
  155. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dispatch.py +0 -0
  156. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/dist_name.py +0 -0
  157. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/events.py +0 -0
  158. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/failure_class.py +0 -0
  159. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/filelock.py +0 -0
  160. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/fleet_config_health.py +0 -0
  161. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/forge_availability.py +0 -0
  162. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/freshness.py +0 -0
  163. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/gate_a.py +0 -0
  164. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/gate_b.py +0 -0
  165. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/gate_snapshot.py +0 -0
  166. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/goal.py +0 -0
  167. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/graph_health.py +0 -0
  168. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/__init__.py +0 -0
  169. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/aggregate.py +0 -0
  170. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/__init__.py +0 -0
  171. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/agent_install.py +0 -0
  172. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/cargo_targets.py +0 -0
  173. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/claude_binary.py +0 -0
  174. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/coord_web_ci_pin.py +0 -0
  175. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/deploy_lane_facts.py +0 -0
  176. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/disk.py +0 -0
  177. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/fleet_board.py +0 -0
  178. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  179. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/fleet_phantom.py +0 -0
  180. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/fleet_unit_drift.py +0 -0
  181. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/graph.py +0 -0
  182. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/graphify_cli.py +0 -0
  183. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/index_lock.py +0 -0
  184. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/plan_usage.py +0 -0
  185. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/release_cordon.py +0 -0
  186. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/repo_state.py +0 -0
  187. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/spawned_coord.py +0 -0
  188. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/stalled_pipeline.py +0 -0
  189. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/timer_active.py +0 -0
  190. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/toolchain.py +0 -0
  191. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/unit_drift.py +0 -0
  192. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/unit_enablement.py +0 -0
  193. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/checks/worktrees.py +0 -0
  194. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/cli.py +0 -0
  195. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/context.py +0 -0
  196. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/fleet_snapshot.py +0 -0
  197. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/models.py +0 -0
  198. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/pypi.py +0 -0
  199. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/registry.py +0 -0
  200. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/render.py +0 -0
  201. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/health/units.py +0 -0
  202. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/hooks.py +0 -0
  203. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/housekeeping.py +0 -0
  204. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/interactive.py +0 -0
  205. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/issue_store.py +0 -0
  206. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/liveness_auditor.py +0 -0
  207. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/machine_pause.py +0 -0
  208. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/milestone_chat.py +0 -0
  209. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/milestone_dispatch.py +0 -0
  210. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/milestone_gate.py +0 -0
  211. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/milestone_order.py +0 -0
  212. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/mock_author.py +0 -0
  213. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/models.py +0 -0
  214. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/network.py +0 -0
  215. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/new_issue_chat.py +0 -0
  216. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/__init__.py +0 -0
  217. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/baseline.py +0 -0
  218. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/cli.py +0 -0
  219. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/collect.py +0 -0
  220. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/digest.py +0 -0
  221. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/models.py +0 -0
  222. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/predicate.py +0 -0
  223. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/service.py +0 -0
  224. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/store.py +0 -0
  225. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notifier/transport.py +0 -0
  226. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/notify.py +0 -0
  227. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/overlap_fence.py +0 -0
  228. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/overlap_predict.py +0 -0
  229. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/parentage.py +0 -0
  230. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/parentage_github.py +0 -0
  231. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/pipeline.py +0 -0
  232. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/plan_parser.py +0 -0
  233. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/plans.py +0 -0
  234. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/platform_paths.py +0 -0
  235. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/portal_bridge.py +0 -0
  236. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/portal_store.py +0 -0
  237. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/portal_sync.py +0 -0
  238. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/pr_body_lint.py +0 -0
  239. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/prereqs.py +0 -0
  240. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/progress.py +0 -0
  241. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/providers/__init__.py +0 -0
  242. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/providers/base.py +0 -0
  243. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/providers/claude.py +0 -0
  244. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/providers/claude_pty.py +0 -0
  245. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/providers/opencode.py +0 -0
  246. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/queue_diagnose.py +0 -0
  247. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/reconcile.py +0 -0
  248. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/reconcile_tick.py +0 -0
  249. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/refine_chat.py +0 -0
  250. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/release_cordon.py +0 -0
  251. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/release_propagate.py +0 -0
  252. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/release_verify.py +0 -0
  253. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/release_window.py +0 -0
  254. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/repo_edit.py +0 -0
  255. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/repo_onboard.py +0 -0
  256. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/reports.py +0 -0
  257. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/revalidate.py +0 -0
  258. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/review.py +0 -0
  259. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/scorecard.py +0 -0
  260. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/self_health.py +0 -0
  261. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  262. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  263. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  264. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  265. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  266. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/portal-followup/SKILL.md +0 -0
  267. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  268. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  269. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/skills/update-issue/SKILL.md +0 -0
  270. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/smoke.py +0 -0
  271. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/spend_ceiling.py +0 -0
  272. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/split_work.py +0 -0
  273. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/stage_projection.py +0 -0
  274. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/test_author.py +0 -0
  275. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/test_chat.py +0 -0
  276. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/test_orchestrator.py +0 -0
  277. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/test_report.py +0 -0
  278. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/tui_release.py +0 -0
  279. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/usage.py +0 -0
  280. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/usage_limits.py +0 -0
  281. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/usage_rollup.py +0 -0
  282. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coord/worker_events.py +0 -0
  283. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/coordinator.example.yml +0 -0
  284. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-agent.service +0 -0
  285. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-db-backup.service +0 -0
  286. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-db-backup.sh +0 -0
  287. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-db-backup.timer +0 -0
  288. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-drive-queue.service +0 -0
  289. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-drive-queue.timer +0 -0
  290. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-failure-notify.service +0 -0
  291. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-failure-notify.sh +0 -0
  292. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-fleet-watchdog.service +0 -0
  293. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-fleet-watchdog.timer +0 -0
  294. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-notify.service +0 -0
  295. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-notify.timer +0 -0
  296. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-release-propagate.service +0 -0
  297. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-release-propagate.timer +0 -0
  298. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-release-window.service +0 -0
  299. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-release-window.timer +0 -0
  300. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-serve.service +0 -0
  301. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-web-dist-build.service +0 -0
  302. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-web-dist-build.sh +0 -0
  303. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-web-dist-build.timer +0 -0
  304. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-web-rollback.sh +0 -0
  305. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/coord-web.service +0 -0
  306. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/deploy/node-shim.sh +0 -0
  307. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  308. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ADR_COORD_WEB_CI.md +0 -0
  309. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ADR_COORD_WEB_DIST.md +0 -0
  310. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/AGENT_OPERATIONS.md +0 -0
  311. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ARCHITECTURE.md +0 -0
  312. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ARCH_SECURITY_GATES.md +0 -0
  313. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/COCKPIT.md +0 -0
  314. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/CONTROL_CENTER.md +0 -0
  315. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/COST_DISCIPLINE.md +0 -0
  316. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/CROSS_PLATFORM.md +0 -0
  317. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/CUSTOMER_FACING_APPS.md +0 -0
  318. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/CUSTOMER_PORTAL.md +0 -0
  319. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/DRIVE_QUEUE.md +0 -0
  320. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/EPHEMERAL_WORKERS.md +0 -0
  321. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/FORGE_MIGRATION.md +0 -0
  322. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/GRAPHIFY_SETUP.md +0 -0
  323. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ISSUE_GUIDANCE.md +0 -0
  324. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/MAC_MINI.md +0 -0
  325. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  326. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/NOTIFIER.md +0 -0
  327. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/OPENCODE_VERIFICATION.md +0 -0
  328. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/OPERATING_GOTCHAS.md +0 -0
  329. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/ORACLE_LOOP.md +0 -0
  330. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/PHONE_WEBAPP.md +0 -0
  331. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/PIPELINE_V2.md +0 -0
  332. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/PLATFORM_EVOLUTION.md +0 -0
  333. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/SECOND_BACKEND.md +0 -0
  334. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/STORE_SERVICE.md +0 -0
  335. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  336. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/WEB_CONTROL_CENTER.md +0 -0
  337. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/WSL_WINDOWS_WORKER.md +0 -0
  338. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/mocks/web/README.md +0 -0
  339. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/mocks/web/_tokens.css +0 -0
  340. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/mocks/web/issue-detail.html +0 -0
  341. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/mocks/web/pipeline-narrow.html +0 -0
  342. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/docs/mocks/web/pipeline-wide.html +0 -0
  343. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/graphify-out/.gitignore +0 -0
  344. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/install-agent.sh +0 -0
  345. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/pyproject.toml +0 -0
  346. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/audit_review_verdict_overrides.py +0 -0
  347. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  348. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/build-worker-image.sh +0 -0
  349. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/coordinator-machine.py +0 -0
  350. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/epic-down.sh +0 -0
  351. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/epic-up.sh +0 -0
  352. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/preflight.sh +0 -0
  353. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/provision-worker.sh +0 -0
  354. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  355. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  356. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/azure-workers/verify-github-token.sh +0 -0
  357. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/check_gh_argv_containment.py +0 -0
  358. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/codegen.py +0 -0
  359. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/coord-test-runner.sh +0 -0
  360. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/coord-venv-rollback.sh +0 -0
  361. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/drive-batch.sh +0 -0
  362. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/fleet_watchdog.py +0 -0
  363. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/gen_mock_index.py +0 -0
  364. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/next_release_tag.py +0 -0
  365. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/run_tests_in_populated_home.sh +0 -0
  366. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/run_tests_without_gh.sh +0 -0
  367. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/smoke_437_interactive.py +0 -0
  368. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/verify_878_review_capture.py +0 -0
  369. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/verify_release_published.py +0 -0
  370. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/scripts/verify_release_wheel.py +0 -0
  371. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/setup.cfg +0 -0
  372. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/SMOKE_SET.md +0 -0
  373. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/__init__.py +0 -0
  374. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  375. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/contract.md +0 -0
  376. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/manifest.yml +0 -0
  377. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  378. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  379. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  380. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  381. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-37/conftest.py +0 -0
  382. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-37/contract.md +0 -0
  383. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-37/manifest.yml +0 -0
  384. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  385. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  386. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/contract.md +0 -0
  387. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/manifest.yml +0 -0
  388. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  389. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  390. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  391. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  392. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  393. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  394. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  395. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  396. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  397. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  398. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/contract.md +0 -0
  399. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  400. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  401. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/manifest.yml +0 -0
  402. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  403. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-51/tsconfig.json +0 -0
  404. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  405. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  406. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  407. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/contract.md +0 -0
  408. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  409. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/manifest.yml +0 -0
  410. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  411. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  412. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  413. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  414. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  415. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  416. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  417. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  418. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  419. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  420. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  421. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  422. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/contract.md +0 -0
  423. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  424. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/manifest.yml +0 -0
  425. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  426. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  427. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  428. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  429. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  430. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  431. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  432. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/board-pipeline-basic.json +0 -0
  433. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  434. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  435. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  436. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  437. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/all_pass.json +0 -0
  438. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  439. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/mixed_fail.json +0 -0
  440. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  441. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  442. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/skip.json +0 -0
  443. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/playwright/truncated.json +0 -0
  444. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  445. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  446. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  448. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  449. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  450. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  451. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  452. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_acceptance.py +0 -0
  453. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_acceptance_drivers.py +0 -0
  454. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent.py +0 -0
  455. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_api_error.py +0 -0
  456. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_app.py +0 -0
  457. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_branch_base.py +0 -0
  458. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_branch_capture.py +0 -0
  459. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_config_free_1712.py +0 -0
  460. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_deploy_units_endpoint.py +0 -0
  461. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_dirty_worktree.py +0 -0
  462. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  463. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_graph_self_heal.py +0 -0
  464. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_health_h3.py +0 -0
  465. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_idle_restart.py +0 -0
  466. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_push_failure.py +0 -0
  467. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_reap.py +0 -0
  468. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_repos_and_pull.py +0 -0
  469. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_restart_services_endpoint.py +0 -0
  470. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_skills_self_heal.py +0 -0
  471. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_startup_diagnostics.py +0 -0
  472. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_update.py +0 -0
  473. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_update_bluegreen.py +0 -0
  474. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_usage_limit.py +0 -0
  475. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_agent_zero_commit.py +0 -0
  476. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ambient_home_isolation.py +0 -0
  477. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_approve_reject_plan.py +0 -0
  478. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_approve_usage_gate.py +0 -0
  479. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_approved_work_2532.py +0 -0
  480. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_assignment_already_recorded_daemon.py +0 -0
  481. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_audit_log.py +0 -0
  482. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_audit_outcome.py +0 -0
  483. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_audit_query.py +0 -0
  484. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_auto_loop.py +0 -0
  485. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_auto_release_publish_2035.py +0 -0
  486. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_base_checkout_restore.py +0 -0
  487. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_block_log.py +0 -0
  488. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_cap_762.py +0 -0
  489. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_read_path.py +0 -0
  490. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_service.py +0 -0
  491. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_state.py +0 -0
  492. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_board_wire.py +0 -0
  493. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_brain.py +0 -0
  494. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_branch_model.py +0 -0
  495. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_bug_intake.py +0 -0
  496. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_build_worker_image_env_update.py +0 -0
  497. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cargo_cache.py +0 -0
  498. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_check_gh_argv_containment.py +0 -0
  499. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ci_acceptance_gate_1950.py +0 -0
  500. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ci_fix.py +0 -0
  501. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ci_gitlab.py +0 -0
  502. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ci_parity_2091.py +0 -0
  503. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_ci_store.py +0 -0
  504. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_claim.py +0 -0
  505. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_acceptance.py +0 -0
  506. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_assign.py +0 -0
  507. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  508. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_assign_interactive_remote.py +0 -0
  509. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_assign_provider.py +0 -0
  510. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  511. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_audit.py +0 -0
  512. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_chat_continue.py +0 -0
  513. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_decide.py +0 -0
  514. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_diagnose_config_provenance.py +0 -0
  515. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_diagnose_forge_availability.py +0 -0
  516. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_diagnose_graph.py +0 -0
  517. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_diagnose_self.py +0 -0
  518. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_doctor.py +0 -0
  519. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_doctor_config_free_1801.py +0 -0
  520. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  521. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_drive.py +0 -0
  522. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_drive_queue.py +0 -0
  523. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_escalate.py +0 -0
  524. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_fix_headless_review.py +0 -0
  525. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_gate_a.py +0 -0
  526. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_install_drift.py +0 -0
  527. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_install_skills.py +0 -0
  528. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_issue_comment.py +0 -0
  529. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_issue_create_label.py +0 -0
  530. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_issue_reopen.py +0 -0
  531. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_issue_view_list.py +0 -0
  532. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_merge.py +0 -0
  533. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_assign.py +0 -0
  534. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_capture.py +0 -0
  535. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_chat_add_child.py +0 -0
  536. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_dispatch.py +0 -0
  537. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_gate_b.py +0 -0
  538. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_gate_c.py +0 -0
  539. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_order.py +0 -0
  540. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  541. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_milestone_ship.py +0 -0
  542. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_network.py +0 -0
  543. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_new_issue_chat.py +0 -0
  544. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_plans.py +0 -0
  545. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_portal.py +0 -0
  546. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_pull_artifact.py +0 -0
  547. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_queue.py +0 -0
  548. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_reattach_sessions.py +0 -0
  549. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_refine_board.py +0 -0
  550. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_release_preflight.py +0 -0
  551. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_release_propagate.py +0 -0
  552. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_release_window.py +0 -0
  553. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_repo_2220.py +0 -0
  554. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  555. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_scorecard.py +0 -0
  556. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_set_review_findings.py +0 -0
  557. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_advisory_terminal.py +0 -0
  558. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_contested_tag.py +0 -0
  559. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_merge_queue.py +0 -0
  560. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_provider.py +0 -0
  561. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_review_finalizing.py +0 -0
  562. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_test_failed_tag.py +0 -0
  563. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_status_usage_limit.py +0 -0
  564. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_sync_comments_873.py +0 -0
  565. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_test_plan.py +0 -0
  566. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_track.py +0 -0
  567. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_tui_update.py +0 -0
  568. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cli_wait.py +0 -0
  569. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_client_base_install.py +0 -0
  570. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_comments.py +0 -0
  571. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_completion_summary.py +0 -0
  572. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config.py +0 -0
  573. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config_acceptance.py +0 -0
  574. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config_audit.py +0 -0
  575. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config_pricing.py +0 -0
  576. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  577. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_config_usage_gate.py +0 -0
  578. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_confirm_test.py +0 -0
  579. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_conflict_fix.py +0 -0
  580. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_conflict_fix_semantic.py +0 -0
  581. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  582. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_test.py +0 -0
  583. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_test_runner_baseline.py +0 -0
  584. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_test_runner_toolchain.py +0 -0
  585. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_uat.py +0 -0
  586. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coord_web_sse_restart_live.py +0 -0
  587. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_coordinator_machine.py +0 -0
  588. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_cross_platform_imports.py +0 -0
  589. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dao.py +0 -0
  590. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dashboard.py +0 -0
  591. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dashboard_fixture.py +0 -0
  592. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dashboard_terminal.py +0 -0
  593. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dashboard_terminal_live.py +0 -0
  594. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dead_end.py +0 -0
  595. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_decomposition_chat.py +0 -0
  596. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_coord_db_backup.py +0 -0
  597. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_coord_web_dist.py +0 -0
  598. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_coord_web_rollback.py +0 -0
  599. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_drive_queue_unit.py +0 -0
  600. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_failure_notify_unit.py +0 -0
  601. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_manifest.py +0 -0
  602. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_notify_unit.py +0 -0
  603. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_units_lane.py +0 -0
  604. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deploy_web_unit.py +0 -0
  605. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_deps.py +0 -0
  606. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_diagnose.py +0 -0
  607. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dispatch.py +0 -0
  608. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dispatch_target_validation.py +0 -0
  609. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_dist_name.py +0 -0
  610. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_done_housekeeping.py +0 -0
  611. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue_blocked_rendering.py +0 -0
  612. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue_launch_argv.py +0 -0
  613. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  614. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue_roll_pending.py +0 -0
  615. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  616. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_drive_tmux.py +0 -0
  617. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_epic_up_capability_detection.py +0 -0
  618. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_epic_up_image_provenance.py +0 -0
  619. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_errors.py +0 -0
  620. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_events.py +0 -0
  621. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_failure_class.py +0 -0
  622. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_filelock.py +0 -0
  623. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  624. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_fix_of_force_override.py +0 -0
  625. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_fleet_config_health.py +0 -0
  626. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_fleet_health_probes.py +0 -0
  627. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_fleet_health_snapshot.py +0 -0
  628. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_fleet_watchdog.py +0 -0
  629. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_forge_availability.py +0 -0
  630. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_freshness.py +0 -0
  631. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gate_a.py +0 -0
  632. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gate_b.py +0 -0
  633. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gate_snapshot_staleness.py +0 -0
  634. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  635. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_gen_mock_index.py +0 -0
  636. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_generated_types_fixture.py +0 -0
  637. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_goal.py +0 -0
  638. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_graph_health.py +0 -0
  639. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_graph_selfheal_absent_2237.py +0 -0
  640. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_handoff.py +0 -0
  641. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_checks.py +0 -0
  642. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_cli.py +0 -0
  643. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_cli_graph.py +0 -0
  644. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_config.py +0 -0
  645. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_context.py +0 -0
  646. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_coord_web_ci_pin.py +0 -0
  647. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_deploy_lane_facts.py +0 -0
  648. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_fix.py +0 -0
  649. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_incident_regression.py +0 -0
  650. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_pypi.py +0 -0
  651. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_registry.py +0 -0
  652. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_release_cordon_probe.py +0 -0
  653. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_timer_active.py +0 -0
  654. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_toolchain.py +0 -0
  655. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_unit_drift.py +0 -0
  656. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_health_unit_enablement.py +0 -0
  657. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_hooks.py +0 -0
  658. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_human_attended_437.py +0 -0
  659. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_init.py +0 -0
  660. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_integration.py +0 -0
  661. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_briefing_echo.py +0 -0
  662. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_pane_log_2541.py +0 -0
  663. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_prefill_state.py +0 -0
  664. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_session_relaunch.py +0 -0
  665. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_test_verdict_backstop.py +0 -0
  666. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_token_attribution.py +0 -0
  667. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_interactive_worktree.py +0 -0
  668. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_issue_store_seam.py +0 -0
  669. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_liveness_auditor.py +0 -0
  670. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_liveness_notify.py +0 -0
  671. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_machine_pause.py +0 -0
  672. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_merge_verify.py +0 -0
  673. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_milestone_chat.py +0 -0
  674. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_milestone_dispatch.py +0 -0
  675. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_milestone_gate.py +0 -0
  676. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_milestone_order.py +0 -0
  677. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_milestone_seam.py +0 -0
  678. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_mock_author.py +0 -0
  679. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_model_tiering.py +0 -0
  680. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_models.py +0 -0
  681. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_models_config_labels.py +0 -0
  682. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_needs_attention.py +0 -0
  683. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_network.py +0 -0
  684. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_new_issue_chat.py +0 -0
  685. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_next_release_tag.py +0 -0
  686. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_node_shim.py +0 -0
  687. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_baseline.py +0 -0
  688. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_cli.py +0 -0
  689. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_collect.py +0 -0
  690. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_config.py +0 -0
  691. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_drive_seam.py +0 -0
  692. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_isolation.py +0 -0
  693. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_predicate.py +0 -0
  694. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_quiet_hours.py +0 -0
  695. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notifier_service.py +0 -0
  696. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notify.py +0 -0
  697. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_notify_drain.py +0 -0
  698. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_operational_defaults.py +0 -0
  699. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_overlap_fence.py +0 -0
  700. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_overlap_predict.py +0 -0
  701. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_packaged_deploy_units.py +0 -0
  702. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_parentage.py +0 -0
  703. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_paste_landed.py +0 -0
  704. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  705. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_pipeline.py +0 -0
  706. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_plan_followup_approve_plan_command.py +0 -0
  707. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_plan_followup_pr_command.py +0 -0
  708. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_plan_followup_review_command.py +0 -0
  709. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_plan_only.py +0 -0
  710. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_plan_parser.py +0 -0
  711. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_platform_paths.py +0 -0
  712. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_portal_bridge.py +0 -0
  713. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_portal_config.py +0 -0
  714. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_portal_store.py +0 -0
  715. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_portal_sync.py +0 -0
  716. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_pr_body_lint.py +0 -0
  717. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_prereqs.py +0 -0
  718. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_production_db_guard.py +0 -0
  719. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_progress.py +0 -0
  720. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_provider_seam.py +0 -0
  721. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_providers.py +0 -0
  722. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_providers_config_labels.py +0 -0
  723. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_providers_pty.py +0 -0
  724. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_quiet_hours.py +0 -0
  725. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_quiet_hours_store_2146.py +0 -0
  726. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reap_merged_sessions.py +0 -0
  727. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reap_stale_interactive_tick.py +0 -0
  728. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile.py +0 -0
  729. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_branch.py +0 -0
  730. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_completions.py +0 -0
  731. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  732. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_merges.py +0 -0
  733. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_no_agent_record.py +0 -0
  734. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_tick.py +0 -0
  735. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reconcile_usage_limit_done.py +0 -0
  736. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_refine_chat.py +0 -0
  737. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_cordon_2101.py +0 -0
  738. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  739. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_cordon_deadlock_2240.py +0 -0
  740. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_cordon_stuck_2490.py +0 -0
  741. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_propagate.py +0 -0
  742. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_propagate_threshold.py +0 -0
  743. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_roll_window_handoff.py +0 -0
  744. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_unified_1242.py +0 -0
  745. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_verify.py +0 -0
  746. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_release_window.py +0 -0
  747. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_remote_auto_prune.py +0 -0
  748. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_remote_interactive_reaper.py +0 -0
  749. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_repo_edit_2220.py +0 -0
  750. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_repo_graph_fleet_2237.py +0 -0
  751. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_repo_onboard_2220.py +0 -0
  752. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_report_result_push.py +0 -0
  753. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_reports.py +0 -0
  754. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_retry.py +0 -0
  755. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_retry_advisory_1606.py +0 -0
  756. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_retry_type_1636.py +0 -0
  757. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_revalidate.py +0 -0
  758. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review.py +0 -0
  759. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_end_review_without_verdict.py +0 -0
  760. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_parse_failure_diagnostic.py +0 -0
  761. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_reaffirm.py +0 -0
  762. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_state.py +0 -0
  763. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_verdict_backstop.py +0 -0
  764. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_verdict_override_audit.py +0 -0
  765. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_verdict_relay.py +0 -0
  766. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_review_zero_commits.py +0 -0
  767. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_scoped_review_wiring.py +0 -0
  768. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_scorecard.py +0 -0
  769. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_self_health.py +0 -0
  770. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_serve.py +0 -0
  771. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_serve_app_board_trim.py +0 -0
  772. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_stage_projection.py +0 -0
  782. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_stalled_pipeline.py +0 -0
  783. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_state_review_findings_daemon.py +0 -0
  784. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_status_fleet_footer.py +0 -0
  785. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_stop_1567.py +0 -0
  786. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_stuck.py +0 -0
  787. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_terminal_command.py +0 -0
  788. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_author.py +0 -0
  789. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_chat.py +0 -0
  790. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_orchestrator.py +0 -0
  791. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_report.py +0 -0
  792. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_verdict_parsing.py +0 -0
  793. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_test_verdict_transcript_floor.py +0 -0
  794. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_text_io_encoding_audit.py +0 -0
  795. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_thin_client_board_audit.py +0 -0
  796. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_thin_client_config_load_1080.py +0 -0
  797. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_thin_client_daemon_routing_906.py +0 -0
  798. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_tmux_host.py +0 -0
  799. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_tmux_session.py +0 -0
  800. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_transcript_floor.py +0 -0
  801. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_usage.py +0 -0
  802. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_usage_limits.py +0 -0
  803. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_usage_rollup.py +0 -0
  804. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_venv_live_install_2121.py +0 -0
  805. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_watch.py +0 -0
  806. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  807. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worker_env_venv_isolation.py +0 -0
  808. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worker_events.py +0 -0
  809. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worker_safety.py +0 -0
  810. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worker_test_scoping.py +0 -0
  811. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worktree.py +0 -0
  812. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  813. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/Cargo.lock +0 -0
  814. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/Cargo.toml +0 -0
  815. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/cargo-config-local-quadraui.toml.example +0 -0
  816. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/approved.rs +0 -0
  817. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/audit.rs +0 -0
  818. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/chat.rs +0 -0
  819. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/data.rs +0 -0
  820. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/dialogs.rs +0 -0
  821. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/doc_tabs.rs +0 -0
  822. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/drive.rs +0 -0
  823. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/drive_queue.rs +0 -0
  824. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/escalation.rs +0 -0
  825. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/events.rs +0 -0
  826. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/fixtures.rs +0 -0
  827. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/fleet_health.rs +0 -0
  828. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/fleet_sessions.rs +0 -0
  829. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/fleet_terminals.rs +0 -0
  830. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/format.rs +0 -0
  831. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/milestone_dag.rs +0 -0
  832. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/mod.rs +0 -0
  833. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/msv.rs +0 -0
  834. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/pipeline.rs +0 -0
  835. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/plans.rs +0 -0
  836. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/render.rs +0 -0
  837. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/reports.rs +0 -0
  838. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/sessions.rs +0 -0
  839. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/settings_ui.rs +0 -0
  840. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/sidebar.rs +0 -0
  841. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/terminal.rs +0 -0
  842. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/tests.rs +0 -0
  843. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/types.rs +0 -0
  844. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/app/workspace.rs +0 -0
  845. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/bin/gtk.rs +0 -0
  846. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/commands.rs +0 -0
  847. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/lib.rs +0 -0
  848. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/main.rs +0 -0
  849. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/src/settings.rs +0 -0
  850. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/tests/acceptance.rs +0 -0
  851. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/tests/cli.rs +0 -0
  852. {code_coordinator-0.5.243 → code_coordinator-0.5.244}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.243
3
+ Version: 0.5.244
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.243
3
+ Version: 0.5.244
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
@@ -41,6 +41,7 @@ coord/audit.py
41
41
  coord/auto_loop.py
42
42
  coord/block_log.py
43
43
  coord/board_bool_guard.py
44
+ coord/board_schema.py
44
45
  coord/board_service.py
45
46
  coord/board_wire.py
46
47
  coord/brain.py
@@ -390,6 +391,7 @@ tests/test_block_log.py
390
391
  tests/test_board_cap_762.py
391
392
  tests/test_board_fixture.py
392
393
  tests/test_board_read_path.py
394
+ tests/test_board_schema.py
393
395
  tests/test_board_service.py
394
396
  tests/test_board_state.py
395
397
  tests/test_board_wire.py
@@ -698,6 +700,7 @@ tests/test_state.py
698
700
  tests/test_state_review_findings_daemon.py
699
701
  tests/test_status_fleet_footer.py
700
702
  tests/test_stop_1567.py
703
+ tests/test_store_contract.py
701
704
  tests/test_stuck.py
702
705
  tests/test_terminal_command.py
703
706
  tests/test_test_author.py
@@ -35,6 +35,7 @@
35
35
  "coord/auto_loop.py",
36
36
  "coord/block_log.py",
37
37
  "coord/board_bool_guard.py",
38
+ "coord/board_schema.py",
38
39
  "coord/board_service.py",
39
40
  "coord/board_wire.py",
40
41
  "coord/brain.py",
@@ -462,6 +463,7 @@
462
463
  "tests/test_board_cap_762.py",
463
464
  "tests/test_board_fixture.py",
464
465
  "tests/test_board_read_path.py",
466
+ "tests/test_board_schema.py",
465
467
  "tests/test_board_service.py",
466
468
  "tests/test_board_state.py",
467
469
  "tests/test_board_wire.py",
@@ -770,6 +772,7 @@
770
772
  "tests/test_state_review_findings_daemon.py",
771
773
  "tests/test_status_fleet_footer.py",
772
774
  "tests/test_stop_1567.py",
775
+ "tests/test_store_contract.py",
773
776
  "tests/test_stuck.py",
774
777
  "tests/test_terminal_command.py",
775
778
  "tests/test_test_author.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.243",
2
+ "tag": "0.5.244",
3
3
  "distance": 0,
4
- "node": "g1b9f7b7e97dc258d03dccf3588639dc09d1e6060",
4
+ "node": "ge4d9c7f1b82d7c7ee8f926388c85ad5ce89ee5aa",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-24"
@@ -40,10 +40,28 @@ def _editable_source_root(dist_name: str) -> Path | None:
40
40
  substring match on ``__file__`` (a non-editable install into a venv
41
41
  satisfies that too, and its metadata IS trustworthy since it's a
42
42
  frozen snapshot rather than a claim about live source).
43
+
44
+ #2728: the URL's path component must go through
45
+ ``urllib.request.url2pathname`` (platform-dispatched), not a bare
46
+ ``urllib.parse.unquote``. pip writes this URL via
47
+ ``pathname2url``/``path_to_url``, which on Windows produces
48
+ ``file:///C:/Users/...`` — ``urlparse`` yields a path of
49
+ ``/C:/Users/...``, and handing that straight to ``pathlib.Path`` does
50
+ NOT recover ``C:\\Users\\...``: Windows path parsing only recognises a
51
+ drive letter at the very start of the string, so a leading slash before
52
+ ``C:`` makes the whole thing parse as a driveless, rooted path (a
53
+ literal top-level folder named ``C:``) that can never exist. ``root
54
+ .is_dir()`` then reads False on every Windows editable install, no
55
+ exception raised, and ``_resolve_version`` silently falls through to
56
+ the frozen ``.dist-info`` snapshot — the exact pre-#2010 symptom,
57
+ reintroduced Windows-only. ``url2pathname`` is ``unquote`` verbatim on
58
+ POSIX (no behaviour change there) and is ``nturl2path.url2pathname`` on
59
+ Windows, which strips that leading slash before the drive letter.
43
60
  """
44
61
  import json # noqa: PLC0415
45
62
  from pathlib import Path # noqa: PLC0415
46
- from urllib.parse import unquote, urlparse # noqa: PLC0415
63
+ from urllib.parse import urlparse # noqa: PLC0415
64
+ from urllib.request import url2pathname # noqa: PLC0415
47
65
 
48
66
  try:
49
67
  raw = Distribution.from_name(dist_name).read_text("direct_url.json")
@@ -55,7 +73,7 @@ def _editable_source_root(dist_name: str) -> Path | None:
55
73
  parsed = urlparse(info.get("url", ""))
56
74
  if parsed.scheme != "file" or not parsed.path:
57
75
  return None
58
- root = Path(unquote(parsed.path))
76
+ root = Path(url2pathname(parsed.path))
59
77
  return root if root.is_dir() else None
60
78
 
61
79
 
@@ -15,6 +15,15 @@ custom deserializer, and cross-references them against the live SQLite
15
15
  schema. ``tests/test_board_fixture.py`` wires this up against the real
16
16
  ``tui/src/app/types.rs`` + a freshly-migrated DB so CI goes red the moment
17
17
  someone adds an unguarded INTEGER-backed bool field.
18
+
19
+ #1849 added the *other* half of this guard, one level up: the ``/board`` wire
20
+ contract is now the explicit DTOs in ``coord/board_schema.py``, and
21
+ ``tests/test_board_schema.py`` asserts every column in
22
+ ``board_schema.INTEGER_BACKED_BOOLEANS`` is declared ``int`` — so the JSON
23
+ type is pinned by the contract rather than by SQLite's (missing) boolean type,
24
+ and a Postgres backend cannot silently start sending ``true``/``false``. This
25
+ text-scraping check stays because it is the only one that reads the *actual
26
+ Rust consumer*; the DTO assertion cannot see ``types.rs``.
18
27
  """
19
28
 
20
29
  from __future__ import annotations
@@ -0,0 +1,393 @@
1
+ """Explicit wire DTOs for the daemon's ``GET /board`` projections (#1849).
2
+
3
+ Before this module the ``/board`` response shape **was** the SQLite table
4
+ layout: ``SqliteStore.board_projection()`` did ``SELECT *`` and
5
+ ``coord/serve_app.py`` built ``components/schemas`` by ``PRAGMA``-introspecting
6
+ a freshly-migrated in-memory DB. Three consequences, all of them real:
7
+
8
+ 1. Every ``coord/db.py`` migration was a potential breaking wire change that
9
+ nothing announced. The hand-curated ``_DROP_COLUMNS`` / ``_JSON_COLUMNS``
10
+ patches this module replaces were evidence the seam was half-built.
11
+ 2. Three independent clients parse this shape — the Rust TUI, the React
12
+ webapp, and ``coord/client.py`` — and only one of them has a compile step
13
+ that might notice a rename.
14
+ 3. **The storage engine's type system was load-bearing on the wire
15
+ contract.** SQLite has no boolean type, so flag columns declared
16
+ ``INTEGER DEFAULT 0`` ship as raw ``0``/``1``; under Postgres the same
17
+ columns become real ``BOOLEAN`` and ship as ``true``/``false``. An
18
+ unguarded ``bool`` field fails the parse of the *entire* ``BoardPayload``
19
+ and blanks the whole TUI board — #632, #546 and #628.
20
+
21
+ So the dataclasses below are the contract, and the storage engine is an
22
+ implementation detail underneath them:
23
+
24
+ - A column that is **not** declared here is **not on the wire**, however many
25
+ ``ALTER TABLE ... ADD COLUMN`` migrations land. Adding a nullable column to
26
+ a board table is now provably a no-op on both ``/board`` and
27
+ ``/openapi.json`` (``tests/test_board_schema.py``).
28
+ - A column's **JSON type is pinned by its Python annotation**, not by SQLite
29
+ affinity. In particular every INTEGER-backed boolean
30
+ (:data:`INTEGER_BACKED_BOOLEANS`) is annotated ``int``, so it stays a JSON
31
+ integer no matter what the storage engine's own type system does — the
32
+ #632-class blank-board failure cannot be reintroduced by a backend swap.
33
+ - A JSON-encoded TEXT column is simply a field typed ``list[str]`` / ``dict``;
34
+ :func:`project_row` decodes it on the way out.
35
+
36
+ The field **names, order, and types were generated from the pre-#1849
37
+ generated spec**, so the change that introduced this file was provably a no-op
38
+ on the wire: ``tests/test_board_fixture.py::test_board_sample_fixture_is_up_to_date``
39
+ still reproduces the *unmodified* #748 golden fixture byte-for-byte.
40
+
41
+ **Field order is part of the contract** — ``/board``'s JSON object key order is
42
+ this file's declaration order. The golden fixture is written with
43
+ ``sort_keys=True`` and so cannot see that; the ordering half is pinned by
44
+ ``tests/test_board_schema.py::test_board_wire_key_order_is_the_declared_field_order``.
45
+ Keep new fields in DDL order, and **append** rather than insert.
46
+
47
+ Nullability convention (inherited verbatim from the ``PRAGMA table_info``
48
+ walk it replaces): a column SQLite reports ``notnull=1`` is a required field
49
+ with no default; everything else is ``X | None = None``, which
50
+ ``coord.openapi.dataclass_schema`` renders as ``nullable: true`` and omits
51
+ from ``required``. ``kw_only=True`` is what lets a defaulted field precede a
52
+ non-defaulted one, so the declaration order can follow the DDL exactly.
53
+ """
54
+
55
+ from __future__ import annotations
56
+
57
+ import dataclasses
58
+ import json
59
+ import sqlite3
60
+ import types as _types
61
+ import typing
62
+ from collections.abc import Mapping
63
+ from typing import Any, Union
64
+
65
+ #: What the read path actually hands the projection. ``sqlite3.Row`` is *not*
66
+ #: a ``Mapping`` (see :func:`_as_dict`), so it has to be named explicitly.
67
+ RowLike = Union[Mapping[str, Any], sqlite3.Row]
68
+
69
+
70
+ @dataclasses.dataclass(kw_only=True)
71
+ class BoardAssignment:
72
+ """One `assignments` row as `/board` carries it.
73
+
74
+ `briefing` is deliberately absent: it is ~8 MB of an ~12 MB live
75
+ payload and no board view reads it. The full row (briefing
76
+ included) is still served by `GET /assignment/{id}`."""
77
+
78
+ assignment_id: str | None = None
79
+ machine_name: str
80
+ repo_name: str
81
+ repo_github: str | None = None
82
+ issue_number: int
83
+ issue_title: str
84
+ status: str
85
+ type: str
86
+ branch: str | None = None
87
+ pr_url: str | None = None
88
+ files_allowed: list[str] | None = None
89
+ files_forbidden: list[str] | None = None
90
+ model: str | None = None
91
+ dispatched_at: float | None = None
92
+ finished_at: float | None = None
93
+ smoke_test: str | None = None
94
+ smoke_test_reason: str | None = None
95
+ review_state: str | None = None
96
+ review_of_assignment_id: str | None = None
97
+ review_target: str | None = None
98
+ required_gates: list[str] | None = None
99
+ plan: dict | None = None
100
+ unreachable_count: int | None = None
101
+ exit_code: int | None = None
102
+ review_iteration: int | None = None
103
+ review_posted_at: float | None = None
104
+ test_state: str | None = None
105
+ test_reason: str | None = None
106
+ uat_state: str | None = None
107
+ uat_reason: str | None = None
108
+ cost_usd: float | None = None
109
+ smoke_tests: list[str] | None = None
110
+ review_findings: str | None = None
111
+ test_plan: dict | None = None
112
+ review_verdict: str | None = None
113
+ claude_session_id: str | None = None
114
+ test_plan_branch_head: str | None = None
115
+ provider_name: str | None = None
116
+ input_tokens: int | None = None
117
+ output_tokens: int | None = None
118
+ cache_creation_tokens: int | None = None
119
+ cache_read_tokens: int | None = None
120
+ is_interactive: int | None = None # 0/1 flag — INTEGER on the wire, never a JSON bool (#1849)
121
+ failure_reason: str | None = None
122
+ review_head_sha: str | None = None
123
+ acceptance_state: str | None = None
124
+ acceptance_reason: str | None = None
125
+ acceptance_sha: str | None = None
126
+ acceptance_total: int | None = None
127
+ acceptance_passed: int | None = None
128
+ completion_summary: str | None = None
129
+ audit_goals_json: str | None = None
130
+ audit_bottom_line: str | None = None
131
+ audit_run_number: int | None = None
132
+ for_issue_number: int | None = None
133
+ review_verdict_original: str | None = None
134
+ review_verdict_override_reason: str | None = None
135
+ review_patch_id: str | None = None
136
+ test_head_sha: str | None = None
137
+ test_patch_id: str | None = None
138
+ test_base_sha: str | None = None
139
+ review_scoped: int | None = None # 0/1 flag — INTEGER on the wire, never a JSON bool (#1849)
140
+ review_scope_base_sha: str | None = None
141
+ driven_by: str | None = None
142
+ test_toolchain: str | None = None
143
+ verdict_source: str | None = None
144
+ verdict_source_reason: str | None = None
145
+ stop_reason: str | None = None
146
+ dispatched_by_assignment_id: str | None = None
147
+
148
+
149
+ @dataclasses.dataclass(kw_only=True)
150
+ class BoardMachine:
151
+ """One `machines` row as `/board` carries it."""
152
+
153
+ name: str | None = None
154
+ host: str
155
+ capabilities: list[str] | None = None
156
+ repos: list[str] | None = None
157
+
158
+
159
+ @dataclasses.dataclass(kw_only=True)
160
+ class BoardMergeQueueEntry:
161
+ """One `merge_queue` row as `/board` carries it."""
162
+
163
+ id: int | None = None
164
+ assignment_id: str
165
+ repo_name: str
166
+ repo_github: str
167
+ branch: str
168
+ target_branch: str
169
+ issue_number: int
170
+ issue_title: str
171
+ state: str
172
+ pr_number: int | None = None
173
+ pr_url: str | None = None
174
+ size: int | None = None
175
+ last_attempt: float | None = None
176
+ error: str | None = None
177
+ enqueued_at: float | None = None
178
+ assignment_type: str | None = None
179
+ required_gates: list[str] | None = None
180
+ ci_infra_reruns: int
181
+ ci_stale_reruns: int
182
+ ci_flaky_reruns: int
183
+ ci_flaky_pending: str
184
+ ci_unreadable_reruns: int
185
+ ci_fix_dispatches: int
186
+
187
+
188
+ @dataclasses.dataclass(kw_only=True)
189
+ class BoardProposal:
190
+ """One `proposals` row as `/board` carries it."""
191
+
192
+ id: int | None = None
193
+ machine_name: str
194
+ repo_name: str
195
+ issue_number: int
196
+ issue_title: str
197
+ rationale: str | None = None
198
+ files_likely: list[str] | None = None
199
+ briefing: str | None = None
200
+ model: str | None = None
201
+ type: str | None = None
202
+ required_gates: list[str] | None = None
203
+
204
+
205
+ @dataclasses.dataclass(kw_only=True)
206
+ class BoardIssue:
207
+ """One `issues` row as `/board` carries it."""
208
+
209
+ repo_name: str
210
+ number: int
211
+ title: str
212
+ body: str
213
+ state: str
214
+ labels: list[str]
215
+ synced_at: float | None = None
216
+ milestone_number: int | None = None
217
+ milestone_title: str | None = None
218
+
219
+
220
+ @dataclasses.dataclass(kw_only=True)
221
+ class BoardDriveEscalation:
222
+ """One `drive_escalations` row as `/board` carries it (#1505)."""
223
+
224
+ id: int | None = None
225
+ repo_name: str
226
+ issue_number: int
227
+ stage: str
228
+ assignment_id: str | None = None
229
+ reason: str
230
+ gate_readings: str
231
+ proposed_command: str
232
+ created_at: float
233
+
234
+
235
+ @dataclasses.dataclass(kw_only=True)
236
+ class BoardDriveQueueEntry:
237
+ """One `drive_queue` row as `/board` carries it (#1753)."""
238
+
239
+ id: int | None = None
240
+ repo_name: str
241
+ issue_number: int
242
+ position: int
243
+ machine: str | None = None
244
+ after_json: list[str]
245
+ state: str
246
+ attempts: int
247
+ deferrals: int
248
+ last_reason: str
249
+ reason_at: float | None = None
250
+ session_name: str | None = None
251
+ launched_at: float | None = None
252
+ enqueued_at: float
253
+ hold_after: int # 0/1 flag — INTEGER on the wire, never a JSON bool (#1849)
254
+ hold_reason: str
255
+ resume_when: str
256
+ hold_state: str
257
+ hold_probes: int
258
+ launch_host: str
259
+ hold_scope: str
260
+ resumes: int
261
+ retry_backoff_at: float | None = None
262
+ max_fix_rounds: int | None = None
263
+ no_acceptance: int # 0/1 flag — INTEGER on the wire, never a JSON bool (#1849)
264
+
265
+
266
+
267
+ #: ``table name`` → the DTO that defines its ``/board`` wire shape. These are
268
+ #: exactly the seven projections ``coord/serve_app.py`` publishes under
269
+ #: ``components/schemas``; a table absent from this mapping (e.g.
270
+ #: ``notifications``) is passed through untouched by :func:`decode_row`.
271
+ BOARD_PROJECTIONS: dict[str, type] = {
272
+ "assignments": BoardAssignment,
273
+ "machines": BoardMachine,
274
+ "merge_queue": BoardMergeQueueEntry,
275
+ "proposals": BoardProposal,
276
+ "issues": BoardIssue,
277
+ "drive_escalations": BoardDriveEscalation,
278
+ "drive_queue": BoardDriveQueueEntry,
279
+ }
280
+
281
+ #: Columns that are semantically booleans but are stored as ``INTEGER`` and
282
+ #: therefore ship as ``0``/``1``. Their DTO fields are annotated ``int`` on
283
+ #: purpose; ``tests/test_board_schema.py`` asserts the generated JSON Schema
284
+ #: types them ``integer`` and never ``boolean``, so the wire shape survives a
285
+ #: storage-engine swap (Postgres would make these real ``BOOLEAN``s). This is
286
+ #: the DTO-level counterpart of ``coord/board_bool_guard.py``'s consumer-side
287
+ #: check against ``tui/src/app/types.rs``.
288
+ INTEGER_BACKED_BOOLEANS: frozenset[str] = frozenset(
289
+ {"is_interactive", "review_scoped", "hold_after", "no_acceptance"}
290
+ )
291
+
292
+
293
+ def _is_json_encoded(tp: Any) -> bool:
294
+ """True when *tp* is a container type — i.e. the column is JSON-in-TEXT in
295
+ SQLite and must be decoded to a native list/dict before hitting the wire."""
296
+ if typing.get_origin(tp) in (typing.Union, _types.UnionType):
297
+ return any(
298
+ _is_json_encoded(a) for a in typing.get_args(tp) if a is not type(None)
299
+ )
300
+ return tp in (list, dict) or typing.get_origin(tp) in (list, dict)
301
+
302
+
303
+ _WIRE_FIELDS_CACHE: dict[type, tuple[tuple[str, bool], ...]] = {}
304
+
305
+
306
+ def wire_fields(cls: type) -> tuple[tuple[str, bool], ...]:
307
+ """``((field_name, is_json_encoded), ...)`` for *cls*, in wire order."""
308
+ cached = _WIRE_FIELDS_CACHE.get(cls)
309
+ if cached is None:
310
+ hints = typing.get_type_hints(cls)
311
+ cached = tuple(
312
+ (f.name, _is_json_encoded(hints[f.name])) for f in dataclasses.fields(cls)
313
+ )
314
+ _WIRE_FIELDS_CACHE[cls] = cached
315
+ return cached
316
+
317
+
318
+ def json_fields(cls: type) -> frozenset[str]:
319
+ """The subset of *cls*'s fields backed by a JSON-encoded TEXT column."""
320
+ return frozenset(name for name, is_json in wire_fields(cls) if is_json)
321
+
322
+
323
+ def _decode_json_value(value: Any) -> Any:
324
+ """JSON-decode a value read out of a JSON-encoded TEXT column.
325
+
326
+ Non-strings pass through untouched (already decoded, or NULL); an empty
327
+ string and unparseable JSON both degrade to ``None`` rather than blowing
328
+ up the whole board read.
329
+ """
330
+ if not isinstance(value, (str, bytes, bytearray)):
331
+ return value
332
+ if not value:
333
+ return None
334
+ try:
335
+ return json.loads(value)
336
+ except (json.JSONDecodeError, TypeError):
337
+ return None
338
+
339
+
340
+ def _as_dict(row: RowLike) -> dict[str, Any]:
341
+ """*row* as a plain ``dict``.
342
+
343
+ ``sqlite3.Row`` is a **sequence**, not a mapping: ``"foo" in row`` tests
344
+ its *values*, not its column names, and would silently drop every field.
345
+ Normalising up front is the only safe way to ask "does this row have that
346
+ column?".
347
+ """
348
+ return row if type(row) is dict else dict(row)
349
+
350
+
351
+ def project_row(cls: type, row: RowLike) -> dict[str, Any]:
352
+ """Project one raw DB row through *cls* into its ``/board`` wire dict.
353
+
354
+ Only fields **declared on the DTO** survive, in declaration order — so a
355
+ column added by a later migration is absent from the wire until someone
356
+ adds it here deliberately. A declared field missing from *row* (an
357
+ un-migrated DB) is skipped rather than raising, matching the old
358
+ ``dict(row)`` behaviour.
359
+
360
+ Values are **not coerced** to their declared types: the annotation defines
361
+ the contract, and coercing here would be a silent wire change on any row
362
+ whose stored value disagrees with it.
363
+ """
364
+ src = _as_dict(row)
365
+ out: dict[str, Any] = {}
366
+ for name, is_json in wire_fields(cls):
367
+ if name not in src:
368
+ continue
369
+ value = src[name]
370
+ out[name] = _decode_json_value(value) if is_json else value
371
+ return out
372
+
373
+
374
+ def decode_row(table: str, row: RowLike, *, full: bool = False) -> dict[str, Any]:
375
+ """One DB row as the wire carries it.
376
+
377
+ ``full=True`` keeps every column (used by the single-resource *detail*
378
+ reads, #1336/#1337, which serve the complete row including ``briefing``)
379
+ and only applies the JSON decoding; the collection projection goes through
380
+ :func:`project_row` and is therefore bounded by the DTO.
381
+
382
+ A table with no DTO is returned as a plain dict, unchanged.
383
+ """
384
+ cls = BOARD_PROJECTIONS.get(table)
385
+ if cls is None:
386
+ return dict(row)
387
+ if not full:
388
+ return project_row(cls, row)
389
+ out = dict(_as_dict(row))
390
+ for name in json_fields(cls):
391
+ if name in out:
392
+ out[name] = _decode_json_value(out[name])
393
+ return out
@@ -14,10 +14,14 @@ the daemon or falls through to a ``_*_local()`` SQL function. That
14
14
  ``commands/acceptance`` analogues) is the single write choke point — #1036
15
15
  hooked the audit log there for exactly that reason — and is the portability
16
16
  seam a future Postgres backend (#282/#828) would actually swap. DB-API 2.0
17
- already abstracts ``sqlite3`` vs ``psycopg`` at the connection layer, so the
18
- port keeps the raw-SQL shape and swaps the connection rather than rewriting the
19
- call sites into store methods; a ``CoordStore``-style write interface would buy
20
- a cleaner API, not portability that is otherwise missing.
17
+ abstracts the *connection and cursor protocol*, not the SQL dialect or the
18
+ parameter style: ``sqlite3.paramstyle`` is ``qmark`` (``?``) and ``psycopg``'s
19
+ is ``pyformat`` (``%s``), and this tree has on the order of 220 ``?``
20
+ placeholders plus SQLite-only idioms (``INSERT OR REPLACE``,
21
+ ``AUTOINCREMENT``, ``PRAGMA``/WAL, ``lastrowid``) that a connection swap alone
22
+ would not touch — the portability work is a dialect seam, not a drop-in
23
+ (#1948). A ``CoordStore``-style write interface would still buy a cleaner
24
+ API, just not portability that is otherwise missing (#1948).
21
25
 
22
26
  ``SqliteStore`` is the concrete SQLite implementation of this read contract.
23
27
  It owns its *own* read-only connection (NOT ``coord.db``'s read/write
@@ -29,6 +33,13 @@ All SQLite idioms (``sqlite3.Row``, JSON-encoded TEXT columns, the ``mode=ro``
29
33
  URI) are encapsulated here: read methods return plain Python dicts with JSON
30
34
  columns decoded to native lists/objects, so neither the wire format nor a future
31
35
  non-SQLite backend inherits any SQLite-only idiom.
36
+
37
+ #1849: the *shape* of those dicts is no longer this module's business either.
38
+ The seven board projections are defined by the dataclasses in
39
+ ``coord/board_schema.py``, and :func:`_decode_row` projects each row through
40
+ its DTO — so the ``GET /board`` wire contract is a property of the declared
41
+ schema rather than of whichever storage engine (and whichever migration state)
42
+ happens to be underneath.
32
43
  """
33
44
 
34
45
  from __future__ import annotations
@@ -41,6 +52,7 @@ from contextlib import closing
41
52
  from pathlib import Path
42
53
  from typing import Any, Protocol, runtime_checkable
43
54
 
55
+ from coord import board_schema
44
56
  from coord.db import DB_PATH
45
57
 
46
58
  # Bump when the /board payload shape changes incompatibly. Clients may branch
@@ -83,39 +95,16 @@ def _board_retention_cutoff(now: float | None = None) -> float | None:
83
95
  return None
84
96
  return (time.time() if now is None else now) - days * 86400.0
85
97
 
86
- # JSON-encoded columns per table — decoded to native objects on read so no
87
- # SQLite idiom (JSON-in-TEXT) leaks past the DAO. Columns added by later ALTER
88
- # migrations are picked up automatically via ``SELECT *``; only JSON ones need
89
- # listing here.
90
- _JSON_COLUMNS: dict[str, set[str]] = {
91
- "assignments": {
92
- "files_allowed",
93
- "files_forbidden",
94
- "required_gates",
95
- "plan",
96
- "smoke_tests",
97
- "test_plan",
98
- # NOTE: review_findings is deliberately NOT decoded — the coord-tui
99
- # client consumes it as a raw JSON string (Option<String>), so it must
100
- # stay a string on the wire.
101
- },
102
- "proposals": {"files_likely", "required_gates"},
103
- "merge_queue": {"required_gates"},
104
- "issues": {"labels"},
105
- "machines": {"capabilities", "repos"},
106
- # #1753: the drive queue's pre-req list — ["repo#N", ...] on the wire, a
107
- # JSON string in SQLite.
108
- "drive_queue": {"after_json"},
109
- }
110
-
111
- # Columns omitted from the board projection. ``assignments.briefing`` is ~8 MB
112
- # of an ~12 MB live payload and is NOT part of the board view (the TUI's board
113
- # query never selects it; the Python mapper defaults it to ""), so dropping it
114
- # keeps refreshes fast over Tailscale. A per-assignment endpoint can serve full
115
- # briefings later if a detail view needs them.
116
- _DROP_COLUMNS: dict[str, set[str]] = {
117
- "assignments": {"briefing"},
118
- }
98
+
99
+ # #1849: the wire shape of the seven board projections is defined by the
100
+ # dataclasses in ``coord/board_schema.py``, NOT by whatever columns
101
+ # ``SELECT *`` happens to return. The hand-curated ``_JSON_COLUMNS`` /
102
+ # ``_DROP_COLUMNS`` tables that used to live here (patches over the leak) are
103
+ # gone: a JSON-encoded TEXT column is now a field typed ``list[str]``/``dict``
104
+ # on its DTO, and a column the board must not carry (e.g.
105
+ # ``assignments.briefing``, ~8 MB of an ~12 MB live payload) is simply absent
106
+ # from the DTO. ``review_findings`` stays a plain ``str`` field on purpose —
107
+ # the coord-tui client consumes it as a raw JSON string (``Option<String>``).
119
108
 
120
109
 
121
110
  @runtime_checkable
@@ -237,25 +226,21 @@ _KEEP_INDEX_COLUMNS = (
237
226
 
238
227
 
239
228
  def _decode_row(table: str, row: sqlite3.Row, *, full: bool = False) -> dict:
240
- """sqlite3.Row → plain dict with that table's JSON columns decoded.
241
-
242
- ``full=True`` keeps the :data:`_DROP_COLUMNS` fields (e.g.
243
- ``assignments.briefing``) — used by the single-resource *detail* reads
244
- (#1336/#1337), which serve the complete row; the collection projection
245
- stays slim.
229
+ """sqlite3.Row → the plain dict the wire carries.
230
+
231
+ #1849: for the seven board tables this projects the row through that
232
+ table's DTO in ``coord/board_schema.py`` — only declared fields survive,
233
+ in declared order, with JSON-encoded TEXT columns decoded — so a later
234
+ ``ALTER TABLE ... ADD COLUMN`` cannot silently widen ``/board``. A table
235
+ with no DTO (e.g. ``notifications``) is passed through unchanged, exactly
236
+ as before.
237
+
238
+ ``full=True`` keeps every column (including ones the board projection
239
+ omits, e.g. ``assignments.briefing``) and applies only the JSON decoding —
240
+ used by the single-resource *detail* reads (#1336/#1337), which serve the
241
+ complete row; the collection projection stays slim.
246
242
  """
247
- d = dict(row)
248
- if not full:
249
- for col in _DROP_COLUMNS.get(table, ()):
250
- d.pop(col, None)
251
- for col in _JSON_COLUMNS.get(table, ()):
252
- val = d.get(col)
253
- if isinstance(val, (str, bytes, bytearray)):
254
- try:
255
- d[col] = json.loads(val) if val else None
256
- except (json.JSONDecodeError, TypeError):
257
- d[col] = None
258
- return d
243
+ return board_schema.decode_row(table, row, full=full)
259
244
 
260
245
 
261
246
  class SqliteStore: