code-coordinator 0.5.247__tar.gz → 0.5.250__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 (866) hide show
  1. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agent.py +5 -1
  5. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/github_ops.py +111 -5
  6. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/providers/claude_pty.py +31 -0
  7. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/reports.py +34 -10
  8. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/review.py +8 -36
  9. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reports.py +54 -9
  10. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review.py +84 -1
  11. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/fixtures.rs +13 -1
  12. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/mod.rs +9 -6
  13. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/workflows/release-tui.yml +0 -0
  26. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/.gitignore +0 -0
  28. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/GOAL.md +0 -0
  30. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/LICENSE +0 -0
  31. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/README.md +0 -0
  33. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/SOURCES.txt +0 -0
  34. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/scm_file_list.json +0 -0
  38. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agent_app.py +0 -0
  44. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/approved_work.py +0 -0
  49. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/board_bool_guard.py +0 -0
  53. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/board_schema.py +0 -0
  54. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/ci_fix.py +0 -0
  61. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/ci_github.py +0 -0
  62. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/ci_gitlab.py +0 -0
  63. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/ci_store.py +0 -0
  64. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/cli.py +0 -0
  66. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/client.py +0 -0
  67. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/__init__.py +0 -0
  68. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/_common.py +0 -0
  69. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/acceptance.py +0 -0
  70. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/agent_ops.py +0 -0
  71. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/audit.py +0 -0
  72. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/drive.py +0 -0
  76. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/drive_queue.py +0 -0
  77. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/merge.py +0 -0
  82. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/milestone.py +0 -0
  83. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/plan_followup.py +0 -0
  84. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/plans.py +0 -0
  85. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/portal.py +0 -0
  86. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/pr.py +0 -0
  87. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/repo.py +0 -0
  89. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/report.py +0 -0
  90. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/review.py +0 -0
  91. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/scorecard.py +0 -0
  92. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/sessions.py +0 -0
  93. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/setup.py +0 -0
  94. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/status.py +0 -0
  95. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/terminal.py +0 -0
  96. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/test_gate.py +0 -0
  97. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/commands/tui.py +0 -0
  98. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/comments.py +0 -0
  99. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/config.py +0 -0
  100. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/config_reload.py +0 -0
  101. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/confirm_test.py +0 -0
  102. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/db.py +0 -0
  110. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dead_end.py +0 -0
  111. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/decomposition_chat.py +0 -0
  112. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/README.md +0 -0
  113. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-agent.service +0 -0
  114. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-db-backup.service +0 -0
  115. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-db-backup.sh +0 -0
  116. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-db-backup.timer +0 -0
  117. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-drive-queue.service +0 -0
  118. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-drive-queue.timer +0 -0
  119. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-failure-notify.service +0 -0
  120. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-fleet-watchdog.service +0 -0
  121. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  122. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-notify.service +0 -0
  123. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-notify.timer +0 -0
  124. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-release-propagate.service +0 -0
  125. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-release-propagate.timer +0 -0
  126. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-release-window.service +0 -0
  127. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-release-window.timer +0 -0
  128. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-serve.service +0 -0
  129. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-web-dist-build.service +0 -0
  130. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-web-dist-build.timer +0 -0
  131. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy/coord-web.service +0 -0
  132. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy_manifest.py +0 -0
  133. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deploy_units.py +0 -0
  134. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/deps.py +0 -0
  135. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/diagnose.py +0 -0
  136. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dispatch.py +0 -0
  137. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/dist_name.py +0 -0
  138. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/drive.py +0 -0
  139. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/drive_queue.py +0 -0
  140. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/drive_state.py +0 -0
  141. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/events.py +0 -0
  142. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/failure_class.py +0 -0
  143. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/filelock.py +0 -0
  144. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/fleet_config_health.py +0 -0
  145. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/forge_availability.py +0 -0
  146. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/freshness.py +0 -0
  147. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/gate_a.py +0 -0
  148. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/gate_b.py +0 -0
  149. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/gate_snapshot.py +0 -0
  150. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/gates.py +0 -0
  151. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/github_throttle.py +0 -0
  152. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/goal.py +0 -0
  153. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/graph_health.py +0 -0
  154. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/__init__.py +0 -0
  155. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/aggregate.py +0 -0
  156. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/__init__.py +0 -0
  157. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/agent_install.py +0 -0
  158. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/cargo_targets.py +0 -0
  159. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/claude_binary.py +0 -0
  160. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/coord_web_ci_pin.py +0 -0
  161. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/deploy_lane_facts.py +0 -0
  162. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/disk.py +0 -0
  163. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/fleet_board.py +0 -0
  164. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  165. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/fleet_phantom.py +0 -0
  166. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/fleet_unit_drift.py +0 -0
  167. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/graph.py +0 -0
  168. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/graphify_cli.py +0 -0
  169. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/index_lock.py +0 -0
  170. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/plan_usage.py +0 -0
  171. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/release_cordon.py +0 -0
  172. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/repo_state.py +0 -0
  173. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/spawned_coord.py +0 -0
  174. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/stalled_pipeline.py +0 -0
  175. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/timer_active.py +0 -0
  176. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/toolchain.py +0 -0
  177. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/unit_drift.py +0 -0
  178. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/unit_enablement.py +0 -0
  179. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/checks/worktrees.py +0 -0
  180. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/cli.py +0 -0
  181. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/context.py +0 -0
  182. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/fleet_snapshot.py +0 -0
  183. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/models.py +0 -0
  184. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/pypi.py +0 -0
  185. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/registry.py +0 -0
  186. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/render.py +0 -0
  187. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/health/units.py +0 -0
  188. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/hooks.py +0 -0
  189. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/housekeeping.py +0 -0
  190. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/interactive.py +0 -0
  191. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/issue_store.py +0 -0
  192. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/liveness_auditor.py +0 -0
  193. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/models.py +0 -0
  201. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/network.py +0 -0
  202. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/new_issue_chat.py +0 -0
  203. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/__init__.py +0 -0
  204. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/baseline.py +0 -0
  205. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/cli.py +0 -0
  206. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/collect.py +0 -0
  207. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/digest.py +0 -0
  208. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/models.py +0 -0
  209. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/predicate.py +0 -0
  210. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/service.py +0 -0
  211. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/store.py +0 -0
  212. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notifier/transport.py +0 -0
  213. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/notify.py +0 -0
  214. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/openapi.py +0 -0
  215. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/overlap_fence.py +0 -0
  216. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/overlap_predict.py +0 -0
  217. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/parentage.py +0 -0
  218. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/parentage_github.py +0 -0
  219. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/pipeline.py +0 -0
  220. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/plan_parser.py +0 -0
  221. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/plans.py +0 -0
  222. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/platform_paths.py +0 -0
  223. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/portal_bridge.py +0 -0
  224. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/portal_store.py +0 -0
  225. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/portal_sync.py +0 -0
  226. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/pr_body_lint.py +0 -0
  227. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/prereqs.py +0 -0
  228. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/providers/opencode.py +0 -0
  233. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/queue_diagnose.py +0 -0
  234. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/reconcile.py +0 -0
  235. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/reconcile_tick.py +0 -0
  236. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/refine_chat.py +0 -0
  237. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/release_cordon.py +0 -0
  238. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/release_propagate.py +0 -0
  239. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/release_verify.py +0 -0
  240. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/release_window.py +0 -0
  241. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/repo_edit.py +0 -0
  242. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/repo_onboard.py +0 -0
  243. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/revalidate.py +0 -0
  244. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/scorecard.py +0 -0
  245. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/self_health.py +0 -0
  246. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/serve_app.py +0 -0
  247. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  248. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  249. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  250. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  251. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  252. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/portal-followup/SKILL.md +0 -0
  253. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  254. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  255. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/skills/update-issue/SKILL.md +0 -0
  256. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/smoke.py +0 -0
  257. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/spend_ceiling.py +0 -0
  258. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/split_work.py +0 -0
  259. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/sql.py +0 -0
  260. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/stage_projection.py +0 -0
  261. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/state.py +0 -0
  262. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/test_author.py +0 -0
  263. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/test_chat.py +0 -0
  264. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/test_orchestrator.py +0 -0
  265. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/test_report.py +0 -0
  266. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/tui_release.py +0 -0
  267. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/usage.py +0 -0
  268. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/usage_limits.py +0 -0
  269. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/usage_rollup.py +0 -0
  270. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coord/worker_events.py +0 -0
  271. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/coordinator.example.yml +0 -0
  272. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-agent.service +0 -0
  273. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-db-backup.service +0 -0
  274. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-db-backup.sh +0 -0
  275. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-db-backup.timer +0 -0
  276. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-drive-queue.service +0 -0
  277. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-drive-queue.timer +0 -0
  278. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-failure-notify.service +0 -0
  279. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-failure-notify.sh +0 -0
  280. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-fleet-watchdog.service +0 -0
  281. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-fleet-watchdog.timer +0 -0
  282. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-notify.service +0 -0
  283. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-notify.timer +0 -0
  284. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-release-propagate.service +0 -0
  285. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-release-propagate.timer +0 -0
  286. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-release-window.service +0 -0
  287. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-release-window.timer +0 -0
  288. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-serve.service +0 -0
  289. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-web-dist-build.service +0 -0
  290. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-web-dist-build.sh +0 -0
  291. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-web-dist-build.timer +0 -0
  292. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-web-rollback.sh +0 -0
  293. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/coord-web.service +0 -0
  294. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/deploy/node-shim.sh +0 -0
  295. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  296. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ADR_COORD_WEB_CI.md +0 -0
  297. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ADR_COORD_WEB_DIST.md +0 -0
  298. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/AGENT_OPERATIONS.md +0 -0
  299. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ARCHITECTURE.md +0 -0
  300. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ARCH_SECURITY_GATES.md +0 -0
  301. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/COCKPIT.md +0 -0
  302. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/CONTROL_CENTER.md +0 -0
  303. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/COST_DISCIPLINE.md +0 -0
  304. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/CROSS_PLATFORM.md +0 -0
  305. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/CUSTOMER_FACING_APPS.md +0 -0
  306. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/CUSTOMER_PORTAL.md +0 -0
  307. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/DRIVE_QUEUE.md +0 -0
  308. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/EPHEMERAL_WORKERS.md +0 -0
  309. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/FORGE_MIGRATION.md +0 -0
  310. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/GRAPHIFY_SETUP.md +0 -0
  311. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ISSUE_GUIDANCE.md +0 -0
  312. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/MAC_MINI.md +0 -0
  313. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  314. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/NOTIFIER.md +0 -0
  315. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/OPENCODE_VERIFICATION.md +0 -0
  316. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/OPERATING_GOTCHAS.md +0 -0
  317. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/OPERATOR_GUIDES.md +0 -0
  318. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/ORACLE_LOOP.md +0 -0
  319. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/PHONE_WEBAPP.md +0 -0
  320. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/PIPELINE_V2.md +0 -0
  321. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/PLATFORM_EVOLUTION.md +0 -0
  322. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/SECOND_BACKEND.md +0 -0
  323. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/STORE_SERVICE.md +0 -0
  324. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  325. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/WEB_CONTROL_CENTER.md +0 -0
  326. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/WSL_WINDOWS_WORKER.md +0 -0
  327. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/mocks/web/README.md +0 -0
  328. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/mocks/web/_tokens.css +0 -0
  329. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/mocks/web/issue-detail.html +0 -0
  330. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/mocks/web/pipeline-narrow.html +0 -0
  331. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/docs/mocks/web/pipeline-wide.html +0 -0
  332. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/graphify-out/.gitignore +0 -0
  333. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/install-agent.sh +0 -0
  334. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/pyproject.toml +0 -0
  335. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/audit_review_verdict_overrides.py +0 -0
  336. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  337. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/build-worker-image.sh +0 -0
  338. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/coordinator-machine.py +0 -0
  339. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/epic-down.sh +0 -0
  340. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/epic-up.sh +0 -0
  341. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/preflight.sh +0 -0
  342. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/provision-worker.sh +0 -0
  343. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  344. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  345. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/azure-workers/verify-github-token.sh +0 -0
  346. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/check_gh_argv_containment.py +0 -0
  347. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/codegen.py +0 -0
  348. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/coord-test-runner.sh +0 -0
  349. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/coord-venv-rollback.sh +0 -0
  350. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/drive-batch.sh +0 -0
  351. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/fleet_watchdog.py +0 -0
  352. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/gen_board_fixture.py +0 -0
  353. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/gen_mock_index.py +0 -0
  354. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/next_release_tag.py +0 -0
  355. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/run_tests_in_populated_home.sh +0 -0
  356. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/run_tests_without_gh.sh +0 -0
  357. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/smoke_437_interactive.py +0 -0
  358. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/verify_878_review_capture.py +0 -0
  359. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/verify_release_published.py +0 -0
  360. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/scripts/verify_release_wheel.py +0 -0
  361. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/setup.cfg +0 -0
  362. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/SMOKE_SET.md +0 -0
  363. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/__init__.py +0 -0
  364. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  365. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/contract.md +0 -0
  366. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/manifest.yml +0 -0
  367. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  368. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  369. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  370. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  371. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-37/conftest.py +0 -0
  372. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-37/contract.md +0 -0
  373. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-37/manifest.yml +0 -0
  374. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  375. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  376. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/contract.md +0 -0
  377. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/manifest.yml +0 -0
  378. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  379. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  380. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  381. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  382. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  383. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  384. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  385. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  386. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  387. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  388. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/contract.md +0 -0
  389. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  390. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  391. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/manifest.yml +0 -0
  392. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  393. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-51/tsconfig.json +0 -0
  394. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  395. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  396. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  397. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/contract.md +0 -0
  398. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  399. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/manifest.yml +0 -0
  400. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  401. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  402. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  403. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  404. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  405. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  406. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  407. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  408. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  409. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  410. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  411. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  412. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/contract.md +0 -0
  413. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  414. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/manifest.yml +0 -0
  415. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  416. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  417. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  418. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  419. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  420. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  421. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  422. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/conftest.py +0 -0
  423. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/board-pipeline-basic.json +0 -0
  424. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  425. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  426. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  427. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  428. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/all_pass.json +0 -0
  429. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  430. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/mixed_fail.json +0 -0
  431. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  432. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  433. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/skip.json +0 -0
  434. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/playwright/truncated.json +0 -0
  435. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  436. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  437. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  438. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  439. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  440. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  441. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  442. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  443. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_acceptance.py +0 -0
  444. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_acceptance_drivers.py +0 -0
  445. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent.py +0 -0
  446. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_api_error.py +0 -0
  447. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_app.py +0 -0
  448. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_branch_base.py +0 -0
  449. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_branch_capture.py +0 -0
  450. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_config_free_1712.py +0 -0
  451. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_deploy_units_endpoint.py +0 -0
  452. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_dirty_worktree.py +0 -0
  453. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  454. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_graph_self_heal.py +0 -0
  455. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_health_h3.py +0 -0
  456. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_idle_restart.py +0 -0
  457. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_push_failure.py +0 -0
  458. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_reap.py +0 -0
  459. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_repos_and_pull.py +0 -0
  460. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_restart_services_endpoint.py +0 -0
  461. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_skills_self_heal.py +0 -0
  462. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_startup_diagnostics.py +0 -0
  463. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_update.py +0 -0
  464. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_update_bluegreen.py +0 -0
  465. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_usage_limit.py +0 -0
  466. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_agent_zero_commit.py +0 -0
  467. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ambient_home_isolation.py +0 -0
  468. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_approve_dependency_busy_2804.py +0 -0
  469. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_approve_reject_plan.py +0 -0
  470. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_approve_usage_gate.py +0 -0
  471. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_approved_work_2532.py +0 -0
  472. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_assignment_already_recorded_daemon.py +0 -0
  473. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_audit_log.py +0 -0
  474. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_audit_outcome.py +0 -0
  475. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_audit_query.py +0 -0
  476. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_auto_loop.py +0 -0
  477. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_auto_release_publish_2035.py +0 -0
  478. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_base_checkout_restore.py +0 -0
  479. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_block_log.py +0 -0
  480. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_cap_762.py +0 -0
  481. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_fixture.py +0 -0
  482. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_read_path.py +0 -0
  483. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_schema.py +0 -0
  484. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_service.py +0 -0
  485. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_state.py +0 -0
  486. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_board_wire.py +0 -0
  487. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_brain.py +0 -0
  488. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_branch_model.py +0 -0
  489. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_bug_intake.py +0 -0
  490. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_build_worker_image_env_update.py +0 -0
  491. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cargo_cache.py +0 -0
  492. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_check_gh_argv_containment.py +0 -0
  493. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ci_acceptance_gate_1950.py +0 -0
  494. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ci_fix.py +0 -0
  495. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ci_gitlab.py +0 -0
  496. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ci_parity_2091.py +0 -0
  497. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_ci_store.py +0 -0
  498. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_claim.py +0 -0
  499. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_claude_md_budget.py +0 -0
  500. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_acceptance.py +0 -0
  501. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_assign.py +0 -0
  502. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  503. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_assign_interactive_remote.py +0 -0
  504. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_assign_provider.py +0 -0
  505. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  506. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_audit.py +0 -0
  507. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_chat_continue.py +0 -0
  508. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_decide.py +0 -0
  509. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_diagnose_config_provenance.py +0 -0
  510. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_diagnose_forge_availability.py +0 -0
  511. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_diagnose_graph.py +0 -0
  512. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_diagnose_self.py +0 -0
  513. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_doctor.py +0 -0
  514. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_doctor_config_free_1801.py +0 -0
  515. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  516. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_drive.py +0 -0
  517. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_drive_queue.py +0 -0
  518. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_escalate.py +0 -0
  519. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_fix_headless_review.py +0 -0
  520. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_gate_a.py +0 -0
  521. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_install_drift.py +0 -0
  522. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_install_skills.py +0 -0
  523. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_issue_comment.py +0 -0
  524. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_issue_create_label.py +0 -0
  525. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_issue_reopen.py +0 -0
  526. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_issue_view_list.py +0 -0
  527. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_merge.py +0 -0
  528. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_assign.py +0 -0
  529. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_capture.py +0 -0
  530. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_chat_add_child.py +0 -0
  531. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_dispatch.py +0 -0
  532. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_gate_b.py +0 -0
  533. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_gate_c.py +0 -0
  534. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_order.py +0 -0
  535. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  536. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_milestone_ship.py +0 -0
  537. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_network.py +0 -0
  538. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_new_issue_chat.py +0 -0
  539. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_plans.py +0 -0
  540. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_portal.py +0 -0
  541. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_pr.py +0 -0
  542. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_pull_artifact.py +0 -0
  543. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_queue.py +0 -0
  544. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_reattach_sessions.py +0 -0
  545. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_refine_board.py +0 -0
  546. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_release_preflight.py +0 -0
  547. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_release_propagate.py +0 -0
  548. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_release_window.py +0 -0
  549. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_repo_2220.py +0 -0
  550. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  551. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_scorecard.py +0 -0
  552. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_set_review_findings.py +0 -0
  553. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_advisory_terminal.py +0 -0
  554. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_contested_tag.py +0 -0
  555. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_merge_queue.py +0 -0
  556. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_provider.py +0 -0
  557. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_review_finalizing.py +0 -0
  558. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_test_failed_tag.py +0 -0
  559. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_status_usage_limit.py +0 -0
  560. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_sync_comments_873.py +0 -0
  561. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_test_plan.py +0 -0
  562. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_track.py +0 -0
  563. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_tui_update.py +0 -0
  564. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cli_wait.py +0 -0
  565. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_client_base_install.py +0 -0
  566. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_commands_common.py +0 -0
  567. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_comments.py +0 -0
  568. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_completion_summary.py +0 -0
  569. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config.py +0 -0
  570. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config_acceptance.py +0 -0
  571. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config_audit.py +0 -0
  572. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config_pricing.py +0 -0
  573. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  574. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_config_usage_gate.py +0 -0
  575. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_confirm_test.py +0 -0
  576. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_conflict_fix.py +0 -0
  577. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_conflict_fix_semantic.py +0 -0
  578. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  579. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_test.py +0 -0
  580. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_test_runner_baseline.py +0 -0
  581. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_test_runner_populated_home.py +0 -0
  582. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_test_runner_routing.py +0 -0
  583. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_test_runner_toolchain.py +0 -0
  584. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_uat.py +0 -0
  585. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coord_web_sse_restart_live.py +0 -0
  586. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_coordinator_machine.py +0 -0
  587. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_cross_platform_imports.py +0 -0
  588. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dao.py +0 -0
  589. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dashboard.py +0 -0
  590. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dashboard_fixture.py +0 -0
  591. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dashboard_terminal.py +0 -0
  592. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dashboard_terminal_live.py +0 -0
  593. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_db.py +0 -0
  594. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dead_end.py +0 -0
  595. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_decomposition_chat.py +0 -0
  596. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_coord_db_backup.py +0 -0
  597. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_coord_web_dist.py +0 -0
  598. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_coord_web_rollback.py +0 -0
  599. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_drive_queue_unit.py +0 -0
  600. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_failure_notify_unit.py +0 -0
  601. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_manifest.py +0 -0
  602. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_notify_unit.py +0 -0
  603. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_units_lane.py +0 -0
  604. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deploy_web_unit.py +0 -0
  605. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_deps.py +0 -0
  606. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_diagnose.py +0 -0
  607. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dispatch.py +0 -0
  608. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dispatch_target_validation.py +0 -0
  609. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_dist_name.py +0 -0
  610. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_done_housekeeping.py +0 -0
  611. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive.py +0 -0
  612. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue.py +0 -0
  613. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue_blocked_rendering.py +0 -0
  614. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue_launch_argv.py +0 -0
  615. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  616. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue_roll_pending.py +0 -0
  617. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  618. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_state.py +0 -0
  619. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_drive_tmux.py +0 -0
  620. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_epic_up_capability_detection.py +0 -0
  621. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  622. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_epic_up_image_provenance.py +0 -0
  623. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_errors.py +0 -0
  624. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_events.py +0 -0
  625. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_failure_class.py +0 -0
  626. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_filelock.py +0 -0
  627. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  628. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_fix_of_force_override.py +0 -0
  629. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_fleet_config_health.py +0 -0
  630. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_fleet_health_probes.py +0 -0
  631. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_fleet_health_snapshot.py +0 -0
  632. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_fleet_watchdog.py +0 -0
  633. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_forge_availability.py +0 -0
  634. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_freshness.py +0 -0
  635. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gate_a.py +0 -0
  636. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gate_b.py +0 -0
  637. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gate_snapshot_staleness.py +0 -0
  638. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gates.py +0 -0
  639. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  640. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_gen_mock_index.py +0 -0
  641. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_generated_rust_fixture.py +0 -0
  642. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_generated_types_fixture.py +0 -0
  643. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_github_ops.py +0 -0
  644. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_github_throttle.py +0 -0
  645. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_goal.py +0 -0
  646. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_graph_health.py +0 -0
  647. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_graph_selfheal_absent_2237.py +0 -0
  648. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_handoff.py +0 -0
  649. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_checks.py +0 -0
  650. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_cli.py +0 -0
  651. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_cli_graph.py +0 -0
  652. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_config.py +0 -0
  653. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_context.py +0 -0
  654. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_coord_web_ci_pin.py +0 -0
  655. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_deploy_lane_facts.py +0 -0
  656. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_fix.py +0 -0
  657. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_incident_regression.py +0 -0
  658. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_pypi.py +0 -0
  659. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_registry.py +0 -0
  660. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_release_cordon_probe.py +0 -0
  661. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_timer_active.py +0 -0
  662. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_toolchain.py +0 -0
  663. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_unit_drift.py +0 -0
  664. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_health_unit_enablement.py +0 -0
  665. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_hooks.py +0 -0
  666. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_human_attended_437.py +0 -0
  667. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_init.py +0 -0
  668. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_integration.py +0 -0
  669. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_briefing_echo.py +0 -0
  670. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_pane_log_2541.py +0 -0
  671. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_prefill_state.py +0 -0
  672. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_session_relaunch.py +0 -0
  673. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_test_verdict_backstop.py +0 -0
  674. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_token_attribution.py +0 -0
  675. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_interactive_worktree.py +0 -0
  676. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_issue_store_seam.py +0 -0
  677. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_liveness_auditor.py +0 -0
  678. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_liveness_notify.py +0 -0
  679. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_machine_pause.py +0 -0
  680. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_merge_queue.py +0 -0
  681. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_merge_verify.py +0 -0
  682. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_milestone_chat.py +0 -0
  683. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_milestone_dispatch.py +0 -0
  684. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_milestone_gate.py +0 -0
  685. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_milestone_order.py +0 -0
  686. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_milestone_seam.py +0 -0
  687. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_mock_author.py +0 -0
  688. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_model_tiering.py +0 -0
  689. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_models.py +0 -0
  690. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_models_config_labels.py +0 -0
  691. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_needs_attention.py +0 -0
  692. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_network.py +0 -0
  693. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_new_issue_chat.py +0 -0
  694. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_next_release_tag.py +0 -0
  695. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_node_shim.py +0 -0
  696. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_baseline.py +0 -0
  697. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_cli.py +0 -0
  698. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_collect.py +0 -0
  699. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_config.py +0 -0
  700. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_drive_seam.py +0 -0
  701. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_isolation.py +0 -0
  702. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_predicate.py +0 -0
  703. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notifier_service.py +0 -0
  705. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notify.py +0 -0
  706. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_notify_drain.py +0 -0
  707. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_openapi.py +0 -0
  708. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_operational_defaults.py +0 -0
  709. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_overlap_fence.py +0 -0
  710. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_overlap_predict.py +0 -0
  711. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_packaged_deploy_units.py +0 -0
  712. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_parentage.py +0 -0
  713. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_paste_landed.py +0 -0
  714. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  715. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_pipeline.py +0 -0
  716. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_plan_followup_approve_plan_command.py +0 -0
  717. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_plan_followup_pr_command.py +0 -0
  718. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_plan_followup_review_command.py +0 -0
  719. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_plan_only.py +0 -0
  720. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_plan_parser.py +0 -0
  721. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_platform_paths.py +0 -0
  722. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_portal_bridge.py +0 -0
  723. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_portal_config.py +0 -0
  724. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_portal_store.py +0 -0
  725. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_portal_sync.py +0 -0
  726. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_pr_body_lint.py +0 -0
  727. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_prereqs.py +0 -0
  728. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_production_db_guard.py +0 -0
  729. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_progress.py +0 -0
  730. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_provider_seam.py +0 -0
  731. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_providers.py +0 -0
  732. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_providers_config_labels.py +0 -0
  733. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_providers_pty.py +0 -0
  734. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_quiet_hours.py +0 -0
  735. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_quiet_hours_store_2146.py +0 -0
  736. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reap_merged_sessions.py +0 -0
  737. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reap_stale_interactive_tick.py +0 -0
  738. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile.py +0 -0
  739. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_branch.py +0 -0
  740. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_completions.py +0 -0
  741. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  742. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_merges.py +0 -0
  743. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_no_agent_record.py +0 -0
  744. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_tick.py +0 -0
  745. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_reconcile_usage_limit_done.py +0 -0
  746. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_refine_chat.py +0 -0
  747. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_cordon_2101.py +0 -0
  748. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  749. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_cordon_deadlock_2240.py +0 -0
  750. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_cordon_stuck_2490.py +0 -0
  751. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_propagate.py +0 -0
  752. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_propagate_threshold.py +0 -0
  753. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_roll_window_handoff.py +0 -0
  754. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_unified_1242.py +0 -0
  755. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_verify.py +0 -0
  756. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_release_window.py +0 -0
  757. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_remote_auto_prune.py +0 -0
  758. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_remote_interactive_reaper.py +0 -0
  759. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_repo_add.py +0 -0
  760. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_repo_edit_2220.py +0 -0
  761. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_repo_graph_fleet_2237.py +0 -0
  762. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_repo_onboard_2220.py +0 -0
  763. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_report_result_push.py +0 -0
  764. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_retry.py +0 -0
  765. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_retry_advisory_1606.py +0 -0
  766. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_retry_type_1636.py +0 -0
  767. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_revalidate.py +0 -0
  768. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_end_review_without_verdict.py +0 -0
  769. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_parse_failure_diagnostic.py +0 -0
  770. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_reaffirm.py +0 -0
  771. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_state.py +0 -0
  772. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_verdict_backstop.py +0 -0
  773. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_verdict_override_audit.py +0 -0
  774. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_verdict_relay.py +0 -0
  775. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_review_zero_commits.py +0 -0
  776. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_scoped_review_wiring.py +0 -0
  777. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_scorecard.py +0 -0
  778. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_self_health.py +0 -0
  779. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_serve.py +0 -0
  780. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_serve_app_board_trim.py +0 -0
  781. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_session.py +0 -0
  782. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_slice_issue_attribution.py +0 -0
  783. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_smoke.py +0 -0
  784. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_smoke_live_checkout_restore.py +0 -0
  785. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_smoke_workflow.py +0 -0
  786. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_spend_ceiling.py +0 -0
  787. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_spend_ceiling_coordinator.py +0 -0
  788. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_split.py +0 -0
  789. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_split_work.py +0 -0
  790. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_sql_dialect.py +0 -0
  791. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_stage_projection.py +0 -0
  792. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_stalled_pipeline.py +0 -0
  793. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_state.py +0 -0
  794. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_state_review_findings_daemon.py +0 -0
  795. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_status_fleet_footer.py +0 -0
  796. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_stop_1567.py +0 -0
  797. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_store_contract.py +0 -0
  798. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_stuck.py +0 -0
  799. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  800. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_terminal_command.py +0 -0
  801. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_author.py +0 -0
  802. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_chat.py +0 -0
  803. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_orchestrator.py +0 -0
  804. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_report.py +0 -0
  805. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_verdict_parsing.py +0 -0
  806. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_test_verdict_transcript_floor.py +0 -0
  807. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_text_io_encoding_audit.py +0 -0
  808. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_thin_client_board_audit.py +0 -0
  809. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_thin_client_config_load_1080.py +0 -0
  810. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_thin_client_daemon_routing_906.py +0 -0
  811. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_tmux_host.py +0 -0
  812. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_tmux_session.py +0 -0
  813. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_transcript_floor.py +0 -0
  814. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_usage.py +0 -0
  815. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_usage_limits.py +0 -0
  816. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_usage_rollup.py +0 -0
  817. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_venv_live_install_2121.py +0 -0
  818. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_version_single_source.py +0 -0
  819. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_watch.py +0 -0
  820. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  821. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worker_env_venv_isolation.py +0 -0
  822. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worker_events.py +0 -0
  823. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worker_image_pin_sync.py +0 -0
  824. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worker_safety.py +0 -0
  825. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worker_test_scoping.py +0 -0
  826. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worktree.py +0 -0
  827. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  828. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/Cargo.lock +0 -0
  829. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/Cargo.toml +0 -0
  830. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/cargo-config-local-quadraui.toml.example +0 -0
  831. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/approved.rs +0 -0
  832. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/audit.rs +0 -0
  833. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/chat.rs +0 -0
  834. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/data.rs +0 -0
  835. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/dialogs.rs +0 -0
  836. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/doc_tabs.rs +0 -0
  837. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/drive.rs +0 -0
  838. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/drive_queue.rs +0 -0
  839. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/escalation.rs +0 -0
  840. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/events.rs +0 -0
  841. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/fleet_health.rs +0 -0
  842. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/fleet_sessions.rs +0 -0
  843. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/fleet_terminals.rs +0 -0
  844. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/format.rs +0 -0
  845. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/milestone_dag.rs +0 -0
  846. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/msv.rs +0 -0
  847. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/pipeline.rs +0 -0
  848. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/plans.rs +0 -0
  849. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/render.rs +0 -0
  850. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/reports.rs +0 -0
  851. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/sessions.rs +0 -0
  852. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/settings_ui.rs +0 -0
  853. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/sidebar.rs +0 -0
  854. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/terminal.rs +0 -0
  855. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/tests.rs +0 -0
  856. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/types/generated.rs +0 -0
  857. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/types.rs +0 -0
  858. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/app/workspace.rs +0 -0
  859. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/bin/gtk.rs +0 -0
  860. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/commands.rs +0 -0
  861. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/lib.rs +0 -0
  862. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/main.rs +0 -0
  863. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/src/settings.rs +0 -0
  864. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/tests/acceptance.rs +0 -0
  865. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/tests/cli.rs +0 -0
  866. {code_coordinator-0.5.247 → code_coordinator-0.5.250}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.247
3
+ Version: 0.5.250
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.247
3
+ Version: 0.5.250
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.247",
2
+ "tag": "0.5.250",
3
3
  "distance": 0,
4
- "node": "g4f09a4eb9bb9c5df7bd584afa61ad7985896abe7",
4
+ "node": "g736f450ea5a6401a7a9b51d286e49fba0c0068e4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-27"
@@ -4918,7 +4918,11 @@ def default_worker_command(spec: AssignmentSpec, *, binary: str = DEFAULT_WORKER
4918
4918
  # (coord.providers.claude_pty.ClaudePtyProvider) intentionally keeps
4919
4919
  # the default sources so an operator's own `coord init`-configured
4920
4920
  # convenience allow-list still applies to a session they're
4921
- # attached to and watching.
4921
+ # attached to and watching. #2821: that tradeoff also means the PTY
4922
+ # path pays for CLAUDE.md via ambient auto-discovery (~7.7k tok)
4923
+ # instead of the explicit `_claude_md_system_prompt_suffix` embed
4924
+ # below (~5.2k tok) — a deliberately accepted, documented cost; see
4925
+ # the argv comment in ClaudePtyProvider.build_command.
4922
4926
  #
4923
4927
  # #2462 tried `--bare` here (closes settings + hooks + .mcp.json +
4924
4928
  # CLAUDE.md auto-discovery at once, vs. this flag's settings.json-only
@@ -2313,17 +2313,123 @@ def rerun_workflow_run_failed(repo: str, run_id: str) -> bool:
2313
2313
  return True
2314
2314
 
2315
2315
 
2316
+ def diff_file_paths(diff_text: str) -> list[str]:
2317
+ """Return every file path touched by *diff_text*, deduped, order-preserving.
2318
+
2319
+ Scans unified-diff file-header lines (``diff --git a/X b/Y``, ``---
2320
+ a/X``, ``+++ b/X``) — cheap, dependency-free (#944 sealing v1) ahead of a
2321
+ real diff parser. Lives here (rather than :mod:`coord.review`, its
2322
+ original home) because :func:`truncate_diff_text` needs it too (#2819)
2323
+ and ``coord.review`` imports :mod:`coord.github_ops`, not the reverse —
2324
+ :mod:`coord.review` re-uses this copy for its own sealed-path /
2325
+ missing-test-coverage checks instead of keeping a second one.
2326
+ """
2327
+ paths: list[str] = []
2328
+ seen: set[str] = set()
2329
+ for line in diff_text.splitlines():
2330
+ candidates: list[str] = []
2331
+ if line.startswith("diff --git "):
2332
+ for part in line.split()[1:]:
2333
+ if part.startswith("a/") or part.startswith("b/"):
2334
+ candidates.append(part[2:])
2335
+ elif line.startswith("--- a/"):
2336
+ candidates.append(line[len("--- a/"):])
2337
+ elif line.startswith("+++ b/"):
2338
+ candidates.append(line[len("+++ b/"):])
2339
+ for c in candidates:
2340
+ if c not in seen:
2341
+ seen.add(c)
2342
+ paths.append(c)
2343
+ return paths
2344
+
2345
+
2346
+ _DIFF_FILE_BOUNDARY_RE = re.compile(r"^diff --git ", re.MULTILINE)
2347
+
2348
+
2316
2349
  def truncate_diff_text(diff: str, max_chars: int = 60000) -> str:
2317
- """Truncate *diff* to *max_chars* with a trailing note, if it's over.
2350
+ """Truncate *diff* to at most *max_chars*, cutting on a ``diff --git``
2351
+ file boundary rather than mid-hunk, and naming the files that got cut.
2318
2352
 
2319
2353
  Factored out of :func:`pr_diff` (#1475) so callers that need the full,
2320
2354
  untruncated diff for content hashing (``compute_patch_id``) can still
2321
2355
  apply the same display truncation to a *separate* copy shown to a human
2322
2356
  reviewer or embedded in a briefing, without a second ``gh`` fetch.
2323
- """
2324
- if len(diff) > max_chars:
2325
- return diff[:max_chars] + f"\n... [diff truncated at {max_chars} chars] ..."
2326
- return diff
2357
+
2358
+ #2819: the original version was a blind character slice — handed the
2359
+ reviewer a diff that stopped mid-hunk, with no indication anything was
2360
+ even cut, on any PR whose diff crossed *max_chars* (61% of a review
2361
+ briefing at the flat 60k default). That's a silent coverage hole in a
2362
+ gate that's supposed to be adversarial. This version instead:
2363
+
2364
+ 1. Cuts at the last ``diff --git`` boundary that fits within
2365
+ *max_chars* — every file kept in the output is complete, never a
2366
+ partial hunk.
2367
+ 2. Appends the paths of every file that got dropped, so the reviewer
2368
+ knows exactly what it did not see and can inspect those files
2369
+ directly (e.g. ``git show``) instead of silently missing them.
2370
+
2371
+ Falls back to the old raw character slice — no boundary preference — when
2372
+ no file boundary fits within *max_chars* at all (a single file's own
2373
+ diff already exceeds the cap, or *diff* isn't a unified diff to begin
2374
+ with). Cutting nothing at that point would just emit an empty string,
2375
+ which is worse than the old behavior. #2819 follow-up: that fallback
2376
+ slice lands *inside* the first file's own diff (the loop below only
2377
+ leaves ``cut_at`` unset when the second file's boundary already exceeds
2378
+ *max_chars*, i.e. before any second file exists in the output) — so
2379
+ that file's header rides into ``head`` looking complete while its body
2380
+ is silently cut mid-hunk. Left unflagged, a reviewer who checks the
2381
+ omitted-files list and finds their file *not* on it would reasonably
2382
+ (and wrongly) conclude it was shown in full. That file is now always
2383
+ called out as truncated, separately from the fully-omitted list.
2384
+ """
2385
+ if len(diff) <= max_chars:
2386
+ return diff
2387
+
2388
+ boundaries = [m.start() for m in _DIFF_FILE_BOUNDARY_RE.finditer(diff)]
2389
+ cut_at: int | None = None
2390
+ for b in boundaries:
2391
+ if b == 0:
2392
+ continue # the first file's own boundary — cutting here keeps nothing
2393
+ if b > max_chars:
2394
+ break
2395
+ cut_at = b
2396
+
2397
+ if cut_at is None:
2398
+ head = diff[:max_chars]
2399
+ # The cut point falls inside the first file's own diff (see the
2400
+ # docstring above) — flag that file as incomplete rather than
2401
+ # letting it silently pass as "not omitted, so fully shown".
2402
+ all_paths = diff_file_paths(diff)
2403
+ incomplete = all_paths[0] if all_paths else None
2404
+ else:
2405
+ head = diff[:cut_at].rstrip("\n")
2406
+ incomplete = None
2407
+
2408
+ dropped = [p for p in diff_file_paths(diff) if p not in diff_file_paths(head)]
2409
+
2410
+ note = f"\n... [diff truncated at {max_chars} chars"
2411
+ tallies = []
2412
+ if incomplete:
2413
+ tallies.append(f"1 file cut off mid-diff ({incomplete})")
2414
+ if dropped:
2415
+ tallies.append(f"{len(dropped)} file(s) omitted")
2416
+ if tallies:
2417
+ note += "; " + "; ".join(tallies)
2418
+ note += "] ..."
2419
+ if incomplete:
2420
+ note += (
2421
+ f"\nFile truncated mid-diff — the shown portion of `{incomplete}` "
2422
+ "is INCOMPLETE, not fully reviewed above; inspect the rest "
2423
+ f"directly (e.g. `git show <head-sha> -- {incomplete}`) before "
2424
+ "approving."
2425
+ )
2426
+ if dropped:
2427
+ note += (
2428
+ "\nFiles omitted by truncation — NOT reviewed above; inspect "
2429
+ "these directly (e.g. `git show <head-sha> -- <path>`) before "
2430
+ "approving:\n" + "\n".join(f" - {p}" for p in dropped)
2431
+ )
2432
+ return head + note
2327
2433
 
2328
2434
 
2329
2435
  def pr_diff(repo_github: str, pr_number: int, *, max_chars: int | None = 60000) -> str | None:
@@ -582,6 +582,37 @@ class ClaudePtyProvider(Provider):
582
582
  # --allowedTools / --permission-mode are still passed as a safety
583
583
  # hedge even though enforcement is unverified in the PTY path
584
584
  # (capabilities().enforces_deny_list == False).
585
+ #
586
+ # #2821: also deliberately NO `--setting-sources user` here, and no
587
+ # `_claude_md_system_prompt_suffix` embed — both of which
588
+ # `default_worker_command` (coord/agent.py) DOES use for the `-p`
589
+ # path. That's not an oversight; it was checked and rejected:
590
+ #
591
+ # 1. `--setting-sources user` would exclude the LOCAL settings
592
+ # scope, which is exactly where `coord init` (coord/commands/
593
+ # setup.py) writes the operator's own `.claude/settings.local.json`
594
+ # convenience allow-list (`Bash(coord *)` etc) for the repo
595
+ # they're interactively attached to. Restricting sources here
596
+ # would silently drop that allow-list for a session the operator
597
+ # is watching and expects to behave like their normal `claude`
598
+ # session — see coord/agent.py:~4919's identical tradeoff
599
+ # written up for the `-p` path (which deliberately keeps the
600
+ # default sources reasoning in reverse: it EXCLUDES project/local
601
+ # because a worker must NOT inherit host-local settings).
602
+ # 2. `--bare` would close the CLAUDE.md-ambient-discovery gap
603
+ # without touching settings sources, but it also unconditionally
604
+ # disables OAuth/keychain reads — this fleet authenticates via
605
+ # `claude login`/OAuth, not `ANTHROPIC_API_KEY` (see #2462's
606
+ # emergency revert in coord/agent.py for the fleet-wide outage
607
+ # that caused). Not usable here either.
608
+ #
609
+ # Net effect, measured (#2821): this path pays ~7.7k ambient-
610
+ # discovery tokens for CLAUDE.md vs. ~5.2k for the `-p` path's
611
+ # explicit embed — a known, accepted cost of preserving the
612
+ # operator's own interactive settings on a human-attended session,
613
+ # not an accident. Revisit if Claude Code ever exposes a way to
614
+ # suppress CLAUDE.md auto-discovery independent of settings-sources
615
+ # and `--bare`'s OAuth side effect.
585
616
  argv: list[str] = [
586
617
  binary,
587
618
  "--system-prompt", system_prompt,
@@ -1762,7 +1762,12 @@ _USAGE_COLUMN_META: dict[str, ColumnMeta] = {
1762
1762
  "repo": ColumnMeta(id="repo", label="Repo", kind="text", weight=1.5),
1763
1763
  "title": ColumnMeta(id="title", label="Title", kind="text", weight=4.0),
1764
1764
  "legs": ColumnMeta(id="legs", label="Legs", kind="int", align="right", weight=0.6),
1765
- "tokens_in": ColumnMeta(id="tokens_in", label="Tok In", kind="int", align="right"),
1765
+ # #2825: labelled "Raw In", not "Tok In" — sitting next to a full "Tok
1766
+ # Out", "Tok In" reads as its matched pair, and it is not: this is raw
1767
+ # UNCACHED input, ~0.001% of what a `work` leg actually sends (the other
1768
+ # ~98% is `cache_read`, below). The column `id` stays `tokens_in` so no
1769
+ # historical number or saved sort changes.
1770
+ "tokens_in": ColumnMeta(id="tokens_in", label="Raw In", kind="int", align="right"),
1766
1771
  "tokens_out": ColumnMeta(id="tokens_out", label="Tok Out", kind="int", align="right"),
1767
1772
  # #2786: the column that carries the money — see module comment above.
1768
1773
  "cache_read": ColumnMeta(id="cache_read", label="Cache Rd", kind="int", align="right"),
@@ -2658,12 +2663,24 @@ COMPLETED_COLUMNS = [
2658
2663
  "title",
2659
2664
  "started_at",
2660
2665
  "ended_at",
2661
- # #2472's four. Appended, never interleaved: the client addresses columns
2662
- # by INDEX for sorting (`reports_sort_by_column`), so inserting one in the
2663
- # middle would silently re-point a saved sort at a different column.
2666
+ # #2472's four, plus #2825's `cache_read`. #2472's own five (`repo`
2667
+ # through `ended_at` above) keep the indices they had — the client
2668
+ # addresses columns by INDEX for sorting (`reports_sort_by_column`), so
2669
+ # THAT boundary is never interleaved. `cost_total` shifting from index 8
2670
+ # to 9 here is accepted, not an oversight: it mirrors `usage`'s own
2671
+ # precedent (#2786 inserted `cache_read`/`cache_create`/`turns` ahead of
2672
+ # `cost_captured`/`cost_est`/`cost_total` there too), and grouping token
2673
+ # counts together beats preserving one more index.
2664
2674
  "legs",
2665
2675
  "tokens_in",
2666
2676
  "tokens_out",
2677
+ # #2825: `cache_read` was already on the wire as a row key (see
2678
+ # `_completed_spend`) — ~98% of a `work` leg's input, sitting next to a
2679
+ # `tokens_in` that is ~0.001% of it. Without this column, `Tok Out`
2680
+ # (uncapped) next to `tokens_in` (raw uncached input) reads as "output
2681
+ # dwarfs input", which is backwards by five orders of magnitude. Reuses
2682
+ # `_USAGE_COLUMN_META`'s `cache_read` verbatim.
2683
+ "cache_read",
2667
2684
  "cost_total",
2668
2685
  ]
2669
2686
 
@@ -2677,10 +2694,14 @@ COMPLETED_COLUMNS = [
2677
2694
  # also what `issue-activity` already does, and what `RowIdentity` reads.
2678
2695
  #
2679
2696
  # #2472's spend columns reuse `_USAGE_COLUMN_META`'s labels/kinds verbatim
2680
- # (`Legs`, `Tok In`, `Tok Out`, `Total $`) rather than inventing near-synonyms:
2681
- # an operator reading `completed` and `usage` side by side is looking at the
2682
- # same numbers out of the same rollup, and two spellings of "Tok In" would
2683
- # imply otherwise.
2697
+ # (`Legs`, `Raw In`, `Tok Out`, `Cache Rd`, `Total $`) rather than inventing
2698
+ # near-synonyms: an operator reading `completed` and `usage` side by side is
2699
+ # looking at the same numbers out of the same rollup, and two spellings of
2700
+ # the same column would imply otherwise.
2701
+ #
2702
+ # #2825: `tokens_in` is labelled "Raw In", not "Tok In" — see the comment on
2703
+ # `_USAGE_COLUMN_META["tokens_in"]` for why. Applied here too so the two
2704
+ # reports keep agreeing.
2684
2705
  #
2685
2706
  # ONE cost column, not `usage`'s `cost_captured`/`cost_est` split. `usage`
2686
2707
  # splits because it is the dedicated cost report, where "some legs have no
@@ -2689,7 +2710,9 @@ COMPLETED_COLUMNS = [
2689
2710
  # would push `title` off a narrow pane. Both halves still ship as extra ROW
2690
2711
  # keys (see `_completed_spend`) — the wire contract allows row keys beyond
2691
2712
  # `columns`, so a client that wants the split has it without another column,
2692
- # and `usage` remains the report to visit for it on screen.
2713
+ # and `usage` remains the report to visit for it on screen. `cache_read` is
2714
+ # the one exception (#2825): it isn't a split of an existing column, it's the
2715
+ # ~98% of input spend that `tokens_in` alone cannot represent.
2693
2716
  COMPLETED_COLUMN_META = [
2694
2717
  ColumnMeta(id="repo", label="Repo", kind="text"),
2695
2718
  ColumnMeta(id="issue", label="Issue", kind="int", align="right"),
@@ -2697,8 +2720,9 @@ COMPLETED_COLUMN_META = [
2697
2720
  ColumnMeta(id="started_at", label="Started", kind="timestamp"),
2698
2721
  ColumnMeta(id="ended_at", label="Ended", kind="timestamp"),
2699
2722
  ColumnMeta(id="legs", label="Legs", kind="int", align="right", weight=0.6),
2700
- ColumnMeta(id="tokens_in", label="Tok In", kind="int", align="right"),
2723
+ ColumnMeta(id="tokens_in", label="Raw In", kind="int", align="right"),
2701
2724
  ColumnMeta(id="tokens_out", label="Tok Out", kind="int", align="right"),
2725
+ ColumnMeta(id="cache_read", label="Cache Rd", kind="int", align="right"),
2702
2726
  ColumnMeta(id="cost_total", label="Total $", kind="money", align="right"),
2703
2727
  ]
2704
2728
 
@@ -1242,35 +1242,6 @@ def read_repo_claude_md(repo_path: Path) -> str | None:
1242
1242
  return None
1243
1243
 
1244
1244
 
1245
- def _diff_file_paths(diff_text: str) -> list[str]:
1246
- """Return every file path touched by *diff_text*, deduped, order-preserving.
1247
-
1248
- Scans unified-diff file-header lines (``diff --git a/X b/Y``, ``---
1249
- a/X``, ``+++ b/X``) — cheap, dependency-free (#944 sealing v1) ahead of a
1250
- real diff parser. Shared by :func:`_diff_touched_sealed_paths` (which
1251
- sealed prefixes) and :func:`_diff_paths_outside_sealed` (which actual
1252
- paths, #1175 — the test-author/mock-author inverse tamper check needs
1253
- the offending files, not just which prefixes matched).
1254
- """
1255
- paths: list[str] = []
1256
- seen: set[str] = set()
1257
- for line in diff_text.splitlines():
1258
- candidates: list[str] = []
1259
- if line.startswith("diff --git "):
1260
- for part in line.split()[1:]:
1261
- if part.startswith("a/") or part.startswith("b/"):
1262
- candidates.append(part[2:])
1263
- elif line.startswith("--- a/"):
1264
- candidates.append(line[len("--- a/"):])
1265
- elif line.startswith("+++ b/"):
1266
- candidates.append(line[len("+++ b/"):])
1267
- for c in candidates:
1268
- if c not in seen:
1269
- seen.add(c)
1270
- paths.append(c)
1271
- return paths
1272
-
1273
-
1274
1245
  def _path_is_sealed(path: str, sealed: str) -> bool:
1275
1246
  """Does *path* fall under the sealed entry *sealed*?
1276
1247
 
@@ -1294,7 +1265,7 @@ def _diff_touched_sealed_paths(diff_text: str, sealed_paths: list[str]) -> list[
1294
1265
  easy to test.
1295
1266
  """
1296
1267
  touched: set[str] = set()
1297
- for c in _diff_file_paths(diff_text):
1268
+ for c in github_ops.diff_file_paths(diff_text):
1298
1269
  for sealed in sealed_paths:
1299
1270
  if _path_is_sealed(c, sealed):
1300
1271
  touched.add(sealed)
@@ -1312,7 +1283,7 @@ def _diff_paths_outside_sealed(diff_text: str, sealed_paths: list[str]) -> list[
1312
1283
  the ones inside it.
1313
1284
  """
1314
1285
  return sorted(
1315
- p for p in _diff_file_paths(diff_text)
1286
+ p for p in github_ops.diff_file_paths(diff_text)
1316
1287
  if not any(_path_is_sealed(p, sealed) for sealed in sealed_paths)
1317
1288
  )
1318
1289
 
@@ -1328,7 +1299,7 @@ def _diff_paths_outside_sealed(diff_text: str, sealed_paths: list[str]) -> list[
1328
1299
  #
1329
1300
  # This is intentionally a coarse, path-only heuristic — no diff semantics, no
1330
1301
  # ``claude -p`` call, no LLM judgment, just the same cheap file-path
1331
- # inspection ``_diff_file_paths``/``_diff_touched_sealed_paths`` already do
1302
+ # inspection ``github_ops.diff_file_paths``/``_diff_touched_sealed_paths`` already do
1332
1303
  # above. It is a NUDGE, not a gate: callers only ever log it, never act on it
1333
1304
  # to change dispatch behavior, so a false positive costs nothing (the
1334
1305
  # reviewer remains the sole authority and, per CLAUDE.md, already honors a
@@ -1395,9 +1366,10 @@ def diff_missing_test_coverage(diff_text: str | None) -> bool:
1395
1366
  """#2192: True when *diff_text* touches user-visible source and zero
1396
1367
  test files, the pattern behind 18.5% of #2132's blocking reviews.
1397
1368
 
1398
- Pure, free, deterministic path inspection — reuses :func:`_diff_file_paths`.
1399
- Returns False (never flags) when the diff is empty, touches no recognized
1400
- source file (docs-only/internal-tooling-only diffs — CLAUDE.md's
1369
+ Pure, free, deterministic path inspection — reuses
1370
+ :func:`coord.github_ops.diff_file_paths`. Returns False (never flags)
1371
+ when the diff is empty, touches no recognized source file
1372
+ (docs-only/internal-tooling-only diffs — CLAUDE.md's
1401
1373
  internal-only exemption), or already includes a test-file change.
1402
1374
 
1403
1375
  The CLAUDE.md exemption is honored only at the granularity a path-only
@@ -1413,7 +1385,7 @@ def diff_missing_test_coverage(diff_text: str | None) -> bool:
1413
1385
  """
1414
1386
  if not diff_text or not diff_text.strip():
1415
1387
  return False
1416
- paths = _diff_file_paths(diff_text)
1388
+ paths = github_ops.diff_file_paths(diff_text)
1417
1389
  if not any(_is_user_visible_path(p) for p in paths):
1418
1390
  return False
1419
1391
  return not any(_is_test_path(p) for p in paths)
@@ -2635,6 +2635,18 @@ class TestUsageSurfacesCacheReadAndTurns:
2635
2635
  # (100 + 100 + 800 + 0) / 10 = 100.
2636
2636
  assert result.rows[0]["tok_per_turn"] == 100
2637
2637
 
2638
+ def test_tokens_in_is_labelled_raw_in_not_tok_in(self) -> None:
2639
+ """#2825: "Tok In" next to a full "Tok Out" reads as a matched pair —
2640
+ it is not one, `tokens_in` is ~0.001% of real input. The column `id`
2641
+ stays `tokens_in` (no historical number or saved sort changes), only
2642
+ the display `label` moves."""
2643
+ from coord.reports import fold_usage
2644
+
2645
+ result = fold_usage(_usage_fixture_rows(), _unbounded_window())
2646
+ meta = {m.id: m for m in result.column_meta}
2647
+ assert meta["tokens_in"].label == "Raw In"
2648
+ assert meta["tokens_out"].label == "Tok Out"
2649
+
2638
2650
  def test_totals_row_also_carries_the_new_columns(self) -> None:
2639
2651
  from coord.reports import fold_usage
2640
2652
 
@@ -4182,7 +4194,10 @@ class TestCompletedFold:
4182
4194
  "repo", "issue", "title", "started_at", "ended_at",
4183
4195
  # #2472's four, APPENDED — the client sorts by column index, so
4184
4196
  # #2454's five must keep the indices they had.
4185
- "legs", "tokens_in", "tokens_out", "cost_total",
4197
+ # #2825's `cache_read`, appended after `tokens_out` (before
4198
+ # `cost_total`, which shifts by one index — see the module
4199
+ # comment).
4200
+ "legs", "tokens_in", "tokens_out", "cache_read", "cost_total",
4186
4201
  ]
4187
4202
  assert [m.id for m in result.column_meta] == result.columns
4188
4203
 
@@ -4298,6 +4313,33 @@ class TestCompletedSpend:
4298
4313
  # captured cost so its 1M sonnet input tokens estimate to $3.00.
4299
4314
  assert row["cost_total"] == pytest.approx(5.0)
4300
4315
 
4316
+ def test_cache_read_is_a_declared_column_not_just_a_row_key(self) -> None:
4317
+ """#2825: `completed` showed a full `Tok Out` next to a `tokens_in`
4318
+ that is ~0.001% of a leg's real input — the raw uncached count sitting
4319
+ alone next to output read as "output dwarfs input", backwards by five
4320
+ orders of magnitude. `cache_read` was already computed into every row
4321
+ by `_usage_metrics`; this only had to become a declared column.
4322
+ """
4323
+ result = fold_completed(
4324
+ [{"repo_name": "myrepo", "number": 21, "title": "t", "state": "closed"}],
4325
+ [{"repo_name": "myrepo", "issue_number": 21,
4326
+ "dispatched_at": 10.0, "finished_at": 20.0, "model": "sonnet",
4327
+ "input_tokens": 634, "output_tokens": 186_209,
4328
+ "cache_read_tokens": 59_908_777}],
4329
+ [],
4330
+ (C_START, C_END),
4331
+ generated_at=C_END,
4332
+ )
4333
+ assert "cache_read" in result.columns
4334
+ meta = {m.id: m for m in result.column_meta}
4335
+ assert meta["cache_read"].label == "Cache Rd"
4336
+ row = result.rows[0]
4337
+ assert row["tokens_in"] == 634
4338
+ assert row["tokens_out"] == 186_209
4339
+ # The number that actually carries the input volume — orders of
4340
+ # magnitude above `tokens_in`, exactly the #2825 scenario.
4341
+ assert row["cache_read"] == 59_908_777
4342
+
4301
4343
  def test_the_captured_estimated_split_ships_as_extra_row_keys(self) -> None:
4302
4344
  """One `Total $` COLUMN, but no information thrown away — a client
4303
4345
  that wants `usage`'s split can read it off the row."""
@@ -4384,7 +4426,7 @@ class TestCompletedSpend:
4384
4426
  if peer is None:
4385
4427
  assert row["legs"] == 0, "only a no-leg issue may be absent from usage"
4386
4428
  continue
4387
- for key in ("legs", "tokens_in", "tokens_out"):
4429
+ for key in ("legs", "tokens_in", "tokens_out", "cache_read"):
4388
4430
  assert row[key] == peer[key], f"{row['repo']}#{row['issue']} {key}"
4389
4431
  assert row["cost_total"] == pytest.approx(peer["cost_total"])
4390
4432
  checked += 1
@@ -4646,14 +4688,17 @@ class TestCompletedCatalogue:
4646
4688
  text = result_to_csv(_fold_completed())
4647
4689
  # The header row is the `column_meta` LABELS (the shared serializer's
4648
4690
  # rule), and the values stay raw epochs — not display strings.
4649
- # #2472's four labels are `usage`'s verbatim, so a spreadsheet built
4650
- # off one export lines up with the other.
4651
- assert "Repo,Issue,Title,Started,Ended,Legs,Tok In,Tok Out,Total $" in text
4652
- # myrepo#9 merged with no assignment: a real 0/0/0/0.0, not four
4691
+ # #2472's four labels (plus #2825's `cache_read`) are `usage`'s
4692
+ # verbatim, so a spreadsheet built off one export lines up with the
4693
+ # other. `tokens_in` is labelled "Raw In", not "Tok In" (#2825) — it
4694
+ # is not `Tok Out`'s pair, it's ~0.001% of a leg's real input.
4695
+ assert "Repo,Issue,Title,Started,Ended,Legs,Raw In,Tok Out,Cache Rd,Total $" in text
4696
+ # myrepo#9 merged with no assignment: a real 0/0/0/0/0.0, not five
4653
4697
  # empty cells.
4654
- assert 'myrepo,9,"Merged, still open",,400.0,0,0,0,0.0' in text
4655
- # myrepo#7's retry: 2 legs, $2.00 captured + $3.00 estimated.
4656
- assert "myrepo,7,Closed one,100.0,250.0,2,1000010,4,5.0" in text
4698
+ assert 'myrepo,9,"Merged, still open",,400.0,0,0,0,0,0.0' in text
4699
+ # myrepo#7's retry: 2 legs, $2.00 captured + $3.00 estimated, no
4700
+ # cache_read_tokens in the fixture so that column reads 0.
4701
+ assert "myrepo,7,Closed one,100.0,250.0,2,1000010,4,0,5.0" in text
4657
4702
 
4658
4703
 
4659
4704
  class TestRowIdentity:
@@ -1062,6 +1062,84 @@ def test_truncate_diff_text_matches_pr_diff_truncation(monkeypatch) -> None:
1062
1062
  assert via_pr_diff == via_helper
1063
1063
 
1064
1064
 
1065
+ def _diff_for(path: str, n_lines: int) -> str:
1066
+ lines = [f"diff --git a/{path} b/{path}", f"--- a/{path}", f"+++ b/{path}"]
1067
+ lines += [f"+line {i}" for i in range(n_lines)]
1068
+ return "\n".join(lines) + "\n"
1069
+
1070
+
1071
+ def test_truncate_diff_text_cuts_on_file_boundary_not_mid_hunk() -> None:
1072
+ """#2819: truncation must never hand the reviewer a partial hunk — the
1073
+ cut lands on the last `diff --git` boundary that fits, so every file
1074
+ kept in the output is complete."""
1075
+ from coord import github_ops
1076
+
1077
+ diff = _diff_for("a.py", 20) + _diff_for("b.py", 20) + _diff_for("c.py", 2000)
1078
+ out = github_ops.truncate_diff_text(diff, max_chars=1000)
1079
+
1080
+ # Both kept files are present in full (their own last line included);
1081
+ # nothing stops mid-hunk.
1082
+ assert "+line 19\ndiff --git a/b.py" in out
1083
+ assert "+line 19\n... [diff truncated" in out
1084
+ assert "diff --git a/c.py" not in out
1085
+
1086
+
1087
+ def test_truncate_diff_text_lists_omitted_files() -> None:
1088
+ """#2819: a reviewer handed a truncated diff must be told which files
1089
+ it did not see, so it can inspect them directly instead of silently
1090
+ missing them."""
1091
+ from coord import github_ops
1092
+
1093
+ diff = _diff_for("a.py", 20) + _diff_for("b.py", 20) + _diff_for("c.py", 2000)
1094
+ out = github_ops.truncate_diff_text(diff, max_chars=1000)
1095
+
1096
+ assert "1 file(s) omitted" in out
1097
+ assert "Files omitted by truncation" in out
1098
+ assert " - c.py" in out
1099
+ # Only the dropped file is listed — the kept files aren't flagged as omitted.
1100
+ assert " - a.py" not in out
1101
+ assert " - b.py" not in out
1102
+
1103
+
1104
+ def test_truncate_diff_text_falls_back_to_char_slice_when_no_boundary_fits() -> None:
1105
+ """#2819: when even the first file's own diff exceeds max_chars (or the
1106
+ input has no `diff --git` boundaries at all), fall back to the old raw
1107
+ character slice rather than emitting an empty string."""
1108
+ from coord import github_ops
1109
+
1110
+ diff = _diff_for("huge.py", 5000)
1111
+ out = github_ops.truncate_diff_text(diff, max_chars=1000)
1112
+
1113
+ assert len(out) > 1000 # head (1000 chars) + trailing note
1114
+ assert out.startswith(diff[:1000])
1115
+ assert "omitted" not in out # no boundary found -> no file list to report
1116
+
1117
+
1118
+ def test_truncate_diff_text_flags_huge_first_file_as_incomplete() -> None:
1119
+ """#2819 follow-up: when the *first* file's own diff already exceeds
1120
+ max_chars, the char-slice fallback used to let it ride into `head`
1121
+ looking complete (its header made it in, so it never appeared on the
1122
+ "omitted" list) while its body was silently cut mid-hunk. A reviewer
1123
+ trusting the omitted-files list would wrongly conclude the huge first
1124
+ file was shown in full. It must now be called out explicitly, distinct
1125
+ from files that were dropped entirely."""
1126
+ from coord import github_ops
1127
+
1128
+ diff = _diff_for("huge.py", 5000) + _diff_for("small.py", 5)
1129
+ out = github_ops.truncate_diff_text(diff, max_chars=1000)
1130
+
1131
+ # The huge first file is cut off mid-hunk, not omitted entirely — it
1132
+ # must be flagged as incomplete rather than silently passing review.
1133
+ assert "huge.py" in out
1134
+ assert "cut off mid-diff" in out
1135
+ assert "INCOMPLETE" in out
1136
+ # The trailing file is genuinely never shown at all — still on the
1137
+ # separate "omitted" list.
1138
+ assert "1 file(s) omitted" in out
1139
+ assert "Files omitted by truncation" in out
1140
+ assert " - small.py" in out
1141
+
1142
+
1065
1143
  def test_pr_diff_returns_none_on_gh_error(monkeypatch) -> None:
1066
1144
  """#612: pr_diff is best-effort — a gh failure yields None, not a raise."""
1067
1145
  from coord import github_ops
@@ -1928,7 +2006,12 @@ def test_dispatch_review_patch_id_hashes_untruncated_diff(
1928
2006
  # display-truncated copy, so a huge diff still can't blow the briefing.
1929
2007
  assert client.calls, "expected a dispatch POST"
1930
2008
  _, payload = client.calls[0]
1931
- assert "[diff truncated at 60000 chars]" in payload["briefing"]
2009
+ # #2819 follow-up: f.py is the *only* file and it alone exceeds the cap,
2010
+ # so the char-slice fallback fires and the note now also flags f.py
2011
+ # itself as cut off mid-diff (not just "truncated at N chars") — the
2012
+ # exact fix this test's own issue asked for.
2013
+ assert "[diff truncated at 60000 chars" in payload["briefing"]
2014
+ assert "cut off mid-diff (f.py)" in payload["briefing"]
1932
2015
  assert len(payload["briefing"]) < len(big_diff)
1933
2016
 
1934
2017
 
@@ -141,7 +141,19 @@ pub fn make_test_app(data: BoardData) -> CoordApp {
141
141
  chat_transcript_cache_key: None,
142
142
  chat_last_activity: None,
143
143
  chat_spinner_throttle: 0,
144
- paused_machines: read_paused_machines(),
144
+ // #2028: never call the real `read_paused_machines()` from a test
145
+ // fixture — it reads the LOCAL `~/.coord/paused_machines.json`
146
+ // unconditionally (mirrors `workspace` above: no real I/O). Before
147
+ // this, any host whose real pause file was non-empty (e.g. two
148
+ // long-destroyed ephemeral workers left paused on dellserver since
149
+ // 2026-08-04) failed `poll_paused_machines_replaces_snapshot_when_ready`
150
+ // and `..._reverts_an_operator_pause_..` (`app/tests.rs`) purely from
151
+ // ambient machine state — both tests assert `paused_machines.is_empty()`
152
+ // immediately after construction. Empty here matches what every
153
+ // caller of this fixture already expects; a test that wants a
154
+ // pre-populated set assigns `app.paused_machines` directly (see the
155
+ // tests further down this file).
156
+ paused_machines: std::collections::HashSet::new(),
145
157
  quiet_paused_machines: std::collections::HashSet::new(),
146
158
  cordoned_machines: std::collections::HashSet::new(),
147
159
  quiet_hours_windows: std::collections::HashMap::new(),
@@ -9756,12 +9756,15 @@ fn today_yyyy_mm_dd() -> String {
9756
9756
  ///
9757
9757
  /// #1563: on a thin client (board service configured) this file is no
9758
9758
  /// longer authoritative — `coord pause` on such a client now writes
9759
- /// straight to the daemon instead. `CoordApp::new`/`make_test_app` still
9760
- /// call this directly for the *initial* synchronous `paused_machines`
9761
- /// snapshot (mirroring `live_tmux_sessions`/`fleet_terminals`/
9762
- /// `drive_sessions` further up this file, each seeded from a cheap local
9763
- /// read before their background remote sweep is armed), but every
9764
- /// *periodic* refresh after that goes through
9759
+ /// straight to the daemon instead. `CoordApp::new` still calls this
9760
+ /// directly for the *initial* synchronous `paused_machines` snapshot
9761
+ /// (mirroring `live_tmux_sessions`/`fleet_terminals`/`drive_sessions`
9762
+ /// further up this file, each seeded from a cheap local read before their
9763
+ /// background remote sweep is armed). `app::fixtures::make_test_app`
9764
+ /// deliberately does NOT call this (#2028) — a test fixture must never
9765
+ /// read ambient machine state, so it seeds `paused_machines` empty instead
9766
+ /// and lets individual tests assign it directly. Every *periodic* refresh
9767
+ /// after startup goes through
9765
9768
  /// [`data::fetch_paused_machines`] / [`data::spawn_paused_machines_fetch`]
9766
9769
  /// instead, which route to the daemon's `GET /pause` when a board service
9767
9770
  /// is configured and fall back to this function otherwise — so a