code-coordinator 0.5.326__tar.gz → 0.5.328__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 (822) hide show
  1. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent.py +30 -8
  5. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/portal.py +6 -3
  6. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dao.py +11 -1
  7. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/db.py +132 -1
  8. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/decomposition_chat.py +220 -0
  9. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/merge_queue.py +14 -2
  10. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/state.py +44 -7
  11. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dao.py +82 -0
  12. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_db.py +403 -33
  13. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_decomposition_chat.py +453 -0
  14. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_merge_queue.py +95 -0
  15. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_state.py +143 -0
  16. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/board.md +0 -0
  17. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/complete-session.md +0 -0
  18. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.claude/commands/coordinator.md +0 -0
  19. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/_lib.sh +0 -0
  20. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-checkout +0 -0
  21. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-commit +0 -0
  22. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.githooks/post-merge +0 -0
  23. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/coord-ci-acceptance.yml +0 -0
  25. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/.gitignore +0 -0
  29. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/GOAL.md +0 -0
  31. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/LICENSE +0 -0
  32. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/README.md +0 -0
  34. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/SOURCES.txt +0 -0
  35. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/scm_file_list.json +0 -0
  39. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/approved_work.py +0 -0
  50. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/audit.py +0 -0
  51. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/auto_loop.py +0 -0
  52. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/block_log.py +0 -0
  53. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_schema.py +0 -0
  54. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_fix.py +0 -0
  61. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_github.py +0 -0
  62. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_gitlab.py +0 -0
  63. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/ci_store.py +0 -0
  64. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/cli.py +0 -0
  66. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/client.py +0 -0
  67. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/machine.py +0 -0
  82. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/store_migrate.py +0 -0
  96. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/config.py +0 -0
  101. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/confirm_test.py +0 -0
  103. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/conflict_fix.py +0 -0
  104. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dead_end.py +0 -0
  110. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/README.md +0 -0
  111. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-agent.service +0 -0
  112. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.service +0 -0
  113. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.sh +0 -0
  114. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-db-backup.timer +0 -0
  115. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-drive-queue.service +0 -0
  116. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-drive-queue.timer +0 -0
  117. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-failure-notify.service +0 -0
  118. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-fleet-watchdog.service +0 -0
  119. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  120. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-notify.service +0 -0
  121. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-notify.timer +0 -0
  122. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-propagate.service +0 -0
  123. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-propagate.timer +0 -0
  124. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-window.service +0 -0
  125. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-release-window.timer +0 -0
  126. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-serve.service +0 -0
  127. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web-dist-build.service +0 -0
  128. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web-dist-build.timer +0 -0
  129. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy/coord-web.service +0 -0
  130. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy_manifest.py +0 -0
  131. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deploy_units.py +0 -0
  132. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deprecation_telemetry.py +0 -0
  133. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/deps.py +0 -0
  134. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/diagnose.py +0 -0
  135. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dispatch.py +0 -0
  136. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/dist_name.py +0 -0
  137. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive.py +0 -0
  138. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive_queue.py +0 -0
  139. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/drive_state.py +0 -0
  140. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/events.py +0 -0
  141. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/failure_class.py +0 -0
  142. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/filelock.py +0 -0
  143. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/fleet_config_health.py +0 -0
  144. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/forge_availability.py +0 -0
  145. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/freshness.py +0 -0
  146. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_a.py +0 -0
  147. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_b.py +0 -0
  148. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gate_snapshot.py +0 -0
  149. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/gates.py +0 -0
  150. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/github_ops.py +0 -0
  151. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/_ci_pin.py +0 -0
  158. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/agent_install.py +0 -0
  159. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/cargo_targets.py +0 -0
  160. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/claude_binary.py +0 -0
  161. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  162. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/coord_web_ci_pin.py +0 -0
  163. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/deploy_lane_facts.py +0 -0
  164. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/disk.py +0 -0
  165. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_board.py +0 -0
  166. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  167. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_phantom.py +0 -0
  168. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/fleet_unit_drift.py +0 -0
  169. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/graph.py +0 -0
  170. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/graphify_cli.py +0 -0
  171. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/index_lock.py +0 -0
  172. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/issues_sync_staleness.py +0 -0
  173. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/plan_usage.py +0 -0
  174. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/release_cordon.py +0 -0
  175. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/repo_state.py +0 -0
  176. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/spawned_coord.py +0 -0
  177. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/stalled_pipeline.py +0 -0
  178. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/timer_active.py +0 -0
  179. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/toolchain.py +0 -0
  180. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/unit_drift.py +0 -0
  181. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/unit_enablement.py +0 -0
  182. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/wedged_drive_queue.py +0 -0
  183. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/checks/worktrees.py +0 -0
  184. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/cli.py +0 -0
  185. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/context.py +0 -0
  186. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/fleet_snapshot.py +0 -0
  187. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/models.py +0 -0
  188. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/pypi.py +0 -0
  189. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/registry.py +0 -0
  190. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/render.py +0 -0
  191. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/health/units.py +0 -0
  192. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/hooks.py +0 -0
  193. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/housekeeping.py +0 -0
  194. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/interactive.py +0 -0
  195. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/issue_store.py +0 -0
  196. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/issues_sync_status.py +0 -0
  197. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/liveness_auditor.py +0 -0
  198. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/machine_onboard.py +0 -0
  199. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/machine_pause.py +0 -0
  200. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_chat.py +0 -0
  201. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_dispatch.py +0 -0
  202. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_gate.py +0 -0
  203. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/milestone_order.py +0 -0
  204. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/mock_author.py +0 -0
  205. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/models.py +0 -0
  206. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/network.py +0 -0
  207. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/new_issue_chat.py +0 -0
  208. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/__init__.py +0 -0
  209. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/baseline.py +0 -0
  210. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/cli.py +0 -0
  211. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/collect.py +0 -0
  212. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/digest.py +0 -0
  213. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/models.py +0 -0
  214. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/predicate.py +0 -0
  215. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/service.py +0 -0
  216. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/store.py +0 -0
  217. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notifier/transport.py +0 -0
  218. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/notify.py +0 -0
  219. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/openapi.py +0 -0
  220. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/overlap_fence.py +0 -0
  221. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/overlap_predict.py +0 -0
  222. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/parentage.py +0 -0
  223. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/parentage_github.py +0 -0
  224. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/pipeline.py +0 -0
  225. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/plan_parser.py +0 -0
  226. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/plans.py +0 -0
  227. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/platform_paths.py +0 -0
  228. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_bridge.py +0 -0
  229. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_store.py +0 -0
  230. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/portal_sync.py +0 -0
  231. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/pr_body_lint.py +0 -0
  232. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/prereqs.py +0 -0
  233. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/progress.py +0 -0
  234. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/__init__.py +0 -0
  235. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/base.py +0 -0
  236. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/claude.py +0 -0
  237. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/claude_pty.py +0 -0
  238. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/providers/opencode.py +0 -0
  239. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/queue_diagnose.py +0 -0
  240. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reconcile.py +0 -0
  241. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reconcile_tick.py +0 -0
  242. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/refine_chat.py +0 -0
  243. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_cordon.py +0 -0
  244. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_propagate.py +0 -0
  245. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_verify.py +0 -0
  246. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/release_window.py +0 -0
  247. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_dormancy.py +0 -0
  248. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_edit.py +0 -0
  249. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/repo_onboard.py +0 -0
  250. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/reports.py +0 -0
  251. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/rest_schema.py +0 -0
  252. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/revalidate.py +0 -0
  253. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/review.py +0 -0
  254. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/scorecard.py +0 -0
  255. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/self_health.py +0 -0
  256. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/serve_app.py +0 -0
  257. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  258. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  259. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  260. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  261. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  262. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/portal-followup/SKILL.md +0 -0
  263. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/release-now/SKILL.md +0 -0
  264. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  265. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  266. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/skills/update-issue/SKILL.md +0 -0
  267. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/smoke.py +0 -0
  268. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/spend_ceiling.py +0 -0
  269. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/split_work.py +0 -0
  270. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/sql.py +0 -0
  271. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/stage_projection.py +0 -0
  272. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/store_migrate.py +0 -0
  273. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_author.py +0 -0
  274. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_chat.py +0 -0
  275. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_orchestrator.py +0 -0
  276. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/test_report.py +0 -0
  277. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/tui_release.py +0 -0
  278. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage.py +0 -0
  279. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage_limits.py +0 -0
  280. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/usage_rollup.py +0 -0
  281. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coord/worker_events.py +0 -0
  282. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/coordinator.example.yml +0 -0
  283. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-agent.service +0 -0
  284. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.service +0 -0
  285. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.sh +0 -0
  286. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-db-backup.timer +0 -0
  287. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-drive-queue.service +0 -0
  288. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-drive-queue.timer +0 -0
  289. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-failure-notify.service +0 -0
  290. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-failure-notify.sh +0 -0
  291. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-fleet-watchdog.service +0 -0
  292. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-fleet-watchdog.timer +0 -0
  293. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-notify.service +0 -0
  294. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-notify.timer +0 -0
  295. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-propagate.service +0 -0
  296. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-propagate.timer +0 -0
  297. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-window.service +0 -0
  298. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-release-window.timer +0 -0
  299. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-serve.service +0 -0
  300. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.service +0 -0
  301. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.sh +0 -0
  302. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-dist-build.timer +0 -0
  303. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web-rollback.sh +0 -0
  304. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/coord-web.service +0 -0
  305. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/deploy/node-shim.sh +0 -0
  306. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_TUI_CI.md +0 -0
  307. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  308. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_CI.md +0 -0
  309. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_COORD_WEB_DIST.md +0 -0
  310. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  311. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/AGENT_OPERATIONS.md +0 -0
  312. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ARCHITECTURE.md +0 -0
  313. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ARCH_SECURITY_GATES.md +0 -0
  314. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/COCKPIT.md +0 -0
  315. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CONTROL_CENTER.md +0 -0
  316. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/COST_DISCIPLINE.md +0 -0
  317. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CROSS_PLATFORM.md +0 -0
  318. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CUSTOMER_FACING_APPS.md +0 -0
  319. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/CUSTOMER_PORTAL.md +0 -0
  320. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/DRIVE_QUEUE.md +0 -0
  321. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/EPHEMERAL_WORKERS.md +0 -0
  322. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/FORGE_MIGRATION.md +0 -0
  323. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/GRAPHIFY_SETUP.md +0 -0
  324. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ISSUE_GUIDANCE.md +0 -0
  325. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/MAC_MINI.md +0 -0
  326. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  327. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/NOTIFIER.md +0 -0
  328. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPENCODE_VERIFICATION.md +0 -0
  329. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPERATING_GOTCHAS.md +0 -0
  330. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/OPERATOR_GUIDES.md +0 -0
  331. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/ORACLE_LOOP.md +0 -0
  332. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PHONE_WEBAPP.md +0 -0
  333. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PIPELINE_V2.md +0 -0
  334. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/PLATFORM_EVOLUTION.md +0 -0
  335. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/SECOND_BACKEND.md +0 -0
  336. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/STORE_SERVICE.md +0 -0
  337. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  338. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/WEB_CONTROL_CENTER.md +0 -0
  339. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/WSL_WINDOWS_WORKER.md +0 -0
  340. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/README.md +0 -0
  341. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/_tokens.css +0 -0
  342. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/issue-detail.html +0 -0
  343. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/pipeline-narrow.html +0 -0
  344. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/docs/mocks/web/pipeline-wide.html +0 -0
  345. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/graphify-out/.gitignore +0 -0
  346. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/install-agent.sh +0 -0
  347. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/pyproject.toml +0 -0
  348. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/audit_review_verdict_overrides.py +0 -0
  349. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  350. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/build-worker-image.sh +0 -0
  351. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/coordinator-machine.py +0 -0
  352. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/epic-down.sh +0 -0
  353. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/epic-up.sh +0 -0
  354. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/preflight.sh +0 -0
  355. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/provision-worker.sh +0 -0
  356. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  357. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  358. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/azure-workers/verify-github-token.sh +0 -0
  359. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/check_gh_argv_containment.py +0 -0
  360. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/codegen.py +0 -0
  361. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-test-runner.sh +0 -0
  362. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  363. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  364. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  365. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  366. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/coord-venv-rollback.sh +0 -0
  367. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/drive-batch.sh +0 -0
  368. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/extract-coord-tui.sh +0 -0
  369. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/fleet_watchdog.py +0 -0
  370. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/gen_board_fixture.py +0 -0
  371. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/gen_mock_index.py +0 -0
  372. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/next_release_tag.py +0 -0
  373. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/run_tests_in_populated_home.sh +0 -0
  374. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/run_tests_without_gh.sh +0 -0
  375. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/smoke_437_interactive.py +0 -0
  376. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_878_review_capture.py +0 -0
  377. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_release_published.py +0 -0
  378. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/scripts/verify_release_wheel.py +0 -0
  379. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/setup.cfg +0 -0
  380. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/SMOKE_SET.md +0 -0
  381. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/__init__.py +0 -0
  382. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/conftest.py +0 -0
  383. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/contract.md +0 -0
  384. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/manifest.yml +0 -0
  385. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  386. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  387. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/contract.md +0 -0
  388. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  389. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  390. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/manifest.yml +0 -0
  391. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  392. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-51/tsconfig.json +0 -0
  393. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  394. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/backends.py +0 -0
  395. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/conftest.py +0 -0
  396. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/board-pipeline-basic.json +0 -0
  397. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  398. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  399. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  400. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  401. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/all_pass.json +0 -0
  402. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  403. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/mixed_fail.json +0 -0
  404. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  405. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  406. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/skip.json +0 -0
  407. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/playwright/truncated.json +0 -0
  408. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  409. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  410. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  411. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  412. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  413. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  414. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  415. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  416. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_acceptance.py +0 -0
  417. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_acceptance_drivers.py +0 -0
  418. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent.py +0 -0
  419. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_api_error.py +0 -0
  420. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_app.py +0 -0
  421. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_branch_base.py +0 -0
  422. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_branch_capture.py +0 -0
  423. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_config_free_1712.py +0 -0
  424. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_deploy_units_endpoint.py +0 -0
  425. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_dirty_worktree.py +0 -0
  426. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  427. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_graph_self_heal.py +0 -0
  428. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_health_h3.py +0 -0
  429. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_idle_restart.py +0 -0
  430. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_push_failure.py +0 -0
  431. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_reap.py +0 -0
  432. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_repos_and_pull.py +0 -0
  433. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_restart_services_endpoint.py +0 -0
  434. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_skills_self_heal.py +0 -0
  435. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_startup_diagnostics.py +0 -0
  436. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_update.py +0 -0
  437. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_update_bluegreen.py +0 -0
  438. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_usage_limit.py +0 -0
  439. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_agent_zero_commit.py +0 -0
  440. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ambient_home_isolation.py +0 -0
  441. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_dependency_busy_2804.py +0 -0
  442. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_reject_plan.py +0 -0
  443. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approve_usage_gate.py +0 -0
  444. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approved_work_2532.py +0 -0
  445. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_approved_work_2996.py +0 -0
  446. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_assignment_already_recorded_daemon.py +0 -0
  447. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_log.py +0 -0
  448. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_outcome.py +0 -0
  449. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_audit_query.py +0 -0
  450. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_auto_loop.py +0 -0
  451. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_auto_release_publish_2035.py +0 -0
  452. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_backend_selection.py +0 -0
  453. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_base_checkout_restore.py +0 -0
  454. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_block_log.py +0 -0
  455. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_cap_762.py +0 -0
  456. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_fixture.py +0 -0
  457. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_read_path.py +0 -0
  458. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_schema.py +0 -0
  459. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_service.py +0 -0
  460. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_state.py +0 -0
  461. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_board_wire.py +0 -0
  462. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_brain.py +0 -0
  463. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_branch_model.py +0 -0
  464. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_bug_intake.py +0 -0
  465. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_build_worker_image_env_update.py +0 -0
  466. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cargo_cache.py +0 -0
  467. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_check_gh_argv_containment.py +0 -0
  468. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_acceptance_gate_1950.py +0 -0
  469. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_fix.py +0 -0
  470. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_gitlab.py +0 -0
  471. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_parity_2091.py +0 -0
  472. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_ci_store.py +0 -0
  473. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_claim.py +0 -0
  474. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_claude_md_budget.py +0 -0
  475. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_acceptance.py +0 -0
  476. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign.py +0 -0
  477. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  478. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_interactive_remote.py +0 -0
  479. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_provider.py +0 -0
  480. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  481. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_audit.py +0 -0
  482. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_chat_continue.py +0 -0
  483. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_decide.py +0 -0
  484. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_capability_rules.py +0 -0
  485. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_config_provenance.py +0 -0
  486. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_forge_availability.py +0 -0
  487. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_graph.py +0 -0
  488. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_self.py +0 -0
  489. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_diagnose_test_coverage.py +0 -0
  490. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor.py +0 -0
  491. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor_config_free_1801.py +0 -0
  492. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  493. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_drive.py +0 -0
  494. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_drive_queue.py +0 -0
  495. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_escalate.py +0 -0
  496. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_fix_headless_review.py +0 -0
  497. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_gate_a.py +0 -0
  498. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_install_drift.py +0 -0
  499. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_install_skills.py +0 -0
  500. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_comment.py +0 -0
  501. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_create_label.py +0 -0
  502. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_reopen.py +0 -0
  503. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_issue_view_list.py +0 -0
  504. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_merge.py +0 -0
  505. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_assign.py +0 -0
  506. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_capture.py +0 -0
  507. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_chat_add_child.py +0 -0
  508. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_dispatch.py +0 -0
  509. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_gate_b.py +0 -0
  510. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_gate_c.py +0 -0
  511. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_order.py +0 -0
  512. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  513. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_milestone_ship.py +0 -0
  514. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_network.py +0 -0
  515. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_new_issue_chat.py +0 -0
  516. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_plans.py +0 -0
  517. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_portal.py +0 -0
  518. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_pr.py +0 -0
  519. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_pull_artifact.py +0 -0
  520. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_queue.py +0 -0
  521. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_reattach_sessions.py +0 -0
  522. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_refine_board.py +0 -0
  523. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_preflight.py +0 -0
  524. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_propagate.py +0 -0
  525. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_release_window.py +0 -0
  526. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_repo_2220.py +0 -0
  527. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  528. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_scorecard.py +0 -0
  529. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_set_review_findings.py +0 -0
  530. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_advisory_terminal.py +0 -0
  531. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_contested_tag.py +0 -0
  532. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_merge_queue.py +0 -0
  533. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_provider.py +0 -0
  534. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_review_finalizing.py +0 -0
  535. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_test_failed_tag.py +0 -0
  536. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_status_usage_limit.py +0 -0
  537. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_sync_comments_873.py +0 -0
  538. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_test_plan.py +0 -0
  539. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_track.py +0 -0
  540. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_tui_update.py +0 -0
  541. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cli_wait.py +0 -0
  542. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_client_base_install.py +0 -0
  543. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_client_resource_migration_1946.py +0 -0
  544. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_commands_common.py +0 -0
  545. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_comments.py +0 -0
  546. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_completion_summary.py +0 -0
  547. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config.py +0 -0
  548. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_acceptance.py +0 -0
  549. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_audit.py +0 -0
  550. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_pricing.py +0 -0
  551. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  552. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_config_usage_gate.py +0 -0
  553. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_confirm_test.py +0 -0
  554. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_conflict_fix.py +0 -0
  555. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_conflict_fix_semantic.py +0 -0
  556. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  557. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test.py +0 -0
  558. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  559. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_baseline.py +0 -0
  560. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_populated_home.py +0 -0
  561. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_routing.py +0 -0
  562. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_test_runner_toolchain.py +0 -0
  563. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_uat.py +0 -0
  564. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coord_web_sse_restart_live.py +0 -0
  565. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_coordinator_machine.py +0 -0
  566. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_cross_platform_imports.py +0 -0
  567. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard.py +0 -0
  568. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_api.py +0 -0
  569. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_fixture.py +0 -0
  570. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_terminal.py +0 -0
  571. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dashboard_terminal_live.py +0 -0
  572. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dead_end.py +0 -0
  573. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_db_backup.py +0 -0
  574. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_web_dist.py +0 -0
  575. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_coord_web_rollback.py +0 -0
  576. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_drive_queue_unit.py +0 -0
  577. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_failure_notify_unit.py +0 -0
  578. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_manifest.py +0 -0
  579. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_notify_unit.py +0 -0
  580. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_units_lane.py +0 -0
  581. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deploy_web_unit.py +0 -0
  582. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deprecation_telemetry.py +0 -0
  583. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_deps.py +0 -0
  584. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_diagnose.py +0 -0
  585. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dispatch.py +0 -0
  586. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dispatch_target_validation.py +0 -0
  587. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_dist_name.py +0 -0
  588. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_done_housekeeping.py +0 -0
  589. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive.py +0 -0
  590. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue.py +0 -0
  591. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_blocked_rendering.py +0 -0
  592. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_launch_argv.py +0 -0
  593. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  594. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_roll_pending.py +0 -0
  595. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  596. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_state.py +0 -0
  597. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_drive_tmux.py +0 -0
  598. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_capability_detection.py +0 -0
  599. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  600. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_epic_up_image_provenance.py +0 -0
  601. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_errors.py +0 -0
  602. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_events.py +0 -0
  603. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_failure_class.py +0 -0
  604. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_filelock.py +0 -0
  605. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  606. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fix_of_force_override.py +0 -0
  607. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_config_health.py +0 -0
  608. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_health_probes.py +0 -0
  609. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_health_snapshot.py +0 -0
  610. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_fleet_watchdog.py +0 -0
  611. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_forge_availability.py +0 -0
  612. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_freshness.py +0 -0
  613. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_a.py +0 -0
  614. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_b.py +0 -0
  615. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gate_snapshot_staleness.py +0 -0
  616. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gates.py +0 -0
  617. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  618. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_gen_mock_index.py +0 -0
  619. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_rust_fixture.py +0 -0
  620. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_rust_requests.py +0 -0
  621. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_generated_types_fixture.py +0 -0
  622. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_github_ops.py +0 -0
  623. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_github_throttle.py +0 -0
  624. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_goal.py +0 -0
  625. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_graph_health.py +0 -0
  626. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_graph_selfheal_absent_2237.py +0 -0
  627. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_handoff.py +0 -0
  628. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_checks.py +0 -0
  629. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_cli.py +0 -0
  630. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_cli_graph.py +0 -0
  631. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_config.py +0 -0
  632. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_context.py +0 -0
  633. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_coord_tui_ci_pin.py +0 -0
  634. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_coord_web_ci_pin.py +0 -0
  635. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_deploy_lane_facts.py +0 -0
  636. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_fix.py +0 -0
  637. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_incident_regression.py +0 -0
  638. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_issues_sync_staleness.py +0 -0
  639. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_pypi.py +0 -0
  640. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_registry.py +0 -0
  641. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_release_cordon_probe.py +0 -0
  642. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_timer_active.py +0 -0
  643. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_toolchain.py +0 -0
  644. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_unit_drift.py +0 -0
  645. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_unit_enablement.py +0 -0
  646. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_health_wedged_drive_queue.py +0 -0
  647. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_hooks.py +0 -0
  648. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_human_attended_437.py +0 -0
  649. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_init.py +0 -0
  650. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_install_agent_venv_2911.py +0 -0
  651. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_pane_log_2541.py +0 -0
  654. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_prefill_state.py +0 -0
  655. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_session_relaunch.py +0 -0
  656. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_test_verdict_backstop.py +0 -0
  657. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_token_attribution.py +0 -0
  658. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_interactive_worktree.py +0 -0
  659. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_issue_store_seam.py +0 -0
  660. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_issues_sync_status.py +0 -0
  661. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_liveness_auditor.py +0 -0
  662. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_liveness_notify.py +0 -0
  663. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_lock_contention_ratchet.py +0 -0
  664. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_machine_onboard.py +0 -0
  665. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_machine_pause.py +0 -0
  666. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_overlap_predict.py +0 -0
  696. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_packaged_deploy_units.py +0 -0
  697. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_parentage.py +0 -0
  698. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_paste_landed.py +0 -0
  699. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  700. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_store.py +0 -0
  710. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_portal_sync.py +0 -0
  711. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_pr_body_lint.py +0 -0
  712. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_prereqs.py +0 -0
  713. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_production_db_guard.py +0 -0
  714. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_progress.py +0 -0
  715. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_provider_seam.py +0 -0
  716. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers.py +0 -0
  717. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers_config_labels.py +0 -0
  718. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_providers_pty.py +0 -0
  719. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_py_rust_mirror_inventory.py +0 -0
  720. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile.py +0 -0
  725. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_branch.py +0 -0
  726. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_completions.py +0 -0
  727. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  728. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_no_agent_record.py +0 -0
  730. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_tick.py +0 -0
  731. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_cordon_stuck_2490.py +0 -0
  737. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_propagate.py +0 -0
  738. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_propagate_threshold.py +0 -0
  739. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_roll_between_legs_2854.py +0 -0
  740. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_roll_window_handoff.py +0 -0
  741. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_unified_1242.py +0 -0
  742. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_verify.py +0 -0
  743. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_release_window.py +0 -0
  744. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_remote_auto_prune.py +0 -0
  745. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_remote_interactive_reaper.py +0 -0
  746. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_add.py +0 -0
  747. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_dormancy.py +0 -0
  748. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_self_health.py +0 -0
  769. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve.py +0 -0
  770. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve_app_board_trim.py +0 -0
  771. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_serve_rest_routes.py +0 -0
  772. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_session.py +0 -0
  773. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_slice_issue_attribution.py +0 -0
  774. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke.py +0 -0
  775. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke_live_checkout_restore.py +0 -0
  776. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_smoke_workflow.py +0 -0
  777. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_spend_ceiling.py +0 -0
  778. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_spend_ceiling_coordinator.py +0 -0
  779. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_split.py +0 -0
  780. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_split_work.py +0 -0
  781. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_sql_dialect.py +0 -0
  782. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_sqlite_connect_ratchet.py +0 -0
  783. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stage_projection.py +0 -0
  784. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stale_busy_reviewer_697.py +0 -0
  785. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stalled_pipeline.py +0 -0
  786. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_state_review_findings_daemon.py +0 -0
  787. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_status_fleet_footer.py +0 -0
  788. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stop_1567.py +0 -0
  789. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_store_contract.py +0 -0
  790. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_store_migrate.py +0 -0
  791. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stuck.py +0 -0
  792. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  793. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_text_io_encoding_audit.py +0 -0
  801. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_board_audit.py +0 -0
  802. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_config_load_1080.py +0 -0
  803. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_thin_client_daemon_routing_906.py +0 -0
  804. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_tmux_host.py +0 -0
  805. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_tmux_session.py +0 -0
  806. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage.py +0 -0
  808. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage_limits.py +0 -0
  809. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_usage_rollup.py +0 -0
  810. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_venv_live_install_2121.py +0 -0
  811. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_version_single_source.py +0 -0
  812. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_watch.py +0 -0
  813. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  814. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_env_venv_isolation.py +0 -0
  815. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/test_write_parity.py +0 -0
  822. {code_coordinator-0.5.326 → code_coordinator-0.5.328}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.326
3
+ Version: 0.5.328
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.326
3
+ Version: 0.5.328
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,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.326",
2
+ "tag": "0.5.328",
3
3
  "distance": 0,
4
- "node": "g4f5acb0a5caf92650d4867c894085c97109eebc7",
4
+ "node": "g96977c771489f05d7c30eb4cc2696206c872072b",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-31"
@@ -4027,14 +4027,36 @@ response (a session that silently chose to file instead of asking is \
4027
4027
  exactly the failure this design exists to prevent); the submission's \
4028
4028
  OUTCOME, AUDIENCE, DONE DEFINITION, and CONSTRAINTS; its mapped repo(s); \
4029
4029
  `coordinator.yml` topology context for those repo(s) (depends_on, which \
4030
- machines claim each repo); and a RUNNING CONTEXT section rendering the \
4031
- submission's full ledger so far — every question asked and (if answered) \
4032
- its answer, every decision on record (current and archived, archived ones \
4033
- carrying WHY they were ruled out), and the current narrative. Read \
4034
- RUNNING CONTEXT before doing anything else: never re-ask a question already \
4035
- answered there, and never re-propose a decision already archived there \
4036
- without new information that changes the calculus — cite the existing \
4037
- entry's seq/reason if the operator or a re-briefed fact brings it up again.
4030
+ machines claim each repo); a HOUSE STACK section (#2997) naming what the \
4031
+ REST of this org's registered repos already run and deploy on, which \
4032
+ managed services are already in use and already paid for, and any coord \
4033
+ gate that assumes a particular host; and a RUNNING CONTEXT section \
4034
+ rendering the submission's full ledger so far — every question asked and \
4035
+ (if answered) its answer, every decision on record (current and archived, \
4036
+ archived ones carrying WHY they were ruled out), and the current \
4037
+ narrative. Read RUNNING CONTEXT before doing anything else: never re-ask a \
4038
+ question already answered there, and never re-propose a decision already \
4039
+ archived there without new information that changes the calculus — cite \
4040
+ the existing entry's seq/reason if the operator or a re-briefed fact \
4041
+ brings it up again.
4042
+
4043
+ **HOUSE STACK is context, not a mandate** — you may still propose \
4044
+ something outside it when it genuinely fits better (a greenfield repo is \
4045
+ not required to inherit the fleet's stack). But you may never propose a \
4046
+ stack/architecture/hosting/vendor decision in SILENCE about it: if HOUSE \
4047
+ STACK names a service that's a plausible fit and you're proposing \
4048
+ something else, you MUST record the house-stack option itself as a \
4049
+ considered-and-rejected alternative (`coord portal decision propose` \
4050
+ naming it, then `coord portal decision reject ... "<why it loses>"`) in \
4051
+ the SAME iteration you propose your own recommendation — the same \
4052
+ "record every alternative you seriously considered and ruled OUT" rule the \
4053
+ PROPOSE terminal move already requires below applies to the house stack \
4054
+ first, not last. The failure this closes (#2997, SUB-1EA1D3) was a session \
4055
+ proposing a brand-new vendor for a greenfield repo with FOUR rejected \
4056
+ alternatives on record and Cloudflare — the stack the rest of the org \
4057
+ already runs and pays for — never mentioned in any of them. Silence, not \
4058
+ disagreement, was the bug; a reasoned rejection is a completely fine \
4059
+ outcome.
4038
4060
 
4039
4061
  You can always re-fetch the live ledger mid-session with:
4040
4062
 
@@ -731,6 +731,7 @@ def _run_decompose_chat_interactive(
731
731
  build_decomposition_chat_briefing,
732
732
  describe_unapproved_submission,
733
733
  fetch_running_context,
734
+ house_stack_context,
734
735
  render_running_context_section,
735
736
  repo_topology_context,
736
737
  resolve_approved_submission,
@@ -794,6 +795,7 @@ def _run_decompose_chat_interactive(
794
795
  # that the Ask move would "refuse loudly" — no longer true.
795
796
 
796
797
  topology_context = repo_topology_context(cfg, repos)
798
+ house_stack = house_stack_context(cfg, exclude_repos=repos)
797
799
  discuss_mode, discuss_reason = select_discuss_mode(cfg, submission, discuss_override=discuss)
798
800
  running_context = render_running_context_section(fetch_running_context(submission_id))
799
801
  briefing = build_decomposition_chat_briefing(
@@ -802,6 +804,7 @@ def _run_decompose_chat_interactive(
802
804
  discuss=discuss_mode,
803
805
  discuss_reason=discuss_reason,
804
806
  running_context_section=running_context,
807
+ house_stack_context_section=house_stack,
805
808
  )
806
809
 
807
810
  repo_path = str(_Path(machine.repo_path(repos[0]) or str(_Path.cwd())).expanduser())
@@ -819,9 +822,9 @@ def _run_decompose_chat_interactive(
819
822
  seed_prompt = (
820
823
  f"Intake session for portal submission {submission_id} "
821
824
  f"(MODE: {mode_word} — {discuss_reason}): read the full context at "
822
- f"{brief_path} (submission fields, repo topology, and the running-"
823
- "context ledger so far) and let's work through it. This is an "
824
- "ATTENDED session: state your read and your PROPOSED exit, then stop "
825
+ f"{brief_path} (submission fields, repo topology, the house stack, "
826
+ "and the running-context ledger so far) and let's work through it. "
827
+ "This is an ATTENDED session: state your read and your PROPOSED exit, then stop "
825
828
  "and wait for me — write nothing until I answer (#2867)."
826
829
  )
827
830
 
@@ -393,6 +393,15 @@ class SqliteStore:
393
393
  forward-compatible stand-in the issue asks for (#1039 can replace the
394
394
  semantics without a wire-shape change — it's still one integer).
395
395
  Fail-open to 0 so a missing/pre-migration table never 503s the board.
396
+
397
+ #2983: that fail-open needs a rollback to actually be fail-open on
398
+ Postgres. This runs inside a caller's ``with closing(self._connect())``
399
+ block alongside many other reads (``_board_meta``, ``_round_number``,
400
+ every ``_table`` call in ``board_projection``), and Postgres aborts the
401
+ whole transaction on a failed statement — so a missing ``audit_log``
402
+ took out every *sibling* read on that connection too, producing
403
+ precisely the 503 this guard exists to prevent. Nothing uncommitted
404
+ can be lost: ``SqliteStore``'s connections are opened read-only.
396
405
  """
397
406
  try:
398
407
  cutoff = time.time() - _AUDIT_RECENT_WINDOW_SECONDS
@@ -400,7 +409,8 @@ class SqliteStore:
400
409
  conn, "SELECT COUNT(*) AS n FROM audit_log WHERE ts >= ?", (cutoff,)
401
410
  ).fetchone()
402
411
  return int(row["n"]) if row else 0
403
- except sql.driver_error(conn):
412
+ except sql.driver_error(conn) as exc:
413
+ db_mod.rollback_after_driver_error(conn, exc) # #2983: caller reuses `conn`
404
414
  return 0
405
415
 
406
416
  # ── public reads ────────────────────────────────────────────────────────────
@@ -429,6 +429,79 @@ def close() -> None:
429
429
 
430
430
  _T = TypeVar("_T")
431
431
 
432
+
433
+ # ── Recovering a connection after a swallowed driver error (#2983) ──────────
434
+
435
+
436
+ def _board_connection_if_open() -> Any | None:
437
+ """This process's already-open board connection, or ``None`` (#2983).
438
+
439
+ Deliberately NOT :func:`get_connection`: this is called from inside a
440
+ driver-error handler, where *opening* a connection that wasn't open
441
+ before would be a surprising side effect (and, on the SQLite path,
442
+ would create the database file). It only ever hands back a connection
443
+ something else already opened — the ``override_connection()``/SQLite
444
+ singleton, else THIS thread's Postgres connection, mirroring
445
+ :func:`get_connection`'s own precedence order.
446
+ """
447
+ if _conn is not None:
448
+ return _conn
449
+ return getattr(_pg_thread_local, "conn", None)
450
+
451
+
452
+ def rollback_after_driver_error(conn: Any | None, exc: BaseException) -> None:
453
+ """Clear the aborted transaction *exc* left behind on *conn*, so a
454
+ handler that swallowed *exc* and keeps using the same connection still
455
+ has a usable one (#2983).
456
+
457
+ **The rule this implements.** After catching a driver error through the
458
+ dialect seam (``except sql.driver_error(conn):`` /
459
+ ``except sql.driver_errors():``), a handler that intends to CONTINUE on
460
+ the same connection must roll back first. A handler that re-raises need
461
+ not. Postgres aborts the *whole* transaction on any failed statement,
462
+ so without this every statement issued afterwards on that connection —
463
+ for the rest of the process, since ``coord.db``'s connection is a
464
+ process-/thread-lived singleton — raises
465
+ ``psycopg.errors.InFailedSqlTransaction``. That is what made the whole
466
+ #2597/#2689/#2784 degrade-gracefully layer inert or actively harmful on
467
+ the second backend: guards written to *prevent* a crash caused one.
468
+ SQLite has no such concept — a failed statement there leaves the
469
+ connection perfectly usable — which is exactly why every one of these
470
+ 21 handler sites read as correct for years.
471
+
472
+ **Gated on the exception, not on the connection's dialect.** *exc* is a
473
+ Postgres driver error iff it carries a SQLSTATE (``psycopg3``'s
474
+ ``.sqlstate``, ``psycopg2``'s ``.pgcode`` — the same pair
475
+ :func:`is_lock_contention_error` dispatches on, for the same #2719
476
+ reason: no config flag, no driver import). Keying off that rather than
477
+ ``sql.detect_dialect(conn)`` makes "SQLite behaviour is byte-identical
478
+ to before #2983" true *by construction* rather than by argument: a
479
+ ``sqlite3.Error`` has no SQLSTATE, so this returns without touching the
480
+ connection and no SQLite caller can lose uncommitted work it expected
481
+ to survive into the next statement (``retry_on_locked``'s multi-
482
+ statement writers being the case where that would actually be
483
+ observable). #2982's sibling fix in ``_migrate_add_columns`` predates
484
+ this helper and rolls back unconditionally; it is correct there (the
485
+ only uncommitted statement at that point is the one that just failed)
486
+ and is deliberately left as-is.
487
+
488
+ A ``None`` *conn* is a no-op — see :func:`_board_connection_if_open`,
489
+ which may legitimately have nothing to hand over. A failure of the
490
+ rollback itself is suppressed: this runs inside an ``except`` block
491
+ whose original exception is the interesting one, and masking it with a
492
+ secondary error from the recovery attempt would be strictly worse than
493
+ leaving the connection unrecovered.
494
+ """
495
+ if conn is None:
496
+ return
497
+ if getattr(exc, "sqlstate", None) is None and getattr(exc, "pgcode", None) is None:
498
+ return # not a Postgres driver error — nothing was aborted
499
+ try:
500
+ conn.rollback()
501
+ except Exception: # noqa: BLE001 — never mask the caught driver error
502
+ pass
503
+
504
+
432
505
  # #2538: a handful of consecutive short retries — long enough to ride out a
433
506
  # concurrent writer (the daemon's own passive tick, another `coord merge`/
434
507
  # `coord notify` invocation) that only holds the DB for a moment, short
@@ -517,6 +590,7 @@ def is_lock_contention_error(exc: BaseException) -> bool:
517
590
  def retry_on_locked(
518
591
  write: Callable[[], _T],
519
592
  *,
593
+ conn: Any | None = None,
520
594
  attempts: int = _LOCK_RETRY_ATTEMPTS,
521
595
  base_delay: float = _LOCK_RETRY_BASE_DELAY_S,
522
596
  ) -> _T:
@@ -547,12 +621,58 @@ def retry_on_locked(
547
621
  ``coord.state._record_dispatched_assignment_local``, whose caller —
548
622
  ``coord.auto_loop._dispatch_fix`` — treats it as a declined dispatch
549
623
  rather than letting it crash the whole run).
624
+
625
+ Transaction recovery, and whether "retry" means anything on Postgres
626
+ (#2983)
627
+ ------------------------------------------------------------------
628
+ SQLite's ``SQLITE_BUSY`` retry model is "the statement never ran; the
629
+ lock is held elsewhere; the transaction is untouched" — so re-running
630
+ *write* verbatim is exactly the right move, and has been since #2538.
631
+ Postgres's three contention SQLSTATEs
632
+ (:data:`_POSTGRES_LOCK_CONTENTION_SQLSTATES`) are contention-shaped in
633
+ the same way, but they ALSO abort the whole transaction. That makes the
634
+ retry loop *worse than useless* on Postgres without recovery: attempt 2
635
+ onwards raises ``InFailedSqlTransaction`` instead of re-attempting the
636
+ write, ``is_lock_contention_error`` reads False for it, and the loop
637
+ bails out on attempt 2 re-raising the wrong error — the #2597/#2689
638
+ retry budget silently reduced to a single attempt.
639
+
640
+ So the answer to "does SQLite's retry model have a Postgres analogue at
641
+ all, or should the retry just be a no-op there?" is: it has one, and it
642
+ is the standard Postgres idiom — **roll back, then re-run the whole
643
+ transaction.** Every *write* callable in this tree is already a
644
+ self-contained transaction (its own statements followed by its own
645
+ ``conn.commit()``), which is precisely what makes re-running it after a
646
+ rollback correct rather than a partial replay. Hence
647
+ :func:`rollback_after_driver_error` before both the retry and the final
648
+ re-raise: after the re-raise the connection must still be usable too,
649
+ because ~13 of this tree's callers catch that exception and *swallow*
650
+ it (a cache mirror whose upstream GitHub write already landed must not
651
+ turn into a 503), then keep using the same singleton connection.
652
+ Recovering here rather than in each of those handlers is what keeps the
653
+ guarantee in one place: **when this function returns OR raises, it has
654
+ not left an aborted transaction behind.**
655
+
656
+ *conn* is the connection *write* writes through, needed only for that
657
+ rollback. It defaults to :func:`_board_connection_if_open` because
658
+ every call site in this tree writes through ``get_connection()``
659
+ (``coord.state``, ``coord.merge_queue``, ``coord.audit``,
660
+ ``coord.commands.merge``), so the default is correct for all of them
661
+ and none had to be churned; pass it explicitly if you ever write
662
+ through a different connection. Rolling back an innocent already-
663
+ committed connection would be a no-op anyway — every writer here
664
+ commits immediately — and the rollback is skipped entirely unless the
665
+ caught exception carries a Postgres SQLSTATE, so the SQLite path is
666
+ byte-identical to before #2983.
550
667
  """
551
668
  delay = base_delay
552
669
  for attempt in range(1, attempts + 1):
553
670
  try:
554
671
  return write()
555
672
  except sql.driver_errors() as exc:
673
+ rollback_after_driver_error(
674
+ conn if conn is not None else _board_connection_if_open(), exc
675
+ )
556
676
  if not is_lock_contention_error(exc) or attempt >= attempts:
557
677
  raise
558
678
  time.sleep(delay)
@@ -619,10 +739,21 @@ def _read_schema_version(conn: sqlite3.Connection) -> int:
619
739
  the current ``_DB_SCHEMA_VERSION`` and skips the write path entirely —
620
740
  until the next bump (#2675: that skip is exactly what silently dropped
621
741
  two `_migrate_add_columns` entries when they landed without one).
742
+
743
+ #2983: the "table doesn't exist yet" swallow below needs its own
744
+ rollback — #2982's fix is one layer downstream and does not cover this.
745
+ On a fresh Postgres database this is the FIRST statement `_open_postgres`
746
+ -> `_migrate_if_needed` runs, it errors (`UndefinedTable`), and that
747
+ aborts the transaction; the caller then continues on the same connection
748
+ straight into `_fix_schema_version_table`'s `CREATE TABLE IF NOT
749
+ EXISTS`, which raises `InFailedSqlTransaction`. So on Postgres the
750
+ brand-new-database path — the one case this guard exists for — could
751
+ never get past its own first statement.
622
752
  """
623
753
  try:
624
754
  row = sql.execute(conn, "SELECT MAX(version) FROM schema_version").fetchone()
625
- except sql.driver_errors(): # #2784: was sqlite3.OperationalError only
755
+ except sql.driver_errors() as exc: # #2784: was sqlite3.OperationalError only
756
+ rollback_after_driver_error(conn, exc) # #2983: caller keeps using `conn`
626
757
  return 0 # table doesn't exist yet
627
758
  if row is None or row[0] is None:
628
759
  return 0
@@ -409,6 +409,209 @@ def pick_decomposition_chat_machine(cfg: "Config", repos: list[str]) -> "Machine
409
409
  return None
410
410
 
411
411
 
412
+ # ── #2997: HOUSE STACK — the fleet's existing stack, not just this
413
+ # submission's mapped repo(s). See the module briefing (SUB-1EA1D3, the
414
+ # grocery-list submission) for why this section exists: a MODE: DISCUSS
415
+ # iteration proposed Vite+React+Supabase for a greenfield repo without ever
416
+ # weighing Cloudflare — the stack every other repo in this org already runs
417
+ # and pays for — because nothing in the briefing carried it. This section is
418
+ # CONTEXT, not a mandate (the design sketch's own framing): a session may
419
+ # still propose something else, but the system prompt (coord/agent.py) is
420
+ # what requires it to then record the house alternative as a
421
+ # considered-and-rejected decision rather than staying silent about it.
422
+
423
+ #: Root-level marker file -> the stack signal its mere presence implies.
424
+ #: Deliberately mechanical and small, same posture as `_SEEDED_ROOT_FILES`
425
+ #: above: cheap to check, cheap to extend, wrong at worst by omission (a
426
+ #: repo using something unlisted here just contributes nothing) never by a
427
+ #: false positive.
428
+ _ROOT_STACK_MARKERS: dict[str, str] = {
429
+ "wrangler.toml": "Cloudflare Workers/Pages (wrangler.toml)",
430
+ "Cargo.toml": "Rust (Cargo.toml)",
431
+ "package.json": "Node/TypeScript (package.json)",
432
+ "pyproject.toml": "Python (pyproject.toml)",
433
+ }
434
+
435
+ #: Same idea, scoped to `.github/workflows/` — a deploy LANE is a workflow
436
+ #: file, not a root marker.
437
+ _WORKFLOW_STACK_MARKERS: dict[str, str] = {
438
+ "deploy-cloudflare.yml": "Cloudflare Pages deploy (.github/workflows/deploy-cloudflare.yml)",
439
+ }
440
+
441
+ #: `wrangler.toml` binding keys -> the managed Cloudflare service they name
442
+ #: (Cloudflare's own `wrangler.toml` schema) — read only when the file is
443
+ #: actually present, so this never guesses at a service that isn't wired up.
444
+ _WRANGLER_BINDING_MARKERS: dict[str, str] = {
445
+ "d1_databases": "Cloudflare D1 (bound in wrangler.toml)",
446
+ "r2_buckets": "Cloudflare R2 (bound in wrangler.toml)",
447
+ "kv_namespaces": "Cloudflare KV (bound in wrangler.toml)",
448
+ }
449
+
450
+ #: Keywords worth a mention when they show up in a repo's own `CLAUDE.md` —
451
+ #: the design sketch's "cheapest read from each repo's own CLAUDE.md" half,
452
+ #: for a lane that leaves no marker file at all (e.g. Cloudflare Access,
453
+ #: which is edge config, never a repo artifact — coord-portal's own
454
+ #: `docs/CUSTOMER_PORTAL.md` names it in prose, not in a file this module
455
+ #: could otherwise detect). Casefolded substring match: a false positive
456
+ #: here only adds one extra weighed line, never a wrong guess about what
457
+ #: exists, since the word is genuinely present in the repo's own docs.
458
+ _CLAUDE_MD_KEYWORD_MARKERS: dict[str, str] = {
459
+ "cloudflare access": "Cloudflare Access (mentioned in CLAUDE.md)",
460
+ "cloudflare pages": "Cloudflare Pages (mentioned in CLAUDE.md)",
461
+ "cloudflare d1": "Cloudflare D1 (mentioned in CLAUDE.md)",
462
+ "cloudflare r2": "Cloudflare R2 (mentioned in CLAUDE.md)",
463
+ }
464
+
465
+
466
+ def _repo_stack_signals(repo_github: str, branch: str) -> list[str]:
467
+ """Mechanical, best-effort stack signals for *repo_github* on *branch* —
468
+ root-level marker files, known deploy-workflow files under
469
+ `.github/workflows/`, and (when `wrangler.toml` is present) the managed
470
+ Cloudflare services it binds.
471
+
472
+ **Degrades gracefully** (#2997 acceptance criterion): any lookup
473
+ failure, or a repo with nothing recognisable, returns `[]` rather than a
474
+ guess — this feeds an informational briefing section, not a gate, so
475
+ silence is always the safe failure mode.
476
+
477
+ "Any lookup failure" is meant literally, hence the deliberately broad
478
+ ``except Exception`` guards below rather than the narrow
479
+ ``RuntimeError``/``ValueError`` pair an earlier revision used. The
480
+ Contents-API seam this walks is not exception-typed end to end:
481
+ ``github_ops.list_repo_dir`` indexes ``entry["name"]`` on whatever JSON
482
+ came back (``KeyError``/``TypeError`` on a malformed or
483
+ unexpectedly-shaped payload), and ``_gh`` itself is a subprocess
484
+ boundary that a caller lower in the stack can surface as ``OSError``.
485
+ None of those are worth turning an *informational* paragraph into a
486
+ hard failure of ``coord portal decompose-chat`` for — a crash here
487
+ costs the operator the whole intake session, while a swallowed lookup
488
+ costs one unweighed line.
489
+ """
490
+ from coord import github_ops # noqa: PLC0415
491
+
492
+ try:
493
+ root_files, root_dirs = _dir_entries(repo_github, "", branch)
494
+ except Exception: # noqa: BLE001 - informational section, never a gate
495
+ return []
496
+
497
+ signals = [label for marker, label in _ROOT_STACK_MARKERS.items() if marker in root_files]
498
+
499
+ def _file_text(path: str) -> str:
500
+ """*path*'s contents on *branch*, or ``""`` on any lookup failure."""
501
+ try:
502
+ text = github_ops.get_repo_file(repo_github, path, branch)
503
+ # `isinstance` rather than a bare return: a Contents-API payload
504
+ # that decodes to something other than text must not turn a
505
+ # substring probe below into a `TypeError`.
506
+ return text if isinstance(text, str) else ""
507
+ except Exception: # noqa: BLE001 - see the docstring
508
+ # Covers `binascii.Error` (a ValueError subclass) from
509
+ # `get_repo_file_with_sha`'s `base64.b64decode` on a malformed
510
+ # Contents-API response, `GhError` from the subprocess boundary,
511
+ # and anything else the seam can surface: this feeds an
512
+ # informational section, not a gate, so a failed read degrades
513
+ # to "no signal" rather than blowing up the briefing build.
514
+ return ""
515
+
516
+ def _entries(path: str) -> tuple[list[str], list[str]]:
517
+ """``(files, dirs)`` under *path*, or ``([], [])`` on any failure."""
518
+ try:
519
+ return _dir_entries(repo_github, path, branch)
520
+ except Exception: # noqa: BLE001 - see the docstring
521
+ return [], []
522
+
523
+ if "wrangler.toml" in root_files:
524
+ wrangler_text = _file_text("wrangler.toml")
525
+ signals += [
526
+ label for key, label in _WRANGLER_BINDING_MARKERS.items() if key in wrangler_text
527
+ ]
528
+
529
+ if "CLAUDE.md" in root_files:
530
+ claude_md_text = _file_text("CLAUDE.md").casefold()
531
+ signals += [
532
+ label for key, label in _CLAUDE_MD_KEYWORD_MARKERS.items() if key in claude_md_text
533
+ ]
534
+
535
+ if ".github" in root_dirs:
536
+ _, gh_dirs = _entries(".github")
537
+ if "workflows" in gh_dirs:
538
+ wf_files, _ = _entries(".github/workflows")
539
+ signals += [
540
+ label for marker, label in _WORKFLOW_STACK_MARKERS.items() if marker in wf_files
541
+ ]
542
+
543
+ return signals
544
+
545
+
546
+ def house_stack_context(cfg: "Config", exclude_repos: list[str] | None = None) -> str:
547
+ """Render the HOUSE STACK briefing section: what the *rest* of the
548
+ fleet's repos already run and deploy on, derived mechanically from each
549
+ registered repo's tracked files rather than hand-maintained (the design
550
+ sketch's own preference — a hand-maintained approved-stack list rots and
551
+ suppresses the reasoning the decision archive exists to capture).
552
+
553
+ *exclude_repos* is normally the submission's own mapped repo(s) — the
554
+ one(s) actually being decomposed, which say nothing about "the REST of
555
+ the fleet" even when they aren't greenfield.
556
+
557
+ A repo that contributes no recognisable signal (no CLAUDE.md, no known
558
+ marker file, no known workflow file) is omitted from the per-repo list
559
+ entirely — #2997's "degrades gracefully" criterion: nothing beats a
560
+ wrong guess. When *no* repo in the fleet contributes anything, the whole
561
+ section reads as empty rather than asserting a managed-services list or
562
+ a host-coupled gate that nothing here actually evidences.
563
+
564
+ One sick repo never costs the operator the whole intake session: each
565
+ repo's probe is isolated, so a lookup that blows up for `acme/api`
566
+ still leaves `acme/coord-portal`'s Cloudflare signal in the rendered
567
+ section. This section is built on the critical path of *every*
568
+ `coord portal decompose-chat` (headless and `--interactive` alike) —
569
+ an informational paragraph must never be able to abort a dispatch.
570
+ """
571
+ exclude = set(exclude_repos or [])
572
+ per_repo: list[str] = []
573
+ saw_cloudflare = False
574
+ for repo_cfg in cfg.repos:
575
+ if repo_cfg.name in exclude:
576
+ continue
577
+ branch = repo_cfg.default_branch or "main"
578
+ try:
579
+ signals = _repo_stack_signals(repo_cfg.github, branch)
580
+ except Exception: # noqa: BLE001 - one repo must not sink the section
581
+ continue
582
+ if not signals:
583
+ continue
584
+ per_repo.append(f"- {repo_cfg.name} ({repo_cfg.github}): {'; '.join(signals)}")
585
+ if any("Cloudflare" in s for s in signals):
586
+ saw_cloudflare = True
587
+
588
+ if not per_repo:
589
+ return (
590
+ "HOUSE STACK (fleet-wide, #2997): no recognisable stack/deploy signal on any "
591
+ "other registered repo — nothing to weigh here."
592
+ )
593
+
594
+ lines = [
595
+ "HOUSE STACK (fleet-wide, not just this submission's mapped repo(s) — #2997):",
596
+ *per_repo,
597
+ "",
598
+ "This is CONTEXT, not a mandate: propose something else if it genuinely fits "
599
+ "better, but if you do, record the house-stack alternative as a "
600
+ "considered-and-rejected decision with a reason (`coord portal decision propose` "
601
+ "then `coord portal decision reject ... \"<why the house stack loses>\"`) instead "
602
+ "of leaving it unweighed.",
603
+ ]
604
+ if saw_cloudflare:
605
+ lines.append("")
606
+ lines.append(
607
+ "Gate that assumes a host: `coord portal enqueue-preview` reads a Cloudflare "
608
+ "Pages PREVIEW deployment URL created per-PR by `cloudflare/pages-action` "
609
+ "(docs/CUSTOMER_PORTAL.md) — choosing a different host means the #2359 "
610
+ "customer preview-approval gate does not apply without new coord work."
611
+ )
612
+ return "\n".join(lines)
613
+
614
+
412
615
  def repo_topology_context(cfg: "Config", repos: list[str]) -> str:
413
616
  """One paragraph of `coordinator.yml` topology per mapped repo — the
414
617
  "coordinator.yml topology context ... the same way docs/CUSTOMER_PORTAL.md's
@@ -442,6 +645,7 @@ def build_decomposition_chat_briefing(
442
645
  discuss: bool,
443
646
  discuss_reason: str,
444
647
  running_context_section: str = "",
648
+ house_stack_context_section: str = "",
445
649
  ) -> str:
446
650
  """Compose the seed briefing the worker sees as its first user message.
447
651
 
@@ -454,6 +658,15 @@ def build_decomposition_chat_briefing(
454
658
  pane already shows the operator (ms-67 contract §4b: "nothing hidden
455
659
  between 'looks right in the panel' and 'is what the session got'"),
456
660
  plus everything #2749's ledger has accumulated across prior iterations.
661
+
662
+ **#2997:** also carries a HOUSE STACK section (*house_stack_context_section*,
663
+ normally :func:`house_stack_context`'s output) — the fleet's existing
664
+ stack and infrastructure conventions, which used to be entirely absent
665
+ from this briefing. That gap is what let a MODE: DISCUSS iteration on a
666
+ greenfield repo propose a brand-new vendor (Supabase) without ever
667
+ weighing the Cloudflare stack the rest of this org already runs and
668
+ pays for (SUB-1EA1D3, this issue's own measured regression case). Empty
669
+ by default so every existing caller/test keeps working unchanged.
457
670
  """
458
671
  submission_id = submission.get("submission_id", "")
459
672
  repos = submission.get("repos") or []
@@ -484,6 +697,11 @@ def build_decomposition_chat_briefing(
484
697
  parts.append("COORDINATOR.YML TOPOLOGY CONTEXT:")
485
698
  parts.append(topology_context)
486
699
  parts.append("")
700
+ parts.append(
701
+ house_stack_context_section.strip()
702
+ or "HOUSE STACK (fleet-wide, #2997): (not computed for this briefing)"
703
+ )
704
+ parts.append("")
487
705
  parts.append(
488
706
  running_context_section.strip()
489
707
  or "RUNNING CONTEXT (from the portal ledger): (none yet — first iteration)"
@@ -677,6 +895,7 @@ def dispatch_decomposition_chat(
677
895
  machine = picked
678
896
 
679
897
  topology_context = repo_topology_context(config, repos)
898
+ house_stack = house_stack_context(config, exclude_repos=repos)
680
899
  discuss_mode, discuss_reason = select_discuss_mode(
681
900
  config, submission, discuss_override=discuss
682
901
  )
@@ -687,6 +906,7 @@ def dispatch_decomposition_chat(
687
906
  discuss=discuss_mode,
688
907
  discuss_reason=discuss_reason,
689
908
  running_context_section=running_context,
909
+ house_stack_context_section=house_stack,
690
910
  )
691
911
 
692
912
  resolved_model = config.models.default
@@ -42,7 +42,7 @@ from coord.ci_store import (
42
42
  summarize,
43
43
  summarize_counts,
44
44
  )
45
- from coord.db import get_connection, retry_on_locked
45
+ from coord.db import get_connection, retry_on_locked, rollback_after_driver_error
46
46
  from coord.forge_availability import MERGE_GATE_REFUSAL_KINDS, record_merge_gate_refusal
47
47
  from coord.models import (
48
48
  CLOSES_ISSUE_TYPES,
@@ -3812,11 +3812,23 @@ def _archived_merged_issue_keys(conn: sqlite3.Connection) -> set[tuple[str, int]
3812
3812
  "SELECT repo_name, issue_number FROM merge_queue_archive WHERE state = ?",
3813
3813
  (MERGED,),
3814
3814
  ).fetchall()
3815
- except sql.driver_errors(): # #2784: not just sqlite3.OperationalError
3815
+ except sql.driver_errors() as exc: # #2784: not just sqlite3.OperationalError
3816
3816
  # "no such table" surfaces as a *different* driver-named exception
3817
3817
  # per backend (sqlite3.OperationalError vs psycopg.errors.
3818
3818
  # UndefinedTable), so this must go through the dialect seam or the
3819
3819
  # not-yet-archived case becomes an uncaught crash on Postgres.
3820
+ #
3821
+ # #2983: and catching it is only half the job. `conn` here is the
3822
+ # process-lived `get_connection()` singleton, which the caller
3823
+ # (`merged_issue_keys`, and in turn `enqueue_approved_work` /
3824
+ # `staging_items`) keeps writing and reading through long after this
3825
+ # returns — on Postgres the swallowed UndefinedTable aborts that
3826
+ # connection's transaction, so the "archive doesn't exist yet"
3827
+ # degrade turned every subsequent statement into
3828
+ # InFailedSqlTransaction. Nothing uncommitted is at risk: this
3829
+ # function only reads, and on Postgres the abort had already
3830
+ # discarded anything pending regardless.
3831
+ rollback_after_driver_error(conn, exc)
3820
3832
  return set()
3821
3833
  return {(r["repo_name"], r["issue_number"]) for r in rows}
3822
3834