code-coordinator 0.5.236__tar.gz → 0.5.238__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 (816) hide show
  1. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/SOURCES.txt +2 -0
  4. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/scm_file_list.json +2 -0
  5. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agent.py +125 -0
  7. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/portal.py +50 -0
  8. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/db.py +102 -10
  9. code_coordinator-0.5.238/coord/decomposition_chat.py +260 -0
  10. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_portal.py +55 -0
  11. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_db.py +123 -1
  12. code_coordinator-0.5.238/tests/test_decomposition_chat.py +259 -0
  13. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/approved.rs +227 -0
  14. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/dialogs.rs +207 -0
  15. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/events.rs +21 -0
  16. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/fixtures.rs +1 -0
  17. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/mod.rs +33 -0
  18. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/settings_ui.rs +10 -0
  19. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/sidebar.rs +6 -0
  20. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/tests.rs +21 -0
  21. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/types.rs +8 -0
  22. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.claude/commands/board.md +0 -0
  23. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.claude/commands/complete-session.md +0 -0
  24. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.claude/commands/coordinator.md +0 -0
  25. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.githooks/_lib.sh +0 -0
  26. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.githooks/post-checkout +0 -0
  27. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.githooks/post-commit +0 -0
  28. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.githooks/post-merge +0 -0
  29. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  30. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/coord-ci-acceptance.yml +0 -0
  31. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/workflows/auto-release.yml +0 -0
  32. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/workflows/cargo-test.yml +0 -0
  33. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/workflows/publish.yml +0 -0
  34. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/workflows/release-tui.yml +0 -0
  35. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.github/workflows/test.yml +0 -0
  36. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/.gitignore +0 -0
  37. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/CLAUDE.md +0 -0
  38. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/GOAL.md +0 -0
  39. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/LICENSE +0 -0
  40. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/MANIFEST.in +0 -0
  41. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/README.md +0 -0
  42. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/dependency_links.txt +0 -0
  43. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/entry_points.txt +0 -0
  44. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/requires.txt +0 -0
  45. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/code_coordinator.egg-info/top_level.txt +0 -0
  46. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/__init__.py +0 -0
  47. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/_board_mapping.py +0 -0
  48. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/acceptance.py +0 -0
  49. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/acceptance_drivers.py +0 -0
  50. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agent_app.py +0 -0
  51. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agent_update.py +0 -0
  52. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agents/opencode/.gitignore +0 -0
  53. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agents/opencode/agents/work.md +0 -0
  54. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/agents/opencode/routing.jsonc +0 -0
  55. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/approved_work.py +0 -0
  56. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/audit.py +0 -0
  57. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/auto_loop.py +0 -0
  58. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/block_log.py +0 -0
  59. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/board_bool_guard.py +0 -0
  60. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/ci_fix.py +0 -0
  67. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/ci_github.py +0 -0
  68. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/ci_gitlab.py +0 -0
  69. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/ci_store.py +0 -0
  70. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/claim.py +0 -0
  71. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/cli.py +0 -0
  72. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/client.py +0 -0
  73. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/__init__.py +0 -0
  74. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/_common.py +0 -0
  75. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/acceptance.py +0 -0
  76. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/agent_ops.py +0 -0
  77. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/audit.py +0 -0
  78. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/chat.py +0 -0
  79. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/dispatch.py +0 -0
  80. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/dispatch_workers.py +0 -0
  81. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/drive.py +0 -0
  82. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/drive_queue.py +0 -0
  83. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/gate_a.py +0 -0
  84. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/gates.py +0 -0
  85. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/issues.py +0 -0
  86. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/lifecycle.py +0 -0
  87. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/merge.py +0 -0
  88. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/milestone.py +0 -0
  89. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/plan_followup.py +0 -0
  90. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/plans.py +0 -0
  91. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/release.py +0 -0
  92. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/repo.py +0 -0
  93. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/report.py +0 -0
  94. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/review.py +0 -0
  95. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/scorecard.py +0 -0
  96. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/sessions.py +0 -0
  97. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/setup.py +0 -0
  98. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/status.py +0 -0
  99. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/config.py +0 -0
  104. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/confirm_test.py +0 -0
  106. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/conflict_fix.py +0 -0
  107. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dao.py +0 -0
  108. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dashboard/server.py +0 -0
  112. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dashboard/terminal.py +0 -0
  113. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dead_end.py +0 -0
  114. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/README.md +0 -0
  115. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-agent.service +0 -0
  116. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-db-backup.service +0 -0
  117. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-db-backup.sh +0 -0
  118. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-db-backup.timer +0 -0
  119. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-drive-queue.service +0 -0
  120. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-drive-queue.timer +0 -0
  121. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-notify.service +0 -0
  122. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-notify.timer +0 -0
  123. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-release-propagate.service +0 -0
  124. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-release-propagate.timer +0 -0
  125. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-release-window.service +0 -0
  126. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-release-window.timer +0 -0
  127. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-serve.service +0 -0
  128. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-web-dist-build.service +0 -0
  129. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-web-dist-build.timer +0 -0
  130. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy/coord-web.service +0 -0
  131. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy_manifest.py +0 -0
  132. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deploy_units.py +0 -0
  133. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/events.py +0 -0
  141. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/goal.py +0 -0
  152. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/graph_health.py +0 -0
  153. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/__init__.py +0 -0
  154. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/aggregate.py +0 -0
  155. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/__init__.py +0 -0
  156. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/agent_install.py +0 -0
  157. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/cargo_targets.py +0 -0
  158. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/claude_binary.py +0 -0
  159. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/coord_web_ci_pin.py +0 -0
  160. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/deploy_lane_facts.py +0 -0
  161. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/disk.py +0 -0
  162. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/fleet_board.py +0 -0
  163. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  164. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/fleet_phantom.py +0 -0
  165. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/fleet_unit_drift.py +0 -0
  166. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/graph.py +0 -0
  167. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/graphify_cli.py +0 -0
  168. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/index_lock.py +0 -0
  169. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/plan_usage.py +0 -0
  170. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/repo_state.py +0 -0
  171. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/spawned_coord.py +0 -0
  172. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/timer_active.py +0 -0
  173. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/toolchain.py +0 -0
  174. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/unit_drift.py +0 -0
  175. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/unit_enablement.py +0 -0
  176. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/checks/worktrees.py +0 -0
  177. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/cli.py +0 -0
  178. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/context.py +0 -0
  179. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/fleet_snapshot.py +0 -0
  180. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/models.py +0 -0
  181. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/pypi.py +0 -0
  182. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/registry.py +0 -0
  183. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/render.py +0 -0
  184. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/health/units.py +0 -0
  185. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/hooks.py +0 -0
  186. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/housekeeping.py +0 -0
  187. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/interactive.py +0 -0
  188. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/issue_store.py +0 -0
  189. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/liveness_auditor.py +0 -0
  190. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/machine_pause.py +0 -0
  191. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/merge_queue.py +0 -0
  192. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/milestone_chat.py +0 -0
  193. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/milestone_dispatch.py +0 -0
  194. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/milestone_gate.py +0 -0
  195. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/milestone_order.py +0 -0
  196. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/mock_author.py +0 -0
  197. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/models.py +0 -0
  198. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/network.py +0 -0
  199. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/new_issue_chat.py +0 -0
  200. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/__init__.py +0 -0
  201. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/baseline.py +0 -0
  202. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/cli.py +0 -0
  203. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/collect.py +0 -0
  204. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/digest.py +0 -0
  205. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/models.py +0 -0
  206. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/predicate.py +0 -0
  207. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/service.py +0 -0
  208. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/store.py +0 -0
  209. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notifier/transport.py +0 -0
  210. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/notify.py +0 -0
  211. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/openapi.py +0 -0
  212. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/overlap_fence.py +0 -0
  213. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/overlap_predict.py +0 -0
  214. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/parentage.py +0 -0
  215. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/parentage_github.py +0 -0
  216. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/pipeline.py +0 -0
  217. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/plan_parser.py +0 -0
  218. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/plans.py +0 -0
  219. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/platform_paths.py +0 -0
  220. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/portal_bridge.py +0 -0
  221. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/portal_store.py +0 -0
  222. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/portal_sync.py +0 -0
  223. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/pr_body_lint.py +0 -0
  224. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/prereqs.py +0 -0
  225. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/progress.py +0 -0
  226. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/providers/__init__.py +0 -0
  227. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/providers/base.py +0 -0
  228. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/providers/claude.py +0 -0
  229. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/providers/claude_pty.py +0 -0
  230. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/providers/opencode.py +0 -0
  231. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/queue_diagnose.py +0 -0
  232. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/reconcile.py +0 -0
  233. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/reconcile_tick.py +0 -0
  234. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/refine_chat.py +0 -0
  235. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/release_cordon.py +0 -0
  236. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/release_propagate.py +0 -0
  237. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/release_verify.py +0 -0
  238. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/release_window.py +0 -0
  239. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/repo_edit.py +0 -0
  240. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/repo_onboard.py +0 -0
  241. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/reports.py +0 -0
  242. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/revalidate.py +0 -0
  243. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/review.py +0 -0
  244. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/scorecard.py +0 -0
  245. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/self_health.py +0 -0
  246. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/serve_app.py +0 -0
  247. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  248. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  249. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  250. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  251. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  252. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/portal-followup/SKILL.md +0 -0
  253. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  254. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  255. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/skills/update-issue/SKILL.md +0 -0
  256. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/smoke.py +0 -0
  257. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/spend_ceiling.py +0 -0
  258. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/split_work.py +0 -0
  259. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/stage_projection.py +0 -0
  260. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/state.py +0 -0
  261. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/test_author.py +0 -0
  262. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/test_chat.py +0 -0
  263. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/test_orchestrator.py +0 -0
  264. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/test_report.py +0 -0
  265. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/tui_release.py +0 -0
  266. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/usage.py +0 -0
  267. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/usage_limits.py +0 -0
  268. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/usage_rollup.py +0 -0
  269. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coord/worker_events.py +0 -0
  270. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/coordinator.example.yml +0 -0
  271. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-agent.service +0 -0
  272. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-db-backup.service +0 -0
  273. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-db-backup.sh +0 -0
  274. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-db-backup.timer +0 -0
  275. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-drive-queue.service +0 -0
  276. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-drive-queue.timer +0 -0
  277. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-notify.service +0 -0
  278. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-notify.timer +0 -0
  279. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-release-propagate.service +0 -0
  280. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-release-propagate.timer +0 -0
  281. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-release-window.service +0 -0
  282. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-release-window.timer +0 -0
  283. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-serve.service +0 -0
  284. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-web-dist-build.service +0 -0
  285. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-web-dist-build.sh +0 -0
  286. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-web-dist-build.timer +0 -0
  287. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-web-rollback.sh +0 -0
  288. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/coord-web.service +0 -0
  289. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/deploy/node-shim.sh +0 -0
  290. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  291. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ADR_COORD_WEB_CI.md +0 -0
  292. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ADR_COORD_WEB_DIST.md +0 -0
  293. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/AGENT_OPERATIONS.md +0 -0
  294. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ARCHITECTURE.md +0 -0
  295. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ARCH_SECURITY_GATES.md +0 -0
  296. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/COCKPIT.md +0 -0
  297. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/CONTROL_CENTER.md +0 -0
  298. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/COST_DISCIPLINE.md +0 -0
  299. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/CROSS_PLATFORM.md +0 -0
  300. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/CUSTOMER_PORTAL.md +0 -0
  301. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/DRIVE_QUEUE.md +0 -0
  302. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/EPHEMERAL_WORKERS.md +0 -0
  303. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/FORGE_MIGRATION.md +0 -0
  304. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/GRAPHIFY_SETUP.md +0 -0
  305. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ISSUE_GUIDANCE.md +0 -0
  306. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/MAC_MINI.md +0 -0
  307. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  308. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/NOTIFIER.md +0 -0
  309. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/OPENCODE_VERIFICATION.md +0 -0
  310. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/OPERATING_GOTCHAS.md +0 -0
  311. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/ORACLE_LOOP.md +0 -0
  312. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/PHONE_WEBAPP.md +0 -0
  313. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/PIPELINE_V2.md +0 -0
  314. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/PLATFORM_EVOLUTION.md +0 -0
  315. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/SECOND_BACKEND.md +0 -0
  316. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/STORE_SERVICE.md +0 -0
  317. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  318. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/WEB_CONTROL_CENTER.md +0 -0
  319. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/WSL_WINDOWS_WORKER.md +0 -0
  320. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/mocks/web/README.md +0 -0
  321. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/mocks/web/_tokens.css +0 -0
  322. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/mocks/web/issue-detail.html +0 -0
  323. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/mocks/web/pipeline-narrow.html +0 -0
  324. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/docs/mocks/web/pipeline-wide.html +0 -0
  325. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/graphify-out/.gitignore +0 -0
  326. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/install-agent.sh +0 -0
  327. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/pyproject.toml +0 -0
  328. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/audit_review_verdict_overrides.py +0 -0
  329. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  330. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/build-worker-image.sh +0 -0
  331. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/coordinator-machine.py +0 -0
  332. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/epic-down.sh +0 -0
  333. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/epic-up.sh +0 -0
  334. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/preflight.sh +0 -0
  335. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/provision-worker.sh +0 -0
  336. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  337. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  338. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/azure-workers/verify-github-token.sh +0 -0
  339. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/check_gh_argv_containment.py +0 -0
  340. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/codegen.py +0 -0
  341. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/coord-test-runner.sh +0 -0
  342. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/drive-batch.sh +0 -0
  343. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/gen_board_fixture.py +0 -0
  344. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/gen_mock_index.py +0 -0
  345. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/next_release_tag.py +0 -0
  346. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/run_tests_in_populated_home.sh +0 -0
  347. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/run_tests_without_gh.sh +0 -0
  348. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/smoke_437_interactive.py +0 -0
  349. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/verify_878_review_capture.py +0 -0
  350. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/verify_release_published.py +0 -0
  351. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/scripts/verify_release_wheel.py +0 -0
  352. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/setup.cfg +0 -0
  353. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/SMOKE_SET.md +0 -0
  354. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/__init__.py +0 -0
  355. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  356. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/contract.md +0 -0
  357. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/manifest.yml +0 -0
  358. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  359. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  360. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  361. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  362. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-37/conftest.py +0 -0
  363. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-37/contract.md +0 -0
  364. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-37/manifest.yml +0 -0
  365. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  366. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  367. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/contract.md +0 -0
  368. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/manifest.yml +0 -0
  369. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  370. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  371. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  372. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  373. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  374. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  375. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  376. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  377. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  378. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  379. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/contract.md +0 -0
  380. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  381. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  382. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/manifest.yml +0 -0
  383. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  384. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-51/tsconfig.json +0 -0
  385. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  386. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  387. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  388. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/contract.md +0 -0
  389. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  390. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/manifest.yml +0 -0
  391. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  392. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  393. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  394. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  395. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  396. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  397. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  398. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  399. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  400. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  401. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  402. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  403. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/contract.md +0 -0
  404. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  405. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/manifest.yml +0 -0
  406. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  407. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  408. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  409. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  410. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  411. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  412. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  413. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/conftest.py +0 -0
  414. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/board-pipeline-basic.json +0 -0
  415. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  416. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  417. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  418. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  419. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/all_pass.json +0 -0
  420. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  421. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/mixed_fail.json +0 -0
  422. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  423. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  424. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/skip.json +0 -0
  425. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/playwright/truncated.json +0 -0
  426. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  427. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  428. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  429. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  430. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  431. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  432. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  433. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  434. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_acceptance.py +0 -0
  435. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_acceptance_drivers.py +0 -0
  436. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent.py +0 -0
  437. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_api_error.py +0 -0
  438. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_app.py +0 -0
  439. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_branch_base.py +0 -0
  440. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_branch_capture.py +0 -0
  441. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_config_free_1712.py +0 -0
  442. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_deploy_units_endpoint.py +0 -0
  443. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_dirty_worktree.py +0 -0
  444. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  445. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_graph_self_heal.py +0 -0
  446. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_health_h3.py +0 -0
  447. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_idle_restart.py +0 -0
  448. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_push_failure.py +0 -0
  449. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_reap.py +0 -0
  450. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_repos_and_pull.py +0 -0
  451. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_restart_services_endpoint.py +0 -0
  452. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_skills_self_heal.py +0 -0
  453. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_startup_diagnostics.py +0 -0
  454. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_update.py +0 -0
  455. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_update_bluegreen.py +0 -0
  456. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_usage_limit.py +0 -0
  457. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_agent_zero_commit.py +0 -0
  458. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ambient_home_isolation.py +0 -0
  459. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_approve_reject_plan.py +0 -0
  460. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_approve_usage_gate.py +0 -0
  461. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_approved_work_2532.py +0 -0
  462. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_assignment_already_recorded_daemon.py +0 -0
  463. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_audit_log.py +0 -0
  464. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_audit_outcome.py +0 -0
  465. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_audit_query.py +0 -0
  466. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_auto_loop.py +0 -0
  467. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_auto_release_publish_2035.py +0 -0
  468. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_base_checkout_restore.py +0 -0
  469. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_block_log.py +0 -0
  470. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_cap_762.py +0 -0
  471. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_fixture.py +0 -0
  472. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_read_path.py +0 -0
  473. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_service.py +0 -0
  474. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_state.py +0 -0
  475. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_board_wire.py +0 -0
  476. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_brain.py +0 -0
  477. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_branch_model.py +0 -0
  478. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_bug_intake.py +0 -0
  479. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_build_worker_image_env_update.py +0 -0
  480. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cargo_cache.py +0 -0
  481. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_check_gh_argv_containment.py +0 -0
  482. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ci_acceptance_gate_1950.py +0 -0
  483. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ci_fix.py +0 -0
  484. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ci_gitlab.py +0 -0
  485. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ci_parity_2091.py +0 -0
  486. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_ci_store.py +0 -0
  487. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_claim.py +0 -0
  488. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_acceptance.py +0 -0
  489. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_assign.py +0 -0
  490. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  491. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_assign_interactive_remote.py +0 -0
  492. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_assign_provider.py +0 -0
  493. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  494. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_audit.py +0 -0
  495. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_chat_continue.py +0 -0
  496. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_decide.py +0 -0
  497. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_diagnose_config_provenance.py +0 -0
  498. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_diagnose_forge_availability.py +0 -0
  499. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_diagnose_graph.py +0 -0
  500. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_diagnose_self.py +0 -0
  501. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_doctor.py +0 -0
  502. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_doctor_config_free_1801.py +0 -0
  503. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  504. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_drive.py +0 -0
  505. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_drive_queue.py +0 -0
  506. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_escalate.py +0 -0
  507. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_fix_headless_review.py +0 -0
  508. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_gate_a.py +0 -0
  509. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_install_drift.py +0 -0
  510. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_install_skills.py +0 -0
  511. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_issue_create_label.py +0 -0
  512. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_issue_reopen.py +0 -0
  513. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_merge.py +0 -0
  514. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_assign.py +0 -0
  515. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_capture.py +0 -0
  516. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_chat_add_child.py +0 -0
  517. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_dispatch.py +0 -0
  518. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_gate_b.py +0 -0
  519. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_gate_c.py +0 -0
  520. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_order.py +0 -0
  521. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  522. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_milestone_ship.py +0 -0
  523. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_network.py +0 -0
  524. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_new_issue_chat.py +0 -0
  525. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_plans.py +0 -0
  526. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_pull_artifact.py +0 -0
  527. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_queue.py +0 -0
  528. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_reattach_sessions.py +0 -0
  529. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_refine_board.py +0 -0
  530. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_release_preflight.py +0 -0
  531. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_release_propagate.py +0 -0
  532. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_release_window.py +0 -0
  533. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_repo_2220.py +0 -0
  534. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_scorecard.py +0 -0
  535. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_set_review_findings.py +0 -0
  536. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_advisory_terminal.py +0 -0
  537. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_merge_queue.py +0 -0
  538. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_provider.py +0 -0
  539. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_review_finalizing.py +0 -0
  540. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_test_failed_tag.py +0 -0
  541. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_status_usage_limit.py +0 -0
  542. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_sync_comments_873.py +0 -0
  543. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_test_plan.py +0 -0
  544. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_track.py +0 -0
  545. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_tui_update.py +0 -0
  546. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cli_wait.py +0 -0
  547. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_client_base_install.py +0 -0
  548. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_comments.py +0 -0
  549. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_completion_summary.py +0 -0
  550. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config.py +0 -0
  551. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config_acceptance.py +0 -0
  552. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config_audit.py +0 -0
  553. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config_pricing.py +0 -0
  554. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  555. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_config_usage_gate.py +0 -0
  556. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_confirm_test.py +0 -0
  557. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_conflict_fix.py +0 -0
  558. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_conflict_fix_semantic.py +0 -0
  559. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_test.py +0 -0
  560. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_test_runner_baseline.py +0 -0
  561. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_test_runner_populated_home.py +0 -0
  562. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_test_runner_routing.py +0 -0
  563. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_test_runner_toolchain.py +0 -0
  564. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coord_web_sse_restart_live.py +0 -0
  565. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_coordinator_machine.py +0 -0
  566. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_cross_platform_imports.py +0 -0
  567. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dashboard.py +0 -0
  568. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dashboard_fixture.py +0 -0
  569. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dashboard_terminal.py +0 -0
  570. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dashboard_terminal_live.py +0 -0
  571. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dead_end.py +0 -0
  572. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_coord_db_backup.py +0 -0
  573. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_coord_web_dist.py +0 -0
  574. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_coord_web_rollback.py +0 -0
  575. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_drive_queue_unit.py +0 -0
  576. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_manifest.py +0 -0
  577. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_notify_unit.py +0 -0
  578. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_units_lane.py +0 -0
  579. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deploy_web_unit.py +0 -0
  580. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_deps.py +0 -0
  581. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_diagnose.py +0 -0
  582. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dispatch.py +0 -0
  583. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dispatch_target_validation.py +0 -0
  584. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_dist_name.py +0 -0
  585. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_done_housekeeping.py +0 -0
  586. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_drive.py +0 -0
  587. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_drive_queue.py +0 -0
  588. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_drive_state.py +0 -0
  589. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_drive_tmux.py +0 -0
  590. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_epic_up_capability_detection.py +0 -0
  591. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  592. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_epic_up_image_provenance.py +0 -0
  593. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_errors.py +0 -0
  594. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_events.py +0 -0
  595. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_failure_class.py +0 -0
  596. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_filelock.py +0 -0
  597. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  598. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_fix_of_force_override.py +0 -0
  599. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_fleet_config_health.py +0 -0
  600. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_fleet_health_probes.py +0 -0
  601. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_fleet_health_snapshot.py +0 -0
  602. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_forge_availability.py +0 -0
  603. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_freshness.py +0 -0
  604. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gate_a.py +0 -0
  605. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gate_b.py +0 -0
  606. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gate_snapshot_staleness.py +0 -0
  607. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gates.py +0 -0
  608. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  609. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_gen_mock_index.py +0 -0
  610. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_generated_types_fixture.py +0 -0
  611. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_github_ops.py +0 -0
  612. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_goal.py +0 -0
  613. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_graph_health.py +0 -0
  614. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_graph_selfheal_absent_2237.py +0 -0
  615. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_handoff.py +0 -0
  616. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_checks.py +0 -0
  617. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_cli.py +0 -0
  618. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_cli_graph.py +0 -0
  619. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_config.py +0 -0
  620. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_context.py +0 -0
  621. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_coord_web_ci_pin.py +0 -0
  622. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_deploy_lane_facts.py +0 -0
  623. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_incident_regression.py +0 -0
  624. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_pypi.py +0 -0
  625. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_registry.py +0 -0
  626. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_timer_active.py +0 -0
  627. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_toolchain.py +0 -0
  628. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_unit_drift.py +0 -0
  629. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_health_unit_enablement.py +0 -0
  630. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_hooks.py +0 -0
  631. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_human_attended_437.py +0 -0
  632. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_init.py +0 -0
  633. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_integration.py +0 -0
  634. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_briefing_echo.py +0 -0
  635. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_pane_log_2541.py +0 -0
  636. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_prefill_state.py +0 -0
  637. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_session_relaunch.py +0 -0
  638. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_test_verdict_backstop.py +0 -0
  639. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_token_attribution.py +0 -0
  640. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_interactive_worktree.py +0 -0
  641. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_issue_store_seam.py +0 -0
  642. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_liveness_auditor.py +0 -0
  643. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_liveness_notify.py +0 -0
  644. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_machine_pause.py +0 -0
  645. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_merge_queue.py +0 -0
  646. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_merge_verify.py +0 -0
  647. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_milestone_chat.py +0 -0
  648. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_milestone_dispatch.py +0 -0
  649. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_milestone_gate.py +0 -0
  650. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_milestone_order.py +0 -0
  651. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_milestone_seam.py +0 -0
  652. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_mock_author.py +0 -0
  653. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_model_tiering.py +0 -0
  654. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_models.py +0 -0
  655. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_models_config_labels.py +0 -0
  656. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_needs_attention.py +0 -0
  657. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_network.py +0 -0
  658. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_new_issue_chat.py +0 -0
  659. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_next_release_tag.py +0 -0
  660. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_node_shim.py +0 -0
  661. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_baseline.py +0 -0
  662. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_cli.py +0 -0
  663. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_collect.py +0 -0
  664. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_config.py +0 -0
  665. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_drive_seam.py +0 -0
  666. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_isolation.py +0 -0
  667. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_predicate.py +0 -0
  668. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_quiet_hours.py +0 -0
  669. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notifier_service.py +0 -0
  670. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notify.py +0 -0
  671. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_notify_drain.py +0 -0
  672. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_openapi.py +0 -0
  673. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_operational_defaults.py +0 -0
  674. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_overlap_fence.py +0 -0
  675. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_overlap_predict.py +0 -0
  676. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_packaged_deploy_units.py +0 -0
  677. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_parentage.py +0 -0
  678. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_paste_landed.py +0 -0
  679. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_pipeline.py +0 -0
  680. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_plan_followup_approve_plan_command.py +0 -0
  681. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_plan_followup_pr_command.py +0 -0
  682. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_plan_followup_review_command.py +0 -0
  683. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_plan_only.py +0 -0
  684. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_plan_parser.py +0 -0
  685. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_platform_paths.py +0 -0
  686. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_portal_bridge.py +0 -0
  687. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_portal_config.py +0 -0
  688. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_portal_store.py +0 -0
  689. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_portal_sync.py +0 -0
  690. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_pr_body_lint.py +0 -0
  691. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_prereqs.py +0 -0
  692. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_production_db_guard.py +0 -0
  693. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_progress.py +0 -0
  694. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_provider_seam.py +0 -0
  695. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_providers.py +0 -0
  696. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_providers_config_labels.py +0 -0
  697. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_providers_pty.py +0 -0
  698. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_quiet_hours.py +0 -0
  699. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_quiet_hours_store_2146.py +0 -0
  700. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reap_merged_sessions.py +0 -0
  701. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reap_stale_interactive_tick.py +0 -0
  702. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile.py +0 -0
  703. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_branch.py +0 -0
  704. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_completions.py +0 -0
  705. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_merges.py +0 -0
  706. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_no_agent_record.py +0 -0
  707. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_tick.py +0 -0
  708. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reconcile_usage_limit_done.py +0 -0
  709. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_refine_chat.py +0 -0
  710. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_cordon_2101.py +0 -0
  711. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  712. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_cordon_deadlock_2240.py +0 -0
  713. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_cordon_stuck_2490.py +0 -0
  714. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_propagate.py +0 -0
  715. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_roll_window_handoff.py +0 -0
  716. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_unified_1242.py +0 -0
  717. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_verify.py +0 -0
  718. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_release_window.py +0 -0
  719. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_remote_auto_prune.py +0 -0
  720. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_remote_interactive_reaper.py +0 -0
  721. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_repo_edit_2220.py +0 -0
  722. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_repo_graph_fleet_2237.py +0 -0
  723. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_repo_onboard_2220.py +0 -0
  724. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_report_result_push.py +0 -0
  725. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_reports.py +0 -0
  726. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_retry.py +0 -0
  727. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_retry_advisory_1606.py +0 -0
  728. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_retry_type_1636.py +0 -0
  729. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_revalidate.py +0 -0
  730. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review.py +0 -0
  731. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_end_review_without_verdict.py +0 -0
  732. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_parse_failure_diagnostic.py +0 -0
  733. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_reaffirm.py +0 -0
  734. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_state.py +0 -0
  735. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_verdict_backstop.py +0 -0
  736. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_verdict_override_audit.py +0 -0
  737. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_verdict_relay.py +0 -0
  738. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_review_zero_commits.py +0 -0
  739. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_scoped_review_wiring.py +0 -0
  740. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_scorecard.py +0 -0
  741. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_self_health.py +0 -0
  742. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_serve.py +0 -0
  743. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_serve_app_board_trim.py +0 -0
  744. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_session.py +0 -0
  745. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_slice_issue_attribution.py +0 -0
  746. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_smoke.py +0 -0
  747. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_smoke_live_checkout_restore.py +0 -0
  748. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_smoke_workflow.py +0 -0
  749. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_spend_ceiling.py +0 -0
  750. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_spend_ceiling_coordinator.py +0 -0
  751. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_split.py +0 -0
  752. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_split_work.py +0 -0
  753. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_stage_projection.py +0 -0
  754. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_stalled_pipeline.py +0 -0
  755. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_state.py +0 -0
  756. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_state_review_findings_daemon.py +0 -0
  757. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_status_fleet_footer.py +0 -0
  758. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_stop_1567.py +0 -0
  759. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_stuck.py +0 -0
  760. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_terminal_command.py +0 -0
  761. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_author.py +0 -0
  762. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_chat.py +0 -0
  763. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_orchestrator.py +0 -0
  764. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_report.py +0 -0
  765. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_verdict_parsing.py +0 -0
  766. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_test_verdict_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_thin_client_board_audit.py +0 -0
  768. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_thin_client_config_load_1080.py +0 -0
  769. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_thin_client_daemon_routing_906.py +0 -0
  770. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_tmux_host.py +0 -0
  771. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_tmux_session.py +0 -0
  772. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_transcript_floor.py +0 -0
  773. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_usage.py +0 -0
  774. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_usage_limits.py +0 -0
  775. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_usage_rollup.py +0 -0
  776. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_venv_live_install_2121.py +0 -0
  777. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_version_single_source.py +0 -0
  778. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_watch.py +0 -0
  779. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  780. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worker_events.py +0 -0
  781. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worker_image_pin_sync.py +0 -0
  782. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worker_safety.py +0 -0
  783. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worker_test_scoping.py +0 -0
  784. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worktree.py +0 -0
  785. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  786. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/Cargo.lock +0 -0
  787. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/Cargo.toml +0 -0
  788. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/cargo-config-local-quadraui.toml.example +0 -0
  789. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/audit.rs +0 -0
  790. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/chat.rs +0 -0
  791. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/data.rs +0 -0
  792. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/doc_tabs.rs +0 -0
  793. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/drive.rs +0 -0
  794. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/drive_queue.rs +0 -0
  795. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/escalation.rs +0 -0
  796. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/fleet_health.rs +0 -0
  797. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/fleet_sessions.rs +0 -0
  798. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/fleet_terminals.rs +0 -0
  799. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/format.rs +0 -0
  800. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/milestone_dag.rs +0 -0
  801. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/msv.rs +0 -0
  802. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/pipeline.rs +0 -0
  803. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/plans.rs +0 -0
  804. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/render.rs +0 -0
  805. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/reports.rs +0 -0
  806. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/sessions.rs +0 -0
  807. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/terminal.rs +0 -0
  808. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/app/workspace.rs +0 -0
  809. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/bin/gtk.rs +0 -0
  810. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/commands.rs +0 -0
  811. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/lib.rs +0 -0
  812. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/main.rs +0 -0
  813. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/src/settings.rs +0 -0
  814. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/tests/acceptance.rs +0 -0
  815. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/tui/tests/cli.rs +0 -0
  816. {code_coordinator-0.5.236 → code_coordinator-0.5.238}/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.236
3
+ Version: 0.5.238
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.236
3
+ Version: 0.5.238
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
@@ -62,6 +62,7 @@ coord/conflict_fix.py
62
62
  coord/dao.py
63
63
  coord/db.py
64
64
  coord/dead_end.py
65
+ coord/decomposition_chat.py
65
66
  coord/deploy_manifest.py
66
67
  coord/deploy_units.py
67
68
  coord/deps.py
@@ -478,6 +479,7 @@ tests/test_dashboard_terminal.py
478
479
  tests/test_dashboard_terminal_live.py
479
480
  tests/test_db.py
480
481
  tests/test_dead_end.py
482
+ tests/test_decomposition_chat.py
481
483
  tests/test_deploy_coord_db_backup.py
482
484
  tests/test_deploy_coord_web_dist.py
483
485
  tests/test_deploy_coord_web_rollback.py
@@ -91,6 +91,7 @@
91
91
  "coord/dashboard/terminal.py",
92
92
  "coord/db.py",
93
93
  "coord/dead_end.py",
94
+ "coord/decomposition_chat.py",
94
95
  "coord/deploy/README.md",
95
96
  "coord/deploy/coord-agent.service",
96
97
  "coord/deploy/coord-db-backup.service",
@@ -550,6 +551,7 @@
550
551
  "tests/test_dashboard_terminal_live.py",
551
552
  "tests/test_db.py",
552
553
  "tests/test_dead_end.py",
554
+ "tests/test_decomposition_chat.py",
553
555
  "tests/test_deploy_coord_db_backup.py",
554
556
  "tests/test_deploy_coord_web_dist.py",
555
557
  "tests/test_deploy_coord_web_rollback.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.236",
2
+ "tag": "0.5.238",
3
3
  "distance": 0,
4
- "node": "g5110d914da8b0140bb620fbe356079028f405900",
4
+ "node": "g8d13a39e25627c1a4242ac04e7c279023d414a99",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-23"
@@ -3643,6 +3643,112 @@ MILESTONE_CHAT_DENY_COMMANDS: list[str] = [
3643
3643
  "Bash(coord assign *)",
3644
3644
  ]
3645
3645
 
3646
+ DECOMPOSITION_CHAT_SYSTEM_PROMPT = """\
3647
+ You are a decomposition steward for a customer's APPROVED portal submission \
3648
+ that an operator just pulled into this session from the TUI's "Approved \
3649
+ work items" panel (#2533, ms-67 contract §4). Unlike `milestone-chat` above \
3650
+ (which proposes and waits for confirmation before writing anything), this \
3651
+ session's WHOLE JOB is to actually decompose the submission into real \
3652
+ coordinator work — there is no separate confirm-then-write step here \
3653
+ because pulling the row into this session already IS the operator's \
3654
+ confirmation.
3655
+
3656
+ The first user message carries: the submission's OUTCOME, AUDIENCE, DONE \
3657
+ DEFINITION, and CONSTRAINTS (the four fields the customer described); its \
3658
+ mapped repo(s); and `coordinator.yml` topology context for those repo(s) \
3659
+ (depends_on, which machines claim each repo).
3660
+
3661
+ Your job, in order:
3662
+ 1. Decide whether this is ORACLE-LOOP-SHAPED work (docs/ORACLE_LOOP.md) — \
3663
+ big or cross-cutting enough to warrant a Gate-A contract + independent \
3664
+ test-author, or small enough to skip straight to normal dispatch. Discuss \
3665
+ this with the operator if it's not obvious; you don't need to wait for \
3666
+ explicit confirmation before filing, but flag your reasoning.
3667
+ 2. Produce one or more GitHub issues describing the work, using:
3668
+
3669
+ coord issue create <repo> --title '<title>' --body '<body>'
3670
+
3671
+ (or `--body-file` for long markdown — never raw `gh issue create`, this \
3672
+ repo's own house rule). If the decomposition is milestone-shaped, file an \
3673
+ epic/tracking issue first (`coord milestone create <repo> --title '<title>'`) \
3674
+ and file the sub-issues, then `coord milestone add-child <repo> <epic> \
3675
+ <issue>` each of them onto it.
3676
+ 3. Queue every filed issue via:
3677
+
3678
+ coord drive-queue add <repo> <issue>
3679
+
3680
+ — NEVER `coord assign` or `coord drive --tmux` (this repo's own standing \
3681
+ preference: always go through the drive queue, never ad-hoc dispatch).
3682
+ 4. Record the portal link so downstream tooling can find this submission's \
3683
+ work again (2026-08-22 briefing amendment — this is NOT optional):
3684
+
3685
+ coord portal link <repo> <milestone_number> <submission_id>
3686
+
3687
+ Use the SUBMISSION_ID from your first user message and the milestone \
3688
+ number `coord milestone create` printed. If `coord portal link` fails (bad \
3689
+ repo, bad milestone number, daemon-host guard), that is a FAILURE of this \
3690
+ step — say so explicitly to the operator, do not silently move on.
3691
+
3692
+ **If your decomposition produced a single one-off issue with no \
3693
+ milestone/epic** (not a milestone-shaped decomposition): `coord portal \
3694
+ link` has NO non-milestone form today — it requires a `milestone_number`, \
3695
+ which a one-off issue doesn't have. Do NOT invent one or skip the link \
3696
+ silently. Say so explicitly in your final summary to the operator (e.g. \
3697
+ "this submission has no recorded portal link — coord portal link only \
3698
+ covers milestones, and #2533's own dispatcher found no equivalent for a \
3699
+ one-off issue"), so the gap is visible rather than silently lost.
3700
+
3701
+ Rules:
3702
+ - Do NOT run raw `gh issue create`/`gh issue edit`/`gh pr *`/`gh api -X \
3703
+ POST|PATCH|DELETE` or any other mutating `gh` command — the write paths \
3704
+ above (`coord issue create`, `coord milestone create/add-child`, `coord \
3705
+ drive-queue add`, `coord portal link`) are the only ones you may use.
3706
+ - Do NOT run `coord assign <machine> <repo> <issue>` or `coord drive \
3707
+ --tmux` — always `coord drive-queue add`.
3708
+ - Do NOT run `coord approve` or `coord merge` — outside this session's job.
3709
+ - Do NOT run `git push`, `git commit`, or any command that writes to a repo \
3710
+ checkout — this session files issues and queues work, it does not touch code.
3711
+ - Keep the operator informed: summarize your decomposition plan before \
3712
+ filing, and report back what you filed/queued/linked (and any link gap) \
3713
+ when done.\
3714
+ """
3715
+
3716
+ # Deny list applied to decomposition-chat workers (#2533). Unlike
3717
+ # milestone-chat, this type's WHOLE job is to write (issue create /
3718
+ # milestone create+add-child / drive-queue add / portal link), so this list
3719
+ # is deliberately narrow — it blocks raw `gh` mutations, repo-write git
3720
+ # commands, destructive git ops, and the three unrelated `coord` write
3721
+ # commands (approve/merge/assign) explicitly out of scope, while every write
3722
+ # path this session actually needs (`coord issue create`, `coord milestone
3723
+ # create`/`add-child`, `coord drive-queue add`, `coord portal link`) is
3724
+ # allowed by omission.
3725
+ DECOMPOSITION_CHAT_DENY_COMMANDS: list[str] = [
3726
+ "Bash(gh issue edit *)",
3727
+ "Bash(gh issue create *)",
3728
+ "Bash(gh issue delete *)",
3729
+ "Bash(gh issue close *)",
3730
+ "Bash(gh api -X PATCH *)",
3731
+ "Bash(gh api -X POST *)",
3732
+ "Bash(gh api -X DELETE *)",
3733
+ "Bash(gh pr *)",
3734
+ "Bash(gh repo *)",
3735
+ "Bash(gh milestone *)",
3736
+ "Bash(git push *)",
3737
+ "Bash(git commit *)",
3738
+ "Bash(git reset --hard *)",
3739
+ "Bash(git reset * --hard *)",
3740
+ "Bash(git branch -D *)",
3741
+ "Bash(git branch * -D *)",
3742
+ "Bash(git checkout -- .)",
3743
+ "Bash(git clean -f *)",
3744
+ "Bash(git clean * -f *)",
3745
+ "Bash(rm -rf *)",
3746
+ "Bash(rm -fr *)",
3747
+ "Bash(coord approve *)",
3748
+ "Bash(coord merge *)",
3749
+ "Bash(coord assign *)",
3750
+ ]
3751
+
3646
3752
  MOCK_AUTHOR_SYSTEM_PROMPT = """\
3647
3753
  You are an independent mock-author agent for Gate A of a milestone \
3648
3754
  (#930, docs/ORACLE_LOOP.md) — the pre-work architecture gate. You have \
@@ -4238,6 +4344,20 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
4238
4344
  system_prompt = spec.system_prompt if spec.system_prompt else MILESTONE_CHAT_SYSTEM_PROMPT
4239
4345
  system_prompt += build_deny_prompt(MILESTONE_CHAT_DENY_COMMANDS)
4240
4346
  allowed_tools = "Read,Bash"
4347
+ elif spec.type == "decomposition-chat":
4348
+ # #2533 (ms-67 contract §4c): pull an approved portal submission
4349
+ # into a briefed session that decides oracle-loop-shaped-or-not,
4350
+ # files issue(s) via `coord issue create`, queues them via `coord
4351
+ # drive-queue add`, and records `coord portal link` — a mutating
4352
+ # chat type like milestone-chat above, with its own narrow deny
4353
+ # list (see DECOMPOSITION_CHAT_DENY_COMMANDS) rather than
4354
+ # new-issue-chat's blanket one, since this session's whole job is
4355
+ # to write via those specific `coord` commands.
4356
+ system_prompt = (
4357
+ spec.system_prompt if spec.system_prompt else DECOMPOSITION_CHAT_SYSTEM_PROMPT
4358
+ )
4359
+ system_prompt += build_deny_prompt(DECOMPOSITION_CHAT_DENY_COMMANDS)
4360
+ allowed_tools = "Read,Bash"
4241
4361
  elif spec.type == "mock-author":
4242
4362
  # #930 (docs/ORACLE_LOOP.md, Gate A): an independent mock-author
4243
4363
  # agent renders a viewable mock + writes `contract.md` under
@@ -4435,12 +4555,17 @@ def _user_message_line(text: str) -> bytes:
4435
4555
  # a non-closes-issue original (test-author/mock-author/...) — it gets a
4436
4556
  # worktree and runs `gh pr create`, the same GitHub-mutating shape as
4437
4557
  # `type="work"` had before #1142 gave it its own type, so it must stay here.
4558
+ # ``decomposition-chat`` (#2533) is a chat too — no git worktree — but its
4559
+ # whole job is to mutate GitHub (`coord issue create` / `coord milestone
4560
+ # create`/`add-child`) and the drive queue (`coord drive-queue add`), the
4561
+ # same "no worktree, but real mutation" shape ``milestone-chat`` has above.
4438
4562
  WRITE_CAPABLE_SPEC_TYPES: frozenset[str] = frozenset({
4439
4563
  "work",
4440
4564
  "review",
4441
4565
  "smoke",
4442
4566
  "conflict-fix",
4443
4567
  "milestone-chat",
4568
+ "decomposition-chat",
4444
4569
  "mock-author",
4445
4570
  "test-author",
4446
4571
  "pr-helper",
@@ -284,6 +284,56 @@ def portal_link(
284
284
  )
285
285
 
286
286
 
287
+ # ── #2533 (ms-67 PB-3): pull an approved submission into a decomposition chat ──
288
+
289
+
290
+ @portal_group.command("decompose-chat")
291
+ @_CONFIG_OPTION
292
+ @click.argument("submission_id")
293
+ @click.option(
294
+ "--machine",
295
+ "machine_override",
296
+ default=None,
297
+ help="Force a specific machine (must claim every repo the submission maps to).",
298
+ )
299
+ def portal_decompose_chat(config_path, submission_id: str, machine_override: str | None) -> None:
300
+ """Dispatch a ``type="decomposition-chat"`` session for SUBMISSION_ID (#2533).
301
+
302
+ The TUI's "Pull into decomposition session" action (ms-67 contract §4a/
303
+ §4c) shells this out, exactly the way `coord new-issue-chat` / `coord
304
+ milestone chat` already work — prints the new assignment id to stdout,
305
+ which the TUI binds a `ChatController` overlay to once it appears in the
306
+ board poll.
307
+
308
+ Briefs the session with SUBMISSION_ID's outcome / audience / done-
309
+ definition / constraints, its mapped repo(s), and `coordinator.yml`
310
+ topology context for those repo(s) (:mod:`coord.decomposition_chat`).
311
+ The session's own job — deciding whether the work is oracle-loop-shaped,
312
+ filing issue(s) via `coord issue create`, queueing them via `coord
313
+ drive-queue add`, and recording `coord portal link` — is described in its
314
+ system prompt (`coord.agent.DECOMPOSITION_CHAT_SYSTEM_PROMPT`), not here.
315
+
316
+ Reads through :func:`coord.approved_work.approved_submissions`, which
317
+ (like every other portal-bridge reader) resolves state out of this
318
+ machine's own ``~/.coord/coord.db`` — a daemon-host command, same as
319
+ ``link``/``publish-mocks`` above.
320
+ """
321
+ _refuse_if_thin_client("decompose-chat")
322
+
323
+ from coord.decomposition_chat import dispatch_decomposition_chat
324
+
325
+ cfg = _load_config(config_path)
326
+ try:
327
+ assignment_id, machine = dispatch_decomposition_chat(
328
+ submission_id, cfg, machine_override=machine_override
329
+ )
330
+ except RuntimeError as exc:
331
+ click.secho(f"error: {exc}", fg="red")
332
+ raise SystemExit(1) from exc
333
+ click.echo(assignment_id)
334
+ click.echo(f"# dispatched to {machine}", err=True)
335
+
336
+
287
337
  # ── #2513 (PDR-5): manual "publish mocks to portal" ─────────────────────────
288
338
 
289
339
 
@@ -69,10 +69,22 @@ def _open(path: Path) -> sqlite3.Connection:
69
69
  conn.execute("PRAGMA busy_timeout=5000")
70
70
  conn.execute("PRAGMA foreign_keys=ON")
71
71
  conn.row_factory = sqlite3.Row
72
- _ensure_schema(conn)
73
- _maybe_migrate_json(conn)
74
- _migrate_gate_order(conn)
75
- _backfill_orphaned_review_verdicts(conn)
72
+ # #2598: _ensure_schema/_maybe_migrate_json/_migrate_gate_order/
73
+ # _backfill_orphaned_review_verdicts are convergent one-time operations,
74
+ # not per-open invariants — but every one of them ran unconditionally on
75
+ # every process's DB open, so a read-only command (`coord status`) began
76
+ # a write transaction (and, for the unconstrained schema_version table,
77
+ # left a junk row behind — 45,708 of them observed in the field) purely
78
+ # to open a connection it only ever intended to read from. Gate the
79
+ # whole block on a cheap read-only version check: a database already at
80
+ # _DB_SCHEMA_VERSION does none of this work, so opening it issues no
81
+ # write at all. See _read_schema_version's docstring for why this read
82
+ # is correct against both the pre-#2598 and post-#2598 table shapes.
83
+ if _read_schema_version(conn) < _DB_SCHEMA_VERSION:
84
+ _ensure_schema(conn)
85
+ _maybe_migrate_json(conn)
86
+ _migrate_gate_order(conn)
87
+ _backfill_orphaned_review_verdicts(conn)
76
88
  return conn
77
89
 
78
90
 
@@ -143,13 +155,94 @@ def retry_on_locked(
143
155
 
144
156
  # ── Schema ────────────────────────────────────────────────────────────────────
145
157
 
158
+ # #2598: bumped from the original unversioned "1" written by every process
159
+ # forever. Read by _read_schema_version()/_open() as the target a database
160
+ # must reach before _open() can skip its write path entirely. Whoever adds
161
+ # the NEXT one-shot migration (another _migrate_* or _backfill_* function
162
+ # meant to run once per database, not once per process) must bump this too
163
+ # — otherwise an already-caught-up database (version == _DB_SCHEMA_VERSION)
164
+ # will never run it, because the whole write path is gated on this compare.
165
+ _DB_SCHEMA_VERSION = 2
166
+
167
+
168
+ def _read_schema_version(conn: sqlite3.Connection) -> int:
169
+ """Cheap, read-only probe of how caught-up *conn*'s database is (#2598).
170
+
171
+ A plain ``SELECT`` — never begins a write transaction, so calling this
172
+ to decide whether _open() needs to do any write work cannot itself take
173
+ the write lock.
174
+
175
+ Returns 0 when ``schema_version`` doesn't exist yet (brand-new database)
176
+ or is empty. Otherwise returns the highest stored value, which reads
177
+ correctly against *either* table shape: the pre-#2598 unconstrained
178
+ table (every row holds the same value, so MAX is that value — junk rows
179
+ don't change the answer) or the post-#2598 constrained table (exactly
180
+ one row). A pre-#2598 database therefore reads as version 1, which is
181
+ ``< _DB_SCHEMA_VERSION`` (2) — so it takes the write path exactly once
182
+ more, which is what collapses its schema_version duplicates and applies
183
+ the PRIMARY KEY (see _fix_schema_version_table). Every open after that
184
+ reads 2 and skips the write path entirely.
185
+ """
186
+ try:
187
+ row = conn.execute("SELECT MAX(version) FROM schema_version").fetchone()
188
+ except sqlite3.OperationalError:
189
+ return 0 # table doesn't exist yet
190
+ if row is None or row[0] is None:
191
+ return 0
192
+ return int(row[0])
193
+
194
+
195
+ def _fix_schema_version_table(conn: sqlite3.Connection) -> None:
196
+ """Collapse the pre-#2598 unconstrained ``schema_version`` table.
197
+
198
+ The original table declared no ``PRIMARY KEY``/``UNIQUE`` constraint, so
199
+ ``INSERT OR IGNORE INTO schema_version VALUES (1)`` — meant to be a
200
+ once-per-database no-op — actually succeeded on every single process
201
+ open, leaving one junk row per open (45,708 observed in the field).
202
+ This rebuilds the table with a real ``PRIMARY KEY`` on ``version`` so
203
+ that no longer happens, collapsing any existing duplicate rows down to
204
+ their distinct values in the process.
205
+
206
+ Safe to call against any existing shape: the old broken table (any
207
+ number of duplicate rows, no constraint), the new constrained table
208
+ (already migrated — a no-op), or no table at all (fresh database).
209
+ """
210
+ row = conn.execute(
211
+ "SELECT sql FROM sqlite_master WHERE type='table' AND name='schema_version'"
212
+ ).fetchone()
213
+ if row is not None and "PRIMARY KEY" in (row[0] or ""):
214
+ return # already the constrained post-#2598 shape
215
+ conn.executescript(
216
+ """
217
+ CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL);
218
+ CREATE TABLE schema_version_new (version INTEGER PRIMARY KEY);
219
+ INSERT OR IGNORE INTO schema_version_new
220
+ SELECT DISTINCT version FROM schema_version;
221
+ DROP TABLE schema_version;
222
+ ALTER TABLE schema_version_new RENAME TO schema_version;
223
+ """
224
+ )
225
+ conn.commit()
226
+
227
+
228
+ def _set_schema_version(conn: sqlite3.Connection, version: int) -> None:
229
+ """Overwrite ``schema_version`` with a single row holding *version*.
230
+
231
+ ``schema_version`` holds exactly one fact — how caught-up this database
232
+ is — so a version bump DELETEs the old row rather than accumulating one
233
+ row per version ever seen (which ``INSERT OR IGNORE``/``INSERT OR
234
+ REPLACE`` would do here, since they only dedupe on a *matching* primary
235
+ key, and a version bump's whole point is that the key changes).
236
+ """
237
+ conn.execute("DELETE FROM schema_version")
238
+ conn.execute("INSERT INTO schema_version (version) VALUES (?)", (version,))
239
+ conn.commit()
240
+
241
+
146
242
  def _ensure_schema(conn: sqlite3.Connection) -> None:
147
243
  """Create all tables and indexes if they don't already exist."""
244
+ _fix_schema_version_table(conn)
148
245
  conn.executescript("""
149
- CREATE TABLE IF NOT EXISTS schema_version (
150
- version INTEGER NOT NULL
151
- );
152
-
153
246
  CREATE TABLE IF NOT EXISTS assignments (
154
247
  assignment_id TEXT PRIMARY KEY,
155
248
  machine_name TEXT NOT NULL,
@@ -686,13 +779,12 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
686
779
  ON portal_outbox(state, submission_id, seq);
687
780
  CREATE INDEX IF NOT EXISTS idx_portal_events_submission
688
781
  ON portal_events(submission_id);
689
-
690
- INSERT OR IGNORE INTO schema_version VALUES (1);
691
782
  """)
692
783
  conn.commit()
693
784
  # Column-level migrations for existing databases. SQLite does not support
694
785
  # "ADD COLUMN IF NOT EXISTS", so we catch OperationalError instead.
695
786
  _migrate_add_columns(conn)
787
+ _set_schema_version(conn, _DB_SCHEMA_VERSION)
696
788
 
697
789
 
698
790
  def _migrate_add_columns(conn: sqlite3.Connection) -> None:
@@ -0,0 +1,260 @@
1
+ """#2533 (ms-67 contract §4c): dispatch a `type="decomposition-chat"` session
2
+ for "Pull into decomposition session" — the TUI action that turns an
3
+ Approved-work-items row (a signed-off portal submission) into a briefed
4
+ `claude -p` chat whose job is to decide whether the work is oracle-loop-shaped,
5
+ file the resulting GitHub issue(s) via `coord issue create`, and queue them via
6
+ `coord drive-queue add`.
7
+
8
+ Used by `coord portal decompose-chat <submission_id>` (the CLI command the
9
+ TUI shells out to, mirroring `coord new-issue-chat` / `coord milestone chat`
10
+ — see `coord/new_issue_chat.py` / `coord/milestone_dispatch.py` for the two
11
+ precedents this module follows).
12
+
13
+ **Reads through the existing bridge, never a new direct portal read**
14
+ (#2533's own briefing): the submission's four briefing fields (outcome /
15
+ audience / done-definition / constraints) plus its server-resolved mapped
16
+ repo(s) come from :func:`coord.approved_work.approved_submissions` — the same
17
+ function that already serves the TUI's `/board` `approved_submissions` block
18
+ (#2532) — rather than re-deriving them from `coord.portal_store` directly.
19
+
20
+ **Machine selection is generalized to every mapped repo** (contract §4c):
21
+ unlike :func:`coord.new_issue_chat.pick_new_issue_chat_machine` (one repo),
22
+ a submission can map to more than one repo, and the picked machine must be
23
+ able to work on ALL of them — a session that can only reach some of the
24
+ repos it's meant to decompose into is worse than refusing outright. §6.7
25
+ flags this as a genuinely open question the contract does not resolve beyond
26
+ "refuse clearly" — this module's refusal is a plain `RuntimeError`, same
27
+ posture every other dispatcher in this file already uses.
28
+ """
29
+ from __future__ import annotations
30
+
31
+ import time
32
+ import uuid
33
+ from typing import TYPE_CHECKING, Any
34
+
35
+ if TYPE_CHECKING: # pragma: no cover - typing only
36
+ from coord.config import Config
37
+ from coord.models import Machine
38
+
39
+ #: Sentinel `issue_title` this module writes onto the dispatched assignment
40
+ #: — mirrors `dispatch_new_issue_chat`'s own `"(new issue draft)"` sentinel
41
+ #: for a chat type with no real GitHub issue yet. The TUI's own bind path
42
+ #: (`tui/src/app/dialogs.rs::maybe_bind_pending_decomposition_chat`) matches
43
+ #: on this exact string (with the submission id substituted in) since
44
+ #: `Assignment` carries no `submission_id` column of its own — see that
45
+ #: function's doc comment for why this is the module's own choice, not
46
+ #: something #2533's contract pins.
47
+ def _issue_title(submission_id: str) -> str:
48
+ return f"decomposition: {submission_id}"
49
+
50
+
51
+ def pick_decomposition_chat_machine(cfg: "Config", repos: list[str]) -> "Machine | None":
52
+ """Pick a machine that can work on EVERY repo in *repos*.
53
+
54
+ Contract §4c: "the picked machine must list **all** of the submission's
55
+ mapped repos ... not just one." Returns the first unpaused machine
56
+ satisfying `m.can_work_on(r)` for every `r` in *repos*. `None` when
57
+ *repos* is empty (nothing to route) or no single machine covers them
58
+ all — callers must treat `None` as a hard refusal, never fall back to a
59
+ partial match.
60
+ """
61
+ from coord.machine_pause import paused_set
62
+
63
+ if not repos:
64
+ return None
65
+ paused = paused_set(cfg.machines)
66
+ for m in cfg.machines:
67
+ if m.name in paused:
68
+ continue
69
+ if all(m.can_work_on(r) for r in repos):
70
+ return m
71
+ return None
72
+
73
+
74
+ def _repo_topology_context(cfg: "Config", repos: list[str]) -> str:
75
+ """One paragraph of `coordinator.yml` topology per mapped repo — the
76
+ "coordinator.yml topology context ... the same way docs/CUSTOMER_PORTAL.md's
77
+ design-round step already uses it" #2533's own body asks for.
78
+
79
+ No design-round dispatcher exists yet to copy a wire shape from (flagged
80
+ in ms-67 contract.md §5's own notes as a proposal, not a read-off-the-
81
+ schema fact) — this is this module's own reasonable rendering: the
82
+ repo's GitHub slug, its `depends_on`, and which configured machines
83
+ claim it.
84
+ """
85
+ lines: list[str] = []
86
+ for repo_name in repos:
87
+ repo_cfg = cfg.repo(repo_name)
88
+ if repo_cfg is None:
89
+ lines.append(f"- {repo_name}: (not found in coordinator.yml — check the mapping)")
90
+ continue
91
+ machines = [m.name for m in cfg.machines if m.can_work_on(repo_name)]
92
+ depends = ", ".join(repo_cfg.depends_on) if repo_cfg.depends_on else "(none)"
93
+ lines.append(
94
+ f"- {repo_cfg.name} ({repo_cfg.github}): depends_on={depends}; "
95
+ f"machines={', '.join(machines) if machines else '(none configured)'}"
96
+ )
97
+ return "\n".join(lines) if lines else "(no mapped repos)"
98
+
99
+
100
+ def build_decomposition_chat_briefing(
101
+ *,
102
+ submission: dict[str, Any],
103
+ topology_context: str,
104
+ ) -> str:
105
+ """Compose the seed briefing the worker sees as its first user message.
106
+
107
+ Carries exactly the four submission fields #2533's own body names
108
+ (outcome / audience / done-definition / constraints) plus the mapped
109
+ repo(s) and `coordinator.yml` topology context — identical substance to
110
+ what the Approved-work-items detail pane already shows the operator
111
+ (ms-67 contract §4b: "nothing hidden between 'looks right in the panel'
112
+ and 'is what the session got'").
113
+ """
114
+ submission_id = submission.get("submission_id", "")
115
+ repos = submission.get("repos") or []
116
+ parts: list[str] = []
117
+ parts.append(f"=== Decomposition chat context for submission {submission_id} ===\n")
118
+ parts.append(f"Client: {submission.get('client', '')}")
119
+ parts.append(
120
+ f"Project: {submission.get('project_id', '')} ({submission.get('project_label', '')})"
121
+ )
122
+ parts.append("")
123
+ parts.append("OUTCOME:")
124
+ parts.append(submission.get("outcome", "") or "(none provided)")
125
+ parts.append("")
126
+ parts.append("AUDIENCE:")
127
+ parts.append(submission.get("audience", "") or "(none provided)")
128
+ parts.append("")
129
+ parts.append("DONE DEFINITION:")
130
+ parts.append(submission.get("done_definition", "") or "(none provided)")
131
+ parts.append("")
132
+ parts.append("CONSTRAINTS:")
133
+ parts.append(submission.get("constraints", "") or "(none provided)")
134
+ parts.append("")
135
+ parts.append(f"MAPPED REPO(S): {', '.join(repos) if repos else '(none)'}")
136
+ parts.append("")
137
+ parts.append("COORDINATOR.YML TOPOLOGY CONTEXT:")
138
+ parts.append(topology_context)
139
+ parts.append("")
140
+ parts.append("---")
141
+ parts.append(
142
+ "Decide whether this is oracle-loop-shaped work (docs/ORACLE_LOOP.md) "
143
+ "or small enough to skip straight to normal dispatch, then produce one "
144
+ "or more GitHub issues via `coord issue create` and queue them via "
145
+ "`coord drive-queue add`. Once queued, record the portal link via "
146
+ "`coord portal link` — see your system prompt for the exact command "
147
+ "and the one-off-issue caveat."
148
+ )
149
+ return "\n".join(parts)
150
+
151
+
152
+ def dispatch_decomposition_chat(
153
+ submission_id: str,
154
+ config: "Config",
155
+ *,
156
+ machine_override: str | None = None,
157
+ ) -> tuple[str, str]:
158
+ """End-to-end: look up *submission_id*, pick a machine, seed the
159
+ briefing, dispatch a ``type="decomposition-chat"`` assignment. Returns
160
+ ``(assignment_id, machine_name)``.
161
+
162
+ Raises ``RuntimeError`` when the submission isn't a currently-approved
163
+ one, has no mapped repo, no machine claims every mapped repo (or the
164
+ forced ``machine_override`` doesn't), or the agent rejects the dispatch.
165
+ """
166
+ from coord.approved_work import approved_submissions
167
+
168
+ rows = approved_submissions(config)
169
+ submission = next((r for r in rows if r.get("submission_id") == submission_id), None)
170
+ if submission is None:
171
+ raise RuntimeError(
172
+ f"submission {submission_id!r} is not a currently-approved portal "
173
+ "submission (coord.approved_work.approved_submissions) — nothing to decompose"
174
+ )
175
+
176
+ repos: list[str] = submission.get("repos") or []
177
+ if not repos:
178
+ raise RuntimeError(
179
+ f"submission {submission_id!r} has no mapped repo (portal.project_repos "
180
+ "in coordinator.yml) — map its project before pulling it into a "
181
+ "decomposition session"
182
+ )
183
+
184
+ if machine_override:
185
+ machine = next((m for m in config.machines if m.name == machine_override), None)
186
+ if machine is None:
187
+ raise RuntimeError(f"machine {machine_override!r} not in coordinator.yml")
188
+ missing = [r for r in repos if not machine.can_work_on(r)]
189
+ if missing:
190
+ raise RuntimeError(
191
+ f"machine {machine_override!r} does not list repo(s) "
192
+ f"{', '.join(missing)} — submission {submission_id!r} maps to "
193
+ f"{', '.join(repos)}, all of which the target machine must claim"
194
+ )
195
+ else:
196
+ picked = pick_decomposition_chat_machine(config, repos)
197
+ if picked is None:
198
+ raise RuntimeError(
199
+ f"no single machine claims every repo submission {submission_id!r} "
200
+ f"maps to ({', '.join(repos)}) — decomposition-chat refuses rather "
201
+ "than dispatching a session that can't reach all of them "
202
+ "(ms-67 contract §4c/§6.7)"
203
+ )
204
+ machine = picked
205
+
206
+ topology_context = _repo_topology_context(config, repos)
207
+ briefing = build_decomposition_chat_briefing(
208
+ submission=submission, topology_context=topology_context
209
+ )
210
+
211
+ resolved_model = config.models.default
212
+ from coord.models import Assignment, Proposal
213
+
214
+ proposal = Proposal(
215
+ id=0,
216
+ machine_name=machine.name,
217
+ repo_name=repos[0],
218
+ # No existing issue yet — same 0 sentinel `new-issue-chat` uses.
219
+ issue_number=0,
220
+ issue_title=_issue_title(submission_id),
221
+ rationale="decomposition-chat",
222
+ briefing=briefing,
223
+ model=resolved_model,
224
+ type="decomposition-chat",
225
+ required_gates=[],
226
+ )
227
+
228
+ from coord.dispatch import dispatch_with_retry
229
+ from coord.state import record_dispatched_assignment
230
+
231
+ response = dispatch_with_retry(
232
+ proposal,
233
+ config,
234
+ max_retries=config.concurrency.max_retries,
235
+ backoff_base=config.concurrency.backoff_base,
236
+ )
237
+
238
+ assignment_id = response.get("id") or uuid.uuid4().hex[:12]
239
+
240
+ repo_cfg = config.repo(repos[0])
241
+ asg = Assignment(
242
+ machine_name=machine.name,
243
+ repo_name=repos[0],
244
+ issue_number=0,
245
+ issue_title=_issue_title(submission_id),
246
+ files_allowed=[],
247
+ files_forbidden=[],
248
+ briefing=briefing,
249
+ assignment_id=assignment_id,
250
+ status="running",
251
+ dispatched_at=time.time(),
252
+ type="decomposition-chat",
253
+ model=resolved_model,
254
+ )
255
+ record_dispatched_assignment(
256
+ assignment=asg,
257
+ repo_github=repo_cfg.github if repo_cfg is not None else repos[0],
258
+ )
259
+
260
+ return assignment_id, machine.name